[SCM] Debian packaging for jack-audio-connection-kit branch, master.jackd2, updated. debian/1.9.4+svn3842-2-80-g15935e8

js at users.alioth.debian.org js at users.alioth.debian.org
Mon Apr 5 14:07:47 UTC 2010


The following commit has been merged in the master.jackd2 branch:
commit 54c5ad147ee2983ab685e83cd32fefc349061558
Author: Jonas Smedegaard <dr at jones.dk>
Date:   Mon Apr 5 15:07:42 2010 +0200

    Revert upstream part to match tag upstream/1.9.5.dfsg.

diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Build.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Build.py
new file mode 100644
index 0000000..df93caa
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Build.py
@@ -0,0 +1,525 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import os,sys,cPickle,types,imp,errno,re,glob,gc,time,shutil
+import Runner,TaskGen,Node,Scripting,Utils,Environment,Task,Logs,Options
+from Logs import debug,error,info
+from Constants import*
+SAVED_ATTRS='root srcnode bldnode node_sigs node_deps raw_deps task_sigs id_nodes'.split()
+g_modcache={}
+bld=None
+class BuildError(Utils.WafError):
+	def __init__(self,b=None,t=[]):
+		self.bld=b
+		self.tasks=t
+		self.ret=1
+		Utils.WafError.__init__(self,self.format_error())
+	def format_error(self):
+		lst=['Build failed']
+		for tsk in self.tasks:
+			txt=tsk.format_error()
+			if txt:lst.append(txt)
+		return'\n'.join(lst)
+class BuildContext(object):
+	def __init__(self):
+		global bld
+		bld=self
+		self.task_manager=Task.TaskManager()
+		self.id_nodes=0
+		self.all_envs={}
+		self.bdir=''
+		self.path=None
+		self.cache_node_abspath={}
+		self.cache_scanned_folders={}
+		self.uninstall=[]
+		for v in'cache_node_abspath task_sigs node_deps raw_deps node_sigs'.split():
+			var={}
+			setattr(self,v,var)
+		self.cache_dir_contents={}
+		self.all_task_gen=[]
+		self.task_gen_cache_names={}
+		self.cache_sig_vars={}
+		self.log=None
+		self.root=None
+		self.srcnode=None
+		self.bldnode=None
+		class node_class(Node.Node):
+			pass
+		self.node_class=node_class
+		self.node_class.__module__="Node"
+		self.node_class.__name__="Nodu"
+		self.node_class.bld=self
+	def load(self):
+		try:
+			env=Environment.Environment(os.path.join(self.cachedir,'build.config.py'))
+		except(IOError,OSError):
+			pass
+		else:
+			if env['version']<HEXVERSION:
+				raise Utils.WafError('Version mismatch! reconfigure the project')
+			for t in env['tools']:
+				self.setup(**t)
+		try:
+			gc.disable()
+			f=data=None
+			Node.Nodu=self.node_class
+			try:
+				f=open(os.path.join(self.bdir,DBFILE),'rb')
+			except(IOError,EOFError):
+				pass
+			try:
+				if f:data=cPickle.load(f)
+			except AttributeError:
+				if Logs.verbose>1:raise
+			if data:
+				for x in SAVED_ATTRS:setattr(self,x,data[x])
+			else:
+				debug('build: Build cache loading failed')
+		finally:
+			if f:f.close()
+			gc.enable()
+	def save(self):
+		gc.disable()
+		self.root.__class__.bld=None
+		Node.Nodu=self.node_class
+		file=open(os.path.join(self.bdir,DBFILE),'wb')
+		data={}
+		for x in SAVED_ATTRS:data[x]=getattr(self,x)
+		cPickle.dump(data,file,-1)
+		file.close()
+		self.root.__class__.bld=self
+		gc.enable()
+	def clean(self):
+		debug('build: clean called')
+		def clean_rec(node):
+			for x in node.childs.keys():
+				nd=node.childs[x]
+				tp=nd.id&3
+				if tp==Node.DIR:
+					clean_rec(nd)
+				elif tp==Node.BUILD:
+					for env in self.all_envs.values():
+						pt=nd.abspath(env)
+						if pt in env['waf_config_files']:continue
+						try:os.remove(pt)
+						except OSError:pass
+					node.childs.__delitem__(x)
+		node=self.srcnode
+		clean_rec(node)
+		if node==self.srcnode:
+			for v in'node_sigs node_deps task_sigs raw_deps cache_node_abspath'.split():
+				var={}
+				setattr(self,v,var)
+	def compile(self):
+		debug('build: compile called')
+		os.chdir(self.bdir)
+		self.flush()
+		self.generator=Runner.Parallel(self,Options.options.jobs)
+		def dw(on=True):
+			if Options.options.progress_bar:
+				if on:sys.stdout.write(Logs.colors.cursor_on)
+				else:sys.stdout.write(Logs.colors.cursor_off)
+		debug('build: executor starting')
+		try:
+			dw(on=False)
+			self.generator.start()
+		except KeyboardInterrupt:
+			dw()
+			os.chdir(self.srcnode.abspath())
+			self.save()
+			Utils.pprint('RED','Build interrupted')
+			if Logs.verbose>1:raise
+			else:sys.exit(68)
+		except Exception:
+			dw()
+			raise
+		else:
+			dw()
+			self.save()
+		if self.generator.error:
+			os.chdir(self.srcnode.abspath())
+			raise BuildError(self,self.task_manager.tasks_done)
+		os.chdir(self.srcnode.abspath())
+	def install(self):
+		debug('build: install called')
+		self.flush()
+		if Options.commands['uninstall']:
+			lst=[]
+			for x in self.uninstall:
+				dir=os.path.dirname(x)
+				if not dir in lst:lst.append(dir)
+			lst.sort()
+			lst.reverse()
+			nlst=[]
+			for y in lst:
+				x=y
+				while len(x)>4:
+					if not x in nlst:nlst.append(x)
+					x=os.path.dirname(x)
+			nlst.sort()
+			nlst.reverse()
+			for x in nlst:
+				try:os.rmdir(x)
+				except OSError:pass
+	def add_subdirs(self,dirs):
+		for dir in Utils.to_list(dirs):
+			if dir:Scripting.add_subdir(dir,self)
+	def new_task_gen(self,*k,**kw):
+		kw['bld']=self
+		if len(k)==0:return TaskGen.task_gen(*k,**kw)
+		cls_name=k[0]
+		try:cls=TaskGen.task_gen.classes[cls_name]
+		except KeyError:raise Utils.WscriptError('%s is not a valid task generator -> %s'%(cls_name,[x for x in TaskGen.task_gen.classes]))
+		else:return cls(*k,**kw)
+	def load_envs(self):
+		try:
+			lst=Utils.listdir(self.cachedir)
+		except OSError,e:
+			if e.errno==errno.ENOENT:
+				raise Utils.WafError('The project was not configured: run "waf configure" first!')
+			else:
+				raise
+		if not lst:
+			raise Utils.WafError('The cache directory is empty: reconfigure the project')
+		for file in lst:
+			if file.endswith(CACHE_SUFFIX):
+				env=Environment.Environment(os.path.join(self.cachedir,file))
+				name=file.split('.')[0]
+				self.all_envs[name]=env
+		self.init_variants()
+		for env in self.all_envs.values():
+			for f in env['dep_files']:
+				newnode=self.srcnode.find_or_declare(f)
+				try:
+					hash=Utils.h_file(newnode.abspath(env))
+				except(IOError,AttributeError):
+					error("cannot find "+f)
+					hash=SIG_NIL
+				self.node_sigs[env.variant()][newnode.id]=hash
+	def setup(self,tool,tooldir=None,funs=None):
+		if type(tool)is types.ListType:
+			for i in tool:self.setup(i,tooldir)
+			return
+		if not tooldir:tooldir=Options.tooldir
+		file=None
+		key=str((tool,tooldir))
+		module=g_modcache.get(key,None)
+		if not module:
+			file,name,desc=imp.find_module(tool,tooldir)
+			module=imp.load_module(tool,file,name,desc)
+			g_modcache[key]=module
+		if hasattr(module,"setup"):module.setup(self)
+		if file:file.close()
+	def init_variants(self):
+		debug('build: init variants')
+		lstvariants=[]
+		for env in self.all_envs.values():
+			if not env.variant()in lstvariants:
+				lstvariants.append(env.variant())
+		self.lst_variants=lstvariants
+		debug('build: list of variants is %s'%str(lstvariants))
+		for name in lstvariants+[0]:
+			for v in'node_sigs cache_node_abspath'.split():
+				var=getattr(self,v)
+				if not name in var:
+					var[name]={}
+	def load_dirs(self,srcdir,blddir,load_cache=1):
+		assert(os.path.isabs(srcdir))
+		assert(os.path.isabs(blddir))
+		self.cachedir=os.path.join(blddir,CACHE_DIR)
+		if srcdir==blddir:
+			raise Utils.WafError("build dir must be different from srcdir: %s <-> %s "%(srcdir,blddir))
+		self.bdir=blddir
+		if load_cache:self.load()
+		if not self.root:
+			Node.Nodu=self.node_class
+			self.root=Node.Nodu('',None,Node.DIR)
+		if not self.srcnode:
+			self.srcnode=self.root.ensure_dir_node_from_path(srcdir)
+		debug('build: srcnode is %s and srcdir %s'%(str(self.srcnode.name),srcdir))
+		self.path=self.srcnode
+		try:os.makedirs(blddir)
+		except OSError:pass
+		if not self.bldnode:
+			self.bldnode=self.root.ensure_dir_node_from_path(blddir)
+		self.init_variants()
+	def rescan(self,src_dir_node):
+		if self.cache_scanned_folders.get(src_dir_node.id,None):return
+		self.cache_scanned_folders[src_dir_node.id]=1
+		if hasattr(self,'repository'):self.repository(src_dir_node)
+		if sys.platform=="win32"and not src_dir_node.name:
+			return
+		self.listdir_src(src_dir_node,src_dir_node.abspath())
+		h1=self.srcnode.height()
+		h2=src_dir_node.height()
+		lst=[]
+		child=src_dir_node
+		while h2>h1:
+			lst.append(child.name)
+			child=child.parent
+			h2-=1
+		lst.reverse()
+		for variant in self.lst_variants:
+			sub_path=os.path.join(self.bldnode.abspath(),variant,*lst)
+			try:
+				self.listdir_bld(src_dir_node,sub_path,variant)
+			except OSError:
+				dict=self.node_sigs[variant]
+				for node in src_dir_node.childs.values():
+					if node.id in dict:
+						dict.__delitem__(node.id)
+					if node.id!=self.bldnode.id:
+						src_dir_node.childs.__delitem__(node.name)
+				os.makedirs(sub_path)
+	def listdir_src(self,parent_node,path):
+		listed_files=set(Utils.listdir(path))
+		self.cache_dir_contents[parent_node.id]=listed_files
+		debug('build: folder contents '+str(listed_files))
+		node_names=set([x.name for x in parent_node.childs.values()if x.id&3==Node.FILE])
+		cache=self.node_sigs[0]
+		to_keep=listed_files&node_names
+		for x in to_keep:
+			node=parent_node.childs[x]
+			try:
+				cache[node.id]=Utils.h_file(path+os.sep+node.name)
+			except IOError:
+				raise Utils.WafError("The file %s is not readable or has become a dir"%node.abspath())
+		to_remove=node_names-listed_files
+		if to_remove:
+			cache=self.node_sigs[0]
+			for name in to_remove:
+				nd=parent_node.childs[name]
+				if nd.id in cache:
+					cache.__delitem__(nd.id)
+				parent_node.childs.__delitem__(name)
+	def listdir_bld(self,parent_node,path,variant):
+		i_existing_nodes=[x for x in parent_node.childs.values()if x.id&3==Node.BUILD]
+		listed_files=set(Utils.listdir(path))
+		node_names=set([x.name for x in i_existing_nodes])
+		remove_names=node_names-listed_files
+		ids_to_remove=[x.id for x in i_existing_nodes if x.name in remove_names]
+		cache=self.node_sigs[variant]
+		for nid in ids_to_remove:
+			if nid in cache:
+				cache.__delitem__(nid)
+	def get_env(self):
+		return self.env_of_name('default')
+	def set_env(self,name,val):
+		self.all_envs[name]=val
+	env=property(get_env,set_env)
+	def add_manual_dependency(self,path,value):
+		h=getattr(self,'deps_man',{})
+		if isinstance(path,Node.Node):
+			node=path
+		elif os.path.isabs(path):
+			node=self.root.find_resource(path)
+		else:
+			node=self.path.find_resource(path)
+		try:h[node.id].append(value)
+		except KeyError:h[node.id]=[value]
+		self.deps_man=h
+	def launch_node(self):
+		try:
+			return self.p_ln
+		except AttributeError:
+			self.p_ln=self.root.find_dir(Options.launch_dir)
+			return self.p_ln
+	def glob(self,pattern,relative=True):
+		path=self.path.abspath()
+		files=[self.root.find_resource(x)for x in glob.glob(path+os.sep+pattern)]
+		if relative:
+			files=[x.path_to_parent(self.path)for x in files if x]
+		else:
+			files=[x.abspath()for x in files if x]
+		return files
+	def add_group(self):
+		self.flush(all=0)
+		self.task_manager.add_group()
+	def hash_env_vars(self,env,vars_lst):
+		idx=str(id(env))+str(vars_lst)
+		try:return self.cache_sig_vars[idx]
+		except KeyError:pass
+		lst=[env.get_flat(a)for a in vars_lst]
+		ret=Utils.h_list(lst)
+		debug("envhash: %s %s"%(ret.encode('hex'),str(lst)))
+		self.cache_sig_vars[idx]=ret
+		return ret
+	def name_to_obj(self,name,env):
+		cache=self.task_gen_cache_names
+		if not cache:
+			for x in self.all_task_gen:
+				vt=x.env.variant()+'_'
+				if x.name:
+					cache[vt+x.name]=x
+				else:
+					v=vt+x.target
+					if not cache.get(v,None):
+						cache[v]=x
+		return cache.get(env.variant()+'_'+name,None)
+	def flush(self,all=1):
+		self.ini=time.time()
+		self.task_gen_cache_names={}
+		self.name_to_obj('',self.env)
+		debug('build: delayed operation TaskGen.flush() called')
+		if Options.options.compile_targets:
+			debug('task_gen: posting objects listed in compile_targets')
+			target_objects={}
+			for target_name in Options.options.compile_targets.split(','):
+				target_name=target_name.strip()
+				for env in self.all_envs.values():
+					obj=self.name_to_obj(target_name,env)
+					if obj:
+						try:
+							target_objects[target_name].append(obj)
+						except KeyError:
+							target_objects[target_name]=[obj]
+				if not target_name in target_objects and all:
+					raise Utils.WafError("target '%s' does not exist"%target_name)
+			for target_obj in target_objects.values():
+				for x in target_obj:
+					x.post()
+		else:
+			debug('task_gen: posting objects (normal)')
+			ln=self.launch_node()
+			if ln.is_child_of(self.bldnode)or not ln.is_child_of(self.srcnode):
+				ln=self.srcnode
+			for obj in self.all_task_gen:
+				if not obj.path.is_child_of(ln):continue
+				obj.post()
+	def env_of_name(self,name):
+		if not name:
+			error('env_of_name called with no name!')
+			return None
+		try:
+			return self.all_envs[name]
+		except KeyError:
+			error('no such environment: '+name)
+			return None
+	def progress_line(self,state,total,col1,col2):
+		n=len(str(total))
+		Utils.rot_idx+=1
+		ind=Utils.rot_chr[Utils.rot_idx%4]
+		ini=self.ini
+		pc=(100.*state)/total
+		eta=time.strftime('%H:%M:%S',time.gmtime(time.time()-ini))
+		fs="[%%%dd/%%%dd][%%s%%2d%%%%%%s][%s]["%(n,n,ind)
+		left=fs%(state,total,col1,pc,col2)
+		right='][%s%s%s]'%(col1,eta,col2)
+		cols=Utils.get_term_cols()-len(left)-len(right)+2*len(col1)+2*len(col2)
+		if cols<7:cols=7
+		ratio=int((cols*state)/total)-1
+		bar=('='*ratio+'>').ljust(cols)
+		msg=Utils.indicator%(left,bar,right)
+		return msg
+	def do_install(self,src,tgt,chmod=0644):
+		if Options.commands['install']:
+			if not Options.options.force:
+				try:
+					t1=os.stat(tgt).st_mtime
+					t2=os.stat(src).st_mtime
+				except OSError:
+					pass
+				else:
+					if t1>=t2:
+						return False
+			srclbl=src.replace(self.srcnode.abspath(None)+os.sep,'')
+			info("* installing %s as %s"%(srclbl,tgt))
+			try:os.remove(tgt)
+			except OSError:pass
+			try:
+				shutil.copy2(src,tgt)
+				os.chmod(tgt,chmod)
+			except IOError:
+				try:
+					os.stat(src)
+				except IOError:
+					error('File %r does not exist'%src)
+				raise Utils.WafError('Could not install the file %r'%tgt)
+			return True
+		elif Options.commands['uninstall']:
+			info("* uninstalling %s"%tgt)
+			self.uninstall.append(tgt)
+			try:os.remove(tgt)
+			except OSError:pass
+			return True
+	def get_install_path(self,path,env=None):
+		if not env:env=self.env
+		destdir=env.get_destdir()
+		destpath=Utils.subst_vars(path,env)
+		if destdir:
+			destpath=os.path.join(destdir,destpath.lstrip(os.sep))
+		return destpath
+	def install_files(self,path,files,env=None,chmod=0644,relative_trick=False):
+		if not Options.is_install:return[]
+		if not path:return[]
+		node=self.path
+		if type(files)is types.StringType and'*'in files:
+			gl=node.abspath()+os.sep+files
+			lst=glob.glob(gl)
+		else:
+			lst=Utils.to_list(files)
+		env=env or self.env
+		destpath=self.get_install_path(path,env)
+		Utils.check_dir(destpath)
+		installed_files=[]
+		for filename in lst:
+			if not os.path.isabs(filename):
+				nd=node.find_resource(filename)
+				if not nd:
+					raise Utils.WafError("Unable to install the file `%s': not found in %s"%(filename,node))
+				if relative_trick:
+					destfile=os.path.join(destpath,filename)
+					Utils.check_dir(os.path.dirname(destfile))
+				else:
+					destfile=os.path.join(destpath,nd.name)
+				filename=nd.abspath(env)
+			else:
+				alst=Utils.split_path(filename)
+				destfile=os.path.join(destpath,alst[-1])
+			if self.do_install(filename,destfile,chmod):
+				installed_files.append(destfile)
+		return installed_files
+	def install_as(self,path,srcfile,env=None,chmod=0644):
+		if not Options.is_install:return False
+		if not path:return False
+		if not env:env=self.env
+		node=self.path
+		destpath=self.get_install_path(path,env)
+		dir,name=os.path.split(destpath)
+		Utils.check_dir(dir)
+		if not os.path.isabs(srcfile):
+			filenode=node.find_resource(srcfile)
+			src=filenode.abspath(env)
+		else:
+			src=srcfile
+		return self.do_install(src,destpath,chmod)
+	def symlink_as(self,path,src,env=None):
+		if not Options.is_install:return
+		if not path:return
+		tgt=self.get_install_path(path,env)
+		dir,name=os.path.split(tgt)
+		Utils.check_dir(dir)
+		if Options.commands['install']:
+			try:
+				if not os.path.islink(tgt)or os.readlink(tgt)!=src:
+					info("* symlink %s (-> %s)"%(tgt,src))
+					os.symlink(src,tgt)
+				return 0
+			except OSError:
+				return 1
+		elif Options.commands['uninstall']:
+			try:
+				info("* removing %s"%(tgt))
+				os.remove(tgt)
+				return 0
+			except OSError:
+				return 1
+	def exec_command(self,cmd,shell=1):
+		debug('runner: system command -> %s'%cmd)
+		return Utils.exec_command(cmd,shell=shell,log=self.log)
+	def printout(self,s):
+		f=self.log or sys.stdout
+		f.write(s)
+		f.flush()
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Configure.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Configure.py
new file mode 100644
index 0000000..4c1a9e6
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Configure.py
@@ -0,0 +1,179 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,types,imp,cPickle
+import Environment,Utils,Options
+from Logs import warn
+from Constants import*
+class ConfigurationError(Utils.WscriptError):
+	pass
+autoconfig=False
+def find_file(filename,path_list):
+	if type(path_list)is types.StringType:
+		lst=path_list.split()
+	else:
+		lst=path_list
+	for directory in lst:
+		if os.path.exists(os.path.join(directory,filename)):
+			return directory
+	return''
+def find_program_impl(env,filename,path_list=[],var=None):
+	try:path_list=path_list.split()
+	except AttributeError:pass
+	if var:
+		if var in os.environ:env[var]=os.environ[var]
+		if env[var]:return env[var]
+	if not path_list:path_list=os.environ['PATH'].split(os.pathsep)
+	ext=(Options.platform=='win32')and'.exe,.com,.bat,.cmd'or''
+	for y in[filename+x for x in ext.split(',')]:
+		for directory in path_list:
+			x=os.path.join(directory,y)
+			if os.path.isfile(x):
+				x=Utils.quote_whitespace(x)
+				if var:env[var]=x
+				return x
+	return''
+class ConfigurationContext(object):
+	tests={}
+	error_handlers=[]
+	def __init__(self,env=None,blddir='',srcdir=''):
+		self.env=None
+		self.envname=''
+		self.line_just=40
+		self.blddir=blddir
+		self.srcdir=srcdir
+		self.cachedir=os.path.join(blddir,CACHE_DIR)
+		self.all_envs={}
+		self.defines={}
+		self.cwd=os.getcwd()
+		self.tools=[]
+		self.setenv(DEFAULT)
+		self.lastprog=''
+		self.hash=0
+		self.files=[]
+		path=os.path.join(self.blddir,WAF_CONFIG_LOG)
+		try:os.unlink(path)
+		except(OSError,IOError):pass
+		self.log=open(path,'wb')
+	def __del__(self):
+		if hasattr(self,'log')and self.log:
+			self.log.close()
+	def fatal(self,msg):
+		raise ConfigurationError(msg)
+	def check_tool(self,input,tooldir=None,funs=None):
+		tools=Utils.to_list(input)
+		if tooldir:tooldir=Utils.to_list(tooldir)
+		for tool in tools:
+			try:
+				file,name,desc=imp.find_module(tool,tooldir)
+			except ImportError:
+				self.fatal("no tool named '%s' found."%tool)
+			module=imp.load_module(tool,file,name,desc)
+			func=getattr(module,'detect',None)
+			if func:
+				if type(func)is types.FunctionType:func(self)
+				else:self.eval_rules(funs or func)
+			self.tools.append({'tool':tool,'tooldir':tooldir,'funs':funs})
+	def sub_config(self,dir):
+		current=self.cwd
+		self.cwd=os.path.join(self.cwd,dir)
+		cur=os.path.join(self.cwd,WSCRIPT_FILE)
+		mod=Utils.load_module(cur)
+		if not hasattr(mod,'configure'):
+			self.fatal('the module %s has no configure function; make sure such a function is defined'%cur)
+		ret=mod.configure(self)
+		global autoconfig
+		if autoconfig:
+			self.hash=Utils.hash_function_with_globals(self.hash,mod.configure)
+			self.files.append(os.path.abspath(cur))
+		self.cwd=current
+		return ret
+	def store(self,file=''):
+		if not os.path.isdir(self.cachedir):
+			os.makedirs(self.cachedir)
+		file=open(os.path.join(self.cachedir,'build.config.py'),'w')
+		file.write('version = 0x%x\n'%HEXVERSION)
+		file.write('tools = %r\n'%self.tools)
+		file.close()
+		if not self.all_envs:
+			self.fatal('nothing to store in the configuration context!')
+		for key in self.all_envs:
+			tmpenv=self.all_envs[key]
+			tmpenv.store(os.path.join(self.cachedir,key+CACHE_SUFFIX))
+	def set_env_name(self,name,env):
+		self.all_envs[name]=env
+		return env
+	def retrieve(self,name,fromenv=None):
+		try:
+			env=self.all_envs[name]
+		except KeyError:
+			env=Environment.Environment()
+			self.all_envs[name]=env
+		else:
+			if fromenv:warn("The environment %s may have been configured already"%name)
+		return env
+	def setenv(self,name):
+		self.env=self.retrieve(name)
+		self.envname=name
+	def add_os_flags(self,var,dest=None):
+		if not dest:dest=var
+		try:self.env[dest]=os.environ[var]
+		except KeyError:pass
+	def check_message_1(self,sr):
+		self.line_just=max(self.line_just,len(sr))
+		self.log.write(sr+'\n\n')
+		print"%s :"%sr.ljust(self.line_just),
+	def check_message_2(self,sr,color='GREEN'):
+		Utils.pprint(color,sr)
+	def check_message(self,th,msg,state,option=''):
+		sr='Checking for %s %s'%(th,msg)
+		self.check_message_1(sr)
+		p=self.check_message_2
+		if state:p('ok '+option)
+		else:p('not found','YELLOW')
+	def check_message_custom(self,th,msg,custom,option='',color='PINK'):
+		sr='Checking for %s %s'%(th,msg)
+		self.check_message_1(sr)
+		self.check_message_2(custom,color)
+	def find_program(self,filename,path_list=[],var=None):
+		ret=find_program_impl(self.env,filename,path_list,var)
+		self.check_message('program',filename,ret,ret)
+		return ret
+	def __getattr__(self,name):
+		r=self.__class__.__dict__.get(name,None)
+		if r:return r
+		if name and name.startswith('require_'):
+			for k in['check_','find_']:
+				n=name.replace('require_',k)
+				ret=self.__class__.__dict__.get(n,None)
+				if ret:
+					def run(*k,**kw):
+						r=ret(self,*k,**kw)
+						if not r:
+							self.fatal('requirement failure')
+						return r
+					return run
+		self.fatal('No such method %r'%name)
+	def eval_rules(self,rules):
+		self.rules=Utils.to_list(rules)
+		for x in self.rules:
+			f=getattr(self,x)
+			try:
+				f()
+			except Exception,e:
+				ret=self.err_handler(x,e)
+				if ret==BREAK:
+					break
+				elif ret==CONTINUE:
+					continue
+				else:
+					raise
+	def err_handler(self,fun,error):
+		pass
+def conf(f):
+	setattr(ConfigurationContext,f.__name__,f)
+	return f
+def conftest(f):
+	ConfigurationContext.tests[f.__name__]=f
+	return conf(f)
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Constants.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Constants.py
new file mode 100644
index 0000000..f9d05c2
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Constants.py
@@ -0,0 +1,41 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+HEXVERSION=0x10500
+WAFVERSION="1.5.0"
+ABI=6
+CACHE_DIR='c4che'
+CACHE_SUFFIX='.cache.py'
+DBFILE='.wafpickle-%d'%ABI
+WSCRIPT_FILE='wscript'
+WSCRIPT_BUILD_FILE='wscript_build'
+WAF_CONFIG_LOG='config.log'
+WAF_CONFIG_H='config.h'
+COMMON_INCLUDES='COMMON_INCLUDES'
+SIG_NIL='iluvcuteoverload'
+VARIANT='_VARIANT_'
+DEFAULT='default'
+SRCDIR='srcdir'
+BLDDIR='blddir'
+APPNAME='APPNAME'
+VERSION='VERSION'
+DEFINES='defines'
+UNDEFINED='#undefined#variable#for#defines#'
+BREAK="break"
+CONTINUE="continue"
+JOBCONTROL="JOBCONTROL"
+MAXPARALLEL="MAXPARALLEL"
+NORMAL="NORMAL"
+NOT_RUN=0
+MISSING=1
+CRASHED=2
+EXCEPTION=3
+SKIPPED=8
+SUCCESS=9
+ASK_LATER=-1
+SKIP_ME=-2
+RUN_ME=-3
+LOG_FORMAT="%(asctime)s %(c1)s%(zone)s%(c2)s %(message)s"
+HOUR_FORMAT="%H:%M:%S"
+TEST_OK=True
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Environment.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Environment.py
new file mode 100644
index 0000000..fd2fa22
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Environment.py
@@ -0,0 +1,128 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import os,copy,re
+import Logs,Options
+from Constants import*
+re_imp=re.compile('^(#)*?([^#=]*?)\ =\ (.*?)$',re.M)
+class Environment(object):
+	__slots__=("table","parent")
+	def __init__(self,filename=None):
+		self.table={}
+		if Options.commands['configure']:
+			self.table['PREFIX']=os.path.abspath(os.path.expanduser(Options.options.prefix))
+		if filename:
+			self.load(filename)
+	def __contains__(self,key):
+		if key in self.table:return True
+		try:return self.parent.__contains__(key)
+		except AttributeError:return False
+	def __str__(self):
+		keys=set()
+		cur=self
+		while cur:
+			keys.update(cur.table.keys())
+			cur=getattr(cur,'parent',None)
+		keys=list(keys)
+		keys.sort()
+		return"\n".join(["%r %r"%(x,self.__getitem__(x))for x in keys])
+	def set_variant(self,name):
+		self.table[VARIANT]=name
+	def variant(self):
+		env=self
+		while 1:
+			try:
+				return env.table[VARIANT]
+			except KeyError:
+				try:env=env.parent
+				except AttributeError:return DEFAULT
+	def copy(self):
+		newenv=Environment()
+		if Options.commands['configure']:
+			if self['PREFIX']:del newenv.table['PREFIX']
+		newenv.parent=self
+		return newenv
+	def __getitem__(self,key):
+		x=self.table.get(key,None)
+		if not x is None:return x
+		try:
+			u=self.parent
+		except AttributeError:
+			return[]
+		else:
+			return u[key]
+	def __setitem__(self,key,value):
+		self.table[key]=value
+	def get_flat(self,key):
+		s=self[key]
+		if not s:return''
+		elif isinstance(s,list):return' '.join(s)
+		else:return s
+	def _get_list_value_for_modification(self,key):
+		try:
+			value=self.table[key]
+		except KeyError:
+			try:value=self.parent[key]
+			except AttributeError:value=[]
+			if isinstance(value,list):
+				value=copy.copy(value)
+			else:
+				value=[value]
+			self.table[key]=value
+			return value
+		else:
+			if not isinstance(value,list):
+				value=[value]
+				self.table[key]=value
+			return value
+	def append_value(self,var,value):
+		current_value=self._get_list_value_for_modification(var)
+		if isinstance(value,list):
+			current_value.extend(value)
+		else:
+			current_value.append(value)
+	def prepend_value(self,var,value):
+		current_value=self._get_list_value_for_modification(var)
+		if isinstance(value,list):
+			current_value=value+current_value
+			self.table[var]=current_value
+		else:
+			current_value.insert(0,value)
+	def append_unique(self,var,value):
+		current_value=self._get_list_value_for_modification(var)
+		if isinstance(value,list):
+			for value_item in value:
+				if value_item not in current_value:
+					current_value.append(value_item)
+		else:
+			if value not in current_value:
+				current_value.append(value)
+	def store(self,filename):
+		file=open(filename,'w')
+		table_list=[]
+		env=self
+		while 1:
+			table_list.insert(0,env.table)
+			try:env=env.parent
+			except AttributeError:break
+		merged_table={}
+		for table in table_list:
+			merged_table.update(table)
+		keys=merged_table.keys()
+		keys.sort()
+		for k in keys:file.write('%s = %r\n'%(k,merged_table[k]))
+		file.close()
+	def load(self,filename):
+		tbl=self.table
+		file=open(filename,'r')
+		code=file.read()
+		file.close()
+		for m in re_imp.finditer(code):
+			g=m.group
+			tbl[g(2)]=eval(g(3))
+		Logs.debug('env: %s'%str(self.table))
+	def get_destdir(self):
+		if self.__getitem__('NOINSTALL'):return''
+		return Options.options.destdir
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Logs.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Logs.py
new file mode 100644
index 0000000..9ead328
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Logs.py
@@ -0,0 +1,80 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,re,logging,traceback,sys,Utils
+from Constants import*
+zones=''
+verbose=0
+colors_lst={'USE':True,'BOLD':'\x1b[01;1m','RED':'\x1b[01;91m','GREEN':'\x1b[32m','YELLOW':'\x1b[33m','PINK':'\x1b[35m','BLUE':'\x1b[01;34m','CYAN':'\x1b[36m','NORMAL':'\x1b[0m','cursor_on':'\x1b[?25h','cursor_off':'\x1b[?25l',}
+if(sys.platform=='win32')or('NOCOLOR'in os.environ)or(os.environ.get('TERM','dumb')in['dumb','emacs'])or(not sys.stdout.isatty()):
+	colors_lst['USE']=False
+def get_color(cl):
+	if not colors_lst['USE']:return''
+	return colors_lst.get(cl,'')
+class foo(object):
+	def __getattr__(self,a):
+		return get_color(a)
+	def __call__(self,a):
+		return get_color(a)
+colors=foo()
+re_log=re.compile(r'(\w+): (.*)',re.M)
+class log_filter(logging.Filter):
+	def __init__(self,name=None):
+		pass
+	def filter(self,rec):
+		rec.c1=colors.PINK
+		rec.c2=colors.NORMAL
+		rec.zone=rec.module
+		if rec.levelno>=logging.INFO:
+			if rec.levelno>=logging.ERROR:
+				rec.c1=colors.RED
+			else:
+				rec.c1=colors.GREEN
+			return True
+		zone=''
+		m=re_log.match(rec.msg)
+		if m:
+			zone=rec.zone=m.group(1)
+			rec.msg=m.group(2)
+		if zones:
+			return getattr(rec,'zone','')in zones or'*'in zones
+		elif not verbose>2:
+			return False
+		return True
+class formatter(logging.Formatter):
+	def __init__(self):
+		logging.Formatter.__init__(self,LOG_FORMAT,HOUR_FORMAT)
+	def format(self,rec):
+		if rec.levelno>=logging.WARNING or rec.levelno==logging.INFO:
+			return'%s%s%s'%(rec.c1,rec.msg,rec.c2)
+		return logging.Formatter.format(self,rec)
+def debug(msg):
+	msg=msg.replace('\n',' ')
+	if verbose:
+		logging.debug(msg)
+def error(msg):
+	logging.error(msg)
+	if verbose:
+		if isinstance(msg,Utils.WafError):
+			st=msg.stack
+		else:
+			st=traceback.extract_stack()
+		if st:
+			st=st[:-1]
+			buf=[]
+			for filename,lineno,name,line in st:
+				buf.append('  File "%s", line %d, in %s'%(filename,lineno,name))
+				if line:
+					buf.append('	%s'%line.strip())
+			if buf:logging.error("\n".join(buf))
+warn=logging.warn
+info=logging.info
+def init_log():
+	log=logging.getLogger()
+	log.handlers=[]
+	hdlr=logging.StreamHandler()
+	hdlr.setFormatter(formatter())
+	log.addHandler(hdlr)
+	log.addFilter(log_filter())
+	log.setLevel(logging.DEBUG)
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Node.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Node.py
new file mode 100644
index 0000000..663848e
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Node.py
@@ -0,0 +1,338 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,types
+import Utils,Build
+UNDEFINED=0
+DIR=1
+FILE=2
+BUILD=3
+type_to_string={UNDEFINED:"unk",DIR:"dir",FILE:"src",BUILD:"bld"}
+class Node(object):
+	__slots__=("name","parent","id","childs")
+	def __init__(self,name,parent,node_type=UNDEFINED):
+		self.name=name
+		self.parent=parent
+		self.__class__.bld.id_nodes+=4
+		self.id=self.__class__.bld.id_nodes+node_type
+		if node_type==DIR:self.childs={}
+		if Utils.split_path(name)[0]!=name:
+			raise Utils.WafError('name forbidden '+name)
+		if parent and name in parent.childs:
+			raise Utils.WafError('node %s exists in the parent files %s already'%(name,str(parent)))
+		if parent:parent.childs[name]=self
+	def __str__(self):
+		if not self.parent:return''
+		return"%s://%s"%(type_to_string[self.id&3],self.abspath())
+	def __repr__(self):
+		return self.__str__()
+	def __hash__(self):
+		raise Utils.WafError('nodes, you are doing it wrong')
+	def get_type(self):
+		return self.id&3
+	def set_type(self,t):
+		self.id=self.id+t-self.id&3
+	def dirs(self):
+		return[x for x in self.childs.values()if x.id&3==DIR]
+	def files(self):
+		return[x for x in self.childs.values()if x.id&3==FILE]
+	def get_dir(self,name,default=None):
+		node=self.childs.get(name,None)
+		if not node or node.id&3!=DIR:return default
+		return node
+	def get_file(self,name,default=None):
+		node=self.childs.get(name,None)
+		if not node or node.id&3!=FILE:return default
+		return node
+	def get_build(self,name,default=None):
+		node=self.childs.get(name,None)
+		if not node or node.id&3!=BUILD:return default
+		return node
+	def find_resource(self,lst):
+		if type(lst)is types.StringType:
+			lst=Utils.split_path(lst)
+		if not lst[:-1]:
+			parent=self
+		else:
+			parent=self.find_dir(lst[:-1])
+			if not parent:return None
+		self.__class__.bld.rescan(parent)
+		name=lst[-1]
+		node=parent.childs.get(name,None)
+		if node:
+			tp=node.id&3
+			if tp==FILE or tp==BUILD:
+				return node
+		tree=self.__class__.bld
+		if not name in tree.cache_dir_contents[parent.id]:
+			return None
+		path=parent.abspath()+os.sep+name
+		try:
+			st=Utils.h_file(path)
+		except IOError:
+			return None
+		child=self.__class__(name,parent,FILE)
+		tree.node_sigs[0][child.id]=st
+		return child
+	def find_or_declare(self,lst):
+		if type(lst)is types.StringType:
+			lst=Utils.split_path(lst)
+		if not lst[:-1]:
+			parent=self
+		else:
+			parent=self.find_dir(lst[:-1])
+			if not parent:return None
+		self.__class__.bld.rescan(parent)
+		name=lst[-1]
+		node=parent.childs.get(name,None)
+		if node:
+			tp=node.id&3
+			if tp!=BUILD:
+				raise Utils.WafError("find_or_declare returns a build node, not a source nor a directory"+str(lst))
+			return node
+		node=self.__class__(name,parent,BUILD)
+		return node
+	def find_dir(self,lst):
+		if type(lst)is types.StringType:
+			lst=Utils.split_path(lst)
+		current=self
+		for name in lst:
+			self.__class__.bld.rescan(current)
+			prev=current
+			if not current.parent and name==current.name:
+				continue
+			elif not name:
+				continue
+			elif name=='.':
+				continue
+			elif name=='..':
+				current=current.parent or current
+			else:
+				current=prev.childs.get(name,None)
+				if current is None:
+					dir_cont=self.__class__.bld.cache_dir_contents
+					if prev.id in dir_cont and name in dir_cont[prev.id]:
+						current=self.__class__(name,prev,DIR)
+					else:
+						return None
+		return current
+	def ensure_dir_node_from_path(self,lst):
+		if type(lst)is types.StringType:
+			lst=Utils.split_path(lst)
+		current=self
+		for name in lst:
+			if not name:
+				continue
+			elif name=='.':
+				continue
+			elif name=='..':
+				current=current.parent or current
+			else:
+				prev=current
+				current=prev.childs.get(name,None)
+				if current is None:
+					current=self.__class__(name,prev,DIR)
+		return current
+	def exclusive_build_node(self,path):
+		lst=Utils.split_path(path)
+		name=lst[-1]
+		if len(lst)>1:
+			parent=None
+			try:
+				parent=self.find_dir(lst[:-1])
+			except OSError:
+				pass
+			if not parent:
+				parent=self.ensure_dir_node_from_path(lst[:-1])
+				self.__class__.bld.cache_scanned_folders[parent.id]=1
+			else:
+				try:
+					self.__class__.bld.rescan(parent)
+				except OSError:
+					pass
+		else:
+			parent=self
+		node=parent.childs.get(name,None)
+		if not node:
+			node=self.__class__(name,parent,BUILD)
+		return node
+	def path_to_parent(self,parent):
+		lst=[]
+		p=self
+		h1=parent.height()
+		h2=p.height()
+		while h2>h1:
+			h2-=1
+			lst.append(p.name)
+			p=p.parent
+		if lst:
+			lst.reverse()
+			ret=os.path.join(*lst)
+		else:
+			ret=''
+		return ret
+	def find_ancestor(self,node):
+		dist=self.height()-node.height()
+		if dist<0:return node.find_ancestor(self)
+		cand=self
+		while dist>0:
+			cand=cand.parent
+			dist-=1
+		if cand==node:return cand
+		cursor=node
+		while cand.parent:
+			cand=cand.parent
+			cursor=cursor.parent
+			if cand==cursor:return cand
+	def relpath_gen(self,going_to):
+		if self==going_to:return'.'
+		if going_to.parent==self:return'..'
+		ancestor=self.find_ancestor(going_to)
+		lst=[]
+		cand=self
+		while not cand.id==ancestor.id:
+			lst.append(cand.name)
+			cand=cand.parent
+		cand=going_to
+		while not cand.id==ancestor.id:
+			lst.append('..')
+			cand=cand.parent
+		lst.reverse()
+		return os.sep.join(lst)
+	def nice_path(self,env=None):
+		tree=self.__class__.bld
+		ln=tree.launch_node()
+		name=self.name
+		if self.id&3==FILE:return self.relpath_gen(ln)
+		else:return os.path.join(tree.bldnode.relpath_gen(ln),env.variant(),self.relpath_gen(tree.srcnode))
+	def is_child_of(self,node):
+		p=self
+		diff=self.height()-node.height()
+		while diff>0:
+			diff-=1
+			p=p.parent
+		return p.id==node.id
+	def variant(self,env):
+		if not env:return 0
+		elif self.id&3==FILE:return 0
+		else:return env.variant()
+	def height(self):
+		d=self
+		val=-1
+		while d:
+			d=d.parent
+			val+=1
+		return val
+	def abspath(self,env=None):
+		if not self.name:
+			return'/'
+		variant=self.variant(env)
+		ret=self.__class__.bld.cache_node_abspath[variant].get(self.id,None)
+		if ret:return ret
+		if not variant:
+			if not self.parent:
+				val=os.sep
+			elif not self.parent.name:
+				val=os.sep+self.name
+			else:
+				val=self.parent.abspath()+os.sep+self.name
+		else:
+			val=os.sep.join((self.__class__.bld.bldnode.abspath(),env.variant(),self.path_to_parent(self.__class__.bld.srcnode)))
+		self.__class__.bld.cache_node_abspath[variant][self.id]=val
+		return val
+	def change_ext(self,ext):
+		name=self.name
+		k=name.rfind('.')
+		if k>=0:
+			name=name[:k]+ext
+		else:
+			name=name+ext
+		node=self.parent.childs.get(name,None)
+		if not node:
+			node=self.__class__(name,self.parent,BUILD)
+		return node
+	def src_dir(self,env):
+		return self.parent.srcpath(env)
+	def bld_dir(self,env):
+		return self.parent.bldpath(env)
+	def bld_base(self,env):
+		s=self.name
+		s=s[:s.rfind('.')]
+		return os.path.join(self.bld_dir(env),s)
+	def bldpath(self,env=None):
+		if self.id&3==FILE:
+			return self.relpath_gen(self.__class__.bld.bldnode)
+		if self.path_to_parent(self.__class__.bld.srcnode)is not'':
+			return os.path.join(env.variant(),self.path_to_parent(self.__class__.bld.srcnode))
+		return env.variant()
+	def srcpath(self,env=None):
+		if self.id&3==BUILD:
+			return self.bldpath(env)
+		return self.relpath_gen(self.__class__.bld.bldnode)
+	def read(self,env):
+		try:
+			file=open(self.abspath(env),'rb')
+			return file.read()
+		finally:
+			if file:file.close()
+	def dir(self,env):
+		return self.parent.abspath(env)
+	def file(self):
+		return self.name
+	def file_base(self):
+		s=self.name
+		if s.rfind('.')<0:
+			return s
+		return s[:s.rfind('.')]
+	def suffix(self):
+		s=self.name
+		if s.rfind('.')<0:
+			return s
+		return s[s.rfind('.'):]
+if sys.platform=="win32":
+	def find_dir_win32(self,lst):
+		if type(lst)is types.StringType:
+			lst=Utils.split_path(lst)
+		current=self
+		for name in lst:
+			self.__class__.bld.rescan(current)
+			prev=current
+			if not current.parent and name==current.name:
+				continue
+			if not name:
+				continue
+			elif name=='.':
+				continue
+			elif name=='..':
+				current=current.parent or current
+			else:
+				current=prev.childs.get(name,None)
+				if current is None:
+					if(name in self.__class__.bld.cache_dir_contents[prev.id]or(not prev.parent and name[1]==":")):
+						current=self.__class__(name,prev,DIR)
+					else:
+						return None
+		return current
+	Node.find_dir=find_dir_win32
+	def abspath_win32(self,env=None):
+		variant=self.variant(env)
+		ret=self.__class__.bld.cache_node_abspath[variant].get(self.id,None)
+		if ret:return ret
+		if not variant:
+			cur=self
+			lst=[]
+			while cur:
+				lst.append(cur.name)
+				cur=cur.parent
+			lst.reverse()
+			val=os.sep.join(lst)
+		else:
+			val=os.sep.join((self.__class__.bld.bldnode.abspath(),env.variant(),self.path_to_parent(self.__class__.bld.srcnode)))
+		if val.startswith("\\"):val=val[1:]
+		if val.startswith("\\"):val=val[1:]
+		self.__class__.bld.cache_node_abspath[variant][self.id]=val
+		return val
+	Node.abspath=abspath_win32
+class Nodu(Node):
+	pass
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Options.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Options.py
new file mode 100644
index 0000000..73d5a27
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Options.py
@@ -0,0 +1,126 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,imp,types,tempfile
+from optparse import OptionParser
+import Logs,Utils
+from Constants import*
+cmds='dist configure clean distclean build install uninstall check distcheck'.split()
+options={}
+commands={}
+launch_dir=''
+tooldir=''
+lockfile=os.environ.get('WAFLOCK','.lock-wscript')
+try:cache_global=os.path.abspath(os.environ['WAFCACHE'])
+except KeyError:cache_global=''
+platform=Utils.detect_platform()
+conf_file='conf-runs-%s-%d.pickle'%(platform,ABI)
+is_install=False
+default_prefix=os.environ.get('PREFIX')
+if not default_prefix:
+	if platform=='win32':default_prefix=tempfile.gettempdir()
+	else:default_prefix='/usr/local/'
+default_jobs=os.environ.get('JOBS',-1)
+if default_jobs<1:
+	try:
+		default_jobs=os.sysconf('SC_NPROCESSORS_ONLN')
+	except:
+		default_jobs=int(os.environ.get('NUMBER_OF_PROCESSORS',1))
+default_destdir=os.environ.get('DESTDIR','')
+def create_parser():
+	Logs.debug('options: create_parser is called')
+	parser=OptionParser(conflict_handler="resolve",usage="""waf [options] [commands ...]
+
+* Main commands: configure build install clean dist distclean uninstall distcheck
+* Example: ./waf build -j4""",version='waf %s'%WAFVERSION)
+	parser.formatter.width=Utils.get_term_cols()
+	p=parser.add_option
+	p('-j','--jobs',type='int',default=default_jobs,help="amount of parallel jobs [Default: %s]"%default_jobs,dest='jobs')
+	p('-f','--force',action='store_true',default=False,help='force file installation',dest='force')
+	p('-k','--keep',action='store_true',default=False,help='keep running happily on independent task groups',dest='keep')
+	p('-p','--progress',action='count',default=0,help='-p: progress bar; -pp: ide output',dest='progress_bar')
+	p('-v','--verbose',action='count',default=0,help='verbosity level -v -vv or -vvv [Default: 0]',dest='verbose')
+	p('--destdir',help="installation root [Default: '%s']"%default_destdir,default=default_destdir,dest='destdir')
+	p('--nocache',action='store_true',default=False,help='compile everything, even if WAFCACHE is set',dest='nocache')
+	if'configure'in sys.argv:
+		p('-b','--blddir',action='store',default='',help='build dir for the project (configuration)',dest='blddir')
+		p('-s','--srcdir',action='store',default='',help='src dir for the project (configuration)',dest='srcdir')
+		p('--prefix',help="installation prefix (configuration only) [Default: '%s']"%default_prefix,default=default_prefix,dest='prefix')
+	p('--zones',action='store',default='',help='debugging zones (task_gen, deps, tasks, etc)',dest='zones')
+	p('--targets',action='store',default='',help='compile the targets given only [targets in CSV format, e.g. "target1,target2"]',dest='compile_targets')
+	return parser
+def parse_args_impl(parser,_args=None):
+	global options,commands
+	(options,args)=parser.parse_args(args=_args)
+	commands={}
+	for var in cmds:commands[var]=0
+	if len(args)==0:commands['build']=1
+	for arg in args:
+		arg=arg.strip()
+		if arg in cmds:
+			commands[arg]=True
+		else:
+			print'Error: Invalid command specified ',arg
+			parser.print_help()
+			sys.exit(1)
+	if commands['check']:
+		commands['build']=True
+	if commands['install']or commands['uninstall']:
+		global is_install
+		is_install=True
+	if options.keep:options.jobs=1
+	if options.jobs<1:options.jobs=1
+	Logs.verbose=options.verbose
+	Logs.init_log()
+	if options.zones:
+		Logs.zones=options.zones.split(',')
+		if not Logs.verbose:Logs.verbose=1
+	elif Logs.verbose==1:
+		Logs.zones=['runner']
+class Handler(object):
+	parser=None
+	def __init__(self):
+		self.parser=create_parser()
+		self.cwd=os.getcwd()
+		Handler.parser=self
+	def add_option(self,*kw,**kwargs):
+		self.parser.add_option(*kw,**kwargs)
+	def add_option_group(self,*args,**kwargs):
+		return self.parser.add_option_group(*args,**kwargs)
+	def get_option_group(self,opt_str):
+		return self.parser.get_option_group(opt_str)
+	def sub_options(self,dir,option_group=None):
+		try:
+			current=self.cwd
+			self.cwd=os.path.join(self.cwd,dir)
+			cur=os.path.join(self.cwd,WSCRIPT_FILE)
+			mod=Utils.load_module(cur)
+			if not hasattr(mod,'set_options'):
+				msg="the module %s has no set_options function;\n* make sure such a function is defined\n* run configure from the root of the project"%cur
+				raise Utils.WscriptError(msg)
+			else:
+				fun=mod.set_options
+			fun(option_group or self)
+		finally:
+			self.cwd=current
+	def tool_options(self,tool,tdir=None,option_group=None):
+		
+		if type(tool)is types.ListType:
+			for i in tool:self.tool_options(i,tdir,option_group)
+			return
+		if not tdir:tdir=tooldir
+		tdir=Utils.to_list(tdir)
+		try:
+			file,name,desc=imp.find_module(tool,tdir)
+		except ImportError:
+			raise Utils.WscriptError("no tool named '%s' found"%tool)
+		module=imp.load_module(tool,file,name,desc)
+		try:
+			fun=module.set_options
+		except AttributeError:
+			pass
+		else:
+			fun(option_group or self)
+	def parse_args(self,args=None):
+		parse_args_impl(self.parser,args)
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Runner.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Runner.py
new file mode 100644
index 0000000..923492e
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Runner.py
@@ -0,0 +1,145 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import sys,random,time,threading,Queue,traceback
+import Build,Utils,Logs,Options
+import pproc
+from Logs import debug,error
+from Constants import*
+GAP=15
+run_old=threading.Thread.run
+def run(*args,**kwargs):
+	try:
+		run_old(*args,**kwargs)
+	except(KeyboardInterrupt,SystemExit):
+		raise
+	except:
+		sys.excepthook(*sys.exc_info())
+threading.Thread.run=run
+class TaskConsumer(threading.Thread):
+	def __init__(self,m):
+		threading.Thread.__init__(self)
+		self.setDaemon(1)
+		self.master=m
+		self.start()
+	def run(self):
+		try:
+			self.loop()
+		except:
+			pass
+	def loop(self):
+		m=self.master
+		while 1:
+			tsk=m.ready.get()
+			if m.stop:
+				m.out.put(tsk)
+				continue
+			try:
+				tsk.generator.bld.printout(tsk.display())
+				if tsk.__class__.stat:ret=tsk.__class__.stat(tsk)
+				else:ret=tsk.call_run()
+			except Exception,e:
+				tsk.err_msg=Utils.ex_stack()
+				tsk.hasrun=EXCEPTION
+				m.error_handler(tsk)
+				m.out.put(tsk)
+				continue
+			if ret:
+				tsk.err_code=ret
+				tsk.hasrun=CRASHED
+			else:
+				try:
+					tsk.post_run()
+				except OSError:
+					tsk.hasrun=MISSING
+				else:
+					tsk.hasrun=SUCCESS
+			if tsk.hasrun!=SUCCESS:
+				m.error_handler(tsk)
+			m.out.put(tsk)
+class Parallel(object):
+	def __init__(self,bld,j=2):
+		self.numjobs=j
+		self.manager=bld.task_manager
+		self.total=self.manager.total()
+		self.outstanding=[]
+		self.maxjobs=sys.maxint
+		self.frozen=[]
+		self.ready=Queue.Queue(0)
+		self.out=Queue.Queue(0)
+		self.count=0
+		self.stuck=0
+		self.processed=1
+		self.consumers=None
+		self.stop=False
+		self.error=False
+	def get_next(self):
+		if not self.outstanding:
+			return None
+		return self.outstanding.pop(0)
+	def postpone(self,tsk):
+		if random.randint(0,1):
+			self.frozen.insert(0,tsk)
+		else:
+			self.frozen.append(tsk)
+	def refill_task_list(self):
+		while self.count>self.numjobs+GAP or self.count>self.maxjobs:
+			self.get_out()
+		while not self.outstanding:
+			if self.count:
+				self.get_out()
+			if self.frozen:
+				self.outstanding+=self.frozen
+				self.frozen=[]
+			elif not self.count:
+				(self.maxjobs,tmp)=self.manager.get_next_set()
+				if tmp:self.outstanding+=tmp
+				break
+	def get_out(self):
+		ret=self.out.get()
+		self.manager.add_finished(ret)
+		if not self.stop and getattr(ret,'more_tasks',None):
+			self.outstanding+=ret.more_tasks
+			self.total+=len(ret.more_tasks)
+		self.count-=1
+	def error_handler(self,tsk):
+		if not Options.options.keep:
+			self.stop=True
+		self.error=True
+	def start(self):
+		while not self.stop:
+			self.refill_task_list()
+			tsk=self.get_next()
+			if not tsk:
+				if self.count:
+					continue
+				else:
+					break
+			if tsk.hasrun:
+				self.processed+=1
+				self.manager.add_finished(tsk)
+			try:
+				st=tsk.runnable_status()
+			except Exception,e:
+				tsk.err_msg=Utils.ex_stack()
+				tsk.hasrun=EXCEPTION
+				self.processed+=1
+				self.error_handler(tsk)
+				self.manager.add_finished(tsk)
+				continue
+			if st==ASK_LATER:
+				self.postpone(tsk)
+			elif st==SKIP_ME:
+				self.processed+=1
+				tsk.hasrun=SKIPPED
+				self.manager.add_finished(tsk)
+			else:
+				tsk.position=(self.processed,self.total)
+				self.count+=1
+				self.ready.put(tsk)
+				self.processed+=1
+				if not self.consumers:
+					self.consumers=[TaskConsumer(self)for i in xrange(self.numjobs)]
+		assert(self.count==0 or self.stop)
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Scripting.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Scripting.py
new file mode 100644
index 0000000..bfb9cb7
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Scripting.py
@@ -0,0 +1,294 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,shutil,traceback,time
+import Utils,Configure,Build,Logs,Options,Environment
+from Logs import error,warn,info
+from Constants import*
+g_gz='bz2'
+def add_subdir(dir,bld):
+	try:bld.rescan(bld.path)
+	except OSError:raise Utils.WscriptError("No such directory "+bld.path.abspath())
+	old=bld.path
+	new=bld.path.find_dir(dir)
+	if new is None:
+		raise Utils.WscriptError("subdir not found (%s), restore is %s"%(dir,bld.path))
+	bld.path=new
+	try:
+		file_path=os.path.join(new.abspath(),WSCRIPT_BUILD_FILE)
+		file=open(file_path,'r')
+		exec file
+		if file:file.close()
+	except IOError:
+		file_path=os.path.join(new.abspath(),WSCRIPT_FILE)
+		module=Utils.load_module(file_path)
+		module.build(bld)
+	bld.path=old
+def configure():
+	tree=Build.BuildContext()
+	err='The %s is not given in %s:\n * define a top level attribute named "%s"\n * run waf configure --%s=xxx'
+	src=getattr(Options.options,SRCDIR,None)
+	if not src:src=getattr(Utils.g_module,SRCDIR,None)
+	if not src:raise Utils.WscriptError(err%(SRCDIR,os.path.abspath('.'),SRCDIR,SRCDIR))
+	src=os.path.abspath(src)
+	bld=getattr(Options.options,BLDDIR,None)
+	if not bld:bld=getattr(Utils.g_module,BLDDIR,None)
+	if not bld:raise Utils.WscriptError(err%(BLDDIR,os.path.abspath('.'),BLDDIR,BLDDIR))
+	bld=os.path.abspath(bld)
+	tree.load_dirs(src,bld,False)
+	conf=Configure.ConfigurationContext(srcdir=src,blddir=bld)
+	conf.sub_config('')
+	conf.store(tree)
+	env=Environment.Environment()
+	env[BLDDIR]=bld
+	env[SRCDIR]=src
+	env['argv']=sys.argv
+	env['hash']=conf.hash
+	env['files']=conf.files
+	env['commands']=Options.commands
+	env['options']=Options.options.__dict__
+	env.store(Options.lockfile)
+def prepare_impl(t,cwd,ver,wafdir):
+	Options.tooldir=[t]
+	Options.launch_dir=cwd
+	if'--version'in sys.argv:
+		opt_obj=Options.Handler()
+		opt_obj.parse_args()
+		sys.exit(0)
+	msg1='Waf: *** Nothing to do! Please run waf from a directory containing a file named "%s"'%WSCRIPT_FILE
+	build_dir_override=None
+	candidate=None
+	cwd=Options.launch_dir
+	lst=os.listdir(cwd)
+	search_for_candidate=True
+	if WSCRIPT_FILE in lst:
+		candidate=cwd
+	elif'configure'in sys.argv and not WSCRIPT_BUILD_FILE in lst:
+		calldir=os.path.abspath(os.path.dirname(sys.argv[0]))
+		if WSCRIPT_FILE in os.listdir(calldir):
+			candidate=calldir
+			search_for_candidate=False
+		else:
+			error("arg[0] directory does not contain a wscript file")
+			sys.exit(1)
+		build_dir_override=cwd
+	while search_for_candidate:
+		if len(cwd)<=3:
+			break
+		dirlst=os.listdir(cwd)
+		if WSCRIPT_FILE in dirlst:
+			candidate=cwd
+		if'configure'in sys.argv and candidate:
+			break
+		if Options.lockfile in dirlst:
+			break
+		cwd=cwd[:cwd.rfind(os.sep)]
+	if not candidate:
+		if'-h'in sys.argv or'--help'in sys.argv:
+			warn('No wscript file found: the help message may be incomplete')
+			opt_obj=Options.Handler()
+			opt_obj.parse_args()
+		else:
+			error(msg1)
+		sys.exit(0)
+	os.chdir(candidate)
+	Utils.set_main_module(os.path.join(candidate,WSCRIPT_FILE))
+	if build_dir_override:
+		d=getattr(Utils.g_module,BLDDIR,None)
+		if d:
+			msg=' Overriding build directory %s with %s'%(d,build_dir_override)
+			warn(msg)
+		Utils.g_module.blddir=build_dir_override
+	opt_obj=Options.Handler()
+	opt_obj.sub_options('')
+	opt_obj.parse_args()
+	fun=getattr(Utils.g_module,'init',None)
+	if fun:fun()
+	for x in['dist','distclean','distcheck']:
+		if Options.commands[x]:
+			fun=getattr(Utils.g_module,x,None)
+			if fun:
+				fun()
+			else:
+				eval(x+'()')
+			sys.exit(0)
+	main()
+def prepare(t,cwd,ver,wafdir):
+	if WAFVERSION!=ver:
+		msg='Version mismatch: waf %s <> wafadmin %s (wafdir %s)'%(ver,WAFVERSION,wafdir)
+		print'\033[91mError: %s\033[0m'%msg
+		sys.exit(1)
+	try:
+		prepare_impl(t,cwd,ver,wafdir)
+	except Utils.WafError,e:
+		error(e)
+		sys.exit(1)
+def main():
+	if Options.commands['configure']:
+		ini=time.time()
+		configure()
+		ela=''
+		if not Options.options.progress_bar:ela=time.strftime(' (%H:%M:%S)',time.gmtime(time.time()-ini))
+		info('Configuration finished successfully%s; project is now ready to build.'%ela)
+		sys.exit(0)
+	bld=Build.BuildContext()
+	try:
+		proj=Environment.Environment(Options.lockfile)
+	except IOError:
+		if Options.commands['clean']:
+			raise Utils.WafError("Nothing to clean (project not configured)")
+		else:
+			if Configure.autoconfig:
+				warn("Reconfiguring the project")
+				configure()
+				bld=Build.BuildContext()
+				proj=Environment.Environment(Options.lockfile)
+			else:
+				raise Utils.WafError("Project not configured (run 'waf configure' first)")
+	if Configure.autoconfig:
+		if not Options.commands['clean']and not Options.commands['uninstall']:
+			reconf=0
+			h=0
+			try:
+				for file in proj['files']:
+					mod=Utils.load_module(file)
+					h=Utils.hash_function_with_globals(h,mod.configure)
+				reconf=(h!=proj['hash'])
+			except Exception,ex:
+				warn("Reconfiguring the project (an exception occurred: %s)"%(str(ex),))
+				reconf=1
+			if reconf:
+				warn("Reconfiguring the project (the configuration has changed)")
+				back=(Options.commands,Options.options,Logs.zones,Logs.verbose)
+				Options.commands=proj['commands']
+				Options.options.__dict__=proj['options']
+				configure()
+				(Options.commands,Options.options,Logs.zones,Logs.verbose)=back
+				bld=Build.BuildContext()
+				proj=Environment.Environment(Options.lockfile)
+	bld.load_dirs(proj[SRCDIR],proj[BLDDIR])
+	bld.load_envs()
+	f=getattr(Utils.g_module,'build',None)
+	if f:
+		f(bld)
+	else:
+		main_wscript=None
+		for(file_path,module)in Utils.g_loaded_modules.items():
+			if module.__name__=='wscript_main':
+				main_wscript=file_path
+				break
+		raise Utils.WscriptError("Could not find the function 'def build(bld).'",main_wscript)
+	pre_build=getattr(Utils.g_module,'pre_build',None)
+	if pre_build:pre_build()
+	if Options.commands['build']or Options.is_install:
+		if Options.commands['uninstall']:
+			import Task
+			def runnable_status(self):
+				return SKIP_ME
+			setattr(Task.Task,'runnable_status',runnable_status)
+		ini=time.time()
+		bld.compile()
+		if Options.options.progress_bar:print''
+		if Options.is_install:
+			bld.install()
+		ela=''
+		if not Options.options.progress_bar:
+			ela=time.strftime(' (%H:%M:%S)',time.gmtime(time.time()-ini))
+		if Options.commands['install']:msg='Compilation and installation finished successfully%s'%ela
+		elif Options.commands['uninstall']:msg='Uninstallation finished successfully%s'%ela
+		else:msg='Compilation finished successfully%s'%ela
+		info(msg)
+	if Options.commands['clean']:
+		try:
+			bld.clean()
+			info('Cleaning finished successfully')
+		finally:
+			bld.save()
+	fun=getattr(Utils.g_module,'shutdown',None)
+	if fun:fun()
+excludes='.bzr .bzrignore .git .gitignore .svn CVS .cvsignore .arch-ids {arch} SCCS BitKeeper .hg Makefile Makefile.in config.log'.split()
+dist_exts='~ .rej .orig .pyc .pyo .bak .tar.bz2 tar.gz .zip'.split()
+def dont_dist(name,src,build_dir):
+	global excludes,dist_exts
+	if(name.startswith(',,')or name.startswith('++')or(src=='.'and name==Options.lockfile)or name in excludes or name==build_dir):
+		return True
+	for ext in dist_exts:
+		if name.endswith(ext):
+			return True
+	return False
+def copytree(src,dst,build_dir):
+	names=os.listdir(src)
+	os.makedirs(dst)
+	for name in names:
+		srcname=os.path.join(src,name)
+		dstname=os.path.join(dst,name)
+		if dont_dist(name,src,build_dir):
+			continue
+		if os.path.isdir(srcname):
+			copytree(srcname,dstname,build_dir)
+		else:
+			shutil.copy2(srcname,dstname)
+def distclean():
+	lst=os.listdir('.')
+	for f in lst:
+		if f==Options.lockfile:
+			try:
+				proj=Environment.Environment(f)
+				shutil.rmtree(proj[BLDDIR])
+			except(OSError,IOError):
+				pass
+			try:
+				os.remove(f)
+			except(OSError,IOError):
+				pass
+		if f.startswith('.waf-'):
+			shutil.rmtree(f,ignore_errors=True)
+	info('distclean finished successfully')
+def dist(appname='',version=''):
+	import tarfile
+	if not appname:appname=getattr(Utils.g_module,APPNAME,'noname')
+	if not version:version=getattr(Utils.g_module,VERSION,'1.0')
+	tmp_folder=appname+'-'+version
+	arch_name=tmp_folder+'.tar.'+g_gz
+	try:
+		shutil.rmtree(tmp_folder)
+	except(OSError,IOError):
+		pass
+	try:
+		os.remove(arch_name)
+	except(OSError,IOError):
+		pass
+	copytree('.',tmp_folder,getattr(Utils.g_module,BLDDIR,None))
+	dist_hook=getattr(Utils.g_module,'dist_hook',None)
+	if dist_hook:
+		os.chdir(tmp_folder)
+		try:
+			dist_hook()
+		finally:
+			os.chdir('..')
+	tar=tarfile.open(arch_name,'w:'+g_gz)
+	tar.add(tmp_folder)
+	tar.close()
+	info('Your archive is ready -> %s'%arch_name)
+	if os.path.exists(tmp_folder):shutil.rmtree(tmp_folder)
+	return arch_name
+def distcheck(appname='',version=''):
+	import tempfile,tarfile
+	import pproc
+	if not appname:appname=getattr(Utils.g_module,APPNAME,'noname')
+	if not version:version=getattr(Utils.g_module,VERSION,'1.0')
+	waf=os.path.abspath(sys.argv[0])
+	tarball=dist(appname,version)
+	t=tarfile.open(tarball)
+	for x in t:t.extract(x)
+	t.close()
+	instdir=tempfile.mkdtemp('.inst','%s-%s'%(appname,version))
+	cwd_before=os.getcwd()
+	retval=pproc.Popen('%(waf)s configure && %(waf)s ''&& %(waf)s check && %(waf)s install --destdir=%(instdir)s'' && %(waf)s uninstall --destdir=%(instdir)s'%vars(),shell=True).wait()
+	if retval:
+		raise Utils.WafError('distcheck failed with code %i'%(retval))
+	if os.path.exists(instdir):
+		raise Utils.WafError("distcheck succeeded, but files were left in %s"%(instdir))
+	else:
+		info('distcheck finished successfully')
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Task.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Task.py
new file mode 100644
index 0000000..3ff4bb1
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Task.py
@@ -0,0 +1,539 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import os,types,shutil,sys,re,new,random,time
+from Utils import md5
+import Build,Runner,Utils,Node,Logs,Options
+from Logs import debug,error,warn
+from Constants import*
+algotype=NORMAL
+class TaskManager(object):
+	def __init__(self):
+		self.groups=[]
+		self.tasks_done=[]
+		self.current_group=0
+	def get_next_set(self):
+		ret=None
+		while not ret and self.current_group<len(self.groups):
+			ret=self.groups[self.current_group].get_next_set()
+			if ret:return ret
+			else:self.current_group+=1
+		return(None,None)
+	def add_group(self):
+		if self.groups and not self.groups[0].tasks:
+			warn('add_group: an empty group is already present')
+		self.groups.append(TaskGroup())
+	def add_task(self,task):
+		if not self.groups:self.add_group()
+		self.groups[-1].add_task(task)
+	def total(self):
+		total=0
+		if not self.groups:return 0
+		for group in self.groups:
+			total+=len(group.tasks)
+		return total
+	def add_finished(self,tsk):
+		self.tasks_done.append(tsk)
+		bld=tsk.generator.bld
+		if Options.is_install:
+			f=None
+			if'install'in tsk.__dict__:
+				f=tsk.__dict__['install']
+				f(tsk)
+			else:
+				tsk.install()
+class TaskGroup(object):
+	def __init__(self):
+		self.tasks=[]
+		self.cstr_groups={}
+		self.cstr_order={}
+		self.temp_tasks=[]
+		self.ready=0
+	def reset(self):
+		for x in self.cstr_groups:
+			self.tasks+=self.cstr_groups[x]
+		self.tasks=self.temp_tasks+self.tasks
+		self.temp_tasks=[]
+		self.cstr_groups=[]
+		self.cstr_order={}
+		self.ready=0
+	def prepare(self):
+		self.ready=1
+		self.make_cstr_groups()
+		self.extract_constraints()
+	def get_next_set(self):
+		global algotype
+		if algotype==NORMAL:
+			tasks=self.tasks_in_parallel()
+			maxj=sys.maxint
+		elif algotype==JOBCONTROL:
+			(maxj,tasks)=self.tasks_by_max_jobs()
+		elif algotype==MAXPARALLEL:
+			tasks=self.tasks_with_inner_constraints()
+			maxj=sys.maxint
+		else:
+			raise Utils.WafError("unknown algorithm type %s"%(algotype))
+		if not tasks:return()
+		return(maxj,tasks)
+	def make_cstr_groups(self):
+		self.cstr_groups={}
+		for x in self.tasks:
+			h=x.hash_constraints()
+			try:self.cstr_groups[h].append(x)
+			except KeyError:self.cstr_groups[h]=[x]
+	def add_task(self,task):
+		try:self.tasks.append(task)
+		except KeyError:self.tasks=[task]
+	def set_order(self,a,b):
+		try:self.cstr_order[a].add(b)
+		except KeyError:self.cstr_order[a]=set([b,])
+	def compare_exts(self,t1,t2):
+		x="ext_in"
+		y="ext_out"
+		in_=t1.attr(x,())
+		out_=t2.attr(y,())
+		for k in in_:
+			if k in out_:
+				return-1
+		in_=t2.attr(x,())
+		out_=t1.attr(y,())
+		for k in in_:
+			if k in out_:
+				return 1
+		return 0
+	def compare_partial(self,t1,t2):
+		m="after"
+		n="before"
+		name=t2.__class__.__name__
+		if name in t1.attr(m,()):return-1
+		elif name in t1.attr(n,()):return 1
+		name=t1.__class__.__name__
+		if name in t2.attr(m,()):return 1
+		elif name in t2.attr(n,()):return-1
+		return 0
+	def extract_constraints(self):
+		keys=self.cstr_groups.keys()
+		max=len(keys)
+		for i in xrange(max):
+			t1=self.cstr_groups[keys[i]][0]
+			for j in xrange(i+1,max):
+				t2=self.cstr_groups[keys[j]][0]
+				val=(self.compare_exts(t1,t2)or self.compare_partial(t1,t2))
+				if val>0:
+					self.set_order(keys[i],keys[j])
+				elif val<0:
+					self.set_order(keys[j],keys[i])
+	def tasks_in_parallel(self):
+		if not self.ready:self.prepare()
+		keys=self.cstr_groups.keys()
+		unconnected=[]
+		remainder=[]
+		for u in keys:
+			for k in self.cstr_order.values():
+				if u in k:
+					remainder.append(u)
+					break
+			else:
+				unconnected.append(u)
+		toreturn=[]
+		for y in unconnected:
+			toreturn.extend(self.cstr_groups[y])
+		for y in unconnected:
+			try:self.cstr_order.__delitem__(y)
+			except KeyError:pass
+			self.cstr_groups.__delitem__(y)
+		if not toreturn and remainder:
+			raise Utils.WafError("circular order constraint detected %r"%remainder)
+		return toreturn
+	def tasks_by_max_jobs(self):
+		if not self.ready:self.prepare()
+		if not self.temp_tasks:self.temp_tasks=self.tasks_in_parallel()
+		if not self.temp_tasks:return(None,None)
+		maxjobs=sys.maxint
+		ret=[]
+		remaining=[]
+		for t in self.temp_tasks:
+			m=getattr(t,"maxjobs",getattr(self.__class__,"maxjobs",sys.maxint))
+			if m>maxjobs:
+				remaining.append(t)
+			elif m<maxjobs:
+				remaining+=ret
+				ret=[t]
+				maxjobs=m
+			else:
+				ret.append(t)
+		self.temp_tasks=remaining
+		return(maxjobs,ret)
+	def tasks_with_inner_constraints(self):
+		if not self.ready:self.prepare()
+		if getattr(self,"done",None):return None
+		for p in self.cstr_order:
+			for v in self.cstr_order[p]:
+				for m in self.cstr_groups[p]:
+					for n in self.cstr_groups[v]:
+						n.set_run_after(m)
+		self.cstr_order={}
+		self.cstr_groups={}
+		self.done=1
+		return self.tasks[:]
+class store_task_type(type):
+	def __init__(cls,name,bases,dict):
+		super(store_task_type,cls).__init__(name,bases,dict)
+		name=cls.__name__
+		if name.endswith('_task'):
+			name=name.replace('_task','')
+			TaskBase.classes[name]=cls
+class TaskBase(object):
+	__metaclass__=store_task_type
+	color="GREEN"
+	maxjobs=sys.maxint
+	classes={}
+	stat=None
+	def __init__(self,*k,**kw):
+		self.hasrun=NOT_RUN
+		try:
+			self.generator=kw['generator']
+		except KeyError:
+			self.generator=self
+			self.bld=Build.bld
+		if kw.get('normal',1):
+			self.generator.bld.task_manager.add_task(self)
+	def __repr__(self):
+		return'\n\t{task: %s %s}'%(self.__class__.__name__,str(getattr(self,"fun","")))
+	def __str__(self):
+		try:self.fun
+		except AttributeError:return self.__class__.__name__+'\n'
+		else:return'executing: %s\n'%self.fun.__name__
+	def runnable_status(self):
+		return RUN_ME
+	def can_retrieve_cache(self):
+		return False
+	def call_run(self):
+		if self.can_retrieve_cache():
+			return 0
+		return self.run()
+	def run(self):
+		try:fun=self.fun
+		except:return 0
+		return fun(self)
+	def post_run(self):
+		pass
+	def display(self):
+		col1=Logs.colors(self.color)
+		col2=Logs.colors.NORMAL
+		if Options.options.progress_bar==1:
+			return self.generator.bld.progress_line(self.position[0],self.position[1],col1,col2)
+		if Options.options.progress_bar==2:
+			try:ini=self.generator.bld.ini
+			except AttributeError:ini=self.generator.bld.ini=time.time()
+			ela=time.strftime('%H:%M:%S',time.gmtime(time.time()-ini))
+			ins=','.join([n.name for n in self.inputs])
+			outs=','.join([n.name for n in self.outputs])
+			return'|Total %s|Current %s|Inputs %s|Outputs %s|Time %s|\n'%(self.position[1],self.position[0],ins,outs,ela)
+		total=self.position[1]
+		n=len(str(total))
+		fs='[%%%dd/%%%dd] %%s%%s%%s'%(n,n)
+		return fs%(self.position[0],self.position[1],col1,str(self),col2)
+	def attr(self,att,default=None):
+		return getattr(self,att,getattr(self.__class__,att,default))
+	def hash_constraints(self):
+		sum=0
+		names=('before','after','ext_in','ext_out')
+		sum=hash((sum,self.__class__.__name__,))
+		for x in names:
+			sum=hash((sum,str(self.attr(x,sys.maxint)),))
+		sum=hash((sum,self.__class__.maxjobs))
+		return sum
+	def format_error(self):
+		if getattr(self,"error_msg",None):
+			return self.error_msg
+		elif self.hasrun==CRASHED:
+			try:
+				return" -> task failed (err #%d): %r"%(self.err_code,self)
+			except AttributeError:
+				return" -> task failed: %r"%self
+		elif self.hasrun==EXCEPTION:
+			return self.err_msg
+		elif self.hasrun==MISSING:
+			return" -> missing files: %r"%self
+		else:
+			return''
+	def install(self):
+		bld=self.generator.bld
+		d=self.attr('install')
+		if self.attr('install_path'):
+			lst=[a.relpath_gen(bld.srcnode)for a in self.outputs]
+			perm=self.attr('chmod',0644)
+			if self.attr('src'):
+				lst+=[a.relpath_gen(bld.srcnode)for a in self.inputs]
+			if self.attr('filename'):
+				dir=self.install_path+self.attr('filename')
+				bld.install_as(self.install_path,lst[0],self.env,perm)
+			else:
+				bld.install_files(self.install_path,lst,self.env,perm)
+class Task(TaskBase):
+	vars=[]
+	def __init__(self,env,**kw):
+		TaskBase.__init__(self,**kw)
+		self.env=env
+		self.inputs=[]
+		self.outputs=[]
+		self.deps_nodes=[]
+		self.run_after=[]
+	def __str__(self):
+		env=self.env
+		src_str=' '.join([a.nice_path(env)for a in self.inputs])
+		tgt_str=' '.join([a.nice_path(env)for a in self.outputs])
+		return'%s: %s -> %s\n'%(self.__class__.__name__,src_str,tgt_str)
+	def __repr__(self):
+		return"".join(['\n\t{task: ',self.__class__.__name__," ",",".join([x.name for x in self.inputs])," -> ",",".join([x.name for x in self.outputs]),'}'])
+	def unique_id(self):
+		try:
+			return self.uid
+		except AttributeError:
+			m=md5()
+			up=m.update
+			up(self.env.variant())
+			for x in self.inputs+self.outputs:
+				up(x.abspath())
+			up(self.__class__.__name__)
+			up(Utils.h_fun(self.run))
+			self.uid=m.digest()
+			return self.uid
+	def set_inputs(self,inp):
+		if type(inp)is types.ListType:self.inputs+=inp
+		else:self.inputs.append(inp)
+	def set_outputs(self,out):
+		if type(out)is types.ListType:self.outputs+=out
+		else:self.outputs.append(out)
+	def set_run_after(self,task):
+		assert isinstance(task,TaskBase)
+		self.run_after.append(task)
+	def add_file_dependency(self,filename):
+		node=self.generator.bld.current.find_resource(filename)
+		self.deps_nodes.append(node)
+	def signature(self):
+		try:return self.cache_sig[0]
+		except AttributeError:pass
+		m=md5()
+		exp_sig=self.sig_explicit_deps()
+		m.update(exp_sig)
+		imp_sig=self.scan and self.sig_implicit_deps()or SIG_NIL
+		m.update(imp_sig)
+		var_sig=self.sig_vars()
+		m.update(var_sig)
+		ret=m.digest()
+		self.cache_sig=(ret,exp_sig,imp_sig,var_sig)
+		return ret
+	def runnable_status(self):
+		if self.inputs and(not self.outputs):
+			if not getattr(self.__class__,'quiet',None):
+				error("task is invalid : no inputs or outputs (override in a Task subclass?) %r"%self)
+		for t in self.run_after:
+			if not t.hasrun:
+				return ASK_LATER
+		env=self.env
+		bld=self.generator.bld
+		time=None
+		for node in self.outputs:
+			variant=node.variant(env)
+			try:
+				time=bld.node_sigs[variant][node.id]
+			except KeyError:
+				debug("task: task %r must run as the first node does not exist"%self)
+				time=None
+				break
+		if time is None:
+			try:
+				new_sig=self.signature()
+			except KeyError:
+				debug("task: something is wrong, computing the task signature failed")
+				return RUN_ME
+			return RUN_ME
+		key=self.unique_id()
+		try:
+			prev_sig=bld.task_sigs[key][0]
+		except KeyError:
+			debug("task: task %r must run as it was never run before or the task code changed"%self)
+			return RUN_ME
+		new_sig=self.signature()
+		if Logs.verbose:self.debug_why(bld.task_sigs[key])
+		if new_sig!=prev_sig:
+			return RUN_ME
+		return SKIP_ME
+	def post_run(self):
+		bld=self.generator.bld
+		env=self.env
+		sig=self.signature()
+		cnt=0
+		for node in self.outputs:
+			variant=node.variant(env)
+			os.stat(node.abspath(env))
+			bld.node_sigs[variant][node.id]=sig
+			if Options.cache_global:
+				ssig=sig.encode('hex')
+				dest=os.path.join(Options.cache_global,ssig+'-'+str(cnt))
+				try:shutil.copy2(node.abspath(env),dest)
+				except IOError:warn('Could not write the file to the cache')
+				cnt+=1
+		bld.task_sigs[self.unique_id()]=self.cache_sig
+		self.executed=1
+	def can_retrieve_cache(self):
+		if not Options.cache_global:return None
+		if Options.options.nocache:return None
+		env=self.env
+		sig=self.signature()
+		cnt=0
+		for node in self.outputs:
+			variant=node.variant(env)
+			ssig=sig.encode('hex')
+			orig=os.path.join(Options.cache_global,ssig+'-'+str(cnt))
+			try:
+				shutil.copy2(orig,node.abspath(env))
+				os.utime(orig,None)
+			except(OSError,IOError):
+				debug('task: failed retrieving file')
+				return None
+			else:
+				cnt+=1
+				self.generator.bld.node_sigs[variant][node.id]=sig
+				self.generator.bld.printout('restoring from cache %r\n'%node.bldpath(env))
+		return 1
+	def debug_why(self,old_sigs):
+		new_sigs=self.cache_sig
+		def v(x):
+			return x.encode('hex')
+		debug("Task %r"%self)
+		msgs=['Task must run','* Source file or manual dependency','* Implicit dependency','* Environment variable']
+		tmp='task: -> %s: %s %s'
+		for x in xrange(len(msgs)):
+			if(new_sigs[x]!=old_sigs[x]):
+				debug(tmp%(msgs[x],v(old_sigs[x]),v(new_sigs[x])))
+	def sig_explicit_deps(self):
+		bld=self.generator.bld
+		m=md5()
+		for x in self.inputs:
+			variant=x.variant(self.env)
+			m.update(bld.node_sigs[variant][x.id])
+		for x in getattr(self,'dep_nodes',[]):
+			variant=x.variant(self.env)
+			v=bld.node_sigs[variant][x.id]
+			m.update(v)
+		try:
+			additional_deps=bld.deps_man
+		except AttributeError:
+			pass
+		else:
+			for x in self.inputs+self.outputs:
+				try:
+					d=additional_deps[x.id]
+				except KeyError:
+					continue
+				if callable(d):
+					d=d()
+				for v in d:
+					if isinstance(v,Node.Node):
+						bld.rescan(v.parent)
+						variant=v.variant(self.env)
+						try:
+							v=bld.node_sigs[variant][v.id]
+						except KeyError:
+							v=''
+					m.update(v)
+		return m.digest()
+	def sig_vars(self):
+		m=md5()
+		bld=self.generator.bld
+		env=self.env
+		act_sig=bld.hash_env_vars(env,self.__class__.vars)
+		m.update(act_sig)
+		var_sig=SIG_NIL
+		dep_vars=getattr(self,'dep_vars',None)
+		if dep_vars:
+			var_sig=bld.hash_env_vars(env,dep_vars)
+			m.update(var_sig)
+		for x in getattr(self.__class__,'vars',()):
+			k=env[x]
+			if k:
+				m.update(str(k))
+				vars_sig=hash((var_sig,str(k)))
+		return m.digest()
+	scan=None
+	def sig_implicit_deps(self):
+		bld=self.generator.bld
+		key=self.unique_id()
+		prev_sigs=bld.task_sigs.get(key,())
+		if prev_sigs:
+			try:
+				if prev_sigs[2]==self.compute_sig_implicit_deps():
+					return prev_sigs[2]
+			except KeyError:
+				pass
+		(nodes,names)=self.scan()
+		if Logs.verbose and Logs.zones:
+			debug('deps: scanner for %s returned %s %s'%(str(self),str(nodes),str(names)))
+		bld.node_deps[self.unique_id()]=nodes
+		bld.raw_deps[self.unique_id()]=names
+		sig=self.compute_sig_implicit_deps()
+		return sig
+	def compute_sig_implicit_deps(self):
+		m=md5()
+		upd=m.update
+		bld=self.generator.bld
+		tstamp=bld.node_sigs
+		env=self.env
+		for k in bld.node_deps.get(self.unique_id(),())+self.inputs:
+			if not k.parent.id in bld.cache_scanned_folders:
+				bld.rescan(k.parent)
+			if k.id&3==Node.FILE:
+				upd(tstamp[0][k.id])
+			else:
+				upd(tstamp[env.variant()][k.id])
+		return m.digest()
+def funex(c):
+	exec(c)
+	return f
+reg_act=re.compile(r"(?P<dollar>\$\$)|(?P<subst>\$\{(?P<var>\w+)(?P<code>.*?)\})",re.M)
+def compile_fun(name,line):
+	extr=[]
+	def repl(match):
+		g=match.group
+		if g('dollar'):return"$"
+		elif g('subst'):extr.append((g('var'),g('code')));return"%s"
+		return None
+	line=reg_act.sub(repl,line)
+	parm=[]
+	dvars=[]
+	app=parm.append
+	for(var,meth)in extr:
+		if var=='SRC':
+			if meth:app('task.inputs%s'%meth)
+			else:app('" ".join([a.srcpath(env) for a in task.inputs])')
+		elif var=='TGT':
+			if meth:app('task.outputs%s'%meth)
+			else:app('" ".join([a.bldpath(env) for a in task.outputs])')
+		else:
+			if not var in dvars:dvars.append(var)
+			app("p('%s')"%var)
+	if parm:parm="%% (%s) "%(',\n\t\t'.join(parm))
+	else:parm=''
+	c='''
+def f(task):
+	env = task.env
+	p = env.get_flat
+	cmd = "%s" %s
+	return task.generator.bld.exec_command(cmd)
+'''%(line,parm)
+	debug('action: %s'%c)
+	return(funex(c),dvars)
+def simple_task_type(name,line,color='GREEN',vars=[],ext_in=[],ext_out=[],before=[],after=[]):
+	(fun,dvars)=compile_fun(name,line)
+	fun.code=line
+	return task_type_from_func(name,fun,vars or dvars,color,ext_in,ext_out,before,after)
+def task_type_from_func(name,func,vars=[],color='GREEN',ext_in=[],ext_out=[],before=[],after=[]):
+	params={'run':func,'vars':vars,'color':color,'name':name,'ext_in':Utils.to_list(ext_in),'ext_out':Utils.to_list(ext_out),'before':Utils.to_list(before),'after':Utils.to_list(after),}
+	cls=new.classobj(name,(Task,),params)
+	TaskBase.classes[name]=cls
+	return cls
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/TaskGen.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/TaskGen.py
new file mode 100644
index 0000000..9d35de1
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/TaskGen.py
@@ -0,0 +1,288 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import os,types,traceback,copy
+import Build,Task,Utils,Logs,Options
+from Logs import debug,error,warn
+from Constants import*
+typos={'sources':'source','targets':'target','include':'includes','define':'defines','importpath':'importpaths','install_var':'install_path','install_subdir':'install_path','inst_var':'install_path','inst_dir':'install_path',}
+class register_obj(type):
+	def __init__(cls,name,bases,dict):
+		super(register_obj,cls).__init__(name,bases,dict)
+		name=cls.__name__
+		suffix='_taskgen'
+		if name.endswith(suffix):
+			task_gen.classes[name.replace(suffix,'')]=cls
+class task_gen(object):
+	__metaclass__=register_obj
+	mappings={}
+	mapped={}
+	prec={}
+	traits={}
+	classes={}
+	idx={}
+	def __init__(self,*kw,**kwargs):
+		self.prec={}
+		self.source=''
+		self.target=''
+		self.meths=[]
+		self.mappings={}
+		self.features=list(kw)
+		self.tasks=[]
+		self.default_chmod=0644
+		self.default_install_path=None
+		if Options.is_install:
+			self.inst_files=[]
+		self.allnodes=[]
+		self.bld=kwargs.get('bld',Build.bld)
+		self.env=self.bld.env.copy()
+		self.path=self.bld.path
+		self.name=''
+		self.bld.all_task_gen.append(self)
+		self.idx=task_gen.idx[self.path.id]=task_gen.idx.get(self.path.id,0)+1
+		for key,val in kwargs.iteritems():
+			setattr(self,key,val)
+	def __str__(self):
+		return("<task_gen '%s' of type %s defined in %s>"%(self.name or self.target,self.__class__.__name__,str(self.path)))
+	def __setattr__(self,name,attr):
+		real=typos.get(name,name)
+		if real!=name:
+			warn('typo %s -> %s'%(name,real))
+			if Logs.verbose>0:
+				traceback.print_stack()
+		object.__setattr__(self,real,attr)
+	def to_list(self,value):
+		if type(value)is types.StringType:return value.split()
+		else:return value
+	def apply_core(self):
+		find_resource=self.path.find_resource
+		for filename in self.to_list(self.source):
+			x=self.get_hook(filename)
+			if x:
+				x(self,filename)
+			else:
+				node=find_resource(filename)
+				if not node:raise Utils.WafError("source not found: '%s' in '%s'"%(filename,str(self.path)))
+				self.allnodes.append(node)
+		for node in self.allnodes:
+			filename=node.name
+			k=max(0,filename.rfind('.'))
+			x=self.get_hook(filename[k:])
+			if not x:
+				raise Utils.WafError("Do not know how to process %s in %s, mappings are %s"%(str(node),str(self.__class__),str(self.__class__.mappings)))
+			x(self,node)
+	def apply(self):
+		keys=set(self.meths)
+		self.features=Utils.to_list(self.features)
+		for x in self.features+['*']:
+			keys.update(task_gen.traits.get(x,()))
+		prec={}
+		prec_tbl=self.prec or task_gen.prec
+		for x in prec_tbl:
+			if x in keys:
+				prec[x]=prec_tbl[x]
+		tmp=[]
+		for a in keys:
+			for x in prec.values():
+				if a in x:break
+			else:
+				tmp.append(a)
+		out=[]
+		while tmp:
+			e=tmp.pop()
+			if e in keys:out.append(e)
+			try:
+				nlst=prec[e]
+			except KeyError:
+				pass
+			else:
+				del prec[e]
+				for x in nlst:
+					for y in prec:
+						if x in prec[y]:
+							break
+					else:
+						tmp.append(x)
+		if prec:raise Utils.WafError("graph has a cycle %s"%str(prec))
+		out.reverse()
+		self.meths=out
+		if not out:out.append(self.apply_core.__name__)
+		debug('task_gen: posting %s %d'%(self,id(self)))
+		for x in out:
+			try:
+				v=getattr(self,x)
+			except AttributeError:
+				raise Utils.WafError("tried to retrieve %s which is not a valid method"%x)
+			debug('task_gen: -> %s (%d)'%(x,id(self)))
+			v()
+	def post(self):
+		if not self.name:self.name=self.target
+		if getattr(self,'posted',None):
+			return
+		self.apply()
+		debug('task_gen: posted %s'%self.name)
+		self.posted=True
+	def get_hook(self,ext):
+		try:return self.mappings[ext]
+		except KeyError:
+			try:return task_gen.mappings[ext]
+			except KeyError:return None
+	def create_task(self,name,env=None):
+		task=Task.TaskBase.classes[name](env or self.env,generator=self)
+		self.tasks.append(task)
+		return task
+	def name_to_obj(self,name):
+		return self.bld.name_to_obj(name,self.env)
+	def find_sources_in_dirs(self,dirnames,excludes=[],exts=[]):
+		lst=[]
+		err_msg="'%s' attribute must be a list.\n""Directories should be given either as a string separated by spaces, or as a list."
+		not_a_list=lambda x:x and type(x)is not types.ListType
+		if not_a_list(excludes):
+			raise Utils.WscriptError(err_msg%'excludes')
+		if not_a_list(exts):
+			raise Utils.WscriptError(err_msg%'exts')
+		dirnames=self.to_list(dirnames)
+		ext_lst=exts or self.mappings.keys()+task_gen.mappings.keys()
+		for name in dirnames:
+			anode=self.path.find_dir(name)
+			if not anode or not anode.is_child_of(self.bld.srcnode):
+				raise Utils.WscriptError("Unable to use '%s' - either because it's not a relative path"", or it's not child of '%s'."%(name,self.bld.srcnode))
+			self.bld.rescan(anode)
+			for name in self.bld.cache_dir_contents[anode.id]:
+				(base,ext)=os.path.splitext(name)
+				if ext in ext_lst and not name in lst and not name in excludes:
+					lst.append((anode.relpath_gen(self.path)or'.')+os.path.sep+name)
+		lst.sort()
+		self.source=self.to_list(self.source)
+		if not self.source:self.source=lst
+		else:self.source+=lst
+	def clone(self,env):
+		newobj=task_gen(bld=self.bld)
+		for x in self.__dict__:
+			if x in["env"]:
+				continue
+			elif x in["path","features"]:
+				setattr(newobj,x,getattr(self,x))
+			else:
+				setattr(newobj,x,copy.copy(getattr(self,x)))
+		newobj.__class__=self.__class__
+		if type(env)is types.StringType:
+			newobj.env=self.bld.all_envs[env].copy()
+		else:
+			newobj.env=env.copy()
+		self.bld.all_task_gen.append(newobj)
+		return newobj
+	def get_inst_path(self):
+		return getattr(self,'_install_path',getattr(self,'default_install_path',''))
+	def set_inst_path(self,val):
+		self._install_path=val
+	install_path=property(get_inst_path,set_inst_path)
+	def get_chmod(self):
+		return getattr(self,'_chmod',getattr(self,'default_chmod',0644))
+	def set_chmod(self,val):
+		self._chmod=val
+	chmod=property(get_chmod,set_chmod)
+def declare_extension(var,func):
+	try:
+		for x in var:
+			task_gen.mappings[x]=func
+	except:
+		raise Utils.WscriptError('declare extension takes either a list or a string %s'%str(var))
+	task_gen.mapped[func.__name__]=func
+def declare_order(*k):
+	assert(len(k)>1)
+	n=len(k)-1
+	for i in xrange(n):
+		f1=k[i]
+		f2=k[i+1]
+		try:
+			if not f1 in task_gen.prec[f2]:task_gen.prec[f2].append(f1)
+		except:
+			task_gen.prec[f2]=[f1]
+def declare_chain(name='',action='',ext_in='',ext_out='',reentrant=1,color='BLUE',install=0,before=[],after=[],decider=None):
+	if type(action)is types.StringType:
+		act=Task.simple_task_type(name,action,color=color)
+	else:
+		act=Task.task_type_from_func(name,action,color=color)
+	act.ext_in=tuple(Utils.to_list(ext_in))
+	act.ext_out=tuple(Utils.to_list(ext_out))
+	act.before=Utils.to_list(before)
+	act.after=Utils.to_list(after)
+	def x_file(self,node):
+		if decider:
+			ext=decider(self,node)
+		elif type(ext_out)is types.StringType:
+			ext=ext_out
+		if type(ext)is types.StringType:
+			out_source=node.change_ext(ext)
+			if reentrant:
+				self.allnodes.append(out_source)
+		elif type(ext)==types.ListType:
+			out_source=[node.change_ext(x)for x in ext]
+			if reentrant:
+				for i in xrange(reentrant):
+					self.allnodes.append(out_source[i])
+		else:
+			raise Utils.WafError("do not know how to process %s"%str(ext))
+		tsk=self.create_task(name)
+		tsk.set_inputs(node)
+		tsk.set_outputs(out_source)
+		if Options.is_install and install:
+			tsk.install=install
+	declare_extension(act.ext_in,x_file)
+def bind_feature(name,methods):
+	lst=Utils.to_list(methods)
+	try:
+		l=task_gen.traits[name]
+	except KeyError:
+		l=set()
+		task_gen.traits[name]=l
+	l.update(lst)
+def taskgen(func):
+	setattr(task_gen,func.__name__,func)
+def feature(*k):
+	def deco(func):
+		setattr(task_gen,func.__name__,func)
+		for name in k:
+			try:
+				l=task_gen.traits[name]
+			except KeyError:
+				l=set()
+				task_gen.traits[name]=l
+			l.update([func.__name__])
+		return func
+	return deco
+def before(*k):
+	def deco(func):
+		for fun_name in k:
+			try:
+				if not func.__name__ in task_gen.prec[fun_name]:task_gen.prec[fun_name].append(func.__name__)
+			except KeyError:
+				task_gen.prec[fun_name]=[func.__name__]
+		return func
+	return deco
+def after(*k):
+	def deco(func):
+		for fun_name in k:
+			try:
+				if not fun_name in task_gen.prec[func.__name__]:task_gen.prec[func.__name__].append(fun_name)
+			except KeyError:
+				task_gen.prec[func.__name__]=[fun_name]
+		return func
+	return deco
+def extension(var):
+	if type(var)is types.ListType:
+		pass
+	elif type(var)is types.StringType:
+		var=[var]
+	else:
+		raise Utils.WafError('declare extension takes either a list or a string %s'%str(var))
+	def deco(func):
+		setattr(task_gen,func.__name__,func)
+		for x in var:
+			task_gen.mappings[x]=func
+		task_gen.mapped[func.__name__]=func
+		return func
+	return deco
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/UnitTest.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/UnitTest.py
new file mode 100644
index 0000000..9baa1d0
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/UnitTest.py
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys
+import Build,TaskGen,Utils,Options,Logs
+import pproc
+class unit_test(object):
+	def __init__(self):
+		self.returncode_ok=0
+		self.num_tests_ok=0
+		self.num_tests_failed=0
+		self.num_tests_err=0
+		self.total_num_tests=0
+		self.max_label_length=0
+		self.unit_tests={}
+		self.unit_test_results={}
+		self.unit_test_erroneous={}
+		self.change_to_testfile_dir=False
+		self.want_to_see_test_output=False
+		self.want_to_see_test_error=False
+		self.run_if_waf_does='check'
+	def run(self):
+		self.num_tests_ok=0
+		self.num_tests_failed=0
+		self.num_tests_err=0
+		self.total_num_tests=0
+		self.max_label_length=0
+		self.unit_tests={}
+		self.unit_test_results={}
+		self.unit_test_erroneous={}
+		if not Options.commands[self.run_if_waf_does]:return
+		for obj in Build.bld.all_task_gen:
+			if not hasattr(obj,'unit_test'):continue
+			unit_test=getattr(obj,'unit_test')
+			if not unit_test:continue
+			try:
+				if'program'in obj.features:
+					output=obj.path
+					filename=os.path.join(output.abspath(obj.env),obj.target)
+					srcdir=output.abspath()
+					label=os.path.join(output.bldpath(obj.env),obj.target)
+					self.max_label_length=max(self.max_label_length,len(label))
+					self.unit_tests[label]=(filename,srcdir)
+			except KeyError:
+				pass
+		self.total_num_tests=len(self.unit_tests)
+		Utils.pprint('GREEN','Running the unit tests')
+		count=0
+		result=1
+		for label,file_and_src in self.unit_tests.iteritems():
+			filename=file_and_src[0]
+			srcdir=file_and_src[1]
+			count+=1
+			line=Build.bld.progress_line(count,self.total_num_tests,Logs.colors.GREEN,Logs.colors.NORMAL)
+			if Options.options.progress_bar and line:
+				sys.stdout.write(line)
+				sys.stdout.flush()
+			try:
+				kwargs={}
+				if self.change_to_testfile_dir:
+					kwargs['cwd']=srcdir
+				if not self.want_to_see_test_output:
+					kwargs['stdout']=pproc.PIPE
+				if not self.want_to_see_test_error:
+					kwargs['stderr']=pproc.PIPE
+				pp=pproc.Popen(filename,**kwargs)
+				pp.wait()
+				result=int(pp.returncode==self.returncode_ok)
+				if result:
+					self.num_tests_ok+=1
+				else:
+					self.num_tests_failed+=1
+				self.unit_test_results[label]=result
+				self.unit_test_erroneous[label]=0
+			except OSError:
+				self.unit_test_erroneous[label]=1
+				self.num_tests_err+=1
+			except KeyboardInterrupt:
+				pass
+		if Options.options.progress_bar:sys.stdout.write(Logs.colors.cursor_on)
+	def print_results(self):
+		if not Options.commands[self.run_if_waf_does]:return
+		p=Utils.pprint
+		if self.total_num_tests==0:
+			p('YELLOW','No unit tests present')
+			return
+		p('GREEN','Running unit tests')
+		print
+		for label,filename in self.unit_tests.iteritems():
+			err=0
+			result=0
+			try:err=self.unit_test_erroneous[label]
+			except KeyError:pass
+			try:result=self.unit_test_results[label]
+			except KeyError:pass
+			n=self.max_label_length-len(label)
+			if err:n+=4
+			elif result:n+=7
+			else:n+=3
+			line='%s %s'%(label,'.'*n)
+			print line,
+			if err:p('RED','ERROR')
+			elif result:p('GREEN','OK')
+			else:p('YELLOW','FAILED')
+		percentage_ok=float(self.num_tests_ok)/float(self.total_num_tests)*100.0
+		percentage_failed=float(self.num_tests_failed)/float(self.total_num_tests)*100.0
+		percentage_erroneous=float(self.num_tests_err)/float(self.total_num_tests)*100.0
+		print'''
+Successful tests:      %i (%.1f%%)
+Failed tests:          %i (%.1f%%)
+Erroneous tests:       %i (%.1f%%)
+
+Total number of tests: %i
+'''%(self.num_tests_ok,percentage_ok,self.num_tests_failed,percentage_failed,self.num_tests_err,percentage_erroneous,self.total_num_tests)
+		p('GREEN','Unit tests finished')
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/__init__.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/__init__.py
new file mode 100644
index 0000000..cbc8406
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/__init__.py
@@ -0,0 +1,4 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ar.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ar.py
new file mode 100644
index 0000000..8572d5d
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ar.py
@@ -0,0 +1,53 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys
+import Task
+from Configure import conftest
+ar_str='${AR} ${ARFLAGS} ${TGT} ${SRC} && ${RANLIB} ${RANLIBFLAGS} ${TGT}'
+if sys.platform=="win32":
+	ar_str='${AR} s${ARFLAGS} ${TGT} ${SRC}'
+cls=Task.simple_task_type('ar_link_static',ar_str,color='YELLOW',ext_in='.o')
+cls.maxjobs=1
+def detect(conf):
+	comp=conf.find_program('ar',var='AR')
+	if not comp:return
+	ranlib=conf.find_program('ranlib',var='RANLIB')
+	if not ranlib:return
+	v=conf.env
+	v['AR']=comp
+	v['ARFLAGS']='rc'
+	v['RANLIB']=ranlib
+	v['RANLIBFLAGS']=''
+def find_ar(conf):
+	v=conf.env
+	conf.check_tool('ar')
+	if not v['AR']:conf.fatal('ar is required for static libraries - not found')
+def find_cpp(conf):
+	v=conf.env
+	cpp=None
+	if v['CPP']:cpp=v['CPP']
+	elif'CPP'in os.environ:cpp=os.environ['CPP']
+	if not cpp:cpp=conf.find_program('cpp',var='CPP')
+	if not cpp:cpp=v['CC']
+	if not cpp:cpp=v['CXX']
+	v['CPP']=cpp
+def cc_add_flags(conf):
+	conf.add_os_flags('CFLAGS','CCFLAGS')
+	conf.add_os_flags('CPPFLAGS')
+	conf.add_os_flags('LINKFLAGS')
+def cxx_add_flags(conf):
+	conf.add_os_flags('CXXFLAGS')
+	conf.add_os_flags('CPPFLAGS')
+	conf.add_os_flags('LINKFLAGS')
+def cc_load_tools(conf):
+	conf.check_tool('cc')
+def cxx_load_tools(conf):
+	conf.check_tool('cxx')
+
+conftest(find_ar)
+conftest(find_cpp)
+conftest(cc_add_flags)
+conftest(cxx_add_flags)
+conftest(cc_load_tools)
+conftest(cxx_load_tools)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/bison.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/bison.py
new file mode 100644
index 0000000..0c7e294
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/bison.py
@@ -0,0 +1,18 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import TaskGen
+def decide_ext(self,node):
+	c_ext='.tab.c'
+	if node.name.endswith('.yc'):c_ext='.tab.cc'
+	if'-d'in self.env['BISONFLAGS']:
+		return[c_ext,c_ext.replace('c','h')]
+	else:
+		return c_ext
+TaskGen.declare_chain(name='bison',action='cd ${SRC[0].bld_dir(env)} && ${BISON} ${BISONFLAGS} ${SRC[0].abspath()} -o ${TGT[0].name}',ext_in='.y .yc .yy',decider=decide_ext,before='cc cxx',)
+def detect(conf):
+	bison=conf.find_program('bison',var='BISON')
+	if not bison:conf.fatal("bison was not found")
+	v=conf.env
+	v['BISONFLAGS']='-d'
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cc.py
new file mode 100644
index 0000000..f318b30
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cc.py
@@ -0,0 +1,71 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import TaskGen,Build,Utils,Task
+from Logs import debug
+import ccroot
+from TaskGen import feature,before,extension,after
+g_cc_flag_vars=['CCDEPS','FRAMEWORK','FRAMEWORKPATH','STATICLIB','LIB','LIBPATH','LINKFLAGS','RPATH','CCFLAGS','CPPPATH','CPPFLAGS','CCDEFINES']
+EXT_CC=['.c']
+TaskGen.bind_feature('cc',['apply_core'])
+g_cc_type_vars=['CCFLAGS','LINKFLAGS']
+class cc_taskgen(ccroot.ccroot_abstract):
+	pass
+def init_cc(self):
+	self.p_flag_vars=set(self.p_flag_vars).union(g_cc_flag_vars)
+	self.p_type_vars=set(self.p_type_vars).union(g_cc_type_vars)
+	if not self.env['CC_NAME']:
+		raise Utils.WafError("At least one compiler (gcc, ..) must be selected")
+def apply_obj_vars_cc(self):
+	env=self.env
+	app=env.append_unique
+	cpppath_st=env['CPPPATH_ST']
+	for i in env['INC_PATHS']:
+		app('_CCINCFLAGS',cpppath_st%i.bldpath(env))
+		app('_CCINCFLAGS',cpppath_st%i.srcpath(env))
+	for i in env['CPPPATH']:
+		app('_CCINCFLAGS',cpppath_st%i)
+	app('_CCINCFLAGS',cpppath_st%'.')
+	app('_CCINCFLAGS',cpppath_st%env.variant())
+	tmpnode=self.path
+	app('_CCINCFLAGS',cpppath_st%tmpnode.bldpath(env))
+	app('_CCINCFLAGS',cpppath_st%tmpnode.srcpath(env))
+def apply_defines_cc(self):
+	tree=Build.bld
+	self.defines=getattr(self,'defines',[])
+	lst=self.to_list(self.defines)+self.to_list(self.env['CCDEFINES'])
+	milst=[]
+	for defi in lst:
+		if not defi in milst:
+			milst.append(defi)
+	libs=self.to_list(self.uselib)
+	for l in libs:
+		val=self.env['CCDEFINES_'+l]
+		if val:milst+=val
+	self.env['DEFLINES']=["%s %s"%(x[0],Utils.trimquotes('='.join(x[1:])))for x in[y.split('=')for y in milst]]
+	y=self.env['CCDEFINES_ST']
+	self.env['_CCDEFFLAGS']=[y%x for x in milst]
+def c_hook(self,node):
+	task=self.create_task('cc')
+	try:obj_ext=self.obj_ext
+	except AttributeError:obj_ext='_%d.o'%self.idx
+	task.defines=self.scanner_defines
+	task.inputs=[node]
+	task.outputs=[node.change_ext(obj_ext)]
+	self.compiled_tasks.append(task)
+cc_str='${CC} ${CCFLAGS} ${CPPFLAGS} ${_CCINCFLAGS} ${_CCDEFFLAGS} ${CC_SRC_F}${SRC} ${CC_TGT_F}${TGT}'
+link_str='${LINK_CC} ${CCLNK_SRC_F}${SRC} ${CCLNK_TGT_F}${TGT} ${LINKFLAGS} ${_LIBDIRFLAGS} ${_LIBFLAGS}'
+cls=Task.simple_task_type('cc',cc_str,'GREEN',ext_out='.o',ext_in='.c')
+cls.scan=ccroot.scan
+cls.vars.append('CCDEPS')
+cls=Task.simple_task_type('cc_link',link_str,color='YELLOW',ext_in='.o')
+cls.maxjobs=1
+TaskGen.declare_order('apply_incpaths','apply_defines_cc','apply_core','apply_lib_vars','apply_obj_vars_cc','apply_obj_vars')
+
+feature('cc')(init_cc)
+before('apply_type_vars')(init_cc)
+after('default_cc')(init_cc)
+feature('cc')(apply_obj_vars_cc)
+feature('cc')(apply_defines_cc)
+extension(EXT_CC)(c_hook)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ccroot.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ccroot.py
new file mode 100644
index 0000000..ba61ec9
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ccroot.py
@@ -0,0 +1,300 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,re
+import TaskGen,Utils,preproc,Logs,Build,Options
+from Logs import error,debug,warn
+from Utils import md5
+from TaskGen import taskgen,after,before,feature
+from Constants import*
+import config_c
+get_version_re=re.compile('\d+\.\d+(\.?\d+)*')
+def get_cc_version(conf,cc,version_var):
+	v=conf.env
+	output=Utils.cmd_output('%s -dumpversion'%cc)
+	if output:
+		match=get_version_re.search(output)
+		if match:
+			v[version_var]=match.group(0)
+			conf.check_message('compiler','version',1,v[version_var])
+			return v[version_var]
+	warn('could not determine the compiler version')
+class DEBUG_LEVELS:
+	ULTRADEBUG="ultradebug"
+	DEBUG="debug"
+	RELEASE="release"
+	OPTIMIZED="optimized"
+	CUSTOM="custom"
+	ALL=[ULTRADEBUG,DEBUG,RELEASE,OPTIMIZED,CUSTOM]
+def scan(self):
+	debug('ccroot: _scan_preprocessor(self, node, env, path_lst)')
+	all_nodes=[]
+	all_names=[]
+	seen=[]
+	for node in self.inputs:
+		gruik=preproc.c_parser(nodepaths=self.env['INC_PATHS'],defines=self.defines)
+		gruik.start(node,self.env)
+		if Logs.verbose:
+			debug('deps: nodes found for %s: %s %s'%(str(node),str(gruik.nodes),str(gruik.names)))
+			debug('deps: deps found for %s: %s'%(str(node),str(gruik.deps)))
+		for x in gruik.nodes:
+			if id(x)in seen:continue
+			seen.append(id(x))
+			all_nodes.append(x)
+		for x in gruik.names:
+			if not x in all_names:
+				all_names.append(x)
+	return(all_nodes,gruik.names)
+class ccroot_abstract(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+		if len(k)>1:
+			self.features.append('c'+k[1])
+def default_cc(self):
+	Utils.def_attrs(self,includes='',defines='',rpaths='',uselib='',uselib_local='',add_objects='',p_flag_vars=[],p_type_vars=[],scanner_defines={},compiled_tasks=[],link_task=None)
+def get_target_name(self):
+	tp='program'
+	for x in self.features:
+		if x in['cshlib','cstaticlib']:
+			tp=x.lstrip('c')
+	pattern=self.env[tp+'_PATTERN']
+	if not pattern:pattern='%s'
+	name=self.target
+	k=name.rfind('/')
+	return name[0:k+1]+pattern%name[k+1:]
+def apply_verif(self):
+	if not'objects'in self.features:
+		if not self.source:
+			raise Utils.WafError('no source files specified for %s'%self)
+		if not self.target:
+			raise Utils.WafError('no target for %s'%self)
+def install_shlib(self):
+	nums=self.vnum.split('.')
+	path=self.install_path
+	libname=self.outputs[0].name
+	name3=libname+'.'+self.vnum
+	name2=libname+'.'+nums[0]
+	name1=libname
+	filename=self.outputs[0].abspath(self.env)
+	bld=Build.bld
+	bld.install_as(os.path.join(path,name3),filename,env=self.env)
+	bld.symlink_as(os.path.join(path,name2),name3)
+	bld.symlink_as(os.path.join(path,name1),name3)
+def vars_target_cprogram(self):
+	self.default_install_path='${PREFIX}/bin'
+	self.default_chmod=0755
+def vars_target_cstaticlib(self):
+	self.default_install_path='${PREFIX}/lib'
+def install_target_cstaticlib(self):
+	if not Options.is_install:return
+	self.link_task.install_path=self.install_path
+def install_target_cshlib(self):
+	if getattr(self,'vnum','')and sys.platform!='win32':
+		tsk=self.link_task
+		tsk.vnum=self.vnum
+		tsk.install=install_shlib
+def apply_incpaths(self):
+	lst=[]
+	for lib in self.to_list(self.uselib):
+		for path in self.env['CPPPATH_'+lib]:
+			if not path in lst:
+				lst.append(path)
+	if preproc.go_absolute:
+		for path in preproc.standard_includes:
+			if not path in lst:
+				lst.append(path)
+	for path in self.to_list(self.includes):
+		if not path in lst:
+			lst.append(path)
+			if(not preproc.go_absolute)and os.path.isabs(path):
+				self.env.prepend_value('CPPPATH',path)
+	tree=Build.bld
+	inc_lst=[]
+	for path in lst:
+		node=None
+		if os.path.isabs(path):
+			if preproc.go_absolute:
+				node=Build.bld.root.find_dir(path)
+		else:
+			node=self.path.find_dir(path)
+		if node:
+			inc_lst.append(node)
+	self.env['INC_PATHS']+=inc_lst
+def apply_type_vars(self):
+	for x in self.features:
+		if not x in['cprogram','cstaticlib','cshlib']:
+			continue
+		x=x.lstrip('c')
+		st=self.env[x+'_USELIB']
+		if st:self.uselib=self.uselib+' '+st
+		for var in self.p_type_vars:
+			compvar='%s_%s'%(x,var)
+			value=self.env[compvar]
+			if value:self.env.append_value(var,value)
+def apply_link(self):
+	link=getattr(self,'link',None)
+	if not link:
+		if'cstaticlib'in self.features:link='ar_link_static'
+		elif'cxx'in self.features:link='cxx_link'
+		else:link='cc_link'
+	linktask=self.create_task(link)
+	outputs=[t.outputs[0]for t in self.compiled_tasks]
+	linktask.set_inputs(outputs)
+	linktask.set_outputs(self.path.find_or_declare(get_target_name(self)))
+	linktask.chmod=self.chmod
+	self.link_task=linktask
+def apply_lib_vars(self):
+	env=self.env
+	uselib=self.to_list(self.uselib)
+	seen=[]
+	names=self.to_list(self.uselib_local)[:]
+	while names:
+		x=names.pop(0)
+		if x in seen:
+			continue
+		y=self.name_to_obj(x)
+		if not y:
+			raise Utils.WafError("object '%s' was not found in uselib_local (required by '%s')"%(x,self.name))
+		if getattr(y,'uselib_local',None):
+			lst=y.to_list(y.uselib_local)
+			for u in lst:
+				if not u in seen:
+					names.append(u)
+		y.post()
+		seen.append(x)
+		if'cshlib'in y.features or'cprogram'in y.features:
+			env.append_value('LIB',y.target)
+		elif'cstaticlib'in y.features:
+			env.append_value('STATICLIB',y.target)
+		tmp_path=y.path.bldpath(self.env)
+		if not tmp_path in env['LIBPATH']:env.prepend_value('LIBPATH',tmp_path)
+		if y.link_task is not None:
+			self.link_task.set_run_after(y.link_task)
+			dep_nodes=getattr(self.link_task,'dep_nodes',[])
+			self.link_task.dep_nodes=dep_nodes+y.link_task.outputs
+		morelibs=y.to_list(y.uselib)
+		for v in morelibs:
+			if v in uselib:continue
+			uselib=[v]+uselib
+		if getattr(y,'export_incdirs',None):
+			cpppath_st=self.env['CPPPATH_ST']
+			for x in self.to_list(y.export_incdirs):
+				node=y.path.find_dir(x)
+				if not node:raise Utils.WafError('object %s: invalid folder %s in export_incdirs'%(y.target,x))
+				self.env.append_unique('INC_PATHS',node)
+	for x in uselib:
+		for v in self.p_flag_vars:
+			val=self.env[v+'_'+x]
+			if val:self.env.append_value(v,val)
+def apply_objdeps(self):
+	seen=[]
+	names=self.to_list(self.add_objects)
+	while names:
+		x=names[0]
+		if x in seen:
+			names=names[1:]
+			continue
+		y=self.name_to_obj(x)
+		if not y:
+			raise Utils.WafError("object '%s' was not found in uselib_local (required by add_objects '%s')"%(x,self.name))
+		if y.add_objects:
+			added=0
+			lst=y.to_list(y.add_objects)
+			lst.reverse()
+			for u in lst:
+				if u in seen:continue
+				added=1
+				names=[u]+names
+			if added:continue
+		y.post()
+		seen.append(x)
+		self.link_task.inputs+=y.out_nodes
+def apply_obj_vars(self):
+	v=self.env
+	lib_st=v['LIB_ST']
+	staticlib_st=v['STATICLIB_ST']
+	libpath_st=v['LIBPATH_ST']
+	staticlibpath_st=v['STATICLIBPATH_ST']
+	rpath_st=v['RPATH_ST']
+	app=v.append_unique
+	if v['FULLSTATIC']:
+		v.append_value('LINKFLAGS',v['FULLSTATIC_MARKER'])
+	for i in v['RPATH']:
+		if i and rpath_st:
+			app('LINKFLAGS',rpath_st%i)
+	for i in v['LIBPATH']:
+		app('LINKFLAGS',libpath_st%i)
+		app('LINKFLAGS',staticlibpath_st%i)
+	if v['STATICLIB']:
+		v.append_value('LINKFLAGS',v['STATICLIB_MARKER'])
+		k=[(staticlib_st%i)for i in v['STATICLIB']]
+		app('LINKFLAGS',k)
+	if not v['FULLSTATIC']:
+		if v['STATICLIB']or v['LIB']:
+			v.append_value('LINKFLAGS',v['SHLIB_MARKER'])
+	app('LINKFLAGS',[lib_st%i for i in v['LIB']])
+def apply_vnum(self):
+	if sys.platform!='darwin'and sys.platform!='win32':
+		try:
+			nums=self.vnum.split('.')
+		except AttributeError:
+			pass
+		else:
+			try:name3=self.soname
+			except AttributeError:name3=self.link_task.outputs[0].name+'.'+nums[0]
+			self.env.append_value('LINKFLAGS','-Wl,-h,'+name3)
+def process_obj_files(self):
+	if not hasattr(self,'obj_files'):return
+	for x in self.obj_files:
+		node=self.path.find_resource(x)
+		self.link_task.inputs.append(node)
+def add_obj_file(self,file):
+	if not hasattr(self,'obj_files'):self.obj_files=[]
+	if not'process_obj_files'in self.meths:self.meths.append('process_obj_files')
+	self.obj_files.append(file)
+def make_objects_available(self):
+	self.out_nodes=[]
+	app=self.out_nodes.append
+	for t in self.compiled_tasks:app(t.outputs[0])
+c_attrs={'cxxflag':'CXXFLAGS','cflag':'CCFLAGS','ccflag':'CCFLAGS','linkflag':'LINKFLAGS','ldflag':'LINKFLAGS','lib':'LIB','libpath':'LIBPATH','staticlib':'STATICLIB','staticlibpath':'STATICLIBPATH','rpath':'RPATH',}
+def add_extra_flags(self):
+	for x in self.__dict__.keys():
+		y=x.lower()
+		if y[-1]=='s':
+			y=y[:-1]
+		if c_attrs.get(y,None):
+			self.env.append_unique(c_attrs[y],getattr(self,x))
+
+feature('cc','cxx')(default_cc)
+before('init_cc','init_cxx')(default_cc)
+feature('cprogram','dprogram','cstaticlib','dstaticlib','cshlib','dshlib')(apply_verif)
+feature('cprogram','dprogram')(vars_target_cprogram)
+before('apply_core')(vars_target_cprogram)
+feature('cstaticlib','dstaticlib','cshlib','dshlib')(vars_target_cstaticlib)
+before('apply_core')(vars_target_cstaticlib)
+feature('cprogram','dprogram','cstaticlib','dstaticlib','cshlib','dshlib')(install_target_cstaticlib)
+after('apply_objdeps','apply_link')(install_target_cstaticlib)
+feature('cshlib','dshlib')(install_target_cshlib)
+after('apply_objdeps','apply_link')(install_target_cshlib)
+feature('cc','cxx')(apply_incpaths)
+after('apply_type_vars')(apply_incpaths)
+feature('cc','cxx')(apply_type_vars)
+taskgen(apply_link)
+feature('cprogram','cshlib','cstaticlib')(apply_link)
+after('apply_core')(apply_link)
+feature('cc','cxx')(apply_lib_vars)
+after('apply_vnum')(apply_lib_vars)
+feature('objects')(apply_objdeps)
+after('apply_obj_vars','apply_vnum')(apply_objdeps)
+feature('cprogram','cshlib','cstaticlib')(apply_obj_vars)
+after('apply_lib_vars')(apply_obj_vars)
+feature('cprogram','cshlib','cstaticlib')(apply_vnum)
+after('apply_link')(apply_vnum)
+taskgen(process_obj_files)
+after('apply_link')(process_obj_files)
+taskgen(add_obj_file)
+feature('objects')(make_objects_available)
+after('apply_core')(make_objects_available)
+taskgen(add_extra_flags)
+feature('cc','cxx')(add_extra_flags)
+before('init_cxx','init_cc')(add_extra_flags)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_cc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_cc.py
new file mode 100644
index 0000000..1a8852c
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_cc.py
@@ -0,0 +1,33 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,imp,types,ccroot
+import optparse
+import Utils,Configure,Options
+c_compiler={'win32':['msvc','gcc'],'cygwin':['gcc'],'darwin':['gcc'],'aix5':['gcc'],'linux':['gcc','suncc'],'sunos':['suncc','gcc'],'irix':['gcc'],'hpux':['gcc'],'default':['gcc']}
+def __list_possible_compiler(platform):
+	try:
+		return c_compiler[platform]
+	except KeyError:
+		return c_compiler["default"]
+def detect(conf):
+	try:test_for_compiler=Options.options.check_c_compiler
+	except AttributeError:raise Configure.ConfigurationError("Add set_options(opt): opt.tool_options('compiler_cc')")
+	for c_compiler in test_for_compiler.split():
+		conf.check_tool(c_compiler)
+		if conf.env['CC']:
+			conf.check_message("%s"%c_compiler,'',True)
+			conf.env["COMPILER_CC"]="%s"%c_compiler
+			return
+		conf.check_message("%s"%c_compiler,'',False)
+	conf.env["COMPILER_CC"]=None
+def set_options(opt):
+	detected_platform=Options.platform
+	possible_compiler_list=__list_possible_compiler(detected_platform)
+	test_for_compiler=str(" ").join(possible_compiler_list)
+	cc_compiler_opts=opt.add_option_group("C Compiler Options")
+	cc_compiler_opts.add_option('--check-c-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C-Compiler will be checked by default: "%s"'%(detected_platform,test_for_compiler),dest="check_c_compiler")
+	for c_compiler in test_for_compiler.split():
+		opt.tool_options('%s'%c_compiler,option_group=cc_compiler_opts)
+	opt.add_option('-d','--debug-level',action='store',default=ccroot.DEBUG_LEVELS.RELEASE,help="Specify the debug level, does nothing if CFLAGS is set in the environment. [Allowed Values: '%s']"%"', '".join(ccroot.DEBUG_LEVELS.ALL),choices=ccroot.DEBUG_LEVELS.ALL,dest='debug_level')
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_cxx.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_cxx.py
new file mode 100644
index 0000000..f0aec5e
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_cxx.py
@@ -0,0 +1,33 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,imp,types,ccroot
+import optparse
+import Utils,Configure,Options
+cxx_compiler={'win32':['msvc','g++'],'cygwin':['g++'],'darwin':['g++'],'aix5':['g++'],'linux':['g++','sunc++'],'sunos':['sunc++','g++'],'irix':['g++'],'hpux':['g++'],'default':['g++']}
+def __list_possible_compiler(platform):
+	try:
+		return(cxx_compiler[platform])
+	except KeyError:
+		return(cxx_compiler["default"])
+def detect(conf):
+	try:test_for_compiler=Options.options.check_cxx_compiler
+	except AttributeError:raise Configure.ConfigurationError("Add set_options(opt): opt.tool_options('compiler_cxx')")
+	for cxx_compiler in test_for_compiler.split():
+		conf.check_tool(cxx_compiler)
+		if conf.env['CXX']:
+			conf.check_message("%s"%cxx_compiler,'',True)
+			conf.env["COMPILER_CXX"]="%s"%cxx_compiler
+			return
+		conf.check_message("%s"%cxx_compiler,'',False)
+	conf.env["COMPILER_CXX"]=None
+def set_options(opt):
+	detected_platform=Options.platform
+	possible_compiler_list=__list_possible_compiler(detected_platform)
+	test_for_compiler=str(" ").join(possible_compiler_list)
+	cxx_compiler_opts=opt.add_option_group("C++ Compiler Options")
+	cxx_compiler_opts.add_option('--check-cxx-compiler',default="%s"%test_for_compiler,help='On this platform (%s) the following C++ Compiler will be checked by default: "%s"'%(detected_platform,test_for_compiler),dest="check_cxx_compiler")
+	for cxx_compiler in test_for_compiler.split():
+		opt.tool_options('%s'%cxx_compiler,option_group=cxx_compiler_opts)
+	opt.add_option('-d','--debug-level',action='store',default=ccroot.DEBUG_LEVELS.RELEASE,help="Specify the debug level, does nothing if CXXFLAGS is set in the environment. [Allowed Values: '%s']"%"', '".join(ccroot.DEBUG_LEVELS.ALL),choices=ccroot.DEBUG_LEVELS.ALL,dest='debug_level')
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_d.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_d.py
new file mode 100644
index 0000000..7126134
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/compiler_d.py
@@ -0,0 +1,23 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,imp,types
+import Utils,Configure,Options
+def detect(conf):
+	if getattr(Options.options,'check_dmd_first',None):
+		test_for_compiler=['dmd','gdc']
+	else:
+		test_for_compiler=['gdc','dmd']
+	for d_compiler in test_for_compiler:
+		conf.check_tool(d_compiler)
+		if conf.env['D_COMPILER']:
+			conf.check_message("%s"%d_compiler,'',True)
+			conf.env["COMPILER_D"]=d_compiler
+			return
+		conf.check_message("%s"%d_compiler,'',False)
+def set_options(opt):
+	d_compiler_opts=opt.add_option_group("D Compiler Options")
+	d_compiler_opts.add_option('--check-dmd-first',action="store_true",help='checks for the gdc compiler before dmd (default is the other way round)',dest='check_dmd_first',default=False)
+	for d_compiler in['gdc','dmd']:
+		opt.tool_options('%s'%d_compiler,option_group=d_compiler_opts)
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/config_c.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/config_c.py
new file mode 100644
index 0000000..512bb03
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/config_c.py
@@ -0,0 +1,421 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import os,types,imp,cPickle,sys,shlex,shutil
+from Utils import md5
+import Build,Utils,Configure,Task,Options,Logs
+from Constants import*
+from Configure import conf,conftest
+stdincpath=['/usr/include/','/usr/local/include/']
+stdlibpath=['/usr/lib/','/usr/local/lib/','/lib']
+cfg_ver={'atleast-version':'>=','exact-version':'==','max-version':'<=',}
+def parse_flags(line,uselib,env):
+	lst=shlex.split(line)
+	while lst:
+		x=lst.pop(0)
+		st=x[:2]
+		ot=x[2:]
+		if st=='-I'or st=='/I':
+			if not ot:ot=lst.pop(0)
+			env.append_unique('CPPPATH_'+uselib,ot)
+		elif st=='-D':
+			if not ot:ot=lst.pop(0)
+			env.append_unique('CXXDEFINES_'+uselib,ot)
+			env.append_unique('CCDEFINES_'+uselib,ot)
+		elif st=='-l':
+			if not ot:ot=lst.pop(0)
+			env.append_unique('LIB_'+uselib,ot)
+		elif st=='-L':
+			if not ot:ot=lst.pop(0)
+			env.append_unique('LIBPATH_'+uselib,ot)
+		elif x=='-pthread'or x.startswith('+'):
+			env.append_unique('CCFLAGS_'+uselib,x)
+			env.append_unique('CXXFLAGS_'+uselib,x)
+			env.append_unique('LINKFLAGS_'+uselib,x)
+		elif x.startswith('-std'):
+			env.append_unique('CCFLAGS_'+uselib,x)
+			env.append_unique('LINKFLAGS_'+uselib,x)
+def validate_cfg(self,kw):
+	if not'path'in kw:
+		kw['path']='pkg-config --silence-errors'
+	if'atleast_pkgconfig_version'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for pkg-config version >= %s'%kw['atleast_pkgconfig_version']
+		return
+	if'modversion'in kw:
+		return
+	for x in cfg_ver.keys():
+		y=x.replace('-','_')
+		if y in kw:
+			if not'package'in kw:
+				raise ValueError,'%s requires a package'%x
+			if not'msg'in kw:
+				kw['msg']='Checking for %s %s %s'%(kw['package'],cfg_ver[x],kw[y])
+			return
+	if not'msg'in kw:
+		kw['msg']='Checking for %s flags'%kw['package']
+	if not'okmsg'in kw:
+		kw['okmsg']='ok'
+	if not'errmsg'in kw:
+		kw['errmsg']='not found'
+def exec_cfg(self,kw):
+	if'atleast_pkgconfig_version'in kw:
+		try:
+			Utils.cmd_output('%s --atleast-pkgconfig-version=%s'%(kw['path'],kw['atleast_pkgconfig_version']))
+		except:
+			if not'errmsg'in kw:
+				kw['errmsg']='"pkg-config" could not be found or the version found is too old.'
+			raise Configure.ConfigurationError,kw['errmsg']
+		if not'okmsg'in kw:
+			kw['okmsg']='ok'
+		return
+	for x in cfg_ver:
+		y=x.replace('-','_')
+		if y in kw:
+			try:
+				Utils.cmd_output('%s --%s=%s %s'%(kw['path'],x,kw[y],kw['package']))
+			except:
+				if not'errmsg'in kw:
+					kw['errmsg']='Package "%s (%s %s)" could not be found or the found version is too old.'%(kw['package'],cfg_ver[x],kw[y])
+				raise Configure.ConfigurationError,kw['errmsg']
+			if not'okmsg'in kw:
+				kw['okmsg']='ok'
+			self.define('HAVE_%s'%Utils.quote_define_name(kw.get('uselib_store',kw['package'])),1,0)
+			break
+	if'modversion'in kw:
+		try:
+			version=Utils.cmd_output('%s --modversion %s'%(kw['path'],kw['modversion'])).strip()
+		except ValueError:
+			return''
+		self.define('%s_VERSION'%Utils.quote_define_name(kw.get('uselib_store',kw['modversion'])),version)
+		return version
+	lst=[kw['path']]
+	for key,val in kw.get('define_variable',{}).iteritems():
+		lst.append('--define-variable=%s=%s'%(key,val))
+	lst.append(kw.get('args',''))
+	lst.append(kw['package'])
+	cmd=' '.join(lst)
+	try:
+		ret=Utils.cmd_output(cmd)
+	except:
+		raise Configure.ConfigurationError,"no such package"
+	if not'okmsg'in kw:
+		kw['okmsg']='ok'
+	parse_flags(ret,kw.get('uselib_store',kw['package'].upper()),kw.get('env',self.env))
+	return ret
+def check_cfg(self,*k,**kw):
+	self.validate_cfg(kw)
+	if'msg'in kw:
+		self.check_message_1(kw['msg'])
+	ret=None
+	try:
+		ret=self.exec_cfg(kw)
+	except Configure.ConfigurationError,e:
+		if'errmsg'in kw:
+			self.check_message_2(kw['errmsg'],'YELLOW')
+		if'mandatory'in kw:
+			if Logs.verbose>1:
+				raise
+			else:
+				self.fatal('the configuration failed (see config.log)')
+	else:
+		if'okmsg'in kw:
+			self.check_message_2(kw['okmsg'])
+	return ret
+simple_c_code='int main() {return 0;}\n'
+code_with_headers=''
+def validate_c(self,kw):
+	if not'env'in kw:
+		kw['env']=self.env.copy()
+	env=kw['env']
+	if not'compiler'in kw:
+		kw['compiler']='cc'
+		if env['CXX_NAME']and Task.TaskBase.classes.get('cxx',None):
+			kw['compiler']='cxx'
+	if not'type'in kw:
+		kw['type']='program'
+	assert not(kw['type']!='program'and kw.get('execute',0)),'can only execute programs'
+	def to_header(dct):
+		if'header_name'in dct:
+			dct=Utils.to_list(dct['header_name'])
+			return''.join(['#include <%s>\n'%x for x in dct])
+		return''
+	if'framework_name'in kw:
+		if not kw.get('header_name'):
+			kw['header_name']=[]
+	if'function_name'in kw:
+		fu=kw['function_name']
+		if not'msg'in kw:
+			kw['msg']='Checking for function %s'%fu
+		kw['code']=to_header(kw)+'int main(){\nvoid *p;\np=(void*)(%s);\nreturn 0;\n}\n'%fu
+		if not'uselib_store'in kw:
+			kw['uselib_store']=fu.upper()
+		if not'define_name'in kw:
+			kw['define_name']=self.have_define(fu)
+	elif'header_name'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for header %s'%kw['header_name']
+		if'framework_name'in kw:
+			fwkname=kw['framework_name']
+			fwk='%s/%s.h'%(fwkname,fwkname)
+			if kw.get('remove_dot_h',None):
+				fwk=fwk[:-2]
+			kw['header_name']=Utils.to_list(kw['header_name'])+[fwk]
+			kw['msg']='Checking for framework %s'%fwkname
+			kw['framework']=fwkname
+		l=Utils.to_list(kw['header_name'])
+		assert len(l)>0,'list of headers in header_name is empty'
+		kw['code']=to_header(kw)+'int main(){return 0;}\n'
+		if not'uselib_store'in kw:
+			kw['uselib_store']=l[0].upper()
+		if not'define_name'in kw:
+			kw['define_name']=self.have_define(l[0])
+	if'lib'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for library %s'%kw['lib']
+		if not'uselib_store'in kw:
+			kw['uselib_store']=kw['lib'].upper()
+	if'staticlib'in kw:
+		if not'msg'in kw:
+			kw['msg']='Checking for static library %s'%kw['staticlib']
+		if not'uselib_store'in kw:
+			kw['uselib_store']=kw['staticlib'].upper()
+	if'fragment'in kw:
+		kw['code']=kw['fragment']
+		if not'msg'in kw:
+			kw['msg']='Checking for custom code'
+		if not'errmsg'in kw:
+			kw['errmsg']='fail'
+	for(flagsname,flagstype)in[('cxxflags','compiler'),('cflags','compiler'),('linkflags','linker')]:
+		if flagsname in kw:
+			if not'msg'in kw:
+				kw['msg']='Checking for %s flags %s'%(flagstype,kw[flagsname])
+			if not'errmsg'in kw:
+				kw['errmsg']='fail'
+	if not'execute'in kw:
+		kw['execute']=False
+	if not'errmsg'in kw:
+		kw['errmsg']='not found'
+	if not'okmsg'in kw:
+		kw['okmsg']='ok'
+	if not'code'in kw:
+		kw['code']=simple_c_code
+	assert('msg'in kw)
+def post_check(self,*k,**kw):
+	def define_or_stuff():
+		nm=kw['define_name']
+		if not kw['execute']and not kw.get('define_ret',None):
+			self.define_cond(kw['define_name'],kw['success']is not None)
+		else:
+			self.define(kw['define_name'],kw['success'])
+	if'header_name'in kw:
+		define_or_stuff()
+	elif'function_name'in kw:
+		define_or_stuff()
+	elif'fragment'in kw:
+		if'define_name'in kw:
+			define_or_stuff()
+	if kw['execute']:
+		is_success=kw['success']is not None
+	else:
+		is_success=kw['success']==0
+	if is_success and'uselib_store'in kw:
+		import cc,cxx
+		for k in set(cc.g_cc_flag_vars).union(cxx.g_cxx_flag_vars):
+			lk=k.lower()
+			if k=='CPPPATH':lk='includes'
+			if k=='CXXDEFINES':lk='defines'
+			if k=='CCDEFINES':lk='defines'
+			if lk in kw:
+				self.env.append_value(k+'_'+kw['uselib_store'],kw[lk])
+def check(self,*k,**kw):
+	self.validate_c(kw)
+	self.check_message_1(kw['msg'])
+	ret=None
+	try:
+		ret=self.run_c_code(*k,**kw)
+	except Configure.ConfigurationError,e:
+		self.check_message_2(kw['errmsg'],'YELLOW')
+		if'mandatory'in kw:
+			if Logs.verbose>1:
+				raise
+			else:
+				self.fatal('the configuration failed (see config.log)')
+	else:
+		self.check_message_2(kw['okmsg'])
+	kw['success']=ret
+	self.post_check(*k,**kw)
+	return ret
+def run_c_code(self,*k,**kw):
+	if kw['compiler']=='cxx':
+		tp='cxx'
+		test_f_name='test.cpp'
+	else:
+		tp='cc'
+		test_f_name='test.c'
+	dir=os.path.join(self.blddir,'.wscript-trybuild')
+	try:
+		shutil.rmtree(dir)
+	except OSError:
+		pass
+	os.makedirs(dir)
+	bdir=os.path.join(dir,'testbuild')
+	if not os.path.exists(bdir):
+		os.makedirs(bdir)
+	env=kw['env']
+	dest=open(os.path.join(dir,test_f_name),'w')
+	dest.write(kw['code'])
+	dest.close()
+	back=os.path.abspath('.')
+	bld=Build.BuildContext()
+	bld.log=self.log
+	bld.all_envs.update(self.all_envs)
+	bld.all_envs['default']=env
+	bld.lst_variants=bld.all_envs.keys()
+	bld.load_dirs(dir,bdir)
+	os.chdir(dir)
+	bld.rescan(bld.srcnode)
+	o=bld.new_task_gen(tp,kw['type'])
+	o.source=test_f_name
+	o.target='testprog'
+	for k,v in kw.iteritems():
+		setattr(o,k,v)
+	self.log.write("==>\n%s\n<==\n"%kw['code'])
+	try:
+		bld.compile()
+	except:
+		ret=Utils.ex_stack()
+	else:
+		ret=0
+	os.chdir(back)
+	if ret:
+		raise Configure.ConfigurationError,str(ret)
+	if kw['execute']:
+		lastprog=o.link_task.outputs[0].abspath(env)
+	if kw['execute']:
+		data=Utils.cmd_output('"%s"'%lastprog).strip()
+		ret=data
+	return ret
+def check_cxx(self,*k,**kw):
+	kw['compiler']='cxx'
+	return self.check(*k,**kw)
+def check_cc(self,*k,**kw):
+	kw['compiler']='cc'
+	return self.check(*k,**kw)
+def define(self,define,value,quote=1):
+	assert define and isinstance(define,str)
+	tbl=self.env[DEFINES]or Utils.ordered_dict()
+	if isinstance(value,str):
+		if quote==1:
+			tbl[define]='"%s"'%str(value)
+		else:
+			tbl[define]=value
+	elif isinstance(value,int):
+		tbl[define]=value
+	else:
+		raise TypeError,'define %r -> %r must be a string or an int'%(define,value)
+	self.env[DEFINES]=tbl
+	self.env[define]=value
+def undefine(self,define):
+	assert define and isinstance(define,str)
+	tbl=self.env[DEFINES]or Utils.ordered_dict()
+	value=UNDEFINED
+	tbl[define]=value
+	self.env[DEFINES]=tbl
+	self.env[define]=value
+def define_cond(self,name,value):
+	if value:
+		self.define(name,1)
+	else:
+		self.undefine(name)
+def is_defined(self,key):
+	defines=self.env[DEFINES]
+	if not defines:
+		return False
+	try:
+		value=defines[key]
+	except KeyError:
+		return False
+	else:
+		return value!=UNDEFINED
+def get_define(self,define):
+	try:return self.env[DEFINES][define]
+	except KeyError:return None
+def have_define(self,name):
+	return"HAVE_%s"%Utils.quote_define_name(name)
+def write_config_header(self,configfile='',env=''):
+	if not configfile:configfile=WAF_CONFIG_H
+	lst=Utils.split_path(configfile)
+	base=lst[:-1]
+	if not env:env=self.env
+	base=[self.blddir,env.variant()]+base
+	dir=os.path.join(*base)
+	if not os.path.exists(dir):
+		os.makedirs(dir)
+	dir=os.path.join(dir,lst[-1])
+	self.env.append_value('waf_config_files',os.path.abspath(dir))
+	waf_guard='_%s_WAF'%Utils.quote_define_name(configfile)
+	dest=open(dir,'w')
+	dest.write('/* Configuration header created by Waf - do not edit */\n')
+	dest.write('#ifndef %s\n#define %s\n\n'%(waf_guard,waf_guard))
+	if not configfile in self.env['dep_files']:
+		self.env['dep_files']+=[configfile]
+	tbl=env[DEFINES]or Utils.ordered_dict()
+	for key in tbl.allkeys:
+		value=tbl[key]
+		if value is None:
+			dest.write('#define %s\n'%key)
+		elif value is UNDEFINED:
+			dest.write('/* #undef %s */\n'%key)
+		else:
+			dest.write('#define %s %s\n'%(key,value))
+	dest.write('\n#endif /* %s */\n'%waf_guard)
+	dest.close()
+def cc_check_features(self,kind='cc'):
+	v=self.env
+	test=Configure.check_data()
+	test.code='int main() {return 0;}\n'
+	test.env=v
+	test.execute=1
+	test.force_compiler=kind
+	ret=self.run_check(test)
+	self.check_message('compiler could create','programs',not(ret is False))
+	if not ret:self.fatal("no programs")
+	lib_obj=Configure.check_data()
+	lib_obj.code="int k = 3;\n"
+	lib_obj.env=v
+	lib_obj.build_type="shlib"
+	lib_obj.force_compiler=kind
+	ret=self.run_check(lib_obj)
+	self.check_message('compiler could create','shared libs',not(ret is False))
+	if not ret:self.fatal("no shared libs")
+	lib_obj=Configure.check_data()
+	lib_obj.code="int k = 3;\n"
+	lib_obj.env=v
+	lib_obj.build_type="staticlib"
+	lib_obj.force_compiler=kind
+	ret=self.run_check(lib_obj)
+	self.check_message('compiler could create','static libs',not(ret is False))
+	if not ret:self.fatal("no static libs")
+def cxx_check_features(self):
+	return cc_check_features(self,kind='cpp')
+
+conf(validate_cfg)
+conf(exec_cfg)
+conf(check_cfg)
+conf(validate_c)
+conf(post_check)
+conf(check)
+conf(run_c_code)
+conf(check_cxx)
+conf(check_cc)
+conf(define)
+conf(undefine)
+conf(define_cond)
+conf(is_defined)
+conf(get_define)
+conf(have_define)
+conf(write_config_header)
+conftest(cc_check_features)
+conftest(cxx_check_features)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cs.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cs.py
new file mode 100644
index 0000000..a728db4
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cs.py
@@ -0,0 +1,45 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import TaskGen,Utils,Task
+from Logs import error
+from TaskGen import before,after,taskgen,feature
+flag_vars=['FLAGS','ASSEMBLIES']
+def init_cs(self):
+	Utils.def_attrs(self,flags='',assemblies='',resources='',uselib='')
+def apply_uselib_cs(self):
+	if not self.uselib:
+		return
+	global flag_vars
+	for var in self.to_list(self.uselib):
+		for v in self.flag_vars:
+			val=self.env[v+'_'+var]
+			if val:self.env.append_value(v,val)
+def apply_cs(self):
+	assemblies_flags=[]
+	for i in self.to_list(self.assemblies)+self.env['ASSEMBLIES']:
+		assemblies_flags+='/r:'+i
+	self.env['_ASSEMBLIES']+=assemblies_flags
+	for i in self.to_list(self.resources):
+		self.env['_RESOURCES'].append('/resource:'+i)
+	self.env['_FLAGS']+=self.to_list(self.flags)+self.env['FLAGS']
+	curnode=self.path
+	nodes=[]
+	for i in self.to_list(self.source):
+		nodes.append(curnode.find_resource(i))
+	task=self.create_task('mcs')
+	task.inputs=nodes
+	task.set_outputs(self.path.find_or_declare(self.target))
+Task.simple_task_type('mcs','${MCS} ${SRC} /out:${TGT} ${_FLAGS} ${_ASSEMBLIES} ${_RESOURCES}',color='YELLOW')
+def detect(conf):
+	mcs=conf.find_program('mcs',var='MCS')
+	if not mcs:mcs=conf.find_program('gmcs',var='MCS')
+
+taskgen(init_cs)
+feature('cs')(init_cs)
+taskgen(apply_uselib_cs)
+feature('cs')(apply_uselib_cs)
+after('init_cs')(apply_uselib_cs)
+taskgen(apply_cs)
+feature('cs')(apply_cs)
+after('apply_uselib_cs')(apply_cs)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cxx.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cxx.py
new file mode 100644
index 0000000..83b2d32
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/cxx.py
@@ -0,0 +1,72 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import TaskGen,Task,Utils
+from Logs import debug
+import ccroot
+from TaskGen import feature,before,extension,after
+g_cxx_flag_vars=['CXXDEPS','FRAMEWORK','FRAMEWORKPATH','STATICLIB','LIB','LIBPATH','LINKFLAGS','RPATH','CXXFLAGS','CCFLAGS','CPPPATH','CPPFLAGS','CXXDEFINES']
+EXT_CXX=['.cpp','.cc','.cxx','.C','.c++']
+TaskGen.bind_feature('cxx',['apply_core'])
+g_cxx_type_vars=['CXXFLAGS','LINKFLAGS']
+class cxx_taskgen(ccroot.ccroot_abstract):
+	pass
+def init_cxx(self):
+	if not'cc'in self.features:
+		self.mappings['.c']=TaskGen.task_gen.mappings['.cxx']
+	self.p_flag_vars=set(self.p_flag_vars).union(g_cxx_flag_vars)
+	self.p_type_vars=set(self.p_type_vars).union(g_cxx_type_vars)
+	if not self.env['CXX_NAME']:
+		raise Utils.WafError("At least one compiler (g++, ..) must be selected")
+def apply_obj_vars_cxx(self):
+	env=self.env
+	app=env.append_unique
+	cxxpath_st=env['CPPPATH_ST']
+	for i in env['INC_PATHS']:
+		app('_CXXINCFLAGS',cxxpath_st%i.bldpath(env))
+		app('_CXXINCFLAGS',cxxpath_st%i.srcpath(env))
+	for i in env['CPPPATH']:
+		app('_CXXINCFLAGS',cxxpath_st%i)
+	app('_CXXINCFLAGS',cxxpath_st%'.')
+	app('_CXXINCFLAGS',cxxpath_st%self.env.variant())
+	tmpnode=self.path
+	app('_CXXINCFLAGS',cxxpath_st%tmpnode.bldpath(env))
+	app('_CXXINCFLAGS',cxxpath_st%tmpnode.srcpath(env))
+def apply_defines_cxx(self):
+	self.defines=getattr(self,'defines',[])
+	lst=self.to_list(self.defines)+self.to_list(self.env['CXXDEFINES'])
+	milst=[]
+	for defi in lst:
+		if not defi in milst:
+			milst.append(defi)
+	libs=self.to_list(self.uselib)
+	for l in libs:
+		val=self.env['CXXDEFINES_'+l]
+		if val:milst+=self.to_list(val)
+	self.env['DEFLINES']=["%s %s"%(x[0],Utils.trimquotes('='.join(x[1:])))for x in[y.split('=')for y in milst]]
+	y=self.env['CXXDEFINES_ST']
+	self.env['_CXXDEFFLAGS']=[y%x for x in milst]
+def cxx_hook(self,node):
+	task=self.create_task('cxx')
+	try:obj_ext=self.obj_ext
+	except AttributeError:obj_ext='_%d.o'%self.idx
+	task.defines=self.scanner_defines
+	task.inputs=[node]
+	task.outputs=[node.change_ext(obj_ext)]
+	self.compiled_tasks.append(task)
+cxx_str='${CXX} ${CXXFLAGS} ${CPPFLAGS} ${_CXXINCFLAGS} ${_CXXDEFFLAGS} ${CXX_SRC_F}${SRC} ${CXX_TGT_F}${TGT}'
+link_str='${LINK_CXX} ${CXXLNK_SRC_F}${SRC} ${CXXLNK_TGT_F}${TGT} ${LINKFLAGS} ${_LIBDIRFLAGS} ${_LIBFLAGS}'
+cls=Task.simple_task_type('cxx',cxx_str,color='GREEN',ext_out='.o',ext_in='.cxx')
+cls.scan=ccroot.scan
+cls.vars.append('CXXDEPS')
+cls=Task.simple_task_type('cxx_link',link_str,color='YELLOW',ext_in='.o')
+cls.maxjobs=1
+TaskGen.declare_order('apply_incpaths','apply_defines_cxx','apply_core','apply_lib_vars','apply_obj_vars_cxx','apply_obj_vars')
+
+feature('cxx')(init_cxx)
+before('apply_type_vars')(init_cxx)
+after('default_cc')(init_cxx)
+feature('cxx')(apply_obj_vars_cxx)
+feature('cxx')(apply_defines_cxx)
+extension(EXT_CXX)(cxx_hook)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/d.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/d.py
new file mode 100644
index 0000000..b0b720a
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/d.py
@@ -0,0 +1,346 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,re,optparse
+import ccroot
+import TaskGen,Utils,Task,Configure,Logs,Build
+from Logs import debug,error
+from TaskGen import taskgen,feature,after,before,extension
+EXT_D=['.d','.di','.D']
+D_METHS=['apply_core','apply_vnum','apply_objdeps']
+def filter_comments(filename):
+	f=open(filename,'r')
+	txt=f.read()
+	f.close()
+	buf=[]
+	i=0
+	max=len(txt)
+	while i<max:
+		c=txt[i]
+		if c=='"':
+			i+=1
+			c=''
+			while i<max:
+				p=c
+				c=txt[i]
+				i+=1
+				if i==max:return buf
+				if c=='"':
+					cnt=0
+					while i<cnt and i<max:
+						if txt[i-2-cnt]=='\\':cnt+=1
+						else:break
+					if(cnt%2)==0:break
+		elif c=="'":
+			i+=1
+			if i==max:return buf
+			c=txt[i]
+			if c=='\\':
+				i+=1
+				if i==max:return buf
+				c=txt[i]
+				if c=='x':
+					i+=2
+				elif c=='u':
+					i+=4
+			i+=1
+			if i==max:return buf
+			c=txt[i]
+			if c!='\'':error("uh-oh, invalid character")
+		elif c=='/':
+			if i==max:break
+			c=txt[i+1]
+			if c=='+':
+				i+=1
+				nesting=1
+				prev=0
+				while i<max:
+					c=txt[i]
+					if c=='+':
+						prev=1
+					elif c=='/':
+						if prev:
+							nesting-=1
+							if nesting==0:break
+						else:
+							if i<max:
+								i+=1
+								c=txt[i]
+								if c=='+':
+									nesting+=1
+							else:
+								return buf
+					else:
+						prev=0
+					i+=1
+			elif c=='*':
+				i+=1
+				while i<max:
+					c=txt[i]
+					if c=='*':
+						prev=1
+					elif c=='/':
+						if prev:break
+					else:
+						prev=0
+					i+=1
+			elif c=='/':
+				i+=1
+				c=txt[i]
+				while i<max and c!='\n':
+					i+=1
+					c=txt[i]
+		else:
+			buf.append(c)
+		i+=1
+	return buf
+class d_parser(object):
+	def __init__(self,env,incpaths):
+		self.allnames=[]
+		self.re_module=re.compile("module\s+([^;]+)")
+		self.re_import=re.compile("import\s+([^;]+)")
+		self.re_import_bindings=re.compile("([^:]+):(.*)")
+		self.re_import_alias=re.compile("[^=]+=(.+)")
+		self.env=env
+		self.nodes=[]
+		self.names=[]
+		self.incpaths=incpaths
+	def tryfind(self,filename):
+		found=0
+		for n in self.incpaths:
+			found=n.find_resource(filename.replace('.','/')+'.d')
+			if found:
+				self.nodes.append(found)
+				self.waiting.append(found)
+				break
+		if not found:
+			if not filename in self.names:
+				self.names.append(filename)
+	def get_strings(self,code):
+		self.module=''
+		lst=[]
+		mod_name=self.re_module.search(code)
+		if mod_name:
+			self.module=re.sub('\s+','',mod_name.group(1))
+		import_iterator=self.re_import.finditer(code)
+		if import_iterator:
+			for import_match in import_iterator:
+				import_match_str=re.sub('\s+','',import_match.group(1))
+				bindings_match=self.re_import_bindings.match(import_match_str)
+				if bindings_match:
+					import_match_str=bindings_match.group(1)
+				matches=import_match_str.split(',')
+				for match in matches:
+					alias_match=self.re_import_alias.match(match)
+					if alias_match:
+						match=alias_match.group(1)
+					lst.append(match)
+		return lst
+	def start(self,node):
+		self.waiting=[node]
+		while self.waiting:
+			nd=self.waiting.pop(0)
+			self.iter(nd)
+	def iter(self,node):
+		path=node.abspath(self.env)
+		code="".join(filter_comments(path))
+		names=self.get_strings(code)
+		for x in names:
+			if x in self.allnames:continue
+			self.allnames.append(x)
+			self.tryfind(x)
+def scan(self):
+	env=self.env
+	gruik=d_parser(env,env['INC_PATHS'])
+	gruik.start(self.inputs[0])
+	if Logs.verbose:
+		debug('deps: nodes found for %s: %s %s'%(str(self.inputs[0]),str(gruik.nodes),str(gruik.names)))
+	return(gruik.nodes,gruik.names)
+def get_target_name(self):
+	v=self.env
+	tp='program'
+	for x in self.features:
+		if x in['dshlib','dstaticlib']:
+			tp=x.lstrip('d')
+	return v['D_%s_PATTERN'%tp]%self.target
+d_params={'dflags':{'gdc':'','dmd':''},'importpaths':'','libs':'','libpaths':'','generate_headers':False,}
+def init_d(self):
+	for x in d_params:
+		setattr(self,x,getattr(self,x,d_params[x]))
+class d_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+		if len(k)>1:
+			self.features.append('d'+k[1])
+TaskGen.bind_feature('d',D_METHS)
+def init_d(self):
+	Utils.def_attrs(self,dflags={'gdc':'','dmd':''},importpaths='',libs='',libpaths='',uselib='',uselib_local='',generate_headers=False,compiled_tasks=[],add_objects=[],link_task=None)
+def apply_d_libs(self):
+	uselib=self.to_list(self.uselib)
+	seen=[]
+	local_libs=self.to_list(self.uselib_local)
+	libs=[]
+	libpaths=[]
+	env=self.env
+	while local_libs:
+		x=local_libs.pop()
+		if x in seen:
+			continue
+		else:
+			seen.append(x)
+		y=self.name_to_obj(x)
+		if not y:
+			raise Utils.WafError('object not found in uselib_local: obj %s uselib %s'%(self.name,x))
+		if y.uselib_local:
+			added=0
+			lst=y.to_list(y.uselib_local)
+			lst.reverse()
+			for u in lst:
+				if u in seen:continue
+				added=1
+				local_libs=[u]+local_libs
+			if added:continue
+		y.post()
+		seen.append(x)
+		if'dshlib'in y.features or'dstaticlib'in y.features:
+			libs.append(y.target)
+		tmp_path=y.path.bldpath(env)
+		if not tmp_path in libpaths:libpaths=[tmp_path]+libpaths
+		if y.link_task is not None:
+			self.link_task.set_run_after(y.link_task)
+			dep_nodes=getattr(self.link_task,'dep_nodes',[])
+			self.link_task.dep_nodes=dep_nodes+y.link_task.outputs
+		morelibs=y.to_list(y.uselib)
+		for v in morelibs:
+			if v in uselib:continue
+			uselib=[v]+uselib
+	self.uselib=uselib
+def apply_d_link(self):
+	link=getattr(self,'link',None)
+	if not link:
+		if'dstaticlib'in self.features:link='ar_link_static'
+		else:link='d_link'
+	linktask=self.create_task(link)
+	outputs=[t.outputs[0]for t in self.compiled_tasks]
+	linktask.set_inputs(outputs)
+	linktask.set_outputs(self.path.find_or_declare(get_target_name(self)))
+	self.link_task=linktask
+def apply_d_vars(self):
+	env=self.env
+	dpath_st=env['DPATH_ST']
+	lib_st=env['DLIB_ST']
+	libpath_st=env['DLIBPATH_ST']
+	dflags={'gdc':[],'dmd':[]}
+	importpaths=self.to_list(self.importpaths)
+	libpaths=[]
+	libs=[]
+	uselib=self.to_list(self.uselib)
+	for i in uselib:
+		if env['DFLAGS_'+i]:
+			for dflag in self.to_list(env['DFLAGS_'+i][env['COMPILER_D']]):
+				if not dflag in dflags[env['COMPILER_D']]:
+					dflags[env['COMPILER_D']]+=[dflag]
+	dflags[env['COMPILER_D']]=self.to_list(self.dflags[env['COMPILER_D']])+dflags[env['COMPILER_D']]
+	for dflag in dflags[env['COMPILER_D']]:
+		if not dflag in env['DFLAGS'][env['COMPILER_D']]:
+			env['DFLAGS'][env['COMPILER_D']]+=[dflag]
+	for x in self.features:
+		if not x in['dprogram','dstaticlib','dshlib']:
+			continue
+		x.lstrip('d')
+		d_shlib_dflags=env['D_'+x+'_DFLAGS']
+		if d_shlib_dflags:
+			for dflag in d_shlib_dflags:
+				if not dflag in env['DFLAGS'][env['COMPILER_D']]:
+					env['DFLAGS'][env['COMPILER_D']]+=[dflag]
+	env['_DFLAGS']=env['DFLAGS'][env['COMPILER_D']]
+	for i in uselib:
+		if env['DPATH_'+i]:
+			for entry in self.to_list(env['DPATH_'+i]):
+				if not entry in importpaths:
+					importpaths.append(entry)
+	for path in importpaths:
+		if os.path.isabs(path):
+			env.append_unique('_DIMPORTFLAGS',dpath_st%path)
+		else:
+			node=self.path.find_dir(path)
+			self.env.append_unique('INC_PATHS',node)
+			env.append_unique('_DIMPORTFLAGS',dpath_st%node.srcpath(env))
+			env.append_unique('_DIMPORTFLAGS',dpath_st%node.bldpath(env))
+	for i in uselib:
+		if env['LIBPATH_'+i]:
+			for entry in self.to_list(env['LIBPATH_'+i]):
+				if not entry in libpaths:
+					libpaths+=[entry]
+	libpaths=self.to_list(self.libpaths)+libpaths
+	for path in libpaths:
+		env.append_unique('_DLIBDIRFLAGS',libpath_st%path)
+	for i in uselib:
+		if env['LIB_'+i]:
+			for entry in self.to_list(env['LIB_'+i]):
+				if not entry in libs:
+					libs+=[entry]
+	libs=libs+self.to_list(self.libs)
+	for lib in libs:
+		env.append_unique('_DLIBFLAGS',lib_st%lib)
+	for i in uselib:
+		dlinkflags=env['DLINKFLAGS_'+i]
+		if dlinkflags:
+			for linkflag in dlinkflags:
+				env.append_unique('DLINKFLAGS',linkflag)
+def add_shlib_d_flags(self):
+	for linkflag in self.env['D_shlib_LINKFLAGS']:
+		self.env.append_unique('DLINKFLAGS',linkflag)
+def d_hook(self,node):
+	task=self.create_task(self.generate_headers and'd_with_header'or'd')
+	try:obj_ext=self.obj_ext
+	except AttributeError:obj_ext='_%d.o'%self.idx
+	task.inputs=[node]
+	task.outputs=[node.change_ext(obj_ext)]
+	self.compiled_tasks.append(task)
+	if self.generate_headers:
+		header_node=node.change_ext(self.env['DHEADER_ext'])
+		task.outputs+=[header_node]
+d_str='${D_COMPILER} ${_DFLAGS} ${_DIMPORTFLAGS} ${D_SRC_F}${SRC} ${D_TGT_F}${TGT}'
+d_with_header_str='${D_COMPILER} ${_DFLAGS} ${_DIMPORTFLAGS} \
+${D_HDR_F}${TGT[1].bldpath(env)} \
+${D_SRC_F}${SRC} \
+${D_TGT_F}${TGT[0].bldpath(env)}'
+link_str='${D_LINKER} ${DLNK_SRC_F}${SRC} ${DLNK_TGT_F}${TGT} ${DLINKFLAGS} ${_DLIBDIRFLAGS} ${_DLIBFLAGS}'
+cls=Task.simple_task_type('d',d_str,'GREEN')
+cls.scan=scan
+Task.simple_task_type('d_with_header',d_with_header_str,'GREEN')
+Task.simple_task_type('d_link',link_str,color='YELLOW')
+def generate_header(self,filename,install_path):
+	if not hasattr(self,'header_lst'):self.header_lst=[]
+	self.meths.append('process_header')
+	self.header_lst.append([filename,install_path])
+def process_header(self):
+	env=self.env
+	for i in getattr(self,'header_lst',[]):
+		node=self.path.find_resource(i[0])
+		if not node:
+			raise Utils.WafError('file not found on d obj '+i[0])
+		task=self.create_task('d_header')
+		task.set_inputs(node)
+		task.set_outputs(node.change_ext('.di'))
+d_header_str='${D_COMPILER} ${D_HEADER} ${SRC}'
+Task.simple_task_type('d_header',d_header_str,color='BLUE')
+
+feature('d')(init_d)
+before('apply_type_vars')(init_d)
+feature('d')(init_d)
+before('apply_d_libs')(init_d)
+feature('d')(apply_d_libs)
+after('apply_d_link')(apply_d_libs)
+before('apply_vnum')(apply_d_libs)
+feature('dprogram','dshlib','dstaticlib')(apply_d_link)
+after('apply_core')(apply_d_link)
+feature('d')(apply_d_vars)
+after('apply_core')(apply_d_vars)
+feature('dshlib')(add_shlib_d_flags)
+after('apply_d_vars')(add_shlib_d_flags)
+extension(EXT_D)(d_hook)
+taskgen(generate_header)
+taskgen(process_header)
+before('apply_core')(process_header)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/dbus.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/dbus.py
new file mode 100644
index 0000000..cabd122
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/dbus.py
@@ -0,0 +1,28 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import Task,Utils
+from TaskGen import taskgen,before,after,feature
+def add_dbus_file(self,filename,prefix,mode):
+	if not hasattr(self,'dbus_lst'):
+		self.dbus_lst=[]
+	self.meths.append('process_dbus')
+	self.dbus_lst.append([filename,prefix,mode])
+def process_dbus(self):
+	for filename,prefix,mode in getattr(self,'dbus_lst',[]):
+		env=self.env.copy()
+		node=self.path.find_resource(filename)
+		if not node:
+			raise Utils.WafError('file not found '+filename)
+		env['DBUS_BINDING_TOOL_PREFIX']=prefix
+		env['DBUS_BINDING_TOOL_MODE']=mode
+		task=self.create_task('dbus_binding_tool',env)
+		task.set_inputs(node)
+		task.set_outputs(node.change_ext('.h'))
+Task.simple_task_type('dbus_binding_tool','${DBUS_BINDING_TOOL} --prefix=${DBUS_BINDING_TOOL_PREFIX} --mode=${DBUS_BINDING_TOOL_MODE} --output=${TGT} ${SRC}',color='BLUE',before='cc')
+def detect(conf):
+	dbus_binding_tool=conf.find_program('dbus-binding-tool',var='DBUS_BINDING_TOOL')
+
+taskgen(add_dbus_file)
+taskgen(process_dbus)
+before('apply_core')(process_dbus)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/dmd.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/dmd.py
new file mode 100644
index 0000000..fb5ea68
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/dmd.py
@@ -0,0 +1,49 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import sys
+import ar
+def find_dmd(conf):
+	v=conf.env
+	d_compiler=None
+	if v['D_COMPILER']:
+		d_compiler=v['D_COMPILER']
+	if not d_compiler:d_compiler=conf.find_program('dmd',var='D_COMPILER')
+	if not d_compiler:return 0
+	v['D_COMPILER']=d_compiler
+def common_flags(conf):
+	v=conf.env
+	v['DFLAGS']={'gdc':[],'dmd':['-version=Posix']}
+	v['D_SRC_F']=''
+	v['D_TGT_F']='-c -of'
+	v['DPATH_ST']='-I%s'
+	v['D_LINKER']=v['D_COMPILER']
+	v['DLNK_SRC_F']=''
+	v['DLNK_TGT_F']='-of'
+	v['DLIB_ST']='-L-l%s'
+	v['DLIBPATH_ST']='-L-L%s'
+	v['DFLAGS_OPTIMIZED']=['-O']
+	v['DFLAGS_DEBUG']=['-g','-debug']
+	v['DFLAGS_ULTRADEBUG']=['-g','-debug']
+	v['DLINKFLAGS']=['-quiet']
+	v['D_shlib_DFLAGS']=['-fPIC']
+	v['D_shlib_LINKFLAGS']=['-L-shared']
+	v['DHEADER_ext']='.di'
+	v['D_HDR_F']='-H -Hf'
+	if sys.platform=="win32":
+		v['D_program_PATTERN']='%s.exe'
+		v['D_shlib_PATTERN']='lib%s.dll'
+		v['D_staticlib_PATTERN']='lib%s.a'
+	else:
+		v['D_program_PATTERN']='%s'
+		v['D_shlib_PATTERN']='lib%s.so'
+		v['D_staticlib_PATTERN']='lib%s.a'
+def detect(conf):
+	v=conf.env
+	find_dmd(conf)
+	ar.find_ar(conf)
+	conf.check_tool('d')
+	common_flags(conf)
+def set_options(opt):
+	pass
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/flex.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/flex.py
new file mode 100644
index 0000000..98bc4dd
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/flex.py
@@ -0,0 +1,14 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import TaskGen
+def decide_ext(self,node):
+	if'cxx'in self.features:return'.lex.cc'
+	else:return'.lex.c'
+TaskGen.declare_chain(name='flex',action='${FLEX} -o${TGT} ${FLEXFLAGS} ${SRC}',ext_in='.l',decider=decide_ext,before='cc cxx',)
+def detect(conf):
+	flex=conf.find_program('flex',var='FLEX')
+	if not flex:conf.fatal("flex was not found")
+	v=conf.env
+	v['FLEXFLAGS']=''
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/g++.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/g++.py
new file mode 100644
index 0000000..5eaf11d
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/g++.py
@@ -0,0 +1,118 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,optparse,sys,re
+import Configure,Options,Utils
+import ccroot,ar
+from Configure import conftest
+def find_gxx(conf):
+	v=conf.env
+	cxx=None
+	if v['CXX']:cxx=v['CXX']
+	elif'CXX'in os.environ:cxx=os.environ['CXX']
+	if not cxx:cxx=conf.find_program('g++',var='CXX')
+	if not cxx:cxx=conf.find_program('c++',var='CXX')
+	if not cxx:conf.fatal('g++ was not found')
+	try:
+		if Utils.cmd_output('%s --version'%cxx).find('g++')<0:
+			conf.fatal('g++ was not found, see the result of g++ --version')
+	except ValueError:
+		conf.fatal('g++ --version could not be executed')
+	v['CXX']=cxx
+	v['CXX_NAME']='gcc'
+	ccroot.get_cc_version(conf,cxx,'CXX_VERSION')
+def gxx_common_flags(conf):
+	v=conf.env
+	v['CXX_SRC_F']=''
+	v['CXX_TGT_F']='-c -o '
+	v['CPPPATH_ST']='-I%s'
+	if not v['LINK_CXX']:v['LINK_CXX']=v['CXX']
+	v['CXXLNK_SRC_F']=''
+	v['CXXLNK_TGT_F']='-o '
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STATICLIB_ST']='-l%s'
+	v['STATICLIBPATH_ST']='-L%s'
+	v['RPATH_ST']='-Wl,-rpath %s'
+	v['CXXDEFINES_ST']='-D%s'
+	v['SHLIB_MARKER']='-Wl,-Bdynamic'
+	v['STATICLIB_MARKER']='-Wl,-Bstatic'
+	v['FULLSTATIC_MARKER']='-static'
+	v['program_PATTERN']='%s'
+	v['shlib_CXXFLAGS']=['-fPIC','-DPIC']
+	v['shlib_LINKFLAGS']=['-shared']
+	v['shlib_PATTERN']='lib%s.so'
+	v['staticlib_LINKFLAGS']=['-Wl,-Bstatic']
+	v['staticlib_PATTERN']='lib%s.a'
+	v['MACBUNDLE_LINKFLAGS']=['-bundle','-undefined dynamic_lookup']
+	v['MACBUNDLE_CCFLAGS']=['-fPIC']
+	v['MACBUNDLE_PATTERN']='%s.bundle'
+def gxx_modifier_win32(conf):
+	if sys.platform!='win32':return
+	v=conf.env
+	v['program_PATTERN']='%s.exe'
+	v['shlib_PATTERN']='lib%s.dll'
+	v['shlib_CXXFLAGS']=['']
+	v['staticlib_LINKFLAGS']=['']
+def gxx_modifier_cygwin(conf):
+	if sys.platform!='cygwin':return
+	v=conf.env
+	v['program_PATTERN']='%s.exe'
+	v['shlib_PATTERN']='lib%s.dll'
+	v['shlib_CXXFLAGS']=['']
+	v['staticlib_LINKFLAGS']=['']
+def gxx_modifier_darwin(conf):
+	if sys.platform!='darwin':return
+	v=conf.env
+	v['shlib_CXXFLAGS']=['-fPIC','-compatibility_version 1','-current_version 1']
+	v['shlib_LINKFLAGS']=['-dynamiclib']
+	v['shlib_PATTERN']='lib%s.dylib'
+	v['staticlib_LINKFLAGS']=['']
+	v['SHLIB_MARKER']=''
+	v['STATICLIB_MARKER']=''
+def gxx_modifier_aix5(conf):
+	if sys.platform!='aix5':return
+	v=conf.env
+	v['program_LINKFLAGS']=['-Wl,-brtl']
+	v['shlib_LINKFLAGS']=['-shared','-Wl,-brtl,-bexpfull']
+	v['SHLIB_MARKER']=''
+def gxx_modifier_debug(conf):
+	v=conf.env
+	f='cxx'
+	if conf.check_flags('-O2 -DNDEBUG',kind=f):
+		v['CXXFLAGS_OPTIMIZED']=['-O2','-DNDEBUG']
+		v['CXXFLAGS_RELEASE']=['-O2','-DNDEBUG']
+	if conf.check_flags('-g -DDEBUG',kind=f):
+		v['CXXFLAGS_DEBUG']=['-g','-DDEBUG']
+		v['LINKFLAGS_DEBUG']=['-g']
+	if conf.check_flags('-g3 -O0 -DDEBUG',kind=f):
+		v['CXXFLAGS_ULTRADEBUG']=['-g3','-O0','-DDEBUG']
+		v['LINKFLAGS_ULTRADEBUG']=['-g']
+	if conf.check_flags('-Wall',kind=f):
+		for x in'OPTIMIZED RELEASE DEBUG ULTRADEBUG'.split():v.append_unique('CXXFLAGS_'+x,'-Wall')
+	try:
+		debug_level=Options.options.debug_level.upper()
+	except AttributeError:
+		debug_level=ccroot.DEBUG_LEVELS.CUSTOM
+	v.append_value('CXXFLAGS',v['CXXFLAGS_'+debug_level])
+	v.append_value('LINKFLAGS',v['LINKFLAGS_'+debug_level])
+detect='''
+find_gxx
+find_cpp
+find_ar
+gxx_common_flags
+gxx_modifier_win32
+gxx_modifier_cygwin
+gxx_modifier_darwin
+gxx_modifier_aix5
+cxx_load_tools
+cxx_add_flags
+'''
+
+conftest(find_gxx)
+conftest(gxx_common_flags)
+conftest(gxx_modifier_win32)
+conftest(gxx_modifier_cygwin)
+conftest(gxx_modifier_darwin)
+conftest(gxx_modifier_aix5)
+conftest(gxx_modifier_debug)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gas.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gas.py
new file mode 100644
index 0000000..efd5676
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gas.py
@@ -0,0 +1,35 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys
+import Task
+from TaskGen import extension,taskgen,after,before
+EXT_ASM=['.s','.S','.asm','.ASM','.spp','.SPP']
+as_str='${AS} ${ASFLAGS} ${_ASINCFLAGS} ${SRC} -o ${TGT}'
+Task.simple_task_type('asm',as_str,'PINK',ext_out='.o')
+def asm_hook(self,node):
+	task=self.create_task('asm')
+	try:obj_ext=self.obj_ext
+	except AttributeError:obj_ext='_%d.o'%self.idx
+	task.inputs=[node]
+	task.outputs=[node.change_ext(obj_ext)]
+	self.compiled_tasks.append(task)
+	self.meths.append('asm_incflags')
+def asm_incflags(self):
+	if self.env['ASINCFLAGS']:self.env['_ASINCFLAGS']=self.env['ASINCFLAGS']
+	if'cxx'in self.features:self.env['_ASINCFLAGS']=self.env['_CXXINCFLAGS']
+	else:self.env['_ASINCFLAGS']=self.env['_CCINCFLAGS']
+def detect(conf):
+	comp=os.environ.get('AS','')
+	if not comp:comp=conf.find_program('as',var='AS')
+	if not comp:comp=conf.find_program('gas',var='AS')
+	if not comp:comp=conf.env['CC']
+	if not comp:return
+	v=conf.env
+	v['ASFLAGS']=''
+
+extension(EXT_ASM)(asm_hook)
+taskgen(asm_incflags)
+after('apply_obj_vars_cc')(asm_incflags)
+after('apply_obj_vars_cxx')(asm_incflags)
+before('apply_link')(asm_incflags)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gcc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gcc.py
new file mode 100644
index 0000000..a9df2ec
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gcc.py
@@ -0,0 +1,116 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys
+import Configure,Options,Utils
+import ccroot,ar
+from Configure import conftest
+def find_gcc(conf):
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in os.environ:cc=os.environ['CC']
+	if not cc:cc=conf.find_program('gcc',var='CC')
+	if not cc:cc=conf.find_program('cc',var='CC')
+	if not cc:conf.fatal('gcc was not found')
+	try:
+		if Utils.cmd_output('%s --version'%cc).find('gcc')<0:
+			conf.fatal('gcc was not found, see the result of gcc --version')
+	except ValueError:
+		conf.fatal('gcc --version could not be executed')
+	v['CC']=cc
+	v['CC_NAME']='gcc'
+	ccroot.get_cc_version(conf,cc,'CC_VERSION')
+def gcc_common_flags(conf):
+	v=conf.env
+	v['CC_SRC_F']=''
+	v['CC_TGT_F']='-c -o '
+	v['CPPPATH_ST']='-I%s'
+	if not v['LINK_CC']:v['LINK_CC']=v['CC']
+	v['CCLNK_SRC_F']=''
+	v['CCLNK_TGT_F']='-o '
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STATICLIB_ST']='-l%s'
+	v['STATICLIBPATH_ST']='-L%s'
+	v['RPATH_ST']='-Wl,-rpath %s'
+	v['CCDEFINES_ST']='-D%s'
+	v['SHLIB_MARKER']='-Wl,-Bdynamic'
+	v['STATICLIB_MARKER']='-Wl,-Bstatic'
+	v['program_PATTERN']='%s'
+	v['shlib_CCFLAGS']=['-fPIC','-DPIC']
+	v['shlib_LINKFLAGS']=['-shared']
+	v['shlib_PATTERN']='lib%s.so'
+	v['staticlib_LINKFLAGS']=['-Wl,-Bstatic']
+	v['staticlib_PATTERN']='lib%s.a'
+	v['MACBUNDLE_LINKFLAGS']=['-bundle','-undefined dynamic_lookup']
+	v['MACBUNDLE_CCFLAGS']=['-fPIC']
+	v['MACBUNDLE_PATTERN']='%s.bundle'
+def gcc_modifier_win32(conf):
+	v=conf.env
+	if sys.platform!='win32':return
+	v['program_PATTERN']='%s.exe'
+	v['shlib_PATTERN']='lib%s.dll'
+	v['shlib_CCFLAGS']=[]
+	v['staticlib_LINKFLAGS']=[]
+def gcc_modifier_cygwin(conf):
+	v=conf.env
+	if sys.platform!='cygwin':return
+	v['program_PATTERN']='%s.exe'
+	v['shlib_PATTERN']='lib%s.dll'
+	v['shlib_CCFLAGS']=[]
+	v['staticlib_LINKFLAGS']=[]
+def gcc_modifier_darwin(conf):
+	v=conf.env
+	if sys.platform!='darwin':return
+	v['shlib_CCFLAGS']=['-fPIC','-compatibility_version 1','-current_version 1']
+	v['shlib_LINKFLAGS']=['-dynamiclib']
+	v['shlib_PATTERN']='lib%s.dylib'
+	v['staticlib_LINKFLAGS']=[]
+	v['SHLIB_MARKER']=''
+	v['STATICLIB_MARKER']=''
+def gcc_modifier_aix5(conf):
+	v=conf.env
+	if sys.platform!='aix5':return
+	v['program_LINKFLAGS']=['-Wl,-brtl']
+	v['shlib_LINKFLAGS']=['-shared','-Wl,-brtl,-bexpfull']
+	v['SHLIB_MARKER']=''
+def gcc_modifier_debug(conf):
+	v=conf.env
+	if conf.check_flags('-O2'):
+		v['CCFLAGS_OPTIMIZED']=['-O2']
+		v['CCFLAGS_RELEASE']=['-O2']
+	if conf.check_flags('-g -DDEBUG'):
+		v['CCFLAGS_DEBUG']=['-g','-DDEBUG']
+		v['LINKFLAGS_DEBUG']=['-g']
+	if conf.check_flags('-g3 -O0 -DDEBUG'):
+		v['CCFLAGS_ULTRADEBUG']=['-g3','-O0','-DDEBUG']
+		v['LINKFLAGS_ULTRADEBUG']=['-g']
+	if conf.check_flags('-Wall'):
+		for x in'OPTIMIZED RELEASE DEBUG ULTRADEBUG'.split():v.append_unique('CCFLAGS_'+x,'-Wall')
+	try:
+		debug_level=Options.options.debug_level.upper()
+	except AttributeError:
+		debug_level=ccroot.DEBUG_LEVELS.CUSTOM
+	v.append_value('CCFLAGS',v['CCFLAGS_'+debug_level])
+	v.append_value('LINKFLAGS',v['LINKFLAGS_'+debug_level])
+detect='''
+find_gcc
+find_cpp
+find_ar
+gcc_common_flags
+gcc_modifier_win32
+gcc_modifier_cygwin
+gcc_modifier_darwin
+gcc_modifier_aix5
+cc_load_tools
+cc_add_flags
+'''
+
+conftest(find_gcc)
+conftest(gcc_common_flags)
+conftest(gcc_modifier_win32)
+conftest(gcc_modifier_cygwin)
+conftest(gcc_modifier_darwin)
+conftest(gcc_modifier_aix5)
+conftest(gcc_modifier_debug)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gdc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gdc.py
new file mode 100644
index 0000000..451efc3
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gdc.py
@@ -0,0 +1,49 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import sys
+import ar
+def find_gdc(conf):
+	v=conf.env
+	d_compiler=None
+	if v['D_COMPILER']:
+		d_compiler=v['D_COMPILER']
+	if not d_compiler:d_compiler=conf.find_program('gdc',var='D_COMPILER')
+	if not d_compiler:return 0
+	v['D_COMPILER']=d_compiler
+def common_flags(conf):
+	v=conf.env
+	v['DFLAGS']={'gdc':[],'dmd':[]}
+	v['D_SRC_F']=''
+	v['D_TGT_F']='-c -o '
+	v['DPATH_ST']='-I%s'
+	v['D_LINKER']=v['D_COMPILER']
+	v['DLNK_SRC_F']=''
+	v['DLNK_TGT_F']='-o '
+	v['DLIB_ST']='-l%s'
+	v['DLIBPATH_ST']='-L%s'
+	v['DLINKFLAGS']=[]
+	v['DFLAGS_OPTIMIZED']=['-O3']
+	v['DFLAGS_DEBUG']=['-O0']
+	v['DFLAGS_ULTRADEBUG']=['-O0']
+	v['D_shlib_DFLAGS']=[]
+	v['D_shlib_LINKFLAGS']=['-shared']
+	v['DHEADER_ext']='.di'
+	v['D_HDR_F']='-fintfc -fintfc-file='
+	if sys.platform=="win32":
+		v['D_program_PATTERN']='%s.exe'
+		v['D_shlib_PATTERN']='lib%s.dll'
+		v['D_staticlib_PATTERN']='lib%s.a'
+	else:
+		v['D_program_PATTERN']='%s'
+		v['D_shlib_PATTERN']='lib%s.so'
+		v['D_staticlib_PATTERN']='lib%s.a'
+def detect(conf):
+	v=conf.env
+	find_gdc(conf)
+	ar.find_ar(conf)
+	conf.check_tool('d')
+	common_flags(conf)
+def set_options(opt):
+	pass
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/glib2.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/glib2.py
new file mode 100644
index 0000000..a788a10
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/glib2.py
@@ -0,0 +1,81 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import Task,Utils
+from TaskGen import taskgen,before,after,feature
+def add_marshal_file(self,filename,prefix):
+	if not hasattr(self,'marshal_list'):
+		self.marshal_list=[]
+	self.meths.append('process_marshal')
+	self.marshal_list.append((filename,prefix))
+def process_marshal(self):
+	for filename,prefix in getattr(self,'marshal_list',[]):
+		node=self.path.find_resource(filename)
+		if not node:
+			raise Utils.WafError('file not found '+filename)
+		header_env=self.env.copy()
+		header_env['GLIB_GENMARSHAL_PREFIX']=prefix
+		header_env['GLIB_GENMARSHAL_MODE']='--header'
+		task=self.create_task('glib_genmarshal',header_env)
+		task.set_inputs(node)
+		task.set_outputs(node.change_ext('.h'))
+		body_env=self.env.copy()
+		body_env['GLIB_GENMARSHAL_PREFIX']=prefix
+		body_env['GLIB_GENMARSHAL_MODE']='--body'
+		task=self.create_task('glib_genmarshal',body_env)
+		task.set_inputs(node)
+		task.set_outputs(node.change_ext('.c'))
+		outnode=node.change_ext('.c')
+		self.allnodes.append(outnode)
+def add_enums_from_template(self,source='',target='',template='',comments=''):
+	if not hasattr(self,'enums_list'):
+		self.enums_list=[]
+	self.meths.append('process_enums')
+	self.enums_list.append({'source':source,'target':target,'template':template,'file-head':'','file-prod':'','file-tail':'','enum-prod':'','value-head':'','value-prod':'','value-tail':'','comments':comments})
+def add_enums(self,source='',target='',file_head='',file_prod='',file_tail='',enum_prod='',value_head='',value_prod='',value_tail='',comments=''):
+	if not hasattr(self,'enums_list'):
+		self.enums_list=[]
+	self.meths.append('process_enums')
+	self.enums_list.append({'source':source,'template':'','target':target,'file-head':file_head,'file-prod':file_prod,'file-tail':file_tail,'enum-prod':enum_prod,'value-head':value_head,'value-prod':value_prod,'value-tail':value_tail,'comments':comments})
+def process_enums(self):
+	for enum in getattr(self,'enums_list',[]):
+		env=self.env.copy()
+		task=self.create_task('glib_mkenums',env)
+		inputs=[]
+		source_list=self.to_list(enum['source'])
+		if not source_list:
+			raise Utils.WafError('missing source '+str(enum))
+		source_list=[self.path.find_resource(k)for k in source_list]
+		inputs+=source_list
+		env['GLIB_MKENUMS_SOURCE']=[k.abspath(env)for k in source_list]
+		if not enum['target']:
+			raise Utils.WafError('missing target '+str(enum))
+		tgt_node=self.path.find_or_declare(enum['target'])
+		if tgt_node.name.endswith('.c'):
+			self.allnodes.append(tgt_node)
+		env['GLIB_MKENUMS_TARGET']=tgt_node.abspath(env)
+		options=[]
+		if enum['template']:
+			template_node=self.path.find_resource(enum['template'])
+			options.append('--template %s'%(template_node.abspath(env)))
+			inputs.append(template_node)
+		params={'file-head':'--fhead','file-prod':'--fprod','file-tail':'--ftail','enum-prod':'--eprod','value-head':'--vhead','value-prod':'--vprod','value-tail':'--vtail','comments':'--comments'}
+		for param,option in params.iteritems():
+			if enum[param]:
+				options.append('%s %r'%(option,enum[param]))
+		env['GLIB_MKENUMS_OPTIONS']=' '.join(options)
+		task.set_inputs(inputs)
+		task.set_outputs(tgt_node)
+Task.simple_task_type('glib_genmarshal','${GLIB_GENMARSHAL} ${SRC} --prefix=${GLIB_GENMARSHAL_PREFIX} ${GLIB_GENMARSHAL_MODE} > ${TGT}',color='BLUE',before='cc')
+Task.simple_task_type('glib_mkenums','${GLIB_MKENUMS} ${GLIB_MKENUMS_OPTIONS} ${GLIB_MKENUMS_SOURCE} > ${GLIB_MKENUMS_TARGET}',color='PINK',before='cc')
+def detect(conf):
+	glib_genmarshal=conf.find_program('glib-genmarshal',var='GLIB_GENMARSHAL')
+	mk_enums_tool=conf.find_program('glib-mkenums',var='GLIB_MKENUMS')
+
+taskgen(add_marshal_file)
+taskgen(process_marshal)
+before('apply_core')(process_marshal)
+taskgen(add_enums_from_template)
+taskgen(add_enums)
+taskgen(process_enums)
+before('apply_core')(process_enums)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gnome.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gnome.py
new file mode 100644
index 0000000..1356a54
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gnome.py
@@ -0,0 +1,200 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,re
+import TaskGen,Utils,Runner,Task,Build,Options,Logs
+import cc
+from Logs import error
+from TaskGen import taskgen,before,after,feature
+n1_regexp=re.compile('<refentrytitle>(.*)</refentrytitle>',re.M)
+n2_regexp=re.compile('<manvolnum>(.*)</manvolnum>',re.M)
+def postinstall_schemas(prog_name):
+	if Options.commands['install']:
+		dir=Build.bld.get_install_path('${PREFIX}/etc/gconf/schemas/%s.schemas'%prog_name)
+		if not Options.options.destdir:
+			Utils.pprint('YELLOW','Installing GConf schema')
+			command='gconftool-2 --install-schema-file=%s 1> /dev/null'%dir
+			ret=Utils.exec_command(command)
+		else:
+			Utils.pprint('YELLOW','GConf schema not installed. After install, run this:')
+			Utils.pprint('YELLOW','gconftool-2 --install-schema-file=%s'%dir)
+def postinstall_icons():
+	dir=Build.bld.get_install_path('${DATADIR}/icons/hicolor')
+	if Options.commands['install']:
+		if not Options.options.destdir:
+			Utils.pprint('YELLOW',"Updating Gtk icon cache.")
+			command='gtk-update-icon-cache -q -f -t %s'%dir
+			ret=Utils.exec_command(command)
+		else:
+			Utils.pprint('YELLOW','Icon cache not updated. After install, run this:')
+			Utils.pprint('YELLOW','gtk-update-icon-cache -q -f -t %s'%dir)
+def postinstall_scrollkeeper(prog_name):
+	if Options.commands['install']:
+		if os.path.iswriteable('/var/log/scrollkeeper.log'):
+			dir1=Build.bld.get_install_path('${PREFIX}/var/scrollkeeper')
+			dir2=Build.bld.get_install_path('${DATADIR}/omf/%s'%prog_name)
+			command='scrollkeeper-update -q -p %s -o %s'%(dir1,dir2)
+			ret=Utils.exec_command(command)
+def postinstall(prog_name='myapp',schemas=1,icons=1,scrollkeeper=1):
+	if schemas:postinstall_schemas(prog_name)
+	if icons:postinstall_icons()
+	if scrollkeeper:postinstall_scrollkeeper(prog_name)
+class gnome_doc_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def init_gnome_doc(self):
+	self.default_install_path='${PREFIX}/share'
+def apply_gnome_doc(self):
+	self.env['APPNAME']=self.doc_module
+	lst=self.to_list(self.doc_linguas)
+	for x in lst:
+		tsk=self.create_task('xml2po')
+		node=self.path.find_resource(x+'/'+x+'.po')
+		src=self.path.find_resource('C/%s.xml'%self.doc_module)
+		out=self.path.find_or_declare('%s/%s.xml'%(x,self.doc_module))
+		tsk.set_inputs([node,src])
+		tsk.set_outputs(out)
+		tsk2=self.create_task('xsltproc2po')
+		out2=self.path.find_or_declare('%s/%s-%s.omf'%(x,self.doc_module,x))
+		tsk2.set_outputs(out2)
+		node=self.path.find_resource(self.doc_module+".omf.in")
+		tsk2.inputs=[node,out]
+		tsk2.run_after.append(tsk)
+		if Options.is_install:
+			path=self.install_path+'gnome/help/%s/%s'%(self.doc_module,x)
+			Build.bld.install_files(self.install_path+'omf',out2.abspath(self.env))
+			for y in self.to_list(self.doc_figures):
+				try:
+					os.stat(self.path.abspath()+'/'+x+'/'+y)
+					Common.install_as(path+'/'+y,self.path.abspath()+'/'+x+'/'+y)
+				except:
+					Common.install_as(path+'/'+y,self.path.abspath()+'/C/'+y)
+			Common.install_as(path+'/%s.xml'%self.doc_module,out.abspath(self.env))
+class xml_to_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def init_xml_to(self):
+	Utils.def_attrs(self,source='xmlfile',xslt='xlsltfile',target='hey',default_install_path='${PREFIX}',task_created=None)
+def apply_xml_to(self):
+	tree=Build.bld
+	xmlfile=self.path.find_resource(self.source)
+	xsltfile=self.path.find_resource(self.xslt)
+	tsk=self.create_task('xmlto')
+	tsk.set_inputs([xmlfile,xsltfile])
+	tsk.set_outputs(xmlfile.change_ext('html'))
+	tsk.install_path=self.install_path
+def sgml_scan(self):
+	node=self.inputs[0]
+	env=self.env
+	variant=node.variant(env)
+	fi=open(node.abspath(env),'r')
+	content=fi.read()
+	fi.close()
+	name=n1_regexp.findall(content)[0]
+	num=n2_regexp.findall(content)[0]
+	doc_name=name+'.'+num
+	return([],[doc_name])
+def sig_implicit_deps(self):
+	def sgml_outputs():
+		dps=Build.bld.raw_deps[self.unique_id()]
+		name=dps[0]
+		self.set_outputs(self.task_generator.path.find_or_declare(name))
+	tree=Build.bld
+	key=self.unique_id()
+	prev_sigs=tree.task_sigs.get(key,())
+	if prev_sigs and prev_sigs[2]==self.compute_sig_implicit_deps():
+		sgml_outputs()
+		return prev_sigs[2]
+	(nodes,names)=self.scan()
+	if Logs.verbose and Logs.zones:
+		debug('deps: scanner for %s returned %s %s'%(str(self),str(nodes),str(names)))
+	tree=Build.bld
+	tree.node_deps[self.unique_id()]=nodes
+	tree.raw_deps[self.unique_id()]=names
+	sgml_outputs()
+	sig=self.compute_sig_implicit_deps()
+	return sig
+class gnome_sgml2man_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def apply_gnome_sgml2man(self):
+	assert(getattr(self,'appname',None))
+	def install_result(task):
+		out=task.outputs[0]
+		name=out.name
+		ext=name[-1]
+		env=task.env
+		Build.bld.install_files('DATADIR','man/man%s/'%ext,out.abspath(env),env)
+	tree=Build.bld
+	tree.rescan(self.path)
+	for name in Build.bld.cache_dir_contents[self.path.id]:
+		base,ext=os.path.splitext(name)
+		if ext!='.sgml':continue
+		task=self.create_task('sgml2man')
+		task.set_inputs(self.path.find_resource(name))
+		task.task_generator=self
+		if Options.is_install:task.install=install_result
+		task.scan()
+cls=Task.simple_task_type('sgml2man','${SGML2MAN} -o ${TGT[0].bld_dir(env)} ${SRC}  > /dev/null',color='BLUE')
+cls.scan=sgml_scan
+cls.sig_implicit_deps=sig_implicit_deps
+old_runnable_status=Task.Task.runnable_status
+def runnable_status(self):
+	old_runnable_status(self)
+	return old_runnable_status(self)
+cls.runnable_status=runnable_status
+cls.quiet=1
+Task.simple_task_type('xmlto','${XMLTO} html -m ${SRC[1].abspath(env)} ${SRC[0].abspath(env)}')
+Task.simple_task_type('xml2po','${XML2PO} ${XML2POFLAGS} ${SRC} > ${TGT}',color='BLUE')
+xslt_magic="""${XSLTPROC2PO} -o ${TGT[0].abspath(env)} \
+--stringparam db2omf.basename ${APPNAME} \
+--stringparam db2omf.format docbook \
+--stringparam db2omf.lang C \
+--stringparam db2omf.dtd '-//OASIS//DTD DocBook XML V4.3//EN' \
+--stringparam db2omf.omf_dir ${PREFIX}/share/omf \
+--stringparam db2omf.help_dir ${PREFIX}/share/gnome/help \
+--stringparam db2omf.omf_in ${SRC[0].abspath(env)} \
+--stringparam db2omf.scrollkeeper_cl ${SCROLLKEEPER_DATADIR}/Templates/C/scrollkeeper_cl.xml \
+${DB2OMF} ${SRC[1].abspath(env)}"""
+Task.simple_task_type('xsltproc2po',xslt_magic,color='BLUE')
+def detect(conf):
+	conf.check_tool('gnu_dirs glib2 dbus')
+	sgml2man=conf.find_program('docbook2man',var='SGML2MAN')
+	def getstr(varname):
+		return getattr(Options.options,varname,'')
+	conf.define('GNOMELOCALEDIR',os.path.join(conf.env['DATADIR'],'locale'))
+	xml2po=conf.find_program('xml2po',var='XML2PO')
+	xsltproc2po=conf.find_program('xsltproc',var='XSLTPROC2PO')
+	conf.env['XML2POFLAGS']='-e -p'
+	conf.env['SCROLLKEEPER_DATADIR']=Utils.cmd_output("scrollkeeper-config --pkgdatadir",silent=1).strip()
+	conf.env['DB2OMF']=Utils.cmd_output("/usr/bin/pkg-config --variable db2omf gnome-doc-utils",silent=1).strip()
+	conf.define('ENABLE_NLS',1)
+	conf.define('HAVE_BIND_TEXTDOMAIN_CODESET',1)
+	conf.define('HAVE_DCGETTEXT',1)
+	conf.check(header_name='dlfcn.h',define_name='HAVE_DLFCN_H')
+	conf.define('HAVE_GETTEXT',1)
+	conf.check(header_name='inttypes.h',define_name='HAVE_INTTYPES_H')
+	conf.check(header_name='locale.h',define_name='HAVE_LOCALE_H')
+	conf.check(header_name='memory.h',define_name='HAVE_MEMORY_H')
+	conf.check(header_name='stdint.h',define_name='HAVE_STDINT_H')
+	conf.check(header_name='stdlib.h',define_name='HAVE_STDLIB_H')
+	conf.check(header_name='strings.h',define_name='HAVE_STRINGS_H')
+	conf.check(header_name='string.h',define_name='HAVE_STRING_H')
+	conf.check(header_name='sys/stat.h',define_name='HAVE_SYS_STAT_H')
+	conf.check(header_name='sys/types.h',define_name='HAVE_SYS_TYPES_H')
+	conf.check(header_name='unistd.h',define_name='HAVE_UNISTD_H')
+def set_options(opt):
+	opt.add_option('--want-rpath',type='int',default=1,dest='want_rpath',help='set rpath to 1 or 0 [Default 1]')
+
+taskgen(init_gnome_doc)
+feature('gmome_doc')(init_gnome_doc)
+taskgen(apply_gnome_doc)
+feature('gnome_doc')(apply_gnome_doc)
+after('init_gnome_doc')(apply_gnome_doc)
+taskgen(init_xml_to)
+feature('xml_to')(init_xml_to)
+taskgen(apply_xml_to)
+feature('xml_to')(apply_xml_to)
+after('init_xml_to')(apply_xml_to)
+taskgen(apply_gnome_sgml2man)
+feature('gnome_sgml2man')(apply_gnome_sgml2man)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gnu_dirs.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gnu_dirs.py
new file mode 100644
index 0000000..68e3969
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gnu_dirs.py
@@ -0,0 +1,70 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import re
+import Utils,Options
+_options=[x.split(', ')for x in'''
+bindir, user executables, $(EXEC_PREFIX)/bin
+sbindir, system admin executables, $(EXEC_PREFIX)/sbin
+libexecdir, program executables, $(EXEC_PREFIX)/libexec
+sysconfdir, read-only single-machine data, $(PREFIX)/etc
+sharedstatedir, modifiable architecture-independent data, $(PREFIX)/com
+localstatedir, modifiable single-machine data, $(PREFIX)/var
+libdir, object code libraries, $(EXEC_PREFIX)/lib
+includedir, C header files, $(PREFIX)/include
+oldincludedir, C header files for non-gcc, /usr/include
+datarootdir, read-only arch.-independent data root, $(PREFIX)/share
+datadir, read-only architecture-independent data, $(DATAROOTDIR)
+infodir, info documentation, $(DATAROOTDIR)/info
+localedir, locale-dependent data, $(DATAROOTDIR)/locale
+mandir, man documentation, $(DATAROOTDIR)/man
+docdir, documentation root, $(DATAROOTDIR)/doc/$(PACKAGE)
+htmldir, html documentation, $(DOCDIR)
+dvidir, dvi documentation, $(DOCDIR)
+pdfdir, pdf documentation, $(DOCDIR)
+psdir, ps documentation, $(DOCDIR)
+'''.split('\n')if x]
+re_var=re.compile(r'\$\(([a-zA-Z0-9_]+)\)')
+def subst_vars(foo,vars):
+	def repl(m):
+		s=m.group(1)
+		return s and''+vars[s]or''
+	return re_var.sub(repl,foo)
+def detect(conf):
+	def get_param(varname,default):
+		return getattr(Options.options,varname,'')or default
+	env=conf.env
+	env['EXEC_PREFIX']=get_param('EXEC_PREFIX',env['PREFIX'])
+	env['PACKAGE']=Utils.g_module.APPNAME or env['PACKAGE']
+	complete=False
+	iter=0
+	while not complete and iter<len(_options)+1:
+		iter+=1
+		complete=True
+		for name,help,default in _options:
+			name=name.upper()
+			if not env[name]:
+				try:
+					env[name]=subst_vars(get_param(name,default),env)
+				except TypeError:
+					complete=False
+	if not complete:
+		lst=[name for name,_,_ in _options if not env[name.upper()]]
+		raise Utils.WafError('Variable substitution failure %r'%lst)
+def set_options(opt):
+	inst_dir=opt.add_option_group('Installation directories','By default, "waf install" will put the files in\
+ "/usr/local/bin", "/usr/local/lib" etc. An installation prefix other\
+ than "/usr/local" can be given using "--prefix", for example "--prefix=$HOME"')
+	for k in('--prefix','--destdir'):
+		option=opt.parser.get_option(k)
+		if option:
+			opt.parser.remove_option(k)
+			inst_dir.add_option(option)
+	inst_dir.add_option('--exec-prefix',help='installation prefix [Default: $(PREFIX)]',default='',dest='EXEC_PREFIX')
+	dirs_options=opt.add_option_group('Pre-defined installation directories','')
+	for name,help,default in _options:
+		option_name='--'+name
+		str_default=default
+		str_help='%s [Default: %s]'%(help,str_default)
+		dirs_options.add_option(option_name,help=str_help,default='',dest=name.upper())
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gob2.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gob2.py
new file mode 100644
index 0000000..3f82b99
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/gob2.py
@@ -0,0 +1,11 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import TaskGen
+TaskGen.declare_chain(name='gob2',action='${GOB2} -o ${TGT[0].bld_dir(env)} ${GOB2FLAGS} ${SRC}',ext_in='.gob',ext_out='.c')
+def detect(conf):
+	gob2=conf.find_program('gob2',var='GOB2')
+	if not gob2:conf.fatal('could not find the gob2 compiler')
+	conf.env['GOB2']=gob2
+	conf.env['GOB2FLAGS']=''
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/icc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/icc.py
new file mode 100644
index 0000000..8f4094f
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/icc.py
@@ -0,0 +1,70 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys
+import Configure,Options,Utils
+import ccroot,ar
+from Configure import conftest
+def find_icc(conf):
+	if sys.platform=='win32':
+		conf.find_icc_win32()
+	else:
+		conf.find_icc_other()
+def find_icc_win32(conf):
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in os.environ:cc=os.environ['CC']
+	if not cc:cc=conf.find_program('ICL',var='CC')
+	if not cc:conf.fatal('Intel C Compiler (icl.exe) was not found')
+	v['CC']=Utils.quote_whitespace(cc)
+	v['CC_NAME']='icc'
+	v['CXX']=v['CC']
+def find_icc_other(conf):
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in os.environ:cc=os.environ['CC']
+	if not cc:cc=conf.find_program('icc',var='CC')
+	if not cc:conf.fatal('Intel C Compiler (icc) was not found')
+	try:
+		if Utils.cmd_output('%s --version'%cc).find('icc')<0:
+			conf.fatal('icc was not found, see the result of icc --version')
+	except ValueError:
+		conf.fatal('icc --version could not be executed')
+	v['CC']=cc
+	v['CC_NAME']='icc'
+	ccroot.get_cc_version(conf,cc,'CC_VERSION')
+def icc_modifier_win32(conf):
+	if sys.platform!='win32':return
+	v=conf.env
+	try:
+		v['CC_NAME']='icc'
+		v['CPPFLAGS'].remove('/errorReport:prompt')
+	except ValueError:
+		pass
+if sys.platform=='win32':
+	detect='''
+find_icc
+find_msvc
+msvc_common_flags
+icc_modifier_win32
+cc_load_tools
+cc_add_flags
+'''
+elif sys.platform=='cygwin':
+	conf.fatal("ICC module is not supported for cygwin. Try under native Win32")
+else:
+	detect='''
+find_icc
+find_ar
+gcc_common_flags
+gcc_modifier_darwin
+cc_load_tools
+cc_add_flags
+'''
+
+conftest(find_icc)
+conftest(find_icc_win32)
+conftest(find_icc_other)
+conftest(icc_modifier_win32)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/intltool.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/intltool.py
new file mode 100644
index 0000000..bbb9429
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/intltool.py
@@ -0,0 +1,79 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,re
+import TaskGen,Task,Utils,Runner,Options,Build
+import cc
+from Logs import error
+class intltool_in_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+		self.source=''
+		self.flags=''
+		self.podir='po'
+		self.intlcache='.intlcache'
+		self.tasks=[]
+	def apply(self):
+		self.env=self.env.copy()
+		tree=Build.bld
+		for i in self.to_list(self.source):
+			node=self.path.find_resource(i)
+			podirnode=self.path.find_dir(self.podir)
+			self.env['INTLCACHE']=os.path.join(self.path.bldpath(self.env),self.podir,self.intlcache)
+			self.env['INTLPODIR']=podirnode.srcpath(self.env)
+			self.env['INTLFLAGS']=self.flags
+			task=self.create_task('intltool')
+			task.set_inputs(node)
+			task.set_outputs(node.change_ext(''))
+			task.install_path=self.install_path
+class intltool_po_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+		self.default_install_path='${LOCALEDIR}'
+		self.appname=kw.get('appname','set_your_app_name')
+		self.podir=''
+		self.tasks=[]
+	def apply(self):
+		def install_translation(task):
+			out=task.outputs[0]
+			filename=out.name
+			(langname,ext)=os.path.splitext(filename)
+			inst_file=langname+os.sep+'LC_MESSAGES'+os.sep+self.appname+'.mo'
+			Build.bld.install_as(os.path.join(self.install_path,inst_file),out.abspath(self.env),chmod=self.chmod)
+		linguas=self.path.find_resource(os.path.join(self.podir,'LINGUAS'))
+		if linguas:
+			file=open(linguas.abspath())
+			langs=[]
+			for line in file.readlines():
+				if not line.startswith('#'):
+					langs+=line.split()
+			file.close()
+			re_linguas=re.compile('[-a-zA-Z_ at .]+')
+			for lang in langs:
+				if re_linguas.match(lang):
+					node=self.path.find_resource(os.path.join(self.podir,re_linguas.match(lang).group()+'.po'))
+					task=self.create_task('po')
+					task.set_inputs(node)
+					task.set_outputs(node.change_ext('.mo'))
+					if Options.is_install:task.install=install_translation
+		else:
+			Utils.pprint('RED',"Error no LINGUAS file found in po directory")
+Task.simple_task_type('po','${POCOM} -o ${TGT} ${SRC}',color='BLUE')
+Task.simple_task_type('intltool','${INTLTOOL} ${INTLFLAGS} -q -u -c ${INTLCACHE} ${INTLPODIR} ${SRC} ${TGT}',color='BLUE',after="cc_link cxx_link")
+def detect(conf):
+	pocom=conf.find_program('msgfmt')
+	conf.env['POCOM']=pocom
+	intltool=conf.find_program('intltool-merge')
+	conf.env['INTLTOOL']=intltool
+	def getstr(varname):
+		return getattr(Options.options,varname,'')
+	prefix=conf.env['PREFIX']
+	datadir=getstr('datadir')
+	if not datadir:datadir=os.path.join(prefix,'share')
+	conf.define('LOCALEDIR',os.path.join(datadir,'locale'))
+	conf.define('DATADIR',datadir)
+	conf.check(header_name='locale.h')
+def set_options(opt):
+	opt.add_option('--want-rpath',type='int',default=1,dest='want_rpath',help='set rpath to 1 or 0 [Default 1]')
+	opt.add_option('--datadir',type='string',default='',dest='datadir',help='read-only application data')
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/java.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/java.py
new file mode 100644
index 0000000..b3db0b8
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/java.py
@@ -0,0 +1,107 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,re
+from Configure import conf
+import TaskGen,Task,Utils
+from TaskGen import feature,taskgen
+class java_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def apply_java(self):
+	Utils.def_attrs(self,jarname='',jaropts='',classpath='',source_root='.',jar_mf_attributes={},jar_mf_classpath=[])
+	nodes_lst=[]
+	if not self.classpath:
+		if not self.env['CLASSPATH']:
+			self.env['CLASSPATH']='..'+os.pathsep+'.'
+	else:
+		self.env['CLASSPATH']=self.classpath
+	re_foo=re.compile(self.source)
+	source_root_node=self.path.find_dir(self.source_root)
+	src_nodes=[]
+	bld_nodes=[]
+	prefix_path=source_root_node.abspath()
+	for(root,dirs,filenames)in os.walk(source_root_node.abspath()):
+		for x in filenames:
+			file=root+'/'+x
+			file=file.replace(prefix_path,'')
+			if file.startswith('/'):
+				file=file[1:]
+			if re_foo.search(file)>-1:
+				node=source_root_node.find_resource(file)
+				src_nodes.append(node)
+				node2=node.change_ext(".class")
+				bld_nodes.append(node2)
+	self.env['OUTDIR']=source_root_node.abspath(self.env)
+	tsk=self.create_task('javac')
+	tsk.set_inputs(src_nodes)
+	tsk.set_outputs(bld_nodes)
+	if self.jarname:
+		tsk=self.create_task('jar_create')
+		tsk.set_inputs(bld_nodes)
+		tsk.set_outputs(self.path.find_or_declare(self.jarname))
+		if not self.env['JAROPTS']:
+			if self.jaropts:
+				self.env['JAROPTS']=self.jaropts
+			else:
+				dirs='.'
+				self.env['JAROPTS']='-C %s %s'%(self.env['OUTDIR'],dirs)
+Task.simple_task_type('javac','${JAVAC} -classpath ${CLASSPATH} -d ${OUTDIR} ${SRC}',color='BLUE',before='jar_create')
+Task.simple_task_type('jar_create','${JAR} ${JARCREATE} ${TGT} ${JAROPTS}',color='GREEN')
+def detect(conf):
+	java_path=os.environ['PATH'].split(os.pathsep)
+	v=conf.env
+	if os.environ.has_key('JAVA_HOME'):
+		java_path=[os.path.join(os.environ['JAVA_HOME'],'bin')]+java_path
+		conf.env['JAVA_HOME']=os.environ['JAVA_HOME']
+	conf.find_program('javac',var='JAVAC',path_list=java_path)
+	conf.find_program('java',var='JAVA',path_list=java_path)
+	conf.find_program('jar',var='JAR',path_list=java_path)
+	v['JAVA_EXT']=['.java']
+	if os.environ.has_key('CLASSPATH'):
+		v['CLASSPATH']=os.environ['CLASSPATH']
+	if not v['JAR']:conf.fatal('jar is required for making java packages')
+	if not v['JAVAC']:conf.fatal('javac is required for compiling java classes')
+	v['JARCREATE']='cf'
+def check_java_class(conf,classname,with_classpath=None):
+	class_check_source="""
+public class Test {
+	public static void main(String[] argv) {
+		Class lib;
+		if (argv.length < 1) {
+			System.err.println("Missing argument");
+			System.exit(77);
+		}
+		try {
+			lib = Class.forName(argv[0]);
+		} catch (ClassNotFoundException e) {
+			System.err.println("ClassNotFoundException");
+			System.exit(1);
+		}
+		lib = null;
+		System.exit(0);
+	}
+}
+"""
+	import shutil
+	javatestdir='.waf-javatest'
+	classpath=javatestdir
+	if conf.env['CLASSPATH']:
+		classpath+=os.pathsep+conf.env['CLASSPATH']
+	if isinstance(with_classpath,str):
+		classpath+=os.pathsep+with_classpath
+	shutil.rmtree(javatestdir,True)
+	os.mkdir(javatestdir)
+	java_file=open(os.path.join(javatestdir,'Test.java'),'w')
+	java_file.write(class_check_source)
+	java_file.close()
+	os.popen(conf.env['JAVAC']+' '+os.path.join(javatestdir,'Test.java'))
+	(jstdin,jstdout,jstderr)=os.popen3(conf.env['JAVA']+' -cp '+classpath+' Test '+classname)
+	found=not bool(jstderr.read())
+	conf.check_message('Java class %s'%classname,"",found)
+	shutil.rmtree(javatestdir,True)
+	return found
+
+taskgen(apply_java)
+feature('java')(apply_java)
+conf(check_java_class)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/kde4.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/kde4.py
new file mode 100644
index 0000000..2a67bad
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/kde4.py
@@ -0,0 +1,62 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,re,TaskGen,Task,Utils
+from TaskGen import taskgen,feature,after
+class msgfmt_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def init_msgfmt(self):
+	Utils.def_attrs(self,default_install_path='${KDE4_LOCALE_INSTALL_DIR}',appname='set_your_app_name')
+def apply_msgfmt(self):
+	for lang in self.to_list(self.langs):
+		node=self.path.find_resource(lang+'.po')
+		task=self.create_task('msgfmt')
+		task.set_inputs(node)
+		task.set_outputs(node.change_ext('.mo'))
+		if not Options.is_install:continue
+		langname=lang.split('/')
+		langname=langname[-1]
+		tsk.install_path=self.install_path+os.sep+langname+os.sep+'LC_MESSAGES'
+		task.filename=self.appname+'.mo'
+		task.chmod=self.chmod
+def detect(conf):
+	kdeconfig=conf.find_program('kde4-config')
+	if not kdeconfig:
+		conf.fatal('we need kde4-config')
+	prefix=Utils.cmd_output('%s --prefix'%kdeconfig,silent=True).strip()
+	file='%s/share/apps/cmake/modules/KDELibsDependencies.cmake'%prefix
+	try:os.stat(file)
+	except OSError:
+		file='%s/share/apps/cmake/modules/KDELibsDependencies.cmake'%prefix
+		try:os.stat(file)
+		except:conf.fatal('could not open %s'%file)
+	try:
+		f=open(file,'r')
+		txt=f.read()
+		f.close()
+	except(OSError,IOError):
+		conf.fatal('could not read %s'%file)
+	txt=txt.replace('\\\n','\n')
+	fu=re.compile('#(.*)\n')
+	txt=fu.sub('',txt)
+	setregexp=re.compile('([sS][eE][tT]\s*\()\s*([^\s]+)\s+\"([^"]+)\"\)')
+	found=setregexp.findall(txt)
+	for(_,key,val)in found:
+		conf.env[key]=val
+	conf.env['LIB_KDECORE']='kdecore'
+	conf.env['LIB_KDEUI']='kdeui'
+	conf.env['LIB_KIO']='kio'
+	conf.env['LIB_KHTML']='khtml'
+	conf.env['LIB_KPARTS']='kparts'
+	conf.env['LIBPATH_KDECORE']=conf.env['KDE4_LIB_INSTALL_DIR']
+	conf.env['CPPPATH_KDECORE']=conf.env['KDE4_INCLUDE_INSTALL_DIR']
+	conf.env.append_value('CPPPATH_KDECORE',conf.env['KDE4_INCLUDE_INSTALL_DIR']+"/KDE")
+	conf.env['MSGFMT']=conf.find_program('msgfmt')
+Task.simple_task_type('msgfmt','${MSGFMT} ${SRC} -o ${TGT}',color='BLUE')
+
+taskgen(init_msgfmt)
+feature('msgfmt')(init_msgfmt)
+taskgen(apply_msgfmt)
+feature('msgfmt')(apply_msgfmt)
+after('init_msgfmt')(apply_msgfmt)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/libtool.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/libtool.py
new file mode 100644
index 0000000..267a1e1
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/libtool.py
@@ -0,0 +1,244 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import sys,re,os,optparse
+import TaskGen,Task,Utils,preproc
+from Logs import error,debug,warn
+from TaskGen import taskgen,after,before,feature
+REVISION="0.1.3"
+fakelibtool_vardeps=['CXX','PREFIX']
+def fakelibtool_build(task):
+	env=task.env
+	dest=open(task.outputs[0].abspath(env),'w')
+	sname=task.inputs[0].name
+	fu=dest.write
+	fu("# Generated by ltmain.sh - GNU libtool 1.5.18 - (pwn3d by BKsys II code name WAF)\n")
+	if env['vnum']:
+		nums=env['vnum'].split('.')
+		libname=task.inputs[0].name
+		name3=libname+'.'+env['vnum']
+		name2=libname+'.'+nums[0]
+		name1=libname
+		fu("dlname='%s'\n"%name2)
+		strn=" ".join([name3,name2,name1])
+		fu("library_names='%s'\n"%(strn))
+	else:
+		fu("dlname='%s'\n"%sname)
+		fu("library_names='%s %s %s'\n"%(sname,sname,sname))
+	fu("old_library=''\n")
+	vars=' '.join(env['libtoolvars']+env['LINKFLAGS'])
+	fu("dependency_libs='%s'\n"%vars)
+	fu("current=0\n")
+	fu("age=0\nrevision=0\ninstalled=yes\nshouldnotlink=no\n")
+	fu("dlopen=''\ndlpreopen=''\n")
+	fu("libdir='%s/lib'\n"%env['PREFIX'])
+	dest.close()
+	return 0
+def read_la_file(path):
+	sp=re.compile(r'^([^=]+)=\'(.*)\'$')
+	dc={}
+	file=open(path,"r")
+	for line in file.readlines():
+		try:
+			_,left,right,_=sp.split(line.strip())
+			dc[left]=right
+		except ValueError:
+			pass
+	file.close()
+	return dc
+def apply_link_libtool(self):
+	if self.type!='program':
+		linktask=self.link_task
+		latask=self.create_task('fakelibtool')
+		latask.set_inputs(linktask.outputs)
+		latask.set_outputs(linktask.outputs[0].change_ext('.la'))
+		self.latask=latask
+	if Options.commands['install']or Options.commands['uninstall']:
+		Build.bld.install_files('PREFIX','lib',linktask.outputs[0].abspath(self.env),self.env)
+def apply_libtool(self):
+	self.env['vnum']=self.vnum
+	paths=[]
+	libs=[]
+	libtool_files=[]
+	libtool_vars=[]
+	for l in self.env['LINKFLAGS']:
+		if l[:2]=='-L':
+			paths.append(l[2:])
+		elif l[:2]=='-l':
+			libs.append(l[2:])
+	for l in libs:
+		for p in paths:
+			dict=read_la_file(p+'/lib'+l+'.la')
+			linkflags2=dict.get('dependency_libs','')
+			for v in linkflags2.split():
+				if v.endswith('.la'):
+					libtool_files.append(v)
+					libtool_vars.append(v)
+					continue
+				self.env.append_unique('LINKFLAGS',v)
+				break
+	self.env['libtoolvars']=libtool_vars
+	while libtool_files:
+		file=libtool_files.pop()
+		dict=read_la_file(file)
+		for v in dict['dependency_libs'].split():
+			if v[-3:]=='.la':
+				libtool_files.append(v)
+				continue
+			self.env.append_unique('LINKFLAGS',v)
+Task.task_type_from_func('fakelibtool',vars=fakelibtool_vardeps,func=fakelibtool_build,color='BLUE',after="cc_link cxx_link ar_link_static")
+class libtool_la_file:
+	def __init__(self,la_filename):
+		self.__la_filename=la_filename
+		self.linkname=str(os.path.split(la_filename)[-1])[:-3]
+		if self.linkname.startswith("lib"):
+			self.linkname=self.linkname[3:]
+		self.dlname=None
+		self.library_names=None
+		self.old_library=None
+		self.dependency_libs=None
+		self.current=None
+		self.age=None
+		self.revision=None
+		self.installed=None
+		self.shouldnotlink=None
+		self.dlopen=None
+		self.dlpreopen=None
+		self.libdir='/usr/lib'
+		if not self.__parse():
+			raise"file %s not found!!"%(la_filename)
+	def __parse(self):
+		if not os.path.isfile(self.__la_filename):return 0
+		la_file=open(self.__la_filename,'r')
+		for line in la_file:
+			ln=line.strip()
+			if not ln:continue
+			if ln[0]=='#':continue
+			(key,value)=str(ln).split('=',1)
+			key=key.strip()
+			value=value.strip()
+			if value=="no":value=False
+			elif value=="yes":value=True
+			else:
+				try:value=int(value)
+				except ValueError:value=value.strip("'")
+			setattr(self,key,value)
+		la_file.close()
+		return 1
+	def get_libs(self):
+		libs=[]
+		if self.dependency_libs:
+			libs=str(self.dependency_libs).strip().split()
+		if libs==None:
+			libs=[]
+		libs.insert(0,"-l%s"%self.linkname.strip())
+		libs.insert(0,"-L%s"%self.libdir.strip())
+		return libs
+	def __str__(self):
+		return'''\
+dlname = "%(dlname)s"
+library_names = "%(library_names)s"
+old_library = "%(old_library)s"
+dependency_libs = "%(dependency_libs)s"
+version = %(current)s.%(age)s.%(revision)s
+installed = "%(installed)s"
+shouldnotlink = "%(shouldnotlink)s"
+dlopen = "%(dlopen)s"
+dlpreopen = "%(dlpreopen)s"
+libdir = "%(libdir)s"'''%self.__dict__
+class libtool_config:
+	def __init__(self,la_filename):
+		self.__libtool_la_file=libtool_la_file(la_filename)
+		tmp=self.__libtool_la_file
+		self.__version=[int(tmp.current),int(tmp.age),int(tmp.revision)]
+		self.__sub_la_files=[]
+		self.__sub_la_files.append(la_filename)
+		self.__libs=None
+	def __cmp__(self,other):
+		if not other:
+			return 1
+		othervers=[int(s)for s in str(other).split(".")]
+		selfvers=self.__version
+		return cmp(selfvers,othervers)
+	def __str__(self):
+		return"\n".join([str(self.__libtool_la_file),' '.join(self.__libtool_la_file.get_libs()),'* New getlibs:',' '.join(self.get_libs())])
+	def __get_la_libs(self,la_filename):
+		return libtool_la_file(la_filename).get_libs()
+	def get_libs(self):
+		libs_list=list(self.__libtool_la_file.get_libs())
+		libs_map={}
+		while len(libs_list)>0:
+			entry=libs_list.pop(0)
+			if entry:
+				if str(entry).endswith(".la"):
+					if entry not in self.__sub_la_files:
+						self.__sub_la_files.append(entry)
+						libs_list.extend(self.__get_la_libs(entry))
+				else:
+					libs_map[entry]=1
+		self.__libs=libs_map.keys()
+		return self.__libs
+	def get_libs_only_L(self):
+		if not self.__libs:self.get_libs()
+		libs=self.__libs
+		libs=filter(lambda s:str(s).startswith('-L'),libs)
+		return libs
+	def get_libs_only_l(self):
+		if not self.__libs:self.get_libs()
+		libs=self.__libs
+		libs=filter(lambda s:str(s).startswith('-l'),libs)
+		return libs
+	def get_libs_only_other(self):
+		if not self.__libs:self.get_libs()
+		libs=self.__libs
+		libs=filter(lambda s:not(str(s).startswith('-L')or str(s).startswith('-l')),libs)
+		return libs
+def useCmdLine():
+	usage='''Usage: %prog [options] PathToFile.la
+example: %prog --atleast-version=2.0.0 /usr/lib/libIlmImf.la
+nor: %prog --libs /usr/lib/libamarok.la'''
+	parser=optparse.OptionParser(usage)
+	a=parser.add_option
+	a("--version",dest="versionNumber",action="store_true",default=False,help="output version of libtool-config")
+	a("--debug",dest="debug",action="store_true",default=False,help="enable debug")
+	a("--libs",dest="libs",action="store_true",default=False,help="output all linker flags")
+	a("--libs-only-l",dest="libs_only_l",action="store_true",default=False,help="output -l flags")
+	a("--libs-only-L",dest="libs_only_L",action="store_true",default=False,help="output -L flags")
+	a("--libs-only-other",dest="libs_only_other",action="store_true",default=False,help="output other libs (e.g. -pthread)")
+	a("--atleast-version",dest="atleast_version",default=None,help="return 0 if the module is at least version ATLEAST_VERSION")
+	a("--exact-version",dest="exact_version",default=None,help="return 0 if the module is exactly version EXACT_VERSION")
+	a("--max-version",dest="max_version",default=None,help="return 0 if the module is at no newer than version MAX_VERSION")
+	(options,args)=parser.parse_args()
+	if len(args)!=1 and not options.versionNumber:
+		parser.error("incorrect number of arguments")
+	if options.versionNumber:
+		print"libtool-config version %s"%REVISION
+		return 0
+	ltf=libtool_config(args[0])
+	if options.debug:
+		print(ltf)
+	if options.atleast_version:
+		if ltf>=options.atleast_version:return 0
+		sys.exit(1)
+	if options.exact_version:
+		if ltf==options.exact_version:return 0
+		sys.exit(1)
+	if options.max_version:
+		if ltf<=options.max_version:return 0
+		sys.exit(1)
+	def p(x):
+		print" ".join(x)
+	if options.libs:p(ltf.get_libs())
+	elif options.libs_only_l:p(ltf.get_libs_only_l())
+	elif options.libs_only_L:p(ltf.get_libs_only_L())
+	elif options.libs_only_other:p(ltf.get_libs_only_other())
+	return 0
+if __name__=='__main__':
+	useCmdLine()
+
+taskgen(apply_link_libtool)
+feature("libtool")(apply_link_libtool)
+after('apply_link')(apply_link_libtool)
+taskgen(apply_libtool)
+feature("libtool")(apply_libtool)
+before('apply_core')(apply_libtool)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/lua.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/lua.py
new file mode 100644
index 0000000..93f8604
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/lua.py
@@ -0,0 +1,14 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import TaskGen
+from TaskGen import taskgen,feature
+TaskGen.declare_chain(name='luac',action='${LUAC} -s -o ${TGT} ${SRC}',ext_in='.lua',ext_out='.luac',reentrant=0,install='LUADIR',)
+def init_lua(self):
+	self.default_chmod=0755
+def detect(conf):
+	luac=conf.find_program('luac',var='LUAC')
+	if not luac:conf.fatal('cannot find the compiler "luac"')
+
+taskgen(init_lua)
+feature('lua')(init_lua)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/misc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/misc.py
new file mode 100644
index 0000000..d37019d
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/misc.py
@@ -0,0 +1,301 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import shutil,re,os,types
+import TaskGen,Node,Task,Utils,Build,pproc
+from TaskGen import feature,taskgen,after
+from Logs import debug
+def copy_func(tsk):
+	env=tsk.env
+	infile=tsk.inputs[0].abspath(env)
+	outfile=tsk.outputs[0].abspath(env)
+	try:
+		shutil.copy2(infile,outfile)
+	except OSError,IOError:
+		return 1
+	else:
+		if tsk.chmod:os.chmod(outfile,tsk.chmod)
+		return 0
+def action_process_file_func(tsk):
+	if not tsk.fun:raise Utils.WafError('task must have a function attached to it for copy_func to work!')
+	return tsk.fun(tsk)
+class cmd_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def apply_cmd(self):
+	if not self.fun:raise Utils.WafError('cmdobj needs a function!')
+	tsk=Task.TaskBase()
+	tsk.fun=self.fun
+	tsk.env=self.env
+	self.tasks.append(tsk)
+	tsk.install_path=self.install_path
+class copy_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def apply_copy(self):
+	Utils.def_attrs(self,fun=copy_func)
+	self.default_install_path=0
+	lst=self.to_list(self.source)
+	for filename in lst:
+		node=self.path.find_resource(filename)
+		if not node:raise Utils.WafError('cannot find input file %s for processing'%filename)
+		target=self.target
+		if not target or len(lst)>1:target=node.name
+		newnode=self.path.find_or_declare(target)
+		tsk=self.create_task('copy')
+		tsk.set_inputs(node)
+		tsk.set_outputs(newnode)
+		tsk.fun=self.fun
+		tsk.chmod=self.chmod
+		if not tsk.env:
+			tsk.debug()
+			raise Utils.WafError('task without an environment')
+def subst_func(tsk):
+	m4_re=re.compile('@(\w+)@',re.M)
+	env=tsk.env
+	infile=tsk.inputs[0].abspath(env)
+	outfile=tsk.outputs[0].abspath(env)
+	file=open(infile,'r')
+	code=file.read()
+	file.close()
+	code=code.replace('%','%%')
+	s=m4_re.sub(r'%(\1)s',code)
+	dict=tsk.dict
+	if not dict:
+		names=m4_re.findall(code)
+		for i in names:
+			if env[i]and type(env[i])is types.ListType:
+				dict[i]=" ".join(env[i])
+			else:dict[i]=env[i]
+	file=open(outfile,'w')
+	file.write(s%dict)
+	file.close()
+	if tsk.chmod:os.chmod(outfile,tsk.chmod)
+	return 0
+class subst_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def apply_subst(self):
+	Utils.def_attrs(self,fun=subst_func)
+	self.default_install_path=0
+	lst=self.to_list(self.source)
+	self.dict=getattr(self,'dict',{})
+	for filename in lst:
+		node=self.path.find_resource(filename)
+		if not node:raise Utils.WafError('cannot find input file %s for processing'%filename)
+		newnode=node.change_ext('')
+		if self.dict and not self.env['DICT_HASH']:
+			self.env=self.env.copy()
+			self.env['DICT_HASH']=hash(str(self.dict))
+		tsk=self.create_task('copy')
+		tsk.set_inputs(node)
+		tsk.set_outputs(newnode)
+		tsk.fun=self.fun
+		tsk.dict=self.dict
+		tsk.dep_vars=['DICT_HASH']
+		tsk.install_path=self.install_path
+		tsk.chmod=self.chmod
+		if not tsk.env:
+			tsk.debug()
+			raise Utils.WafError('task without an environment')
+class cmd_arg(object):
+	def __init__(self,name,template='%s'):
+		self.name=name
+		self.template=template
+		self.node=None
+class input_file(cmd_arg):
+	def find_node(self,base_path):
+		assert isinstance(base_path,Node.Node)
+		self.node=base_path.find_resource(self.name)
+		if self.node is None:
+			raise Utils.WafError("Input file %s not found in "%(self.name,base_path))
+	def get_path(self,env,absolute):
+		if absolute:
+			return self.template%self.node.abspath(env)
+		else:
+			return self.template%self.node.srcpath(env)
+class output_file(cmd_arg):
+	def find_node(self,base_path):
+		assert isinstance(base_path,Node.Node)
+		self.node=base_path.find_or_declare(self.name)
+		if self.node is None:
+			raise Utils.WafError("Output file %s not found in "%(self.name,base_path))
+	def get_path(self,env,absolute):
+		if absolute:
+			return self.template%self.node.abspath(env)
+		else:
+			return self.template%self.node.bldpath(env)
+class cmd_dir_arg(cmd_arg):
+	def __init__(self,name,template=None):
+		cmd_arg.__init__(self)
+		self.name=name
+		self.node=None
+		if template is None:
+			self.template='%s'
+		else:
+			self.template=template
+	def find_node(self,base_path):
+		assert isinstance(base_path,Node.Node)
+		self.node=base_path.find_dir(self.name)
+		if self.node is None:
+			raise Utils.WafError("Directory %s not found in "%(self.name,base_path))
+class input_dir(cmd_dir_arg):
+	def get_path(self,dummy_env,dummy_absolute):
+		return self.template%self.node.abspath()
+class output_dir(cmd_dir_arg):
+	def get_path(self,env,dummy_absolute):
+		return self.template%self.node.abspath(env)
+class command_output(Task.Task):
+	color="BLUE"
+	def __init__(self,env,command,command_node,command_args,stdin,stdout,cwd,os_env,stderr):
+		Task.Task.__init__(self,env,normal=1)
+		assert isinstance(command,(str,Node.Node))
+		self.command=command
+		self.command_args=command_args
+		self.stdin=stdin
+		self.stdout=stdout
+		self.cwd=cwd
+		self.os_env=os_env
+		self.stderr=stderr
+		if command_node is not None:self.dep_nodes=[command_node]
+		self.dep_vars=[]
+	def run(self):
+		task=self
+		assert len(task.inputs)>0
+		def input_path(node,template):
+			if task.cwd is None:
+				return template%node.bldpath(task.env)
+			else:
+				return template%node.abspath()
+		def output_path(node,template):
+			fun=node.abspath
+			if task.cwd is None:fun=node.bldpath
+			return template%fun(task.env)
+		if isinstance(task.command,Node.Node):
+			argv=[input_path(task.command,'%s')]
+		else:
+			argv=[task.command]
+		for arg in task.command_args:
+			if isinstance(arg,str):
+				argv.append(arg)
+			else:
+				assert isinstance(arg,cmd_arg)
+				argv.append(arg.get_path(task.env,(task.cwd is not None)))
+		if task.stdin:
+			stdin=file(input_path(task.stdin,'%s'))
+		else:
+			stdin=None
+		if task.stdout:
+			stdout=file(output_path(task.stdout,'%s'),"w")
+		else:
+			stdout=None
+		if task.stderr:
+			stderr=file(output_path(task.stderr,'%s'),"w")
+		else:
+			stderr=None
+		if task.cwd is None:
+			cwd=('None (actually %r)'%os.getcwd())
+		else:
+			cwd=repr(task.cwd)
+		debug("command-output: cwd=%s, stdin=%r, stdout=%r, argv=%r"%(cwd,stdin,stdout,argv))
+		if task.os_env is None:
+			os_env=os.environ
+		else:
+			os_env=task.os_env
+		command=pproc.Popen(argv,stdin=stdin,stdout=stdout,stderr=stderr,cwd=task.cwd,env=os_env)
+		return command.wait()
+class cmd_output_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def init_cmd_output(self):
+	Utils.def_attrs(self,stdin=None,stdout=None,stderr=None,command=None,command_is_external=False,argv=[],dependencies=[],dep_vars=[],hidden_inputs=[],hidden_outputs=[],cwd=None,os_env=None)
+def apply_cmd_output(self):
+	if self.command is None:
+		raise Utils.WafError("command-output missing command")
+	if self.command_is_external:
+		cmd=self.command
+		cmd_node=None
+	else:
+		cmd_node=self.path.find_resource(self.command)
+		assert cmd_node is not None,('''Could not find command '%s' in source tree.
+Hint: if this is an external command,
+use command_is_external=True''')%(self.command,)
+		cmd=cmd_node
+	if self.cwd is None:
+		cwd=None
+	else:
+		assert isinstance(cwd,CmdDirArg)
+		self.cwd.find_node(self.path)
+	args=[]
+	inputs=[]
+	outputs=[]
+	for arg in self.argv:
+		if isinstance(arg,cmd_arg):
+			arg.find_node(self.path)
+			if isinstance(arg,input_file):
+				inputs.append(arg.node)
+			if isinstance(arg,output_file):
+				outputs.append(arg.node)
+	if self.stdout is None:
+		stdout=None
+	else:
+		assert isinstance(self.stdout,basestring)
+		stdout=self.path.find_or_declare(self.stdout)
+		if stdout is None:
+			raise Utils.WafError("File %s not found"%(self.stdout,))
+		outputs.append(stdout)
+	if self.stderr is None:
+		stderr=None
+	else:
+		assert isinstance(self.stderr,basestring)
+		stderr=self.path.find_or_declare(self.stderr)
+		if stderr is None:
+			Params.fatal("File %s not found"%(self.stderr,))
+		outputs.append(stderr)
+	if self.stdin is None:
+		stdin=None
+	else:
+		assert isinstance(self.stdin,basestring)
+		stdin=self.path.find_resource(self.stdin)
+		if stdin is None:
+			raise Utils.WafError("File %s not found"%(self.stdin,))
+		inputs.append(stdin)
+	for hidden_input in self.to_list(self.hidden_inputs):
+		node=self.path.find_resource(hidden_input)
+		if node is None:
+			raise Utils.WafError("File %s not found in dir %s"%(hidden_input,self.path))
+		inputs.append(node)
+	for hidden_output in self.to_list(self.hidden_outputs):
+		node=self.path.find_or_declare(hidden_output)
+		if node is None:
+			raise Utils.WafError("File %s not found in dir %s"%(hidden_output,self.path))
+		outputs.append(node)
+	if not inputs:
+		raise Utils.WafError("command-output objects must have at least one input file")
+	if not outputs:
+		raise Utils.WafError("command-output objects must have at least one output file")
+	task=command_output(self.env,cmd,cmd_node,self.argv,stdin,stdout,cwd,self.os_env,stderr)
+	Utils.copy_attrs(self,task,'before after ext_in ext_out',only_if_set=True)
+	self.tasks.append(task)
+	task.set_inputs(inputs)
+	task.set_outputs(outputs)
+	task.dep_vars=self.to_list(self.dep_vars)
+	for dep in self.dependencies:
+		assert dep is not self
+		dep.post()
+		for dep_task in dep.tasks:
+			task.set_run_after(dep_task)
+Task.task_type_from_func('copy',vars=[],func=action_process_file_func)
+TaskGen.task_gen.classes['command-output']=cmd_output_taskgen
+
+taskgen(apply_cmd)
+feature('cmd')(apply_cmd)
+taskgen(apply_copy)
+feature('copy')(apply_copy)
+taskgen(apply_subst)
+feature('subst')(apply_subst)
+taskgen(init_cmd_output)
+feature('command-output')(init_cmd_output)
+taskgen(apply_cmd_output)
+feature('command-output')(apply_cmd_output)
+after('init_cmd_output')(apply_cmd_output)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/msvc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/msvc.py
new file mode 100644
index 0000000..b7b2d30
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/msvc.py
@@ -0,0 +1,311 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,re,string,optparse
+import Utils,TaskGen,Runner,Configure,Task,Options
+from Logs import debug,error,warn
+from Utils import quote_whitespace
+from TaskGen import taskgen,after,before,feature
+from Configure import conftest
+import ccroot,cc,cxx,ar
+from libtool import read_la_file
+from os.path import exists
+def msvc_linker(task):
+	e=task.env
+	linker=e['LINK']
+	srcf=e['LINK_SRC_F']
+	trgtf=e['LINK_TGT_F']
+	linkflags=e.get_flat('LINKFLAGS')
+	libdirs=e.get_flat('_LIBDIRFLAGS')
+	libs=e.get_flat('_LIBFLAGS')
+	subsystem=''
+	if task.subsystem:
+		subsystem='/subsystem:%s'%task.subsystem
+	outfile=task.outputs[0].bldpath(e)
+	manifest=outfile+'.manifest'
+	pdbnode=task.outputs[0].change_ext('.pdb')
+	pdbfile=pdbnode.bldpath(e)
+	objs=" ".join(['"%s"'%a.abspath(e)for a in task.inputs])
+	cmd="%s %s %s%s %s%s %s %s %s"%(linker,subsystem,srcf,objs,trgtf,outfile,linkflags,libdirs,libs)
+	ret=task.generator.bld.exec_command(cmd,shell=False)
+	if ret:return ret
+	if os.path.exists(pdbfile):
+		task.outputs.append(pdbnode)
+	if os.path.exists(manifest):
+		debug('msvc: manifesttool')
+		mtool=e['MT']
+		if not mtool:
+			return 0
+		mode=''
+		if'cprogram'in task.features:
+			mode='1'
+		elif'cshlib'in task.features:
+			mode='2'
+		debug('msvc: embedding manifest')
+		flags=' '.join(e['MTFLAGS']or[])
+		cmd='%s %s -manifest "%s" -outputresource:"%s";#%s'%(mtool,flags,manifest,outfile,mode)
+		ret=task.generator.bld.exec_command(cmd,shell=False)
+	return ret
+g_msvc_systemlibs="""
+aclui activeds ad1 adptif adsiid advapi32 asycfilt authz bhsupp bits bufferoverflowu cabinet
+cap certadm certidl ciuuid clusapi comctl32 comdlg32 comsupp comsuppd comsuppw comsuppwd comsvcs
+credui crypt32 cryptnet cryptui d3d8thk daouuid dbgeng dbghelp dciman32 ddao35 ddao35d
+ddao35u ddao35ud delayimp dhcpcsvc dhcpsapi dlcapi dnsapi dsprop dsuiext dtchelp
+faultrep fcachdll fci fdi framedyd framedyn gdi32 gdiplus glauxglu32 gpedit gpmuuid
+gtrts32w gtrtst32hlink htmlhelp httpapi icm32 icmui imagehlp imm32 iphlpapi iprop
+kernel32 ksguid ksproxy ksuser libcmt libcmtd libcpmt libcpmtd loadperf lz32 mapi
+mapi32 mgmtapi minidump mmc mobsync mpr mprapi mqoa mqrt msacm32 mscms mscoree
+msdasc msimg32 msrating mstask msvcmrt msvcurt msvcurtd mswsock msxml2 mtx mtxdm
+netapi32 nmapinmsupp npptools ntdsapi ntdsbcli ntmsapi ntquery odbc32 odbcbcp
+odbccp32 oldnames ole32 oleacc oleaut32 oledb oledlgolepro32 opends60 opengl32
+osptk parser pdh penter pgobootrun pgort powrprof psapi ptrustm ptrustmd ptrustu
+ptrustud qosname rasapi32 rasdlg rassapi resutils riched20 rpcndr rpcns4 rpcrt4 rtm
+rtutils runtmchk scarddlg scrnsave scrnsavw secur32 sensapi setupapi sfc shell32
+shfolder shlwapi sisbkup snmpapi sporder srclient sti strsafe svcguid tapi32 thunk32
+traffic unicows url urlmon user32 userenv usp10 uuid uxtheme vcomp vcompd vdmdbg
+version vfw32 wbemuuid  webpost wiaguid wininet winmm winscard winspool winstrm
+wintrust wldap32 wmiutils wow32 ws2_32 wsnmp32 wsock32 wst wtsapi32 xaswitch xolehlp
+""".split()
+def find_lt_names_msvc(self,libname,is_static=False):
+	lt_names=['lib%s.la'%libname,'%s.la'%libname,]
+	for path in self.libpaths:
+		for la in lt_names:
+			laf=os.path.join(path,la)
+			dll=None
+			if exists(laf):
+				ltdict=read_la_file(laf)
+				lt_libdir=None
+				if ltdict.has_key('libdir')and ltdict['libdir']!='':
+					lt_libdir=ltdict['libdir']
+				if not is_static and ltdict.has_key('library_names')and ltdict['library_names']!='':
+					dllnames=ltdict['library_names'].split()
+					dll=dllnames[0].lower()
+					dll=re.sub('\.dll$','',dll)
+					return(lt_libdir,dll,False)
+				elif ltdict.has_key('old_library')and ltdict['old_library']!='':
+					olib=ltdict['old_library']
+					if exists(os.path.join(path,olib)):
+						return(path,olib,True)
+					elif lt_libdir!=''and exists(os.path.join(lt_libdir,olib)):
+						return(lt_libdir,olib,True)
+					else:
+						return(None,olib,True)
+				else:
+					raise Utils.WafError('invalid libtool object file: %s'%laf)
+	return(None,None,None)
+def libname_msvc(self,libname,is_static=False):
+	lib=libname.lower()
+	lib=re.sub('\.lib$','',lib)
+	if lib in g_msvc_systemlibs:
+		return lib+'.lib'
+	lib=re.sub('^lib','',lib)
+	if lib=='m':
+		return None
+	(lt_path,lt_libname,lt_static)=find_lt_names_msvc(self,lib,is_static)
+	if lt_path!=None and lt_libname!=None:
+		if lt_static==True:
+			return os.path.join(lt_path,lt_libname)
+	if lt_path!=None:
+		_libpaths=[lt_path]+self.libpaths
+	else:
+		_libpaths=self.libpaths
+	static_libs=['%ss.lib'%lib,'lib%ss.lib'%lib,'%s.lib'%lib,'lib%s.lib'%lib,]
+	dynamic_libs=['lib%s.dll.lib'%lib,'lib%s.dll.a'%lib,'%s.dll.lib'%lib,'%s.dll.a'%lib,'lib%s_d.lib'%lib,'%s_d.lib'%lib,'%s.lib'%lib,]
+	libnames=static_libs
+	if not is_static:
+		libnames=dynamic_libs+static_libs
+	for path in _libpaths:
+		for libn in libnames:
+			if os.path.exists(os.path.join(path,libn)):
+				debug('msvc: lib found: %s'%os.path.join(path,libn))
+				return libn
+	return None
+def apply_msvc_obj_vars(self):
+	debug('msvc: apply_msvc_obj_vars called for msvc')
+	env=self.env
+	app=env.append_unique
+	cpppath_st=env['CPPPATH_ST']
+	lib_st=env['LIB_ST']
+	staticlib_st=env['STATICLIB_ST']
+	libpath_st=env['LIBPATH_ST']
+	staticlibpath_st=env['STATICLIBPATH_ST']
+	for i in env['LIBPATH']:
+		app('LINKFLAGS',libpath_st%i)
+		if not self.libpaths.count(i):
+			self.libpaths.append(i)
+	for i in env['LIBPATH']:
+		app('LINKFLAGS',staticlibpath_st%i)
+		if not self.libpaths.count(i):
+			self.libpaths.append(i)
+	if not env['FULLSTATIC']:
+		if env['STATICLIB']or env['LIB']:
+			app('LINKFLAGS',env['SHLIB_MARKER'])
+	if env['STATICLIB']:
+		app('LINKFLAGS',env['STATICLIB_MARKER'])
+		for i in env['STATICLIB']:
+			debug('msvc: libname: %s'%i)
+			libname=libname_msvc(self,i,True)
+			debug('msvc: libnamefixed: %s'%libname)
+			if libname!=None:
+				app('LINKFLAGS',libname)
+	if self.env['LIB']:
+		for i in env['LIB']:
+			debug('msvc: libname: %s'%i)
+			libname=libname_msvc(self,i)
+			debug('msvc: libnamefixed: %s'%libname)
+			if libname!=None:
+				app('LINKFLAGS',libname)
+def apply_link_msvc(self):
+	if'objects'in self.features:
+		self.out_nodes=[]
+		app=self.out_nodes.append
+		for t in self.compiled_tasks:app(t.outputs[0])
+		return
+	link=getattr(self,'link',None)
+	if not link:
+		if'cstaticlib'in self.features:link='msvc_ar_link_static'
+		elif'cxx'in self.features:link='msvc_cxx_link'
+		else:link='msvc_cc_link'
+	linktask=self.create_task(link)
+	outputs=[t.outputs[0]for t in self.compiled_tasks]
+	linktask.set_inputs(outputs)
+	linktask.set_outputs(self.path.find_or_declare(ccroot.get_target_name(self)))
+	linktask.features=self.features
+	linktask.subsystem=getattr(self,'subsystem','')
+	self.link_task=linktask
+def init_msvc(self):
+	if self.env['CC_NAME']=='msvc'or self.env['CXX_NAME']=='msvc':
+		self.meths.remove('apply_link')
+		self.meths.remove('apply_obj_vars')
+	else:
+		for x in['apply_link_msvc','apply_msvc_obj_vars']:
+			self.meths.remove(x)
+	try:_libpaths=getattr(self,'libpaths')
+	except AttributeError:self.libpaths=[]
+static_link_str='${STLIBLINK} ${LINK_SRC_F}${SRC} ${LINK_TGT_F}${TGT}'
+Task.simple_task_type('msvc_ar_link_static',static_link_str,color='YELLOW',ext_in='.o')
+Task.task_type_from_func('msvc_cc_link',vars=['LINK','LINK_SRC_F','LINK_TGT_F','LINKFLAGS','_LIBDIRFLAGS','_LIBFLAGS','MT','MTFLAGS'],color='YELLOW',func=msvc_linker,ext_in='.o')
+Task.task_type_from_func('msvc_cxx_link',vars=['LINK','LINK_SRC_F','LINK_TGT_F','LINKFLAGS','_LIBDIRFLAGS','_LIBFLAGS','MT','MTFLAGS'],color='YELLOW',func=msvc_linker,ext_in='.o')
+rc_str='${RC} ${RCFLAGS} /fo ${TGT} ${SRC}'
+Task.simple_task_type('rc',rc_str,color='GREEN',before='cc cxx')
+import winres
+detect='''
+find_msvc
+msvc_common_flags
+cc_load_tools
+cxx_load_tools
+cc_add_flags
+cxx_add_flags
+'''
+def find_msvc(conf):
+	if sys.platform!='win32':
+		conf.fatal('MSVC module only works under native Win32 Python! cygwin is not supported yet')
+	v=conf.env
+	cxx=None
+	if v['CXX']:cxx=v['CXX']
+	elif'CXX'in os.environ:cxx=os.environ['CXX']
+	if not cxx:cxx=conf.find_program('CL',var='CXX')
+	if not cxx:conf.fatal('CL was not found (compiler)')
+	v['CXX']=cxx
+	v['CC']=v['CXX']
+	v['CXX_NAME']='msvc'
+	v['CC_NAME']='msvc'
+	if not v['LINK_CXX']:
+		link=conf.find_program('LINK')
+		if link:v['LINK_CXX']=link
+		else:conf.fatal('LINK was not found (linker)')
+	v['LINK']=link
+	if not v['LINK_CC']:v['LINK_CC']=v['LINK_CXX']
+	if not v['STLIBLINK']:
+		stliblink=conf.find_program('LIB')
+		if not stliblink:return
+		v['STLIBLINK']=stliblink
+	manifesttool=conf.find_program('MT')
+	if manifesttool:
+		v['MT']=manifesttool
+		v['MTFLAGS']=['/NOLOGO']
+	conf.check_tool('winres')
+	if not conf.env['WINRC']:
+		warn('Resource compiler not found. Compiling resource file is disabled')
+def msvc_common_flags(conf):
+	v=conf.env
+	v['CPPFLAGS']=['/W3','/nologo','/EHsc','/errorReport:prompt']
+	v['CCDEFINES']=['WIN32']
+	v['CXXDEFINES']=['WIN32']
+	v['_CCINCFLAGS']=[]
+	v['_CCDEFFLAGS']=[]
+	v['_CXXINCFLAGS']=[]
+	v['_CXXDEFFLAGS']=[]
+	v['CC_SRC_F']=''
+	v['CC_TGT_F']='/c /Fo'
+	v['CXX_SRC_F']=''
+	v['CXX_TGT_F']='/c /Fo'
+	v['CPPPATH_ST']='/I%s'
+	v['CPPFLAGS_CONSOLE']=['/SUBSYSTEM:CONSOLE']
+	v['CPPFLAGS_NATIVE']=['/SUBSYSTEM:NATIVE']
+	v['CPPFLAGS_POSIX']=['/SUBSYSTEM:POSIX']
+	v['CPPFLAGS_WINDOWS']=['/SUBSYSTEM:WINDOWS']
+	v['CPPFLAGS_WINDOWSCE']=['/SUBSYSTEM:WINDOWSCE']
+	v['CPPFLAGS_CRT_MULTITHREADED']=['/MT']
+	v['CPPFLAGS_CRT_MULTITHREADED_DLL']=['/MD']
+	v['CPPDEFINES_CRT_MULTITHREADED']=['_MT']
+	v['CPPDEFINES_CRT_MULTITHREADED_DLL']=['_MT','_DLL']
+	v['CPPFLAGS_CRT_MULTITHREADED_DBG']=['/MTd']
+	v['CPPFLAGS_CRT_MULTITHREADED_DLL_DBG']=['/MDd']
+	v['CPPDEFINES_CRT_MULTITHREADED_DBG']=['_DEBUG','_MT']
+	v['CPPDEFINES_CRT_MULTITHREADED_DLL_DBG']=['_DEBUG','_MT','_DLL']
+	v['CCFLAGS']=['/TC']
+	v['CCFLAGS_OPTIMIZED']=['/O2','/DNDEBUG']
+	v['CCFLAGS_RELEASE']=['/O2','/DNDEBUG']
+	v['CCFLAGS_DEBUG']=['/Od','/RTC1','/D_DEBUG','/ZI']
+	v['CCFLAGS_ULTRADEBUG']=['/Od','/RTC1','/D_DEBUG','/ZI']
+	v['CXXFLAGS']=['/TP']
+	v['CXXFLAGS_OPTIMIZED']=['/O2','/DNDEBUG']
+	v['CXXFLAGS_RELEASE']=['/O2','/DNDEBUG']
+	v['CXXFLAGS_DEBUG']=['/Od','/RTC1','/D_DEBUG','/ZI']
+	v['CXXFLAGS_ULTRADEBUG']=['/Od','/RTC1','/D_DEBUG','/ZI']
+	v['LIB']=[]
+	v['LINK_TGT_F']='/OUT:'
+	v['LINK_SRC_F']=' '
+	v['LIB_ST']='%s.lib'
+	v['LIBPATH_ST']='/LIBPATH:%s'
+	v['STATICLIB_ST']='%s.lib'
+	v['STATICLIBPATH_ST']='/LIBPATH:%s'
+	v['CCDEFINES_ST']='/D%s'
+	v['CXXDEFINES_ST']='/D%s'
+	v['_LIBDIRFLAGS']=''
+	v['_LIBFLAGS']=''
+	v['SHLIB_MARKER']=''
+	v['STATICLIB_MARKER']=''
+	v['LINKFLAGS']=['/NOLOGO','/MACHINE:X86','/ERRORREPORT:PROMPT']
+	try:
+		debug_level=Options.options.debug_level.upper()
+	except AttributeError:
+		debug_level=ccroot.DEBUG_LEVELS.CUSTOM
+	v['CCFLAGS']+=v['CCFLAGS_'+debug_level]
+	v['CXXFLAGS']+=v['CXXFLAGS_'+debug_level]
+	v['LINKFLAGS']+=v['LINKFLAGS_'+debug_level]
+	v['shlib_CCFLAGS']=['']
+	v['shlib_CXXFLAGS']=['']
+	v['shlib_LINKFLAGS']=['/DLL']
+	v['shlib_PATTERN']='%s.dll'
+	v['staticlib_LINKFLAGS']=['']
+	v['staticlib_PATTERN']='%s.lib'
+	v['program_PATTERN']='%s.exe'
+def set_options(opt):
+	opt.add_option('-d','--debug-level',action='store',default=ccroot.DEBUG_LEVELS.DEBUG,help="Specify the debug level, does nothing if CFLAGS is set in the environment. [Allowed Values: '%s']"%"', '".join(ccroot.DEBUG_LEVELS.ALL),choices=ccroot.DEBUG_LEVELS.ALL,dest='debug_level')
+
+taskgen(apply_msvc_obj_vars)
+feature('cc','cxx')(apply_msvc_obj_vars)
+after('apply_obj_vars_cc')(apply_msvc_obj_vars)
+after('apply_obj_vars_cxx')(apply_msvc_obj_vars)
+taskgen(apply_link_msvc)
+feature('cc','cxx')(apply_link_msvc)
+after('apply_core')(apply_link_msvc)
+before('apply_obj_vars_cc')(apply_link_msvc)
+before('apply_obj_vars_cxx')(apply_link_msvc)
+taskgen(init_msvc)
+feature('cc','cxx')(init_msvc)
+before('apply_core')(init_msvc)
+conftest(find_msvc)
+conftest(msvc_common_flags)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/nasm.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/nasm.py
new file mode 100644
index 0000000..a2eac74
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/nasm.py
@@ -0,0 +1,31 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os
+import TaskGen,Task
+from TaskGen import taskgen,before,extension
+nasm_str='${NASM} ${NASM_FLAGS} ${NASM_INCLUDES} ${SRC} -o ${TGT}'
+EXT_NASM=['.s','.S','.asm','.ASM','.spp','.SPP']
+def apply_nasm_vars(self):
+	if hasattr(self,'nasm_flags'):
+		for flag in self.to_list(self.nasm_flags):
+			self.env.append_value('NASM_FLAGS',flag)
+	if hasattr(self,'includes'):
+		for inc in self.to_list(self.includes):
+			self.env.append_value('NASM_INCLUDES','-I %s'%inc.srcpath(self.env))
+def nasm_file(self,node):
+	o_node=node.change_ext('.o')
+	task=self.create_task('nasm')
+	task.set_inputs(node)
+	task.set_outputs(o_node)
+	self.compiled_tasks.append(task)
+	self.meths.append('apply_nasm_vars')
+Task.simple_task_type('nasm',nasm_str,color='BLUE',ext_out='.o')
+def detect(conf):
+	nasm=conf.find_program('nasm',var='NASM')
+	if not nasm:nasm=conf.find_program('yasm',var='NASM')
+	if not nasm:conf.fatal('could not find nasm (or yasm), install it or set PATH env var')
+
+taskgen(apply_nasm_vars)
+before('apply_link')(apply_nasm_vars)
+extension(EXT_NASM)(nasm_file)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ocaml.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ocaml.py
new file mode 100644
index 0000000..3e7bc3e
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/ocaml.py
@@ -0,0 +1,240 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,re
+import TaskGen,Utils,Task,Build
+from Logs import error
+from TaskGen import taskgen,feature,before,after,extension
+EXT_MLL=['.mll']
+EXT_MLY=['.mly']
+EXT_MLI=['.mli']
+EXT_MLC=['.c']
+EXT_ML=['.ml']
+open_re=re.compile('^\s*open\s+([a-zA-Z]+)(;;){0,1}$',re.M)
+foo=re.compile(r"""(\(\*)|(\*\))|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^()*"'\\]*)""",re.M)
+def filter_comments(txt):
+	meh=[0]
+	def repl(m):
+		if m.group(1):meh[0]+=1
+		elif m.group(2):meh[0]-=1
+		elif not meh[0]:return m.group(0)
+		return''
+	return foo.sub(repl,txt)
+def scan(self):
+	node=self.inputs[0]
+	code=filter_comments(node.read(self.env))
+	global open_re
+	names=[]
+	import_iterator=open_re.finditer(code)
+	if import_iterator:
+		for import_match in import_iterator:
+			names.append(import_match.group(1))
+	found_lst=[]
+	raw_lst=[]
+	for name in names:
+		nd=None
+		for x in self.incpaths:
+			nd=x.find_resource(name.lower()+'.ml')
+			if not nd:nd=x.find_resource(name+'.ml')
+			if nd:
+				found_lst.append(nd)
+				break
+		else:
+			raw_lst.append(name)
+	return(found_lst,raw_lst)
+native_lst=['native','all','c_object']
+bytecode_lst=['bytecode','all']
+class ocaml_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+TaskGen.bind_feature('ocaml','apply_core')
+def init_ml(self):
+	Utils.def_attrs(self,type='all',incpaths_lst=[],bld_incpaths_lst=[],mlltasks=[],mlytasks=[],mlitasks=[],native_tasks=[],bytecode_tasks=[],linktasks=[],bytecode_env=None,native_env=None,compiled_tasks=[],includes='',uselib='',out_nodes=[],are_deps_set=0)
+def init_envs_ml(self):
+	self.islibrary=getattr(self,'islibrary',False)
+	global native_lst,bytecode_lst
+	self.native_env=None
+	if self.type in native_lst:
+		self.native_env=self.env.copy()
+		if self.islibrary:self.native_env['OCALINKFLAGS']='-a'
+	self.bytecode_env=None
+	if self.type in bytecode_lst:
+		self.bytecode_env=self.env.copy()
+		if self.islibrary:self.bytecode_env['OCALINKFLAGS']='-a'
+	if self.type=='c_object':
+		self.native_env['OCALINK']=self.native_env['OCALINK']+' -output-obj'
+def apply_incpaths_ml(self):
+	inc_lst=self.includes.split()
+	lst=self.incpaths_lst
+	tree=Build.bld
+	for dir in inc_lst:
+		node=self.path.find_dir(dir)
+		if not node:
+			error("node not found: "+str(dir))
+			continue
+		Build.bld.rescan(node)
+		if not node in lst:lst.append(node)
+		self.bld_incpaths_lst.append(node)
+def apply_vars_ml(self):
+	for i in self.incpaths_lst:
+		if self.bytecode_env:
+			self.bytecode_env.append_value('OCAMLPATH','-I %s'%i.srcpath(self.env))
+			self.bytecode_env.append_value('OCAMLPATH','-I %s'%i.bldpath(self.env))
+		if self.native_env:
+			self.native_env.append_value('OCAMLPATH','-I %s'%i.bldpath(self.env))
+			self.native_env.append_value('OCAMLPATH','-I %s'%i.srcpath(self.env))
+	varnames=['INCLUDES','OCAMLFLAGS','OCALINKFLAGS','OCALINKFLAGS_OPT']
+	for name in self.uselib.split():
+		for vname in varnames:
+			cnt=self.env[vname+'_'+name]
+			if cnt:
+				if self.bytecode_env:self.bytecode_env.append_value(vname,cnt)
+				if self.native_env:self.native_env.append_value(vname,cnt)
+def apply_link_ml(self):
+	if self.bytecode_env:
+		ext=self.islibrary and'.cma'or'.run'
+		linktask=self.create_task('ocalink')
+		linktask.bytecode=1
+		linktask.set_outputs(self.path.find_or_declare(self.target+ext))
+		linktask.obj=self
+		linktask.env=self.bytecode_env
+		self.linktasks.append(linktask)
+	if self.native_env:
+		if getattr(self,'c_objects',''):ext='.o'
+		elif self.islibrary:ext='.cmxa'
+		else:ext=''
+		linktask=self.create_task('ocalinkx')
+		linktask.set_outputs(self.path.find_or_declare(self.target+ext))
+		linktask.obj=self
+		linktask.env=self.native_env
+		self.linktasks.append(linktask)
+		self.out_nodes+=linktask.outputs
+		if self.type=='c_object':self.compiled_tasks.append(linktask)
+def mll_hook(self,node):
+	mll_task=self.create_task('ocamllex',self.native_env)
+	mll_task.set_inputs(node)
+	mll_task.set_outputs(node.change_ext('.ml'))
+	self.mlltasks.append(mll_task)
+	self.allnodes.append(mll_task.outputs[0])
+def mly_hook(self,node):
+	mly_task=self.create_task('ocamlyacc',self.native_env)
+	mly_task.set_inputs(node)
+	mly_task.set_outputs([node.change_ext('.ml'),node.change_ext('.mli')])
+	self.mlytasks.append(mly_task)
+	self.allnodes.append(mly_task.outputs[0])
+	task=self.create_task('ocamlcmi',self.native_env)
+	task.set_inputs(mly_task.outputs[1])
+	task.set_outputs(mly_task.outputs[1].change_ext('.cmi'))
+def mli_hook(self,node):
+	task=self.create_task('ocamlcmi',self.native_env)
+	task.set_inputs(node)
+	task.set_outputs(node.change_ext('.cmi'))
+	self.mlitasks.append(task)
+def mlc_hook(self,node):
+	task=self.create_task('ocamlcc',self.native_env)
+	task.set_inputs(node)
+	task.set_outputs(node.change_ext('.o'))
+	self.out_nodes+=task.outputs
+def ml_hook(self,node):
+	if self.native_env:
+		task=self.create_task('ocamlx',self.native_env)
+		task.set_inputs(node)
+		task.set_outputs(node.change_ext('.cmx'))
+		task.obj=self
+		task.incpaths=self.bld_incpaths_lst
+		self.native_tasks.append(task)
+	if self.bytecode_env:
+		task=self.create_task('ocaml',self.bytecode_env)
+		task.set_inputs(node)
+		task.obj=self
+		task.bytecode=1
+		task.incpaths=self.bld_incpaths_lst
+		task.set_outputs(node.change_ext('.cmo'))
+		self.bytecode_tasks.append(task)
+def compile_may_start(self):
+	if not getattr(self,'flag_deps',''):
+		self.flag_deps=1
+		if getattr(self,'bytecode',''):alltasks=self.obj.bytecode_tasks
+		else:alltasks=self.obj.native_tasks
+		self.signature()
+		tree=Build.bld
+		env=self.env
+		for node in self.inputs:
+			lst=tree.node_deps[self.unique_id()]
+			for depnode in lst:
+				for t in alltasks:
+					if t==self:continue
+					if depnode in t.inputs:
+						self.set_run_after(t)
+		delattr(self,'cache_sig')
+		self.signature()
+	return Task.Task.runnable_status(self)
+b=Task.simple_task_type
+cls=b('ocamlx','${OCAMLOPT} ${OCAMLPATH} ${OCAMLFLAGS} ${INCLUDES} -c -o ${TGT} ${SRC}',color='GREEN')
+cls.runnable_status=compile_may_start
+cls.scan=scan
+b=Task.simple_task_type
+cls=b('ocaml','${OCAMLC} ${OCAMLPATH} ${OCAMLFLAGS} ${INCLUDES} -c -o ${TGT} ${SRC}',color='GREEN')
+cls.runnable_status=compile_may_start
+cls.scan=scan
+b('ocamlcmi','${OCAMLC} ${OCAMLPATH} ${INCLUDES} -o ${TGT} -c ${SRC}',color='BLUE',before="ocaml ocamlcc")
+b('ocamlcc','cd ${TGT[0].bld_dir(env)} && ${OCAMLOPT} ${OCAMLFLAGS} ${OCAMLPATH} ${INCLUDES} -c ${SRC[0].abspath(env)}',color='GREEN')
+b('ocamllex','${OCAMLLEX} ${SRC} -o ${TGT}',color='BLUE',before="ocamlcmi ocaml ocamlcc")
+b('ocamlyacc','${OCAMLYACC} -b ${TGT[0].bld_base(env)} ${SRC}',color='BLUE',before="ocamlcmi ocaml ocamlcc")
+def link_may_start(self):
+	if not getattr(self,'order',''):
+		if getattr(self,'bytecode',0):alltasks=self.obj.bytecode_tasks
+		else:alltasks=self.obj.native_tasks
+		seen=[]
+		pendant=[]+alltasks
+		while pendant:
+			task=pendant.pop(0)
+			if task in seen:continue
+			for x in task.run_after:
+				if not x in seen:
+					pendant.append(task)
+					break
+			else:
+				seen.append(task)
+		self.inputs=[x.outputs[0]for x in seen]
+		self.order=1
+	return Task.Task.runnable_status(self)
+act=b('ocalink','${OCAMLC} -o ${TGT} ${INCLUDES} ${OCALINKFLAGS} ${SRC}',color='YELLOW',after="ocaml ocamlcc")
+act.runnable_status=link_may_start
+act=b('ocalinkx','${OCAMLOPT} -o ${TGT} ${INCLUDES} ${OCALINKFLAGS_OPT} ${SRC}',color='YELLOW',after="ocamlx ocamlcc")
+act.runnable_status=link_may_start
+def detect(conf):
+	opt=conf.find_program('ocamlopt',var='OCAMLOPT')
+	occ=conf.find_program('ocamlc',var='OCAMLC')
+	if(not opt)or(not occ):
+		conf.fatal('The objective caml compiler was not found:\ninstall it or make it available in your PATH')
+	conf.env['OCAMLC']=occ
+	conf.env['OCAMLOPT']=opt
+	conf.env['OCAMLLEX']=conf.find_program('ocamllex',var='OCAMLLEX')
+	conf.env['OCAMLYACC']=conf.find_program('ocamlyacc',var='OCAMLYACC')
+	conf.env['OCAMLFLAGS']=''
+	conf.env['OCAMLLIB']=Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep
+	conf.env['LIBPATH_OCAML']=Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep
+	conf.env['CPPPATH_OCAML']=Utils.cmd_output(conf.env['OCAMLC']+' -where').strip()+os.sep
+	conf.env['LIB_OCAML']='camlrun'
+
+taskgen(init_ml)
+feature('ocaml')(init_ml)
+taskgen(init_envs_ml)
+feature('ocaml')(init_envs_ml)
+after('init_ml')(init_envs_ml)
+taskgen(apply_incpaths_ml)
+feature('ocaml')(apply_incpaths_ml)
+before('apply_vars_ml')(apply_incpaths_ml)
+after('init_envs_ml')(apply_incpaths_ml)
+taskgen(apply_vars_ml)
+feature('ocaml')(apply_vars_ml)
+before('apply_core')(apply_vars_ml)
+taskgen(apply_link_ml)
+feature('ocaml')(apply_link_ml)
+after('apply_core')(apply_link_ml)
+extension(EXT_MLL)(mll_hook)
+extension(EXT_MLY)(mly_hook)
+extension(EXT_MLI)(mli_hook)
+extension(EXT_MLC)(mlc_hook)
+extension(EXT_ML)(ml_hook)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/osx.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/osx.py
new file mode 100644
index 0000000..c89f4ba
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/osx.py
@@ -0,0 +1,105 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,shutil,sys
+import TaskGen,Task,Build,Options
+from TaskGen import taskgen,feature,after,before
+from Logs import error,debug
+def create_task_macapp(self):
+	if'cprogram'in self.features and self.link_task:
+		apptask=self.create_task('macapp',self.env)
+		apptask.set_inputs(self.link_task.outputs)
+		apptask.set_outputs(self.link_task.outputs[0].change_ext('.app'))
+		self.apptask=apptask
+def apply_link_osx(self):
+	if self.env['MACAPP']or getattr(self,'mac_app',False):
+		self.create_task_macapp()
+		name=self.link_task.outputs[0].name
+		if self.vnum:name=name.replace('.dylib','.%s.dylib'%self.vnum)
+		path=os.path.join(self.env['PREFIX'],lib,name)
+		path='-install_name %s'%path
+		self.env.append_value('LINKFLAGS',path)
+def apply_bundle(self):
+	if not'shlib'in self.features:return
+	if self.env['MACBUNDLE']or getattr(self,'mac_bundle',False):
+		self.env['shlib_PATTERN']='%s.bundle'
+		uselib=self.to_list(self.uselib)
+		if not'MACBUNDLE'in uselib:uselib.append('MACBUNDLE')
+def apply_bundle_remove_dynamiclib(self):
+	if not'shlib'in self.features:return
+	if self.env['MACBUNDLE']or getattr(self,'mac_bundle',False):
+		self.env["LINKFLAGS"].remove("-dynamiclib")
+		self.env.append_value("LINKFLAGS","-bundle")
+app_dirs=['Contents',os.path.join('Contents','MacOS'),os.path.join('Contents','Resources')]
+app_info='''
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+	<key>CFBundlePackageType</key>
+	<string>APPL</string>
+	<key>CFBundleGetInfoString</key>
+	<string>Created by Waf</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>NOTE</key>
+	<string>THIS IS A GENERATED FILE, DO NOT MODIFY</string>
+	<key>CFBundleExecutable</key>
+	<string>%s</string>
+</dict>
+</plist>
+'''
+def app_build(task):
+	global app_dirs
+	env=task.env
+	i=0
+	for p in task.outputs:
+		srcfile=p.srcpath(env)
+		debug('osx: creating directories')
+		try:
+			os.mkdir(srcfile)
+			[os.makedirs(os.path.join(srcfile,d))for d in app_dirs]
+		except(OSError,IOError):
+			pass
+		srcprg=task.inputs[i].srcpath(env)
+		dst=os.path.join(srcfile,'Contents','MacOS')
+		debug('osx: copy %s to %s'%(srcprg,dst))
+		shutil.copy(srcprg,dst)
+		debug('osx: generate Info.plist')
+		f=file(os.path.join(srcfile,"Contents","Info.plist"),"w")
+		f.write(app_info%os.path.basename(srcprg))
+		f.close()
+		i+=1
+	return 0
+def install_shlib(task):
+	nums=task.vnum.split('.')
+	path=self.install_path
+	libname=task.outputs[0].name
+	name3=libname.replace('.dylib','.%s.dylib'%task.vnum)
+	name2=libname.replace('.dylib','.%s.dylib'%nums[0])
+	name1=libname
+	filename=task.outputs[0].abspath(task.env)
+	bld=Build.bld
+	bld.install_as(path+name3,filename,env=task.env)
+	bld.symlink_as(path+name2,name3)
+	bld.symlink_as(path+name1,name3)
+def install_target_osx_cshlib(self):
+	if not Options.is_install:return
+	if getattr(self,'vnum','')and sys.platform!='win32':
+		self.link_task.install=install_shlib
+Task.task_type_from_func('macapp',vars=[],func=app_build,after="cxx_link cc_link ar_link_static")
+
+taskgen(create_task_macapp)
+taskgen(apply_link_osx)
+after('apply_link')(apply_link_osx)
+feature('cc','cxx')(apply_link_osx)
+taskgen(apply_bundle)
+before('apply_link')(apply_bundle)
+before('apply_lib_vars')(apply_bundle)
+feature('cc','cxx')(apply_bundle)
+taskgen(apply_bundle_remove_dynamiclib)
+after('apply_link')(apply_bundle_remove_dynamiclib)
+feature('cc','cxx')(apply_bundle_remove_dynamiclib)
+taskgen(install_target_osx_cshlib)
+feature('osx')(install_target_osx_cshlib)
+after('install_target_cshlib')(install_target_osx_cshlib)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/perl.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/perl.py
new file mode 100644
index 0000000..0294183
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/perl.py
@@ -0,0 +1,78 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os
+import pproc
+import Task,Options,Utils
+from Configure import conf
+from TaskGen import extension,taskgen,feature,before
+xsubpp_str='${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}'
+EXT_XS=['.xs']
+def init_pyext(self):
+	self.uselib=self.to_list(getattr(self,'uselib',''))
+	if not'PERL'in self.uselib:self.uselib.append('PERL')
+	if not'PERLEXT'in self.uselib:self.uselib.append('PERLEXT')
+	self.env['shlib_PATTERN']=self.env['perlext_PATTERN']
+def xsubpp_file(self,node):
+	gentask=self.create_task('xsubpp')
+	gentask.set_inputs(node)
+	outnode=node.change_ext('.c')
+	gentask.set_outputs(outnode)
+	self.allnodes.append(outnode)
+Task.simple_task_type('xsubpp',xsubpp_str,color='BLUE',before="cc cxx")
+def check_perl_version(conf,minver=None):
+	res=True
+	if not getattr(Options.options,'perlbinary',None):
+		perl=conf.find_program("perl",var="PERL")
+		if not perl:
+			return False
+	else:
+		perl=Options.options.perlbinary
+		conf.env['PERL']=perl
+	version=Utils.cmd_output(perl+" -e'printf \"%vd\", $^V'")
+	if not version:
+		res=False
+		version="Unknown"
+	elif not minver is None:
+		ver=tuple(map(int,version.split(".")))
+		if ver<minver:
+			res=False
+	if minver is None:
+		cver=""
+	else:
+		cver=".".join(map(str,minver))
+	conf.check_message("perl",cver,res,version)
+	return res
+def check_perl_module(conf,module):
+	cmd=[conf.env['PERL'],'-e','use %s'%module]
+	r=pproc.call(cmd,stdout=pproc.PIPE,stderr=pproc.PIPE)==0
+	conf.check_message("perl module %s"%module,"",r)
+	return r
+def check_perl_ext_devel(conf):
+	if not conf.env['PERL']:
+		return False
+	perl=conf.env['PERL']
+	conf.env["LINKFLAGS_PERLEXT"]=Utils.cmd_output(perl+" -MConfig -e'print $Config{lddlflags}'")
+	conf.env["CPPPATH_PERLEXT"]=Utils.cmd_output(perl+" -MConfig -e'print \"$Config{archlib}/CORE\"'")
+	conf.env["CCFLAGS_PERLEXT"]=Utils.cmd_output(perl+" -MConfig -e'print \"$Config{ccflags} $Config{cccdlflags}\"'")
+	conf.env["XSUBPP"]=Utils.cmd_output(perl+" -MConfig -e'print \"$Config{privlib}/ExtUtils/xsubpp$Config{exe_ext}\"'")
+	conf.env["EXTUTILS_TYPEMAP"]=Utils.cmd_output(perl+" -MConfig -e'print \"$Config{privlib}/ExtUtils/typemap\"'")
+	if not getattr(Options.options,'perlarchdir',None):
+		conf.env["ARCHDIR_PERL"]=Utils.cmd_output(perl+" -MConfig -e'print $Config{sitearch}'")
+	else:
+		conf.env["ARCHDIR_PERL"]=getattr(Options.options,'perlarchdir')
+	conf.env['perlext_PATTERN']='%s.'+Utils.cmd_output(perl+" -MConfig -e'print $Config{dlext}'")
+	return True
+def detect(conf):
+	pass
+def set_options(opt):
+	opt.add_option("--with-perl-binary",type="string",dest="perlbinary",help='Specify alternate perl binary',default=None)
+	opt.add_option("--with-perl-archdir",type="string",dest="perlarchdir",help='Specify directory where to install arch specific files',default=None)
+
+taskgen(init_pyext)
+before('apply_incpaths')(init_pyext)
+feature('perlext')(init_pyext)
+extension(EXT_XS)(xsubpp_file)
+conf(check_perl_version)
+conf(check_perl_module)
+conf(check_perl_ext_devel)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/preproc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/preproc.py
new file mode 100644
index 0000000..087db71
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/preproc.py
@@ -0,0 +1,500 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import re,sys,os,string,types
+if __name__=='__main__':
+	sys.path=['.','..']+sys.path
+import Logs,Build,Utils
+from Logs import debug,error
+import traceback
+class PreprocError(Utils.WafError):
+	pass
+POPFILE='-'
+go_absolute=0
+standard_includes=['/usr/include']
+if sys.platform=="win32":
+	standard_includes=[]
+use_trigraphs=0
+'apply the trigraph rules first'
+strict_quotes=0
+g_optrans={'not':'!','and':'&&','bitand':'&','and_eq':'&=','or':'||','bitor':'|','or_eq':'|=','xor':'^','xor_eq':'^=','compl':'~',}
+re_lines=re.compile('^[ \t]*(#|%:)[ \t]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ \t]*(.*)\r*$',re.IGNORECASE|re.MULTILINE)
+re_mac=re.compile("^[a-zA-Z_]\w*")
+re_fun=re.compile('^[a-zA-Z_][a-zA-Z0-9_]*[(]')
+re_pragma_once=re.compile('^\s*once\s*',re.IGNORECASE)
+re_nl=re.compile('\\\\\r*\n',re.MULTILINE)
+re_cpp=re.compile(r"""(/\*[^*]*\*+([^/*][^*]*\*+)*/)|//[^\n]*|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)""",re.MULTILINE)
+trig_def=[('??'+a,b)for a,b in zip("=-/!'()<>",r'#~\|^[]{}')]
+chr_esc={'0':0,'a':7,'b':8,'t':9,'n':10,'f':11,'v':12,'r':13,'\\':92,"'":39}
+NUM='i'
+OP='O'
+IDENT='T'
+STR='s'
+CHAR='c'
+tok_types=[NUM,STR,IDENT,OP]
+exp_types=[r"""0[xX](?P<hex>[a-fA-F0-9]+)(?P<qual1>[uUlL]*)|L*?'(?P<char>(\\.|[^\\'])+)'|(?P<n1>\d+)[Ee](?P<exp0>[+-]*?\d+)(?P<float0>[fFlL]*)|(?P<n2>\d*\.\d+)([Ee](?P<exp1>[+-]*?\d+))?(?P<float1>[fFlL]*)|(?P<n4>\d+\.\d*)([Ee](?P<exp2>[+-]*?\d+))?(?P<float2>[fFlL]*)|(?P<oct>0*)(?P<n0>\d+)(?P<qual2>[uUlL]*)""",r'L?"([^"\\]|\\.)*"',r'[a-zA-Z_]\w*',r'%:%:|<<=|>>=|\.\.\.|<<|<%|<:|<=|>>|>=|\+\+|\+=|--|->|-=|\*=|/=|%:|%=|%>|==|&&|&=|\|\||\|=|\^=|:>|!=|##|[\(\)\{\}\[\]<>\?\|\^\*\+&=:!#;,%/\-\?\~\.]',]
+re_clexer=re.compile('|'.join(["(?P<%s>%s)"%(name,part)for name,part in zip(tok_types,exp_types)]),re.M)
+accepted='a'
+ignored='i'
+undefined='u'
+skipped='s'
+def repl(m):
+	s=m.group(1)
+	if s is not None:return' '
+	s=m.group(3)
+	if s is None:return''
+	return s
+def filter_comments(filename):
+	f=open(filename,"r")
+	code=f.read()
+	f.close()
+	if use_trigraphs:
+		for(a,b)in trig_def:code=code.split(a).join(b)
+	code=re_nl.sub('',code)
+	code=re_cpp.sub(repl,code)
+	return[(m.group(2),m.group(3))for m in re.finditer(re_lines,code)]
+prec={}
+ops=['* / %','+ -','<< >>','< <= >= >','== !=','& | ^','&& ||',',']
+for x in range(len(ops)):
+	syms=ops[x]
+	for u in syms.split():
+		prec[u]=x
+def reduce_nums(val_1,val_2,val_op):
+	try:a=0+val_1
+	except TypeError:a=int(val_1)
+	try:b=0+val_2
+	except TypeError:b=int(val_2)
+	d=val_op
+	if d=='%':c=a%b
+	elif d=='+':c=a+b
+	elif d=='-':c=a-b
+	elif d=='*':c=a*b
+	elif d=='/':c=a/b
+	elif d=='^':c=a^b
+	elif d=='|':c=a|b
+	elif d=='||':c=int(a or b)
+	elif d=='&':c=a&b
+	elif d=='&&':c=int(a and b)
+	elif d=='==':c=int(a==b)
+	elif d=='!=':c=int(a!=b)
+	elif d=='<=':c=int(a<=b)
+	elif d=='<':c=int(a<b)
+	elif d=='>':c=int(a>b)
+	elif d=='>=':c=int(a>=b)
+	elif d=='^':c=int(a^b)
+	elif d=='<<':c=a<<b
+	elif d=='>>':c=a>>b
+	else:c=0
+	return c
+def get_expr(lst,defs,ban):
+	if not lst:return([],[],[])
+	(p,v)=lst[0]
+	if p==NUM:
+		return(p,v,lst[1:])
+	elif p==STR:
+		try:
+			(p2,v2)=lst[1]
+			if p2==STR:return(p,v+v2,lst[2:])
+		except IndexError:pass
+		return(p,v,lst[1:])
+	elif p==OP:
+		if v in['+','-','!','~','#']:
+			(p2,v2,lst2)=get_expr(lst[1:],defs,ban)
+			if v=='#':
+				if p2!=IDENT:raise PreprocError,"ident expected %s"%str(lst)
+				return get_expr([(STR,v2)]+lst2,defs,ban)
+			if p2!=NUM:raise PreprocError,"num expected %s"%str(lst)
+			if v=='+':return(p2,v2,lst2)
+			elif v=='-':return(p2,-int(v2),lst2)
+			elif v=='!':return(p2,int(not int(v2)),lst2)
+			elif v=='~':return(p2,~int(v2),lst2)
+			return(p2,v2,lst2)
+		elif v=='(':
+			count_par=0
+			i=0
+			for _,v in lst:
+				if v==')':
+					count_par-=1
+					if count_par==0:break
+				elif v=='(':count_par+=1
+				i+=1
+			else:
+				raise PreprocError,"rparen expected %s"%str(lst)
+			ret=process_tokens(lst[1:i],defs,ban)
+			if len(ret)==1:
+				(p,v)=ret[0]
+				return(p,v,lst[i+1:])
+			else:
+				raise PreprocError,"cannot reduce %s"%str(lst)
+	elif p==IDENT:
+		if len(lst)>1:
+			(p2,v2)=lst[1]
+			if v2=="##":
+				(p3,v3)=lst[2]
+				if p3!=IDENT and p3!=NUM and p3!=OP:
+					raise PreprocError,"%s: ident expected after '##'"%str(lst)
+				return get_expr([(p,v+v3)]+lst[3:],defs,ban)
+		if v.lower()=='defined':
+			(p2,v2)=lst[1]
+			off=2
+			if v2=='(':
+				(p2,v2)=lst[2]
+				if p2!=IDENT:raise PreprocError,'expected an identifier after a "defined("'
+				(p3,v3)=lst[3]
+				if v3!=')':raise PreprocError,'expected a ")" after a "defined(x"'
+				off=4
+			elif p2!=IDENT:
+				raise PreprocError,'expected a "(" or an identifier after a defined'
+			x=0
+			if v2 in defs:x=1
+			return(NUM,x,lst[off:])
+		elif not v in defs or v in ban:
+			if"waf_include"in ban:return(p,v,lst[1:])
+			else:return(NUM,0,lst[1:])
+		if type(defs[v])is types.StringType:
+			v,k=extract_macro(defs[v])
+			defs[v]=k
+		macro_def=defs[v]
+		if not macro_def[0]:
+			lst=macro_def[1]+lst[1:]
+			return get_expr(lst,defs,ban)
+		else:
+			params=[]
+			i=1
+			p2,v2=lst[i]
+			if p2!=OP or v2!='(':raise PreprocError,"invalid function call '%s'"%v
+			one_param=[]
+			count_paren=0
+			try:
+				while 1:
+					i+=1
+					p2,v2=lst[i]
+					if p2==OP and count_paren==0:
+						if v2=='(':
+							one_param.append((p2,v2))
+							count_paren+=1
+						elif v2==')':
+							if one_param:params.append(one_param)
+							lst=lst[i+1:]
+							break
+						elif v2==',':
+							if not one_param:raise PreprocError,"empty param in funcall %s"%p
+							params.append(one_param)
+							one_param=[]
+						else:
+							one_param.append((p2,v2))
+					else:
+						one_param.append((p2,v2))
+						if v2=='(':count_paren+=1
+						elif v2==')':count_paren-=1
+			except IndexError,e:
+				raise
+			accu=[]
+			table=macro_def[0]
+			for p2,v2 in macro_def[1]:
+				if p2==IDENT and v2 in table:accu+=params[table[v2]]
+				else:
+					if v2=='__VA_ARGS__':
+						va_toks=[]
+						st=len(macro_def[0])
+						pt=len(params)
+						for x in params[pt-st+1:]:
+							va_toks.extend(x)
+							va_toks.append((OP,','))
+						if va_toks:va_toks.pop()
+						if len(accu)>1:
+							(p3,v3)=accu[-1]
+							(p4,v4)=accu[-2]
+							if v3=='##':
+								accu.pop()
+								if v4==','and pt<st:
+									accu.pop()
+						accu+=va_toks
+					else:
+						accu.append((p2,v2))
+			return get_expr(accu+lst,defs,ban+[v])
+def process_tokens(lst,defs,ban):
+	accu=[]
+	while lst:
+		p,v,nlst=get_expr(lst,defs,ban)
+		if p==NUM:
+			if not nlst:return[(p,v)]
+			op1,ov1=nlst[0]
+			if op1!=OP:
+				raise PreprocError,"op expected %s"%str(lst)
+			if ov1=='?':
+				i=0
+				count_par=0
+				for _,k in nlst:
+					if k==')':count_par-=1
+					elif k=='(':count_par+=1
+					elif k==':'and count_par==0:break
+					i+=1
+				else:raise PreprocError,"ending ':' expected %s"%str(lst)
+				if reduce_nums(v,0,'+'):lst=nlst[1:i]
+				else:lst=nlst[i+1:]
+				continue
+			elif ov1==',':
+				lst=nlst[1:]
+				continue
+			p2,v2,nlst=get_expr(nlst[1:],defs,ban)
+			if p2!=NUM:raise PreprocError,"num expected after op %s"%str(lst)
+			if nlst:
+				op3,ov3=nlst[0]
+				if prec[ov3]<prec[ov1]:
+					p4,v4,nlst2=get_expr(nlst[1:],defs,ban)
+					v5=reduce_nums(v2,v4,ov3)
+					lst=[(p,v),(op1,ov1),(NUM,v5)]+nlst2
+					continue
+			lst=[(NUM,reduce_nums(v,v2,ov1))]+nlst
+			continue
+		elif p==STR:
+			if nlst:raise PreprocError,"sequence must terminate with a string %s"%str(nlst)
+			return[(p,v)]
+		return(None,None,[])
+def eval_macro(lst,adefs):
+	ret=process_tokens(lst,adefs,[])
+	if not ret:raise PreprocError,"missing tokens to evaluate %s"%str(lst)
+	p,v=ret[0]
+	return int(v)!=0
+class c_parser(object):
+	def __init__(self,nodepaths=None,defines=None):
+		self.lines=[]
+		if defines is None:
+			self.defs={}
+		else:
+			self.defs=dict(defines)
+		self.state=[]
+		self.env=None
+		self.count_files=0
+		self.deps=[]
+		self.deps_paths=[]
+		self.currentnode_stack=[]
+		self.nodepaths=nodepaths or[]
+		self.nodes=[]
+		self.names=[]
+		self.curfile=''
+		self.ban_includes=[]
+		try:
+			self.parse_cache=Build.bld.parse_cache
+		except AttributeError:
+			Build.bld.parse_cache={}
+			self.parse_cache=Build.bld.parse_cache
+	def tryfind(self,filename):
+		self.curfile=filename
+		found=self.currentnode_stack[-1].find_resource(filename)
+		for n in self.nodepaths:
+			if found:
+				break
+			found=n.find_resource(filename)
+		if not found:
+			if not filename in self.names:
+				self.names.append(filename)
+			return
+		self.nodes.append(found)
+		if filename[-4:]!='.moc':
+			self.addlines(found)
+	def addlines(self,node):
+		self.currentnode_stack.append(node.parent)
+		filepath=node.abspath(self.env)
+		self.count_files+=1
+		if self.count_files>30000:raise PreprocError,"recursion limit exceeded, bailing out"
+		pc=self.parse_cache
+		debug('preproc: reading file %r'%filepath)
+		try:
+			lns=pc[filepath]
+		except KeyError:
+			pass
+		else:
+			self.lines=lns+self.lines
+			return
+		try:
+			lines=filter_comments(filepath)
+			lines.append((POPFILE,''))
+			pc[filepath]=lines
+			self.lines=lines+self.lines
+		except IOError:
+			raise PreprocError,"could not read the file %s"%filepath
+		except Exception:
+			if Logs.verbose>0:
+				error("parsing %s failed"%filepath)
+				traceback.print_exc()
+	def start(self,node,env):
+		debug('preproc: scanning %s (in %s)'%(node.name,node.parent.name))
+		self.env=env
+		variant=node.variant(env)
+		self.addlines(node)
+		if env['DEFLINES']:
+			self.lines=[('define',x)for x in env['DEFLINES']]+self.lines
+		while self.lines:
+			(type,line)=self.lines.pop(0)
+			if type==POPFILE:
+				self.currentnode_stack.pop()
+				continue
+			try:
+				self.process_line(type,line)
+			except Exception,ex:
+				if Logs.verbose:
+					error("line parsing failed (%s): %s"%(str(ex),line))
+					traceback.print_exc()
+	def process_line(self,token,line):
+		ve=Logs.verbose
+		if ve:debug('preproc: line is %s - %s state is %s'%(token,line,self.state))
+		state=self.state
+		if token in['ifdef','ifndef','if']:
+			state.append(undefined)
+		elif token=='endif':
+			state.pop()
+		if not token in['else','elif','endif']:
+			if skipped in self.state or ignored in self.state:
+				return
+		if token=='if':
+			ret=eval_macro(tokenize(line),self.defs)
+			if ret:state[-1]=accepted
+			else:state[-1]=ignored
+		elif token=='ifdef':
+			m=re_mac.search(line)
+			if m and m.group(0)in self.defs:state[-1]=accepted
+			else:state[-1]=ignored
+		elif token=='ifndef':
+			m=re_mac.search(line)
+			if m and m.group(0)in self.defs:state[-1]=ignored
+			else:state[-1]=accepted
+		elif token=='include'or token=='import':
+			(type,inc)=extract_include(line,self.defs)
+			if inc in self.ban_includes:return
+			if token=='import':self.ban_includes.append(inc)
+			if ve:debug('preproc: include found %s    (%s) '%(inc,type))
+			if type=='"'or not strict_quotes:
+				if not inc in self.deps:
+					self.deps.append(inc)
+				self.tryfind(inc)
+		elif token=='elif':
+			if state[-1]==accepted:
+				state[-1]=skipped
+			elif state[-1]==ignored:
+				if eval_macro(tokenize(line),self.defs):
+					state[-1]=accepted
+		elif token=='else':
+			if state[-1]==accepted:state[-1]=skipped
+			elif state[-1]==ignored:state[-1]=accepted
+		elif token=='define':
+			m=re_mac.search(line)
+			if m:
+				name=m.group(0)
+				if ve:debug('preproc: define %s   %s'%(name,line))
+				self.defs[name]=line
+			else:
+				raise PreprocError,"invalid define line %s"%line
+		elif token=='undef':
+			m=re_mac.search(line)
+			if m and m.group(0)in self.defs:
+				self.defs.__delitem__(m.group(0))
+		elif token=='pragma':
+			if re_pragma_once.search(line.lower()):
+				self.ban_includes.append(self.curfile)
+def extract_macro(txt):
+	t=tokenize(txt)
+	if re_fun.search(txt):
+		p,name=t[0]
+		p,v=t[1]
+		if p!=OP:raise PreprocError,"expected open parenthesis"
+		i=1
+		pindex=0
+		params={}
+		prev='('
+		while 1:
+			i+=1
+			p,v=t[i]
+			if prev=='(':
+				if p==IDENT:
+					params[v]=pindex
+					pindex+=1
+					prev=p
+				elif p==OP and v==')':
+					break
+				else:
+					raise PreprocError,"unexpected token"
+			elif prev==IDENT:
+				if p==OP and v==',':
+					prev=v
+				elif p==OP and v==')':
+					break
+				else:
+					raise PreprocError,"comma or ... expected"
+			elif prev==',':
+				if p==IDENT:
+					params[v]=pindex
+					pindex+=1
+					prev=p
+				elif p==OP and v=='...':
+					raise PreprocError,"not implemented"
+				else:
+					raise PreprocError,"comma or ... expected"
+			elif prev=='...':
+				raise PreprocError,"not implemented"
+			else:
+				raise PreprocError,"unexpected else"
+		print(name,[params,t[i+1:]])
+		return(name,[params,t[i+1:]])
+	else:
+		(p,v)=t[0]
+		return(v,[[],t[1:]])
+re_include=re.compile('^\s*(<(?P<a>.*)>|"(?P<b>.*)")')
+def extract_include(txt,defs):
+	m=re_include.search(txt)
+	if m:
+		if m.group('a'):return'<',m.group('a')
+		if m.group('b'):return'"',m.group('b')
+	tokens=tokenize(txt)
+	tokens=process_tokens(tokens,defs,['waf_include'])
+	p,v=tokens[0]
+	if p!=STR:raise PreprocError,"could not parse include %s"%txt
+	return('"',v)
+def parse_char(txt):
+	if not txt:raise PreprocError,"attempted to parse a null char"
+	if txt[0]!='\\':
+		return ord(txt)
+	c=txt[1]
+	if c=='x':
+		if len(txt)==4 and txt[3]in string.hexdigits:return int(txt[2:],16)
+		return int(txt[2:],16)
+	elif c.isdigit():
+		if c=='0'and len(txt)==2:return 0
+		for i in 3,2,1:
+			if len(txt)>i and txt[1:1+i].isdigit():
+				return(1+i,int(txt[1:1+i],8))
+	else:
+		try:return chr_esc[c]
+		except KeyError:raise PreprocError,"could not parse char literal '%s'"%txt
+def tokenize(s):
+	ret=[]
+	for match in re_clexer.finditer(s):
+		m=match.group
+		for name in tok_types:
+			v=m(name)
+			if v:
+				if name==IDENT:
+					try:v=g_optrans[v];name=OP
+					except KeyError:
+						if v.lower()=="true":
+							v=1
+							name=NUM
+						elif v.lower()=="false":
+							v=0
+							name=NUM
+				elif name==NUM:
+					if m('oct'):v=int(v,8)
+					elif m('hex'):v=int(m('hex'),16)
+					elif m('n0'):v=m('n0')
+					else:
+						v=m('char')
+						if v:v=parse_char(v)
+						else:v=m('n2')or m('n4')
+				elif name==OP:
+					if v=='%:':v='#'
+					elif v=='%:%:':v='##'
+				ret.append((name,v))
+				break
+	return ret
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/python.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/python.py
new file mode 100644
index 0000000..88ff061
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/python.py
@@ -0,0 +1,260 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys
+import TaskGen,Utils,Utils,Runner,Options,Build
+from Logs import debug,warn
+from TaskGen import extension,taskgen,before,after,feature
+from Configure import conf
+import pproc
+EXT_PY=['.py']
+def init_pyext(self):
+	self.default_install_path='${PYTHONDIR}'
+	self.uselib=self.to_list(getattr(self,'uselib',''))
+	if not'PYEXT'in self.uselib:
+		self.uselib.append('PYEXT')
+	self.env['MACBUNDLE']=True
+def pyext_shlib_ext(self):
+	self.env['shlib_PATTERN']=self.env['pyext_PATTERN']
+def init_pyembed(self):
+	self.uselib=self.to_list(getattr(self,'uselib',''))
+	if not'PYEMBED'in self.uselib:
+		self.uselib.append('PYEMBED')
+def process_py(self,node):
+	if Options.is_install and self.install_path:
+		installed_files=Build.bld.install_files(self.install_path,node.abspath(self.env),self.env,self.chmod)
+		if Options.commands['uninstall']:
+			print"* removing byte compiled python files"
+			for fname in installed_files:
+				try:
+					os.remove(fname+'c')
+				except OSError:
+					pass
+				try:
+					os.remove(fname+'o')
+				except OSError:
+					pass
+		if Options.commands['install']:
+			if self.env['PYC']or self.env['PYO']:
+				print"* byte compiling python files"
+			if self.env['PYC']:
+				program=("""
+import sys, py_compile
+for pyfile in sys.argv[1:]:
+	py_compile.compile(pyfile, pyfile + 'c')
+""")
+				argv=[self.env['PYTHON'],"-c",program]
+				argv.extend(installed_files)
+				retval=pproc.Popen(argv).wait()
+				if retval:
+					raise Utils.WafError("bytecode compilation failed")
+			if self.env['PYO']:
+				program=("""
+import sys, py_compile
+for pyfile in sys.argv[1:]:
+	py_compile.compile(pyfile, pyfile + 'o')
+""")
+				argv=[self.env['PYTHON'],self.env['PYFLAGS_OPT'],"-c",program]
+				argv.extend(installed_files)
+				retval=pproc.Popen(argv).wait()
+				if retval:
+					raise Utils.WafError("bytecode compilation failed")
+class py_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def init_py(self):
+	self.default_install_path='${PYTHONDIR}'
+def _get_python_variables(python_exe,variables,imports=['import sys']):
+	program=list(imports)
+	program.append('')
+	for v in variables:
+		program.append("print repr(%s)"%v)
+	proc=pproc.Popen([python_exe,"-c",'\n'.join(program)],stdout=pproc.PIPE)
+	output=proc.communicate()[0].split("\n")
+	if proc.returncode:
+		if Logs.verbose:
+			warn("Python program to extract python configuration variables failed:\n%s"%'\n'.join(["line %03i: %s"%(lineno+1,line)for lineno,line in enumerate(program)]))
+		raise ValueError
+	return_values=[]
+	for s in output:
+		s=s.strip()
+		if not s:
+			continue
+		if s=='None':
+			return_values.append(None)
+		elif s[0]=="'"and s[-1]=="'":
+			return_values.append(s[1:-1])
+		elif s[0].isdigit():
+			return_values.append(int(s))
+		else:break
+	return return_values
+def check_python_headers(conf):
+	env=conf.env
+	python=env['PYTHON']
+	assert python,("python is %r !"%(python,))
+	if Options.platform=='darwin':
+		conf.check_tool('osx')
+	try:
+		v='prefix SO SYSLIBS SHLIBS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED'.split()
+		(python_prefix,python_SO,python_SYSLIBS,python_SHLIBS,python_LIBDIR,python_LIBPL,INCLUDEPY,Py_ENABLE_SHARED)=_get_python_variables(python,["get_config_var('%s')"%x for x in v],['from distutils.sysconfig import get_config_var'])
+	except ValueError:
+		conf.fatal("Python development headers not found (-v for details).")
+	conf.log.write("""Configuration returned from %r:
+python_prefix = %r
+python_SO = %r
+python_SYSLIBS = %r
+python_SHLIBS = %r
+python_LIBDIR = %r
+python_LIBPL = %r
+INCLUDEPY = %r
+Py_ENABLE_SHARED = %r
+"""%(python,python_prefix,python_SO,python_SYSLIBS,python_SHLIBS,python_LIBDIR,python_LIBPL,INCLUDEPY,Py_ENABLE_SHARED))
+	env['pyext_PATTERN']='%s'+python_SO
+	if python_SYSLIBS is not None:
+		for lib in python_SYSLIBS.split():
+			if lib.startswith('-l'):
+				lib=lib[2:]
+			env.append_value('LIB_PYEMBED',lib)
+	if python_SHLIBS is not None:
+		for lib in python_SHLIBS.split():
+			if lib.startswith('-l'):
+				lib=lib[2:]
+			env.append_value('LIB_PYEMBED',lib)
+	code='''
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void Py_Initialize(void);
+ void Py_Finalize(void);
+#ifdef __cplusplus
+}
+#endif
+int main(int argc, char *argv[]) { Py_Initialize(); Py_Finalize(); return 0; }
+'''
+	result=1
+	name='python'+env['PYTHON_VERSION']
+	if python_LIBDIR is not None:
+		path=[python_LIBDIR]
+		result=conf.check_cc(lib=name,uselib='PYEMBED',libpath=path)
+	if result and python_LIBPL is not None:
+		path=[python_LIBPL]
+		result=conf.check_cc(lib=name,uselib='PYEMBED',libpath=path)
+	if result:
+		path=[os.path.join(python_prefix,"libs")]
+		name='python'+env['PYTHON_VERSION'].replace('.','')
+		result=conf.check_cc(lib=name,uselib='PYEMBED',libpath=path)
+	if not result:
+		env['LIBPATH_PYEMBED']=path
+		env.append_value('LIB_PYEMBED',name)
+	if(sys.platform=='win32'or sys.platform.startswith('os2')or sys.platform=='darwin'or Py_ENABLE_SHARED):
+		env['LIBPATH_PYEXT']=env['LIBPATH_PYEMBED']
+		env['LIB_PYEXT']=env['LIB_PYEMBED']
+	python_config=conf.find_program('python%s-config'%('.'.join(env['PYTHON_VERSION'].split('.')[:2])),var='PYTHON_CONFIG')
+	if python_config:
+		includes=[]
+		for incstr in os.popen("%s %s --includes"%(python,python_config)).readline().strip().split():
+			if(incstr.startswith('-I')or incstr.startswith('/I')):
+				incstr=incstr[2:]
+			if incstr not in includes:
+				includes.append(incstr)
+		conf.log.write("Include path for Python extensions ""(found via python-config --includes): %r\n"%(list(includes),))
+		env['CPPPATH_PYEXT']=list(includes)
+		env['CPPPATH_PYEMBED']=list(includes)
+	else:
+		conf.log.write("Include path for Python extensions ""(found via distutils module): %r\n"%(list(includes),))
+		env['CPPPATH_PYEXT']=[INCLUDEPY]
+		env['CPPPATH_PYEMBED']=[INCLUDEPY]
+	if env['CC']:
+		version=os.popen("%s --version"%env['CC']).readline()
+		if'(GCC)'in version or'gcc'in version:
+			env.append_value('CCFLAGS_PYEMBED','-fno-strict-aliasing')
+			env.append_value('CCFLAGS_PYEXT','-fno-strict-aliasing')
+	if env['CXX']:
+		version=os.popen("%s --version"%env['CXX']).readline()
+		if'(GCC)'in version or'g++'in version:
+			env.append_value('CXXFLAGS_PYEMBED','-fno-strict-aliasing')
+			env.append_value('CXXFLAGS_PYEXT','-fno-strict-aliasing')
+	test_env=env.copy()
+	test_env.append_value('CPPPATH',env['CPPPATH_PYEMBED'])
+	test_env.append_value('LIBPATH',env['LIBPATH_PYEMBED'])
+	test_env.append_value('LIB',env['LIB_PYEMBED'])
+	test_env.append_value('CXXFLAGS',env['CXXFLAGS_PYEMBED'])
+	test_env.append_value('CCFLAGS',env['CCFLAGS_PYEMBED'])
+	conf.check_cc(header_name='Python.h',define_name='HAVE_PYTHON_H',env=test_env,fragment='''#include <Python.h>\nint main(int argc, char *argv[]) { Py_Initialize(); Py_Finalize(); return 0; }\n''',errmsg='Could not find the python development headers',mandatory=1)
+def check_python_version(conf,minver=None):
+	assert minver is None or isinstance(minver,tuple)
+	python=conf.env['PYTHON']
+	assert python,("python is %r !"%(python,))
+	cmd=[python,"-c","import sys\nfor x in sys.version_info: print str(x)"]
+	debug('python: Running python command %r'%cmd)
+	proc=pproc.Popen(cmd,stdout=pproc.PIPE)
+	lines=proc.communicate()[0].split()
+	assert len(lines)==5,"found %i lines, expected 5: %r"%(len(lines),lines)
+	pyver_tuple=(int(lines[0]),int(lines[1]),int(lines[2]),lines[3],int(lines[4]))
+	result=(minver is None)or(pyver_tuple>=minver)
+	if result:
+		pyver='.'.join([str(x)for x in pyver_tuple[:2]])
+		conf.env['PYTHON_VERSION']=pyver
+		if'PYTHONDIR'in os.environ:
+			pydir=os.environ['PYTHONDIR']
+		else:
+			if sys.platform=='win32':
+				(python_LIBDEST,)=_get_python_variables(python,["get_config_var('LIBDEST')"],['from distutils.sysconfig import get_config_var'])
+			else:
+				python_LIBDEST=None
+			if python_LIBDEST is None:
+				if conf.env['LIBDIR']:
+					python_LIBDEST=os.path.join(conf.env['LIBDIR'],"python"+pyver)
+				else:
+					python_LIBDEST=os.path.join(conf.env['PREFIX'],"lib","python"+pyver)
+			pydir=os.path.join(python_LIBDEST,"site-packages")
+		if hasattr(conf,'define'):
+			conf.define('PYTHONDIR',pydir)
+		conf.env['PYTHONDIR']=pydir
+	pyver_full='.'.join(map(str,pyver_tuple[:3]))
+	if minver is None:
+		conf.check_message_custom('Python version','',pyver_full)
+	else:
+		minver_str='.'.join(map(str,minver))
+		conf.check_message('Python version',">= %s"%(minver_str,),result,option=pyver_full)
+	if not result:
+		conf.fatal("Python too old.")
+def check_python_module(conf,module_name):
+	result=not pproc.Popen([conf.env['PYTHON'],"-c","import %s"%module_name],stderr=pproc.PIPE,stdout=pproc.PIPE).wait()
+	conf.check_message('Python module',module_name,result)
+	if not result:
+		conf.fatal("Python module not found.")
+def detect(conf):
+	python=conf.find_program('python',var='PYTHON')
+	if not python:return
+	v=conf.env
+	v['PYCMD']='"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"'
+	v['PYFLAGS']=''
+	v['PYFLAGS_OPT']='-O'
+	v['PYC']=getattr(Options.options,'pyc',1)
+	v['PYO']=getattr(Options.options,'pyo',1)
+def set_options(opt):
+	opt.add_option('--nopyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]',dest='pyc')
+	opt.add_option('--nopyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]',dest='pyo')
+
+taskgen(init_pyext)
+before('apply_incpaths')(init_pyext)
+feature('pyext')(init_pyext)
+before('apply_bundle')(init_pyext)
+taskgen(pyext_shlib_ext)
+before('apply_link')(pyext_shlib_ext)
+before('apply_lib_vars')(pyext_shlib_ext)
+after('apply_bundle')(pyext_shlib_ext)
+feature('pyext')(pyext_shlib_ext)
+taskgen(init_pyembed)
+before('apply_incpaths')(init_pyembed)
+feature('pyembed')(init_pyembed)
+extension(EXT_PY)(process_py)
+taskgen(init_py)
+before('apply_core')(init_py)
+after('vars_target_cprogram')(init_py)
+after('vars_target_cstaticlib')(init_py)
+feature('py')(init_py)
+conf(check_python_headers)
+conf(check_python_version)
+conf(check_python_module)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/qt4.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/qt4.py
new file mode 100644
index 0000000..b6725b2
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/qt4.py
@@ -0,0 +1,377 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+try:
+	from xml.sax import make_parser
+	from xml.sax.handler import ContentHandler
+except ImportError:
+	has_xml=False
+	ContentHandler=object
+else:
+	has_xml=True
+import os,sys
+import ccroot,cxx
+import TaskGen,Task,Utils,Runner,Options,Build
+from TaskGen import taskgen,feature,after,extension
+from Logs import error
+from Constants import*
+MOC_H=['.h','.hpp','.hxx','.hh']
+EXT_RCC=['.qrc']
+EXT_UI=['.ui']
+EXT_QT4=['.cpp','.cc','.cxx','.C']
+class MTask(Task.Task):
+	scan=ccroot.scan
+	before=['cxx_link','ar_link_static']
+	def __init__(self,parent):
+		Task.Task.__init__(self,parent.env)
+		self.moc_done=0
+		self.parent=parent
+	def runnable_status(self):
+		if self.moc_done:
+			for t in self.run_after:
+				if not t.hasrun:
+					return ASK_LATER
+			self.signature()
+			return Task.Task.runnable_status(self)
+		else:
+			self.add_moc_tasks()
+			return ASK_LATER
+	def add_moc_tasks(self):
+		tree=Build.bld
+		parn=self.parent
+		node=self.inputs[0]
+		try:
+			self.signature()
+		except:
+			print"TODO"
+		else:
+			delattr(self,'cache_sig')
+		moctasks=[]
+		mocfiles=[]
+		variant=node.variant(parn.env)
+		try:
+			tmp_lst=tree.raw_deps[self.unique_id()]
+			tree.raw_deps[self.unique_id()]=[]
+		except KeyError:
+			tmp_lst=[]
+		for d in tmp_lst:
+			if not d.endswith('.moc'):continue
+			if d in mocfiles:
+				error("paranoia owns")
+				continue
+			mocfiles.append(d)
+			ext=''
+			try:ext=Options.options.qt_header_ext
+			except AttributeError:pass
+			if not ext:
+				base2=d[:-4]
+				path=node.parent.srcpath(parn.env)
+				for i in MOC_H:
+					try:
+						os.stat(os.path.join(path,base2+i))
+					except OSError:
+						pass
+					else:
+						ext=i
+						break
+				if not ext:raise Utils.WafError("no header found for %s which is a moc file"%str(d))
+			h_node=node.parent.find_resource(base2+i)
+			m_node=h_node.change_ext('.moc')
+			tree.node_deps[(self.unique_id(),m_node.name)]=h_node
+			task=Task.TaskBase.classes['moc'](parn.env,normal=0)
+			task.set_inputs(h_node)
+			task.set_outputs(m_node)
+			generator=Build.bld.generator
+			generator.outstanding.insert(0,task)
+			generator.total+=1
+			moctasks.append(task)
+		tmp_lst=tree.raw_deps[self.unique_id()]=mocfiles
+		lst=tree.node_deps.get(self.unique_id(),())
+		for d in lst:
+			name=d.name
+			if name.endswith('.moc'):
+				task=Task.TaskBase.classes['moc'](parn.env,normal=0)
+				task.set_inputs(tree.node_deps[(self.unique_id(),name)])
+				task.set_outputs(d)
+				generator=Build.bld.generator
+				generator.outstanding.insert(0,task)
+				generator.total+=1
+				moctasks.append(task)
+		self.run_after=moctasks
+		self.moc_done=1
+	run=Task.TaskBase.classes['cxx'].__dict__['run']
+def translation_update(task):
+	outs=[a.abspath(task.env)for a in task.outputs]
+	outs=" ".join(outs)
+	lupdate=task.env['QT_LUPDATE']
+	for x in task.inputs:
+		file=x.abspath(task.env)
+		cmd="%s %s -ts %s"%(lupdate,file,outs)
+		Utils.pprint('BLUE',cmd)
+		task.generator.bld.exec_command(cmd)
+class XMLHandler(ContentHandler):
+	def __init__(self):
+		self.buf=[]
+		self.files=[]
+	def startElement(self,name,attrs):
+		if name=='file':
+			self.buf=[]
+	def endElement(self,name):
+		if name=='file':
+			self.files.append(''.join(self.buf))
+	def characters(self,cars):
+		self.buf.append(cars)
+def scan(self):
+	node=self.inputs[0]
+	parser=make_parser()
+	curHandler=XMLHandler()
+	parser.setContentHandler(curHandler)
+	fi=open(self.inputs[0].abspath(self.env))
+	parser.parse(fi)
+	fi.close()
+	nodes=[]
+	names=[]
+	root=self.inputs[0].parent
+	for x in curHandler.files:
+		x=x.encode('utf8')
+		nd=root.find_resource(x)
+		if nd:nodes.append(nd)
+		else:names.append(x)
+	return(nodes,names)
+def create_rcc_task(self,node):
+	rcnode=node.change_ext('_rc.cpp')
+	rcctask=self.create_task('rcc')
+	rcctask.inputs=[node]
+	rcctask.outputs=[rcnode]
+	cpptask=self.create_task('cxx')
+	cpptask.inputs=[rcnode]
+	cpptask.outputs=[rcnode.change_ext('.o')]
+	cpptask.defines=self.scanner_defines
+	self.compiled_tasks.append(cpptask)
+	return cpptask
+def create_uic_task(self,node):
+	uictask=self.create_task('ui4')
+	uictask.inputs=[node]
+	uictask.outputs=[node.change_ext('.h')]
+class qt4_taskgen(cxx.cxx_taskgen):
+	def __init__(self,*kw):
+		cxx.cxx_taskgen.__init__(self,*kw)
+		self.features.append('qt4')
+def apply_qt4(self):
+	if getattr(self,'lang',None):
+		lst=[]
+		trans=[]
+		for l in self.to_list(self.lang):
+			t=Task.TaskBase.classes['ts2qm'](self.env)
+			t.set_inputs(self.path.find_resource(l+'.ts'))
+			t.set_outputs(t.inputs[0].change_ext('.qm'))
+			lst.append(t.outputs[0])
+			if self.update:
+				trans.append(t.inputs[0])
+		if getattr(self,'update',None)and Options.options.trans_qt4:
+			u=Task.TaskCmd(translation_update,self.env,2)
+			u.inputs=[a.inputs[0]for a in self.compiled_tasks]
+			u.outputs=trans
+		if getattr(self,'langname',None):
+			t=Task.TaskBase.classes['qm2rcc'](self.env)
+			t.set_inputs(lst)
+			t.set_outputs(self.path.find_or_declare(self.langname+'.qrc'))
+			t.path=self.path
+			k=create_rcc_task(self,t.outputs[0])
+			self.link_task.inputs.append(k.outputs[0])
+	lst=[]
+	for flag in self.to_list(self.env['CXXFLAGS']):
+		if len(flag)<2:continue
+		if flag[0:2]=='-D'or flag[0:2]=='-I':
+			lst.append(flag)
+	self.env['MOC_FLAGS']=lst
+def find_sources_in_dirs(self,dirnames,excludes=[],exts=[]):
+	lst=[]
+	excludes=self.to_list(excludes)
+	dirnames=self.to_list(dirnames)
+	ext_lst=exts or self.mappings.keys()+TaskGen.task_gen.mappings.keys()
+	self.lang=getattr(self,'lang','')
+	for name in dirnames:
+		anode=self.path.find_dir(name)
+		Build.bld.rescan(anode)
+		for name in Build.bld.cache_dir_contents[anode.id]:
+			(base,ext)=os.path.splitext(name)
+			if ext in ext_lst:
+				if not name in lst:
+					if name in excludes:continue
+					lst.append((anode.path_to_parent(self.path)or'.')+'/'+name)
+			elif ext=='.ts':
+				self.lang+=' '+base
+	lst.sort()
+	self.source=self.source+' '+(" ".join(lst))
+setattr(qt4_taskgen,'find_sources_in_dirs',find_sources_in_dirs)
+def cxx_hook(self,node):
+	task=MTask(self)
+	self.tasks.append(task)
+	try:obj_ext=self.obj_ext
+	except AttributeError:obj_ext='_%d.o'%self.idx
+	task.defines=self.scanner_defines
+	task.inputs=[node]
+	task.outputs=[node.change_ext(obj_ext)]
+	self.compiled_tasks.append(task)
+def process_qm2rcc(task):
+	outfile=task.outputs[0].abspath(task.env)
+	f=open(outfile,'w')
+	f.write('<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n')
+	for k in task.inputs:
+		f.write(' <file>')
+		f.write(k.path_to_parent(task.path))
+		f.write('</file>\n')
+	f.write('</qresource>\n</RCC>')
+	f.close()
+b=Task.simple_task_type
+b('moc','${QT_MOC} ${MOC_FLAGS} ${SRC} ${MOC_ST} ${TGT}',color='BLUE',vars=['QT_MOC','MOC_FLAGS'])
+cls=b('rcc','${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath(env)} ${RCC_ST} -o ${TGT}',color='BLUE',before='cxx moc',after="qm2rcc")
+cls.scan=scan
+b('ui4','${QT_UIC} ${SRC} -o ${TGT}',color='BLUE',before='cxx moc')
+b('ts2qm','${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}',color='BLUE',before='qm2rcc')
+Task.task_type_from_func('qm2rcc',vars=[],func=process_qm2rcc,color='BLUE',before='rcc',after='ts2qm')
+def detect_qt4(conf):
+	env=conf.env
+	opt=Options.options
+	qtlibs=getattr(opt,'qtlibs','')
+	qtincludes=getattr(opt,'qtincludes','')
+	qtbin=getattr(opt,'qtbin','')
+	useframework=getattr(opt,'use_qt4_osxframework',True)
+	qtdir=getattr(opt,'qtdir','')
+	if not qtdir:qtdir=os.environ.get('QT4_ROOT','')
+	if not qtdir:
+		try:
+			lst=os.listdir('/usr/local/Trolltech/')
+			lst.sort()
+			lst.reverse()
+			qtdir='/usr/local/Trolltech/%s/'%lst[0]
+		except OSError:
+			pass
+	if not qtdir:
+		try:
+			path=os.environ['PATH'].split(':')
+			for qmk in['qmake-qt4','qmake4','qmake']:
+				qmake=conf.find_program(qmk,path)
+				if qmake:
+					version=Utils.cmd_output(qmake+" -query QT_VERSION").strip().split('.')
+					if version[0]=="4":
+						qtincludes=Utils.cmd_output(qmake+" -query QT_INSTALL_HEADERS").strip()
+						qtdir=Utils.cmd_output(qmake+" -query QT_INSTALL_PREFIX").strip()+"/"
+						qtbin=Utils.cmd_output(qmake+" -query QT_INSTALL_BINS").strip()+"/"
+						break
+		except(OSError,ValueError):
+			pass
+	if not qtlibs:qtlibs=os.path.join(qtdir,'lib')
+	vars="QtCore QtGui QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtWebKit Qt3Support".split()
+	framework_ok=False
+	if sys.platform=="darwin"and useframework:
+		for i in vars:
+			e=conf.create_framework_configurator()
+			e.path=[qtlibs,'/Library/Frameworks']
+			e.name=i
+			e.remove_dot_h=True
+			e.run()
+			if not i=='QtCore':
+				for r in env['CCFLAGS_'+i.upper()]:
+					if r.startswith('-F'):
+						env['CCFLAGS_'+i.upper()].remove(r)
+						break
+		if conf.is_defined("HAVE_QTOPENGL")and not'-framework OpenGL'in env["LINKFLAGS_QTOPENGL"]:
+			env["LINKFLAGS_QTOPENGL"]+=['-framework OpenGL']
+		if conf.is_defined("HAVE_QTGUI"):
+			if not'-framework AppKit'in env["LINKFLAGS_QTGUI"]:
+				env["LINKFLAGS_QTGUI"]+=['-framework AppKit']
+			if not'-framework ApplicationServices'in env["LINKFLAGS_QTGUI"]:
+				env["LINKFLAGS_QTGUI"]+=['-framework ApplicationServices']
+		framework_ok=True
+		if not conf.is_defined("HAVE_QTGUI"):
+			if not qtincludes:qtincludes=os.path.join(qtdir,'include')
+			env['QTINCLUDEPATH']=qtincludes
+			lst=[qtincludes,'/usr/share/qt4/include/','/opt/qt4/include']
+			conf.check(header_name='QtGui/QFont',define_name='HAVE_QTGUI',mandatory=1,includes=lst)
+	if not qtbin:qtbin=os.path.join(qtdir,'bin')
+	binpath=[qtbin,'/usr/share/qt4/bin/']+os.environ['PATH'].split(':')
+	def find_bin(lst,var):
+		for f in lst:
+			ret=conf.find_program(f,path_list=binpath)
+			if ret:
+				env[var]=ret
+				break
+	find_bin(['uic-qt3','uic3'],'QT_UIC3')
+	find_bin(['uic-qt4','uic'],'QT_UIC')
+	try:
+		version=Utils.cmd_output(env['QT_UIC']+" -version 2>&1").strip()
+	except ValueError:
+		conf.fatal('your uic compiler is for qt3, add uic for qt4 to your path')
+	version=version.replace('Qt User Interface Compiler ','')
+	version=version.replace('User Interface Compiler for Qt','')
+	if version.find(" 3.")!=-1:
+		conf.check_message('uic version','(too old)',0,option='(%s)'%version)
+		sys.exit(1)
+	conf.check_message('uic version','',1,option='(%s)'%version)
+	find_bin(['moc-qt4','moc'],'QT_MOC')
+	find_bin(['rcc'],'QT_RCC')
+	find_bin(['lrelease-qt4','lrelease'],'QT_LRELEASE')
+	find_bin(['lupdate-qt4','lupdate'],'QT_LUPDATE')
+	env['UIC3_ST']='%s -o %s'
+	env['UIC_ST']='%s -o %s'
+	env['MOC_ST']='-o'
+	env['QT_LRELEASE_FLAGS']=['-silent']
+	if not framework_ok:
+		vars_debug=[a+'_debug'for a in vars]
+		pkgconfig=env['pkg-config']or'PKGCONFIG_PATH=%s:%s/pkgconfig:/usr/lib/qt4/lib/pkgconfig:/opt/qt4/lib/pkgconfig:/usr/lib/qt4/lib:/opt/qt4/lib pkg-config --silence-errors'%(qtlibs,qtlibs)
+		for i in vars_debug+vars:
+			try:
+				conf.check_cfg(package=i,args='--cflags --libs',path=pkgconfig)
+			except ValueError:
+				pass
+		def process_lib(vars_,coreval):
+			for d in vars_:
+				var=d.upper()
+				if var=='QTCORE':continue
+				value=env['LIBPATH_'+var]
+				if value:
+					core=env[coreval]
+					accu=[]
+					for lib in value:
+						if lib in core:continue
+						accu.append(lib)
+					env['LIBPATH_'+var]=accu
+		process_lib(vars,'LIBPATH_QTCORE')
+		process_lib(vars_debug,'LIBPATH_QTCORE_DEBUG')
+		if Options.options.want_rpath:
+			def process_rpath(vars_,coreval):
+				for d in vars_:
+					var=d.upper()
+					value=env['LIBPATH_'+var]
+					if value:
+						core=env[coreval]
+						accu=[]
+						for lib in value:
+							if var!='QTCORE':
+								if lib in core:
+									continue
+							accu.append('-Wl,--rpath='+lib)
+						env['RPATH_'+var]=accu
+			process_rpath(vars,'LIBPATH_QTCORE')
+			process_rpath(vars_debug,'LIBPATH_QTCORE_DEBUG')
+	env['QTLOCALE']=str(env['PREFIX'])+'/share/locale'
+def detect(conf):
+	if sys.platform=='win32':conf.fatal('Qt4.py will not work on win32 for now - ask the author')
+	detect_qt4(conf)
+def set_options(opt):
+	opt.add_option('--want-rpath',type='int',default=1,dest='want_rpath',help='set rpath to 1 or 0 [Default 1]')
+	opt.add_option('--header-ext',type='string',default='',help='header extension for moc files',dest='qt_header_ext')
+	for i in"qtdir qtincludes qtlibs qtbin".split():
+		opt.add_option('--'+i,type='string',default='',dest=i)
+	if sys.platform=="darwin":
+		opt.add_option('--no-qt4-framework',action="store_false",help='do not use the framework version of Qt4 in OS X',dest='use_qt4_osxframework',default=True)
+	opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt4",default=False)
+
+extension(EXT_RCC)(create_rcc_task)
+extension(EXT_UI)(create_uic_task)
+taskgen(apply_qt4)
+feature('qt4')(apply_qt4)
+after('apply_link')(apply_qt4)
+extension(EXT_QT4)(cxx_hook)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/sunc++.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/sunc++.py
new file mode 100644
index 0000000..d0bee4e
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/sunc++.py
@@ -0,0 +1,66 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,optparse
+import Utils,Options,Configure
+import ccroot,ar
+from Configure import conftest
+def find_sxx(conf):
+	v=conf.env
+	cc=None
+	if v['CXX']:cc=v['CXX']
+	elif'CXX'in os.environ:cc=os.environ['CXX']
+	if not cc:cc=conf.find_program('c++',var='CXX')
+	if not cc:conf.fatal('sunc++ was not found')
+	v['CXX']=cc
+	v['CXX_NAME']='sun'
+def sxx_common_flags(conf):
+	v=conf.env
+	v['CXX_SRC_F']=''
+	v['CXX_TGT_F']='-c -o '
+	v['CPPPATH_ST']='-I%s'
+	if not v['LINK_CXX']:v['LINK_CXX']=v['CXX']
+	v['CXXLNK_SRC_F']=''
+	v['CXXLNK_TGT_F']='-o '
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STATICLIB_ST']='-l%s'
+	v['STATICLIBPATH_ST']='-L%s'
+	v['CXXDEFINES_ST']='-D%s'
+	v['SHLIB_MARKER']='-Bdynamic'
+	v['STATICLIB_MARKER']='-Bstatic'
+	v['program_PATTERN']='%s'
+	v['shlib_CXXFLAGS']=['-Kpic','-DPIC']
+	v['shlib_LINKFLAGS']=['-G']
+	v['shlib_PATTERN']='lib%s.so'
+	v['staticlib_LINKFLAGS']=['-Bstatic']
+	v['staticlib_PATTERN']='lib%s.a'
+def sxx_modifier_debug(conf,kind='cpp'):
+	v=conf.env
+	v['CXXFLAGS']=['']
+	if conf.check_flags('-O2',kind=kind):
+		v['CXXFLAGS_OPTIMIZED']=['-O2']
+		v['CXXFLAGS_RELEASE']=['-O2']
+	if conf.check_flags('-g -DDEBUG',kind=kind):
+		v['CXXFLAGS_DEBUG']=['-g','-DDEBUG']
+	if conf.check_flags('-g3 -O0 -DDEBUG',kind=kind):
+		v['CXXFLAGS_ULTRADEBUG']=['-g3','-O0','-DDEBUG']
+	try:
+		debug_level=Options.options.debug_level.upper()
+	except AttributeError:
+		debug_level=ccroot.DEBUG_LEVELS.CUSTOM
+	v.append_value('CXXFLAGS',v['CXXFLAGS_'+debug_level])
+detect='''
+find_sxx
+find_cpp
+find_ar
+sxx_common_flags
+cxx_load_tools
+cxx_check_features
+sxx_modifier_debug
+cxx_add_flags
+'''
+
+conftest(find_sxx)
+conftest(sxx_common_flags)
+conftest(sxx_modifier_debug)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/suncc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/suncc.py
new file mode 100644
index 0000000..47e1f82
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/suncc.py
@@ -0,0 +1,71 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,optparse
+import Utils,Options,Configure
+import ccroot,ar
+from Configure import conftest
+def find_scc(conf):
+	v=conf.env
+	cc=None
+	if v['CC']:cc=v['CC']
+	elif'CC'in os.environ:cc=os.environ['CC']
+	if not cc:cc=conf.find_program('cc',var='CC')
+	if not cc:conf.fatal('suncc was not found')
+	try:
+		if not Utils.cmd_output('%s -flags'%cc):
+			conf.fatal('suncc %r was not found'%cc)
+	except ValueError:
+		conf.fatal('suncc -flags could not be executed')
+	v['CC']=cc
+	v['CC_NAME']='sun'
+def scc_common_flags(conf):
+	v=conf.env
+	v['CC_SRC_F']=''
+	v['CC_TGT_F']='-c -o '
+	v['CPPPATH_ST']='-I%s'
+	if not v['LINK_CC']:v['LINK_CC']=v['CC']
+	v['CCLNK_SRC_F']=''
+	v['CCLNK_TGT_F']='-o '
+	v['LIB_ST']='-l%s'
+	v['LIBPATH_ST']='-L%s'
+	v['STATICLIB_ST']='-l%s'
+	v['STATICLIBPATH_ST']='-L%s'
+	v['CCDEFINES_ST']='-D%s'
+	v['SHLIB_MARKER']='-Bdynamic'
+	v['STATICLIB_MARKER']='-Bstatic'
+	v['program_PATTERN']='%s'
+	v['shlib_CCFLAGS']=['-Kpic','-DPIC']
+	v['shlib_LINKFLAGS']=['-G']
+	v['shlib_PATTERN']='lib%s.so'
+	v['staticlib_LINKFLAGS']=['-Bstatic']
+	v['staticlib_PATTERN']='lib%s.a'
+def scc_modifier_debug(conf):
+	v=conf.env
+	v['CCFLAGS']=['-O']
+	if conf.check_flags('-O2'):
+		v['CCFLAGS_OPTIMIZED']=['-O2']
+		v['CCFLAGS_RELEASE']=['-O2']
+	if conf.check_flags('-g -DDEBUG'):
+		v['CCFLAGS_DEBUG']=['-g','-DDEBUG']
+	if conf.check_flags('-g3 -O0 -DDEBUG'):
+		v['CCFLAGS_ULTRADEBUG']=['-g3','-O0','-DDEBUG']
+	try:
+		debug_level=Options.options.debug_level.upper()
+	except AttributeError:
+		debug_level=ccroot.DEBUG_LEVELS.CUSTOM
+	v.append_value('CCFLAGS',v['CCFLAGS_'+debug_level])
+detect='''
+find_scc
+find_cpp
+find_ar
+scc_common_flags
+cc_load_tools
+cc_check_features
+gcc_modifier_debug
+cc_add_flags
+'''
+
+conftest(find_scc)
+conftest(scc_common_flags)
+conftest(scc_modifier_debug)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/tex.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/tex.py
new file mode 100644
index 0000000..9be9e81
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/tex.py
@@ -0,0 +1,184 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,re
+import Utils,TaskGen,Task,Runner,Build
+from TaskGen import taskgen,feature
+from Logs import error,warn,debug
+re_tex=re.compile(r'\\(?P<type>include|input|import|bringin){(?P<file>[^{}]*)}',re.M)
+def scan(self):
+	node=self.inputs[0]
+	env=self.env
+	nodes=[]
+	names=[]
+	if not node:return(nodes,names)
+	fi=open(node.abspath(env),'r')
+	code=fi.read()
+	fi.close()
+	curdirnode=self.curdirnode
+	abs=curdirnode.abspath()
+	for match in re_tex.finditer(code):
+		path=match.group('file')
+		if path:
+			for k in['','.tex','.ltx']:
+				debug('tex: trying %s%s'%(path,k))
+				try:
+					os.stat(abs+os.sep+path+k)
+				except OSError:
+					continue
+				found=path+k
+				node=curdirnode.find_resource(found)
+				if node:
+					nodes.append(node)
+			else:
+				debug('tex: could not find %s'%path)
+				names.append(path)
+	debug("tex: found the following : %s and names %s"%(nodes,names))
+	return(nodes,names)
+g_bibtex_re=re.compile('bibdata',re.M)
+def tex_build(task,command='LATEX'):
+	env=task.env
+	bld=task.generator.bld
+	com='%s %s'%(env[command],env.get_flat(command+'FLAGS'))
+	if not env['PROMPT_LATEX']:com="%s %s"%(com,'-interaction=batchmode')
+	node=task.inputs[0]
+	reldir=node.bld_dir(env)
+	srcfile=node.srcpath(env)
+	lst=[]
+	for c in Utils.split_path(reldir):
+		if c:lst.append('..')
+	sr=os.path.join(*(lst+[srcfile]))
+	sr2=os.path.join(*(lst+[node.parent.srcpath(env)]))
+	aux_node=node.change_ext('.aux')
+	idx_node=node.change_ext('.idx')
+	hash=''
+	old_hash=''
+	nm=aux_node.name
+	docuname=nm[:len(nm)-4]
+	latex_compile_cmd='cd %s && TEXINPUTS=%s:$TEXINPUTS %s %s'%(reldir,sr2,com,sr)
+	warn('first pass on %s'%command)
+	ret=bld.exec_command(latex_compile_cmd)
+	if ret:return ret
+	try:
+		file=open(aux_node.abspath(env),'r')
+		ct=file.read()
+		file.close()
+	except(OSError,IOError):
+		error('error bibtex scan')
+	else:
+		fo=g_bibtex_re.findall(ct)
+		if fo:
+			bibtex_compile_cmd='cd %s && BIBINPUTS=%s:$BIBINPUTS %s %s'%(reldir,sr2,env['BIBTEX'],docuname)
+			warn('calling bibtex')
+			ret=bld.exec_command(bibtex_compile_cmd)
+			if ret:
+				error('error when calling bibtex %s'%bibtex_compile_cmd)
+				return ret
+	try:
+		idx_path=idx_node.abspath(env)
+		os.stat(idx_path)
+	except OSError:
+		error('error file.idx scan')
+	else:
+		makeindex_compile_cmd='cd %s && %s %s'%(reldir,env['MAKEINDEX'],idx_path)
+		warn('calling makeindex')
+		ret=bld.exec_command(makeindex_compile_cmd)
+		if ret:
+			error('error when calling makeindex %s'%makeindex_compile_cmd)
+			return ret
+	i=0
+	while i<10:
+		i+=1
+		old_hash=hash
+		try:
+			hash=Utils.h_file(aux_node.abspath(env))
+		except KeyError:
+			error('could not read aux.h -> %s'%aux_node.abspath(env))
+			pass
+		if hash and hash==old_hash:break
+		warn('calling %s'%command)
+		ret=bld.exec_command(latex_compile_cmd)
+		if ret:
+			error('error when calling %s %s'%(command,latex_compile_cmd))
+			return ret
+	return 0
+latex_vardeps=['LATEX','LATEXFLAGS']
+def latex_build(task):
+	return tex_build(task,'LATEX')
+pdflatex_vardeps=['PDFLATEX','PDFLATEXFLAGS']
+def pdflatex_build(task):
+	return tex_build(task,'PDFLATEX')
+class tex_taskgen(TaskGen.task_gen):
+	def __init__(self,*k,**kw):
+		TaskGen.task_gen.__init__(self,*k,**kw)
+def apply_tex(self):
+	if not self.type in['latex','pdflatex']:
+		raise Utils.WafError('type %s not supported for texobj'%type)
+	tree=Build.bld
+	outs=Utils.to_list(getattr(self,'outs',[]))
+	self.env['PROMPT_LATEX']=getattr(self,'prompt',1)
+	deps_lst=[]
+	if getattr(self,'deps',None):
+		deps=self.to_list(self.deps)
+		for filename in deps:
+			n=self.path.find_resource(filename)
+			if not n in deps_lst:deps_lst.append(n)
+	for filename in self.source.split():
+		base,ext=os.path.splitext(filename)
+		node=self.path.find_resource(filename)
+		if not node:raise Utils.WafError('cannot find %s'%filename)
+		if self.type=='latex':
+			task=self.create_task('latex')
+			task.set_inputs(node)
+			task.set_outputs(node.change_ext('.dvi'))
+		elif self.type=='pdflatex':
+			task=self.create_task('pdflatex')
+			task.set_inputs(node)
+			task.set_outputs(node.change_ext('.pdf'))
+		else:
+			raise Utils.WafError('no type or invalid type given in tex object (should be latex or pdflatex)')
+		task.env=self.env
+		task.curdirnode=self.path
+		if deps_lst:
+			variant=node.variant(self.env)
+			try:
+				lst=tree.node_deps[task.unique_id()]
+				for n in deps_lst:
+					if not n in lst:
+						lst.append(n)
+			except KeyError:
+				tree.node_deps[task.unique_id()]=deps_lst
+		if self.type=='latex':
+			if'ps'in outs:
+				pstask=self.create_task('dvips')
+				pstask.set_inputs(task.outputs)
+				pstask.set_outputs(node.change_ext('.ps'))
+			if'pdf'in outs:
+				pdftask=self.create_task('dvipdf')
+				pdftask.set_inputs(task.outputs)
+				pdftask.set_outputs(node.change_ext('.pdf'))
+		elif self.type=='pdflatex':
+			if'ps'in outs:
+				pstask=self.create_task('pdf2ps')
+				pstask.set_inputs(task.outputs)
+				pstask.set_outputs(node.change_ext('.ps'))
+def detect(conf):
+	v=conf.env
+	for p in'tex latex pdflatex bibtex dvips dvipdf ps2pdf makeindex pdf2ps'.split():
+		conf.find_program(p,var=p.upper())
+		v[p.upper()+'FLAGS']=''
+	v['DVIPSFLAGS']='-Ppdf'
+b=Task.simple_task_type
+b('tex','${TEX} ${TEXFLAGS} ${SRC}',color='BLUE')
+b('bibtex','${BIBTEX} ${BIBTEXFLAGS} ${SRC}',color='BLUE')
+b('dvips','${DVIPS} ${DVIPSFLAGS} ${SRC} -o ${TGT}',color='BLUE',after="latex pdflatex tex bibtex")
+b('dvipdf','${DVIPDF} ${DVIPDFFLAGS} ${SRC} ${TGT}',color='BLUE',after="latex pdflatex tex bibtex")
+b('pdf2ps','${PDF2PS} ${PDF2PSFLAGS} ${SRC} ${TGT}',color='BLUE',after="dvipdf pdflatex")
+b=Task.task_type_from_func
+cls=b('latex',latex_build,vars=latex_vardeps)
+cls.scan=scan
+cls=b('pdflatex',pdflatex_build,vars=pdflatex_vardeps)
+cls.scan=scan
+
+taskgen(apply_tex)
+feature('tex')(apply_tex)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/vala.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/vala.py
new file mode 100644
index 0000000..2e32c33
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/vala.py
@@ -0,0 +1,174 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os.path,shutil
+import Task,Runner,Utils,Logs,Build,Node
+from TaskGen import extension
+EXT_VALA=['.vala','.gs']
+class valac_task(Task.Task):
+	vars=("VALAC","VALAC_VERSION","VALAFLAGS")
+	before=("cc","cxx")
+	def run(self):
+		env=self.env
+		inputs=[a.srcpath(env)for a in self.inputs]
+		valac=env['VALAC']
+		vala_flags=env.get_flat('VALAFLAGS')
+		top_src=self.generator.bld.srcnode.abspath()
+		top_bld=self.generator.bld.srcnode.abspath(env)
+		if env['VALAC_VERSION']>(0,1,6):
+			cmd=[valac,'-C','--quiet',vala_flags]
+		else:
+			cmd=[valac,'-C',vala_flags]
+		if self.threading:
+			cmd.append('--thread')
+		if self.target_glib:
+			cmd.append('--target-glib=%s'%self.target_glib)
+		features=self.generator.features
+		if'cshlib'in features or'cstaticlib'in features:
+			cmd.append('--library '+self.target)
+			cmd.append('--basedir '+top_src)
+			cmd.append('-d '+top_bld)
+		else:
+			output_dir=self.outputs[0].bld_dir(env)
+			cmd.append('-d %s'%output_dir)
+		for vapi_dir in self.vapi_dirs:
+			cmd.append('--vapidir=%s'%vapi_dir)
+		for package in self.packages:
+			cmd.append('--pkg %s'%package)
+		cmd.append(" ".join(inputs))
+		result=self.generator.bld.exec_command(" ".join(cmd))
+		if'cshlib'in features or'cstaticlib'in features:
+			if self.packages:
+				filename=os.path.join(self.generator.path.abspath(env),"%s.deps"%self.target)
+				deps=open(filename,'w')
+				for package in self.packages:
+					deps.write(package+'\n')
+				deps.close()
+			self._fix_output("../%s.vapi"%self.target)
+			self._fix_output("%s.vapi"%self.target)
+			self._fix_output("%s.gidl"%self.target)
+			self._fix_output("%s.gir"%self.target)
+		return result
+	def install(self):
+		bld=self.generator.bld
+		features=self.generator.features
+		if self.attr("install_path")and("cshlib"in features or"cstaticlib"in features):
+			headers_list=[o for o in self.outputs if o.suffix()==".h"]
+			vapi_list=[o for o in self.outputs if(o.suffix()in(".vapi",".deps"))]
+			for header in headers_list:
+				top_src=self.generator.bld.srcnode
+				package=self.env['PACKAGE']
+				try:
+					api_version=Utils.g_module.API_VERSION
+				except AttributeError:
+					version=Utils.g_module.VERSION.split(".")
+					if version[0]=="0":
+						api_version="0."+version[1]
+					else:
+						api_version=version[0]+".0"
+				install_path="${INCLUDEDIR}/%s-%s/%s"%(package,api_version,header.relpath_gen(top_src))
+				bld.install_as(install_path,header.abspath(self.env),self.env)
+			for vapi in vapi_list:
+				bld.install_files("${DATAROOTDIR}/vala/vapi",vapi.abspath(self.env),self.env)
+	def _fix_output(self,output):
+		top_bld=self.generator.bld.srcnode.abspath(self.env)
+		try:
+			src=os.path.join(top_bld,output)
+			dst=self.generator.path.abspath(self.env)
+			shutil.move(src,dst)
+		except IOError:
+			pass
+def vala_file(self,node):
+	valatask=getattr(self,"valatask",None)
+	if not valatask:
+		valatask=self.create_task('valac')
+		self.valatask=valatask
+		valatask.packages=[]
+		valatask.vapi_dirs=[]
+		valatask.target=self.target
+		valatask.threading=False
+		valatask.install_path=self.install_path
+		valatask.target_glib=None
+		packages=Utils.to_list(getattr(self,'packages',[]))
+		vapi_dirs=Utils.to_list(getattr(self,'vapi_dirs',[]))
+		if hasattr(self,'uselib_local'):
+			local_packages=Utils.to_list(self.uselib_local)
+			seen=[]
+			while len(local_packages)>0:
+				package=local_packages.pop()
+				if package in seen:
+					continue
+				seen.append(package)
+				package_obj=self.name_to_obj(package)
+				if not package_obj:
+					raise Utils.WafError("object '%s' was not found in uselib_local (required by '%s')"%(package,self.name))
+				package_name=package_obj.target
+				package_node=package_obj.path
+				package_dir=package_node.relpath_gen(self.path)
+				for task in package_obj.tasks:
+					for output in task.outputs:
+						if output.name==package_name+".vapi":
+							if package_name not in packages:
+								packages.append(package_name)
+								valatask.set_run_after(task)
+							if package_dir not in vapi_dirs:
+								vapi_dirs.append(package_dir)
+				if hasattr(package_obj,'uselib_local'):
+					lst=self.to_list(package_obj.uselib_local)
+					lst.reverse()
+					local_packages=[pkg for pkg in lst if pkg not in seen]+local_packages
+		valatask.packages=packages
+		for vapi_dir in vapi_dirs:
+			try:
+				valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath())
+				valatask.vapi_dirs.append(self.path.find_dir(vapi_dir).abspath(self.env))
+			except AttributeError:
+				Params.warning("Unable to locate Vala API directory: '%s'"%vapi_dir)
+		if hasattr(self,'threading'):
+			valatask.threading=self.threading
+			self.uselib=self.to_list(self.uselib)
+			if not'GTHREAD'in self.uselib:
+				self.uselib.append('GTHREAD')
+		if hasattr(self,'target_glib'):
+			valatask.target_glib=self.target_glib
+	env=valatask.env
+	output_nodes=[]
+	c_node=node.change_ext('.c')
+	output_nodes.append(c_node)
+	self.allnodes.append(c_node)
+	output_nodes.append(node.change_ext('.h'))
+	if not'cprogram'in self.features:
+		output_nodes.append(self.path.find_or_declare('%s.vapi'%self.target))
+		if env['VALAC_VERSION']>(0,3,5):
+			output_nodes.append(self.path.find_or_declare('%s.gir'%self.target))
+		elif env['VALAC_VERSION']>(0,1,7):
+			output_nodes.append(self.path.find_or_declare('%s.gidl'%self.target))
+		if valatask.packages:
+			output_nodes.append(self.path.find_or_declare('%s.deps'%self.target))
+	valatask.inputs.append(node)
+	valatask.outputs.extend(output_nodes)
+def detect(conf):
+	min_version=(0,1,6)
+	min_version_str="%d.%d.%d"%min_version
+	valac=conf.find_program('valac',var='VALAC')
+	if not valac:
+		conf.fatal("valac not found")
+		return
+	if not conf.env["HAVE_GTHREAD"]:
+		conf.check_cfg(package='gthread-2.0',uselib_store='GTHREAD',args='--cflags --libs')
+	try:
+		output=Utils.cmd_output(valac+" --version",silent=True)
+		version=output.split(' ',1)[-1].strip().split(".")
+		version=[int(x)for x in version]
+		valac_version=tuple(version)
+	except Exception:
+		valac_version=(0,0,0)
+	conf.check_message('program version','valac >= '+min_version_str,valac_version>=min_version,"%d.%d.%d"%valac_version)
+	conf.check_tool('gnu_dirs')
+	if valac_version<min_version:
+		conf.fatal("valac version too old to be used with this tool")
+		return
+	conf.env['VALAC_VERSION']=valac_version
+	conf.env['VALAFLAGS']=''
+
+extension(EXT_VALA)(vala_file)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/winres.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/winres.py
new file mode 100644
index 0000000..70c3285
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Tools/winres.py
@@ -0,0 +1,40 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import os,sys,re
+import TaskGen,Task
+from Utils import quote_whitespace
+from TaskGen import extension
+EXT_WINRC=['.rc']
+winrc_str='${WINRC} ${_CPPDEFFLAGS} ${_CXXDEFFLAGS} ${_CCDEFFLAGS} ${WINRCFLAGS} ${_CPPINCFLAGS} ${_CXXINCFLAGS} ${_CCINCFLAGS} ${WINRC_TGT_F}${TGT} ${WINRC_SRC_F}${SRC}'
+def rc_file(self,node):
+	obj_ext='.rc.o'
+	if self.env['WINRC_TGT_F']=='/fo ':obj_ext='.res'
+	rctask=self.create_task('winrc')
+	rctask.set_inputs(node)
+	rctask.set_outputs(node.change_ext(obj_ext))
+	self.compiled_tasks.append(rctask)
+Task.simple_task_type('winrc',winrc_str,color='BLUE',before='cc cxx')
+def detect(conf):
+	v=conf.env
+	cc=os.path.basename(''.join(v['CC']).lower())
+	cxx=os.path.basename(''.join(v['CXX']).lower())
+	cc=re.sub('"','',cc)
+	cxx=re.sub('"','',cxx)
+	if cc in['gcc','cc','g++','c++']:
+		winrc=conf.find_program('windres',var='WINRC')
+		v['WINRC_TGT_F']='-o '
+		v['WINRC_SRC_F']='-i '
+	elif cc.startswith('cl.exe')or cxx.startswith('cl.exe'):
+		winrc=conf.find_program('RC',var='WINRC')
+		v['WINRC_TGT_F']='/fo '
+		v['WINRC_SRC_F']=' '
+	else:
+		return 0
+	if not winrc:
+		conf.fatal('winrc was not found!!')
+	else:
+		v['WINRC']=quote_whitespace(winrc)
+	v['WINRCFLAGS']=''
+
+extension(EXT_WINRC)(rc_file)
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Utils.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Utils.py
new file mode 100644
index 0000000..2c9d058
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/Utils.py
@@ -0,0 +1,278 @@
+#! /usr/bin/env python
+# encoding: utf-8
+import sys
+if sys.hexversion < 0x020400f0: from sets import Set as set
+import os,sys,imp,types,string,errno,traceback,inspect,re
+from UserDict import UserDict
+import Logs,pproc
+from Constants import*
+class WafError(Exception):
+	def __init__(self,*args):
+		self.args=args
+		self.stack=traceback.extract_stack()
+		Exception.__init__(self,*args)
+	def __str__(self):
+		return str(len(self.args)==1 and self.args[0]or self.args)
+class WscriptError(WafError):
+	def __init__(self,message,wscript_file=None):
+		if wscript_file:
+			self.wscript_file=wscript_file
+			self.wscript_line=None
+		else:
+			(self.wscript_file,self.wscript_line)=self.locate_error()
+		msg_file_line=''
+		if self.wscript_file:
+			msg_file_line="%s:"%self.wscript_file
+			if self.wscript_line:
+				msg_file_line+="%s:"%self.wscript_line
+		err_message="%s error: %s"%(msg_file_line,message)
+		WafError.__init__(self,err_message)
+	def locate_error(self):
+		stack=traceback.extract_stack()
+		stack.reverse()
+		for frame in stack:
+			file_name=os.path.basename(frame[0])
+			is_wscript=(file_name==WSCRIPT_FILE or file_name==WSCRIPT_BUILD_FILE)
+			if is_wscript:
+				return(frame[0],frame[1])
+		return(None,None)
+indicator=sys.platform=='win32'and'\x1b[A\x1b[K%s%s%s\r'or'\x1b[K%s%s%s\r'
+try:
+	from fnv import new as md5
+	import Constants
+	Constants.SIG_NIL='signofnv'
+	def h_file(filename):
+		m=md5()
+		try:
+			m.hfile(filename)
+			x=m.digest()
+			if x is None:raise OSError,"not a file"
+			return x
+		except SystemError:
+			raise OSError,"not a file"+filename
+except ImportError:
+	try:
+		from hashlib import md5
+	except ImportError:
+		from md5 import md5
+	def h_file(filename):
+		f=file(filename,'rb')
+		m=md5()
+		readBytes=100000
+		while(readBytes):
+			readString=f.read(readBytes)
+			m.update(readString)
+			readBytes=len(readString)
+		f.close()
+		return m.digest()
+class ordered_dict(UserDict):
+	def __init__(self,dict=None):
+		self.allkeys=[]
+		UserDict.__init__(self,dict)
+	def __delitem__(self,key):
+		self.allkeys.remove(key)
+		UserDict.__delitem__(self,key)
+	def __setitem__(self,key,item):
+		if key not in self.allkeys:self.allkeys.append(key)
+		UserDict.__setitem__(self,key,item)
+def exec_command(s,shell=1,log=None):
+	proc=pproc.Popen(s,shell=shell,stdout=log,stderr=log)
+	return proc.wait()
+if sys.platform=="win32":
+	old_log=exec_command
+	def exec_command(s,shell=1,log=None):
+		if len(s)<2000:return old_log(s,shell=shell,log=log)
+		startupinfo=pproc.STARTUPINFO()
+		startupinfo.dwFlags|=pproc.STARTF_USESHOWWINDOW
+		proc=pproc.Popen(s,shell=False,startupinfo=startupinfo)
+		return proc.wait()
+listdir=os.listdir
+if sys.platform=="win32":
+	def listdir_win32(s):
+		if re.match('^[A-Z]:$',s):
+			s+=os.sep
+		if not os.path.isdir(s):
+			e=OSError()
+			e.errno=errno.ENOENT
+			raise e
+		return os.listdir(s)
+	listdir=listdir_win32
+def waf_version(mini=0x010000,maxi=0x100000):
+	ver=HEXVERSION
+	try:min_val=mini+0
+	except TypeError:min_val=int(mini.replace('.','0'),16)
+	if min_val>ver:
+		Logs.error("waf version should be at least %s (%s found)"%(mini,ver))
+		sys.exit(0)
+	try:max_val=maxi+0
+	except TypeError:max_val=int(maxi.replace('.','0'),16)
+	if max_val<ver:
+		Logs.error("waf version should be at most %s (%s found)"%(maxi,ver))
+		sys.exit(0)
+def python_24_guard():
+	if sys.hexversion<0x20400f0:
+		raise ImportError,"Waf requires Python >= 2.3 but the raw source requires Python 2.4"
+def ex_stack():
+	exc_type,exc_value,tb=sys.exc_info()
+	exc_lines=traceback.format_exception(exc_type,exc_value,tb)
+	return''.join(exc_lines)
+def to_list(sth):
+	if type(sth)is types.ListType:
+		return sth
+	else:
+		return sth.split()
+g_loaded_modules={}
+g_module=None
+def load_module(file_path,name=WSCRIPT_FILE):
+	try:
+		return g_loaded_modules[file_path]
+	except KeyError:
+		pass
+	module=imp.new_module(name)
+	try:
+		file=open(file_path,'r')
+	except(IOError,OSError):
+		raise WscriptError('The file %s could not be opened!'%file_path)
+	module_dir=os.path.dirname(file_path)
+	sys.path.insert(0,module_dir)
+	exec file in module.__dict__
+	sys.path.remove(module_dir)
+	if file:file.close()
+	g_loaded_modules[file_path]=module
+	return module
+def set_main_module(file_path):
+	global g_module
+	g_module=load_module(file_path,'wscript_main')
+def to_hashtable(s):
+	tbl={}
+	lst=s.split('\n')
+	for line in lst:
+		if not line:continue
+		mems=line.split('=')
+		tbl[mems[0]]=mems[1]
+	return tbl
+def get_term_cols():
+	return 80
+try:
+	import struct,fcntl,termios
+except ImportError:
+	pass
+else:
+	if sys.stdout.isatty():
+		def myfun():
+			dummy_lines,cols=struct.unpack("HHHH",fcntl.ioctl(sys.stdout.fileno(),termios.TIOCGWINSZ,struct.pack("HHHH",0,0,0,0)))[:2]
+			return cols
+		try:
+			myfun()
+		except IOError:
+			pass
+		else:
+			get_term_cols=myfun
+rot_idx=0
+rot_chr=['\\','|','/','-']
+def split_path(path):
+	if not path:return['']
+	return path.split('/')
+if sys.platform=='win32':
+	def split_path(path):
+		h,t=os.path.splitunc(path)
+		if not h:return __split_dirs(t)
+		return[h]+__split_dirs(t)[1:]
+	def __split_dirs(path):
+		h,t=os.path.split(path)
+		if not h:return[t]
+		if h==path:return[h.replace('\\','')]
+		if not t:return __split_dirs(h)
+		else:return __split_dirs(h)+[t]
+def copy_attrs(orig,dest,names,only_if_set=False):
+	for a in to_list(names):
+		u=getattr(orig,a,())
+		if u or not only_if_set:
+			setattr(dest,a,u)
+def def_attrs(self,**kw):
+	for k,v in kw.iteritems():
+		try:
+			getattr(self,k)
+		except AttributeError:
+			setattr(self,k,v)
+quote_define_name_table=None
+def quote_define_name(path):
+	global quote_define_name_table
+	if not quote_define_name_table:
+		invalid_chars=set([chr(x)for x in xrange(256)])-set(string.digits+string.uppercase)
+		quote_define_name_table=string.maketrans(''.join(invalid_chars),'_'*len(invalid_chars))
+	return string.translate(string.upper(path),quote_define_name_table)
+def quote_whitespace(path):
+	return(path.strip().find(' ')>0 and'"%s"'%path or path).replace('""','"')
+def trimquotes(s):
+	if not s:return''
+	s=s.rstrip()
+	if s[0]=="'"and s[-1]=="'":return s[1:-1]
+	return s
+def h_list(lst):
+	m=md5()
+	m.update(str(lst))
+	return m.digest()
+def h_fun(fun):
+	try:
+		return fun.code
+	except AttributeError:
+		try:
+			h=inspect.getsource(fun)
+		except IOError:
+			h="nocode"
+		try:
+			fun.code=h
+		except AttributeError:
+			pass
+		return h
+_hash_blacklist_types=(types.BuiltinFunctionType,types.ModuleType,types.FunctionType,types.ClassType,types.TypeType,types.NoneType,)
+def hash_function_with_globals(prevhash,func):
+	assert type(func)is types.FunctionType
+	for name,value in func.func_globals.iteritems():
+		if type(value)in _hash_blacklist_types:
+			continue
+		if isinstance(value,type):
+			continue
+		try:
+			prevhash=hash((prevhash,name,value))
+		except TypeError:
+			pass
+	return hash((prevhash,inspect.getsource(func)))
+def pprint(col,str,label=''):
+	print"%s%s%s %s"%(Logs.colors(col),str,Logs.colors.NORMAL,label)
+def check_dir(dir):
+	try:
+		os.stat(dir)
+	except OSError:
+		try:
+			os.makedirs(dir)
+		except OSError,e:
+			raise WafError("Cannot create folder '%s' (original error: %s)"%(dir,e))
+def cmd_output(cmd,e=None,silent=False):
+	p=pproc.Popen(cmd,stdout=pproc.PIPE,shell=True,env=e)
+	output=p.communicate()[0]
+	if p.returncode:
+		if not silent:
+			msg="command execution failed: %s -> %r"%(cmd,str(output))
+			raise ValueError,msg
+		output=''
+	return output
+reg_subst=re.compile(r"(\\\\)|(\\\$)|\$\{([^}]+)\}")
+def subst_vars(expr,params):
+	def repl_var(m):
+		if m.group(1):
+			return'\\'
+		if m.group(2):
+			return'$'
+		return params[m.group(3)]
+	return reg_subst.sub(repl_var,expr)
+def detect_platform():
+	s=sys.platform
+	for x in'cygwin linux irix sunos hpux aix darwin'.split():
+		if s.find(x)>=0:
+			return x
+	if os.name in'posix java os2'.split():
+		return os.name
+	return s
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/__init__.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/__init__.py
new file mode 100644
index 0000000..cbc8406
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/__init__.py
@@ -0,0 +1,4 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+
diff --git a/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/pproc.py b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/pproc.py
new file mode 100644
index 0000000..67b39f9
--- /dev/null
+++ b/.waf-1.5.0-8e39a4c1c16303c1e8f010bf330305f6/wafadmin/pproc.py
@@ -0,0 +1,496 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+import sys
+mswindows=(sys.platform=="win32")
+import os
+import types
+import traceback
+import gc
+class CalledProcessError(Exception):
+	def __init__(self,returncode,cmd):
+		self.returncode=returncode
+		self.cmd=cmd
+	def __str__(self):
+		return"Command '%s' returned non-zero exit status %d"%(self.cmd,self.returncode)
+if mswindows:
+	import threading
+	import msvcrt
+	if 0:
+		import pywintypes
+		from win32api import GetStdHandle,STD_INPUT_HANDLE,STD_OUTPUT_HANDLE,STD_ERROR_HANDLE
+		from win32api import GetCurrentProcess,DuplicateHandle,GetModuleFileName,GetVersion
+		from win32con import DUPLICATE_SAME_ACCESS,SW_HIDE
+		from win32pipe import CreatePipe
+		from win32process import CreateProcess,STARTUPINFO,GetExitCodeProcess,STARTF_USESTDHANDLES,STARTF_USESHOWWINDOW,CREATE_NEW_CONSOLE
+		from win32event import WaitForSingleObject,INFINITE,WAIT_OBJECT_0
+	else:
+		from _subprocess import*
+		class STARTUPINFO:
+			dwFlags=0
+			hStdInput=None
+			hStdOutput=None
+			hStdError=None
+			wShowWindow=0
+		class pywintypes:
+			error=IOError
+else:
+	import select
+	import errno
+	import fcntl
+	import pickle
+__all__=["Popen","PIPE","STDOUT","call","check_call","CalledProcessError"]
+try:
+	MAXFD=os.sysconf("SC_OPEN_MAX")
+except:
+	MAXFD=256
+try:
+	False
+except NameError:
+	False=0
+	True=1
+_active=[]
+def _cleanup():
+	for inst in _active[:]:
+		if inst.poll(_deadstate=sys.maxint)>=0:
+			try:
+				_active.remove(inst)
+			except ValueError:
+				pass
+PIPE=-1
+STDOUT=-2
+def call(*popenargs,**kwargs):
+	return Popen(*popenargs,**kwargs).wait()
+def check_call(*popenargs,**kwargs):
+	retcode=call(*popenargs,**kwargs)
+	cmd=kwargs.get("args")
+	if cmd is None:
+		cmd=popenargs[0]
+	if retcode:
+		raise CalledProcessError(retcode,cmd)
+	return retcode
+def list2cmdline(seq):
+	result=[]
+	needquote=False
+	for arg in seq:
+		bs_buf=[]
+		if result:
+			result.append(' ')
+		needquote=(" "in arg)or("\t"in arg)or arg==""
+		if needquote:
+			result.append('"')
+		for c in arg:
+			if c=='\\':
+				bs_buf.append(c)
+			elif c=='"':
+				result.append('\\'*len(bs_buf)*2)
+				bs_buf=[]
+				result.append('\\"')
+			else:
+				if bs_buf:
+					result.extend(bs_buf)
+					bs_buf=[]
+				result.append(c)
+		if bs_buf:
+			result.extend(bs_buf)
+		if needquote:
+			result.extend(bs_buf)
+			result.append('"')
+	return''.join(result)
+class Popen(object):
+	def __init__(self,args,bufsize=0,executable=None,stdin=None,stdout=None,stderr=None,preexec_fn=None,close_fds=False,shell=False,cwd=None,env=None,universal_newlines=False,startupinfo=None,creationflags=0):
+		_cleanup()
+		self._child_created=False
+		if not isinstance(bufsize,(int,long)):
+			raise TypeError("bufsize must be an integer")
+		if mswindows:
+			if preexec_fn is not None:
+				raise ValueError("preexec_fn is not supported on Windows platforms")
+			if close_fds:
+				raise ValueError("close_fds is not supported on Windows platforms")
+		else:
+			if startupinfo is not None:
+				raise ValueError("startupinfo is only supported on Windows platforms")
+			if creationflags!=0:
+				raise ValueError("creationflags is only supported on Windows platforms")
+		self.stdin=None
+		self.stdout=None
+		self.stderr=None
+		self.pid=None
+		self.returncode=None
+		self.universal_newlines=universal_newlines
+		(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)=self._get_handles(stdin,stdout,stderr)
+		self._execute_child(args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)
+		if mswindows:
+			if stdin is None and p2cwrite is not None:
+				os.close(p2cwrite)
+				p2cwrite=None
+			if stdout is None and c2pread is not None:
+				os.close(c2pread)
+				c2pread=None
+			if stderr is None and errread is not None:
+				os.close(errread)
+				errread=None
+		if p2cwrite:
+			self.stdin=os.fdopen(p2cwrite,'wb',bufsize)
+		if c2pread:
+			if universal_newlines:
+				self.stdout=os.fdopen(c2pread,'rU',bufsize)
+			else:
+				self.stdout=os.fdopen(c2pread,'rb',bufsize)
+		if errread:
+			if universal_newlines:
+				self.stderr=os.fdopen(errread,'rU',bufsize)
+			else:
+				self.stderr=os.fdopen(errread,'rb',bufsize)
+	def _translate_newlines(self,data):
+		data=data.replace("\r\n","\n")
+		data=data.replace("\r","\n")
+		return data
+	def __del__(self,sys=sys):
+		if not self._child_created:
+			return
+		self.poll(_deadstate=sys.maxint)
+		if self.returncode is None and _active is not None:
+			_active.append(self)
+	def communicate(self,input=None):
+		if[self.stdin,self.stdout,self.stderr].count(None)>=2:
+			stdout=None
+			stderr=None
+			if self.stdin:
+				if input:
+					self.stdin.write(input)
+				self.stdin.close()
+			elif self.stdout:
+				stdout=self.stdout.read()
+			elif self.stderr:
+				stderr=self.stderr.read()
+			self.wait()
+			return(stdout,stderr)
+		return self._communicate(input)
+	if mswindows:
+		def _get_handles(self,stdin,stdout,stderr):
+			if stdin is None and stdout is None and stderr is None:
+				return(None,None,None,None,None,None)
+			p2cread,p2cwrite=None,None
+			c2pread,c2pwrite=None,None
+			errread,errwrite=None,None
+			if stdin is None:
+				p2cread=GetStdHandle(STD_INPUT_HANDLE)
+			if p2cread is not None:
+				pass
+			elif stdin is None or stdin==PIPE:
+				p2cread,p2cwrite=CreatePipe(None,0)
+				p2cwrite=p2cwrite.Detach()
+				p2cwrite=msvcrt.open_osfhandle(p2cwrite,0)
+			elif isinstance(stdin,int):
+				p2cread=msvcrt.get_osfhandle(stdin)
+			else:
+				p2cread=msvcrt.get_osfhandle(stdin.fileno())
+			p2cread=self._make_inheritable(p2cread)
+			if stdout is None:
+				c2pwrite=GetStdHandle(STD_OUTPUT_HANDLE)
+			if c2pwrite is not None:
+				pass
+			elif stdout is None or stdout==PIPE:
+				c2pread,c2pwrite=CreatePipe(None,0)
+				c2pread=c2pread.Detach()
+				c2pread=msvcrt.open_osfhandle(c2pread,0)
+			elif isinstance(stdout,int):
+				c2pwrite=msvcrt.get_osfhandle(stdout)
+			else:
+				c2pwrite=msvcrt.get_osfhandle(stdout.fileno())
+			c2pwrite=self._make_inheritable(c2pwrite)
+			if stderr is None:
+				errwrite=GetStdHandle(STD_ERROR_HANDLE)
+			if errwrite is not None:
+				pass
+			elif stderr is None or stderr==PIPE:
+				errread,errwrite=CreatePipe(None,0)
+				errread=errread.Detach()
+				errread=msvcrt.open_osfhandle(errread,0)
+			elif stderr==STDOUT:
+				errwrite=c2pwrite
+			elif isinstance(stderr,int):
+				errwrite=msvcrt.get_osfhandle(stderr)
+			else:
+				errwrite=msvcrt.get_osfhandle(stderr.fileno())
+			errwrite=self._make_inheritable(errwrite)
+			return(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)
+		def _make_inheritable(self,handle):
+			return DuplicateHandle(GetCurrentProcess(),handle,GetCurrentProcess(),0,1,DUPLICATE_SAME_ACCESS)
+		def _find_w9xpopen(self):
+			w9xpopen=os.path.join(os.path.dirname(GetModuleFileName(0)),"w9xpopen.exe")
+			if not os.path.exists(w9xpopen):
+				w9xpopen=os.path.join(os.path.dirname(sys.exec_prefix),"w9xpopen.exe")
+				if not os.path.exists(w9xpopen):
+					raise RuntimeError("Cannot locate w9xpopen.exe, which is needed for Popen to work with your shell or platform.")
+			return w9xpopen
+		def _execute_child(self,args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite):
+			if not isinstance(args,types.StringTypes):
+				args=list2cmdline(args)
+			if startupinfo is None:
+				startupinfo=STARTUPINFO()
+			if None not in(p2cread,c2pwrite,errwrite):
+				startupinfo.dwFlags|=STARTF_USESTDHANDLES
+				startupinfo.hStdInput=p2cread
+				startupinfo.hStdOutput=c2pwrite
+				startupinfo.hStdError=errwrite
+			if shell:
+				startupinfo.dwFlags|=STARTF_USESHOWWINDOW
+				startupinfo.wShowWindow=SW_HIDE
+				comspec=os.environ.get("COMSPEC","cmd.exe")
+				args=comspec+" /c "+args
+				if(GetVersion()>=0x80000000L or os.path.basename(comspec).lower()=="command.com"):
+					w9xpopen=self._find_w9xpopen()
+					args='"%s" %s'%(w9xpopen,args)
+					creationflags|=CREATE_NEW_CONSOLE
+			try:
+				hp,ht,pid,tid=CreateProcess(executable,args,None,None,1,creationflags,env,cwd,startupinfo)
+			except pywintypes.error,e:
+				raise WindowsError(*e.args)
+			self._child_created=True
+			self._handle=hp
+			self.pid=pid
+			ht.Close()
+			if p2cread is not None:
+				p2cread.Close()
+			if c2pwrite is not None:
+				c2pwrite.Close()
+			if errwrite is not None:
+				errwrite.Close()
+		def poll(self,_deadstate=None):
+			if self.returncode is None:
+				if WaitForSingleObject(self._handle,0)==WAIT_OBJECT_0:
+					self.returncode=GetExitCodeProcess(self._handle)
+			return self.returncode
+		def wait(self):
+			if self.returncode is None:
+				obj=WaitForSingleObject(self._handle,INFINITE)
+				self.returncode=GetExitCodeProcess(self._handle)
+			return self.returncode
+		def _readerthread(self,fh,buffer):
+			buffer.append(fh.read())
+		def _communicate(self,input):
+			stdout=None
+			stderr=None
+			if self.stdout:
+				stdout=[]
+				stdout_thread=threading.Thread(target=self._readerthread,args=(self.stdout,stdout))
+				stdout_thread.setDaemon(True)
+				stdout_thread.start()
+			if self.stderr:
+				stderr=[]
+				stderr_thread=threading.Thread(target=self._readerthread,args=(self.stderr,stderr))
+				stderr_thread.setDaemon(True)
+				stderr_thread.start()
+			if self.stdin:
+				if input is not None:
+					self.stdin.write(input)
+				self.stdin.close()
+			if self.stdout:
+				stdout_thread.join()
+			if self.stderr:
+				stderr_thread.join()
+			if stdout is not None:
+				stdout=stdout[0]
+			if stderr is not None:
+				stderr=stderr[0]
+			if self.universal_newlines and hasattr(file,'newlines'):
+				if stdout:
+					stdout=self._translate_newlines(stdout)
+				if stderr:
+					stderr=self._translate_newlines(stderr)
+			self.wait()
+			return(stdout,stderr)
+	else:
+		def _get_handles(self,stdin,stdout,stderr):
+			p2cread,p2cwrite=None,None
+			c2pread,c2pwrite=None,None
+			errread,errwrite=None,None
+			if stdin is None:
+				pass
+			elif stdin==PIPE:
+				p2cread,p2cwrite=os.pipe()
+			elif isinstance(stdin,int):
+				p2cread=stdin
+			else:
+				p2cread=stdin.fileno()
+			if stdout is None:
+				pass
+			elif stdout==PIPE:
+				c2pread,c2pwrite=os.pipe()
+			elif isinstance(stdout,int):
+				c2pwrite=stdout
+			else:
+				c2pwrite=stdout.fileno()
+			if stderr is None:
+				pass
+			elif stderr==PIPE:
+				errread,errwrite=os.pipe()
+			elif stderr==STDOUT:
+				errwrite=c2pwrite
+			elif isinstance(stderr,int):
+				errwrite=stderr
+			else:
+				errwrite=stderr.fileno()
+			return(p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite)
+		def _set_cloexec_flag(self,fd):
+			try:
+				cloexec_flag=fcntl.FD_CLOEXEC
+			except AttributeError:
+				cloexec_flag=1
+			old=fcntl.fcntl(fd,fcntl.F_GETFD)
+			fcntl.fcntl(fd,fcntl.F_SETFD,old|cloexec_flag)
+		def _close_fds(self,but):
+			for i in xrange(3,MAXFD):
+				if i==but:
+					continue
+				try:
+					os.close(i)
+				except:
+					pass
+		def _execute_child(self,args,executable,preexec_fn,close_fds,cwd,env,universal_newlines,startupinfo,creationflags,shell,p2cread,p2cwrite,c2pread,c2pwrite,errread,errwrite):
+			if isinstance(args,types.StringTypes):
+				args=[args]
+			else:
+				args=list(args)
+			if shell:
+				args=["/bin/sh","-c"]+args
+			if executable is None:
+				executable=args[0]
+			errpipe_read,errpipe_write=os.pipe()
+			self._set_cloexec_flag(errpipe_write)
+			gc_was_enabled=gc.isenabled()
+			gc.disable()
+			try:
+				self.pid=os.fork()
+			except:
+				if gc_was_enabled:
+					gc.enable()
+				raise
+			self._child_created=True
+			if self.pid==0:
+				try:
+					if p2cwrite:
+						os.close(p2cwrite)
+					if c2pread:
+						os.close(c2pread)
+					if errread:
+						os.close(errread)
+					os.close(errpipe_read)
+					if p2cread:
+						os.dup2(p2cread,0)
+					if c2pwrite:
+						os.dup2(c2pwrite,1)
+					if errwrite:
+						os.dup2(errwrite,2)
+					if p2cread and p2cread not in(0,):
+						os.close(p2cread)
+					if c2pwrite and c2pwrite not in(p2cread,1):
+						os.close(c2pwrite)
+					if errwrite and errwrite not in(p2cread,c2pwrite,2):
+						os.close(errwrite)
+					if close_fds:
+						self._close_fds(but=errpipe_write)
+					if cwd is not None:
+						os.chdir(cwd)
+					if preexec_fn:
+						apply(preexec_fn)
+					if env is None:
+						os.execvp(executable,args)
+					else:
+						os.execvpe(executable,args,env)
+				except:
+					exc_type,exc_value,tb=sys.exc_info()
+					exc_lines=traceback.format_exception(exc_type,exc_value,tb)
+					exc_value.child_traceback=''.join(exc_lines)
+					os.write(errpipe_write,pickle.dumps(exc_value))
+				os._exit(255)
+			if gc_was_enabled:
+				gc.enable()
+			os.close(errpipe_write)
+			if p2cread and p2cwrite:
+				os.close(p2cread)
+			if c2pwrite and c2pread:
+				os.close(c2pwrite)
+			if errwrite and errread:
+				os.close(errwrite)
+			data=os.read(errpipe_read,1048576)
+			os.close(errpipe_read)
+			if data!="":
+				os.waitpid(self.pid,0)
+				child_exception=pickle.loads(data)
+				raise child_exception
+		def _handle_exitstatus(self,sts):
+			if os.WIFSIGNALED(sts):
+				self.returncode=-os.WTERMSIG(sts)
+			elif os.WIFEXITED(sts):
+				self.returncode=os.WEXITSTATUS(sts)
+			else:
+				raise RuntimeError("Unknown child exit status!")
+		def poll(self,_deadstate=None):
+			if self.returncode is None:
+				try:
+					pid,sts=os.waitpid(self.pid,os.WNOHANG)
+					if pid==self.pid:
+						self._handle_exitstatus(sts)
+				except os.error:
+					if _deadstate is not None:
+						self.returncode=_deadstate
+			return self.returncode
+		def wait(self):
+			if self.returncode is None:
+				pid,sts=os.waitpid(self.pid,0)
+				self._handle_exitstatus(sts)
+			return self.returncode
+		def _communicate(self,input):
+			read_set=[]
+			write_set=[]
+			stdout=None
+			stderr=None
+			if self.stdin:
+				self.stdin.flush()
+				if input:
+					write_set.append(self.stdin)
+				else:
+					self.stdin.close()
+			if self.stdout:
+				read_set.append(self.stdout)
+				stdout=[]
+			if self.stderr:
+				read_set.append(self.stderr)
+				stderr=[]
+			input_offset=0
+			while read_set or write_set:
+				rlist,wlist,xlist=select.select(read_set,write_set,[])
+				if self.stdin in wlist:
+					bytes_written=os.write(self.stdin.fileno(),buffer(input,input_offset,512))
+					input_offset+=bytes_written
+					if input_offset>=len(input):
+						self.stdin.close()
+						write_set.remove(self.stdin)
+				if self.stdout in rlist:
+					data=os.read(self.stdout.fileno(),1024)
+					if data=="":
+						self.stdout.close()
+						read_set.remove(self.stdout)
+					stdout.append(data)
+				if self.stderr in rlist:
+					data=os.read(self.stderr.fileno(),1024)
+					if data=="":
+						self.stderr.close()
+						read_set.remove(self.stderr)
+					stderr.append(data)
+			if stdout is not None:
+				stdout=''.join(stdout)
+			if stderr is not None:
+				stderr=''.join(stderr)
+			if self.universal_newlines and hasattr(file,'newlines'):
+				if stdout:
+					stdout=self._translate_newlines(stdout)
+				if stderr:
+					stderr=self._translate_newlines(stderr)
+			self.wait()
+			return(stdout,stderr)
+
diff --git a/ChangeLog b/ChangeLog
index e3fa565..91292e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -19,230 +19,194 @@ Romain Moret
 Florian Faber
 Michael Voigt
 Torben Hohn  
-Paul Davis
-Peter L Jones
-Devin Anderson
-Josh Green
+Paul Davis
+Peter L Jones
+Devin Anderson
+Josh Green
 Mario Lang
-Arnold Krille
 
 ---------------------------
   Jackdmp changes log
----------------------------
-
-2010-03-26 Stephane Letz  <letz at grame.fr>
-
-	* ffado-portname-sync.patch from ticket #163 applied.
-
-2010-03-24 Stephane Letz  <letz at grame.fr>
-
-	* On Windows, now use TRE library for regexp (BSD license instead of GPL license).
+---------------------------
 
-2010-03-19 Stephane Letz  <letz at grame.fr>
-
-	* Fix some file header to have library side code use LGPL.
-	* Apply srcfactor.diff patch for ticket #162.
-
-2010-03-06 Stephane Letz  <letz at grame.fr>
-
-	* Arnold Krille firewire patch.
-	* Raise JACK_DRIVER_PARAM_STRING_MAX and JACK_PARAM_STRING_MAX to 127 otherwise some audio drivers cannot be loaded on OSX.
-
-2010-03-04 Stephane Letz  <letz at grame.fr>
-
-	* Correct JackMachServerChannel::Execute : keep running even in error cases.
-	* Raise JACK_PROTOCOL_VERSION number.
-
-2010-03-03 Stephane Letz  <letz at grame.fr>
-
-	* Correct JackGraphManager::DeactivatePort.
-
-2010-03-02 Stephane Letz  <letz at grame.fr>
-
-	* Improve JackCoreAudioDriver and JackCoreAudioAdapter : when no devices are described, takes default input and output and aggregate them.
-
-2010-02-15 Stephane Letz  <letz at grame.fr>
-
-	* Version 1.9.6 started.
-
 2010-01-29 Gabriel M. Beddingfield <gabriel at teuton.org>
 
-	* Change JackEngineProfiling and JackAudioAdapterInterface gnuplot scripts to output SVG instead of PDF.
-
+	* Change JackEngineProfiling and JackAudioAdapterInterface gnuplot scripts to output SVG instead of PDF.
+
 2009-12-15 Stephane Letz  <letz at grame.fr>
 
-	* Shared memory manager was calling abort in case of fatal error, now return an error in caller.
-
+	* Shared memory manager was calling abort in case of fatal error, now return an error in caller.
+
 2009-12-13 Stephane Letz  <letz at grame.fr>
 
-	* Mario Lang alsa_io time calculation overflow patch.
-
+	* Mario Lang alsa_io time calculation overflow patch.
+
 2009-12-10 Stephane Letz  <letz at grame.fr>
 
-	* Use a QUIT notification to properly quit the server channel, the server channel thread can then be 'stopped' instead of 'canceled'.
-
+	* Use a QUIT notification to properly quit the server channel, the server channel thread can then be 'stopped' instead of 'canceled'.
+
 2009-12-09 Stephane Letz  <letz at grame.fr>
 
-	* When threads are cancelled, the exception has to be rethrown. 
-
+	* When threads are cancelled, the exception has to be rethrown. 
+
 2009-12-08 Stephane Letz  <letz at grame.fr>
 
-	* Josh Green ALSA driver capture only patch.  
-
+	* Josh Green ALSA driver capture only patch.  
+
 2009-12-03 Stephane Letz  <letz at grame.fr>
 
-	* Fix JackCoreMidiDriver::ReadProcAux when ring buffer is full (thanks Devin Anderson).  
-
+	* Fix JackCoreMidiDriver::ReadProcAux when ring buffer is full (thanks Devin Anderson).  
+
 2009-12-02 Stephane Letz  <letz at grame.fr>
 
-	* Special code in JackCoreAudio driver to handle completely buggy Digidesign CoreAudio user-land driver. 
-	* Ensure that client-side message buffer thread calls thread_init callback if/when it is set by the client (backport of JACK1 rev 3838).
-	* Check dynamic port-max value.
-
+	* Special code in JackCoreAudio driver to handle completely buggy Digidesign CoreAudio user-land driver. 
+	* Ensure that client-side message buffer thread calls thread_init callback if/when it is set by the client (backport of JACK1 rev 3838).
+	* Check dynamic port-max value.
+
 2009-12-01 Stephane Letz  <letz at grame.fr>
 
-	* Fix port_rename callback : now both old name and new name are given as parameters.
-
+	* Fix port_rename callback : now both old name and new name are given as parameters.
+
 2009-11-30 Stephane Letz  <letz at grame.fr>
 
-	* Devin Anderson patch for Jack FFADO driver issues with lost MIDI bytes between periods (and more). 
-
+	* Devin Anderson patch for Jack FFADO driver issues with lost MIDI bytes between periods (and more). 
+
 2009-11-29 Stephane Letz  <letz at grame.fr>
 
-	* More robust sample rate change handling code in JackCoreAudioDriver.
-
+	* More robust sample rate change handling code in JackCoreAudioDriver.
+
 2009-11-24 Stephane Letz  <letz at grame.fr>
 
-	* Dynamic choice of maximum port number.
-
+	* Dynamic choice of maximum port number.
+
 2009-11-23 Stephane Letz  <letz at grame.fr>
 
-	* Peter L Jones patch for NetJack1 compilation on Windows.
-
+	* Peter L Jones patch for NetJack1 compilation on Windows.
+
 2009-11-20 Stephane Letz  <letz at grame.fr>
 
-	* Version 1.9.5 started.
-	* Client debugging code improved.
-
+	* Version 1.9.5 started.
+	* Client debugging code improved.
+
 2009-11-18 Stephane Letz  <letz at grame.fr>
 
-	* Sync JackCoreAudioAdapter code with JackCoreAudioDriver.
-
+	* Sync JackCoreAudioAdapter code with JackCoreAudioDriver.
+
 2009-11-17 Stephane Letz  <letz at grame.fr>
 
-	* In JackCoreAudio driver, clock drift compensation in aggregated devices working.
-	* In JackCoreAudio driver, clock drift compensation semantic changed a bit : when on, does not activate if not needed (same clock domain).
-
+	* In JackCoreAudio driver, clock drift compensation in aggregated devices working.
+	* In JackCoreAudio driver, clock drift compensation semantic changed a bit : when on, does not activate if not needed (same clock domain).
+
 2009-11-16 Stephane Letz  <letz at grame.fr>
 
-	* In JackCoreAudio driver, (possibly) clock drift compensation when needed in aggregated devices.
-
+	* In JackCoreAudio driver, (possibly) clock drift compensation when needed in aggregated devices.
+
 2009-11-14 Stephane Letz  <letz at grame.fr>
 
-	* Sync with JACK1 : -r parameter now used for no-realtime, realtime (-R) is now default, usable backend given vie platform.
-
+	* Sync with JACK1 : -r parameter now used for no-realtime, realtime (-R) is now default, usable backend given vie platform.
+
 2009-11-13 Stephane Letz  <letz at grame.fr>
 
-	* Better memory allocation error checking in ringbuffer.c, weak import improvements.
-	* Memory allocation error checking for jack_client_new and jack_client_open (server and client side).
-	* Memory allocation error checking in server for RPC.
-	* Simplify server temporary mode : now use a JackTemporaryException.
-	* Lock/Unlock shared memory segments (to test...).
-
+	* Better memory allocation error checking in ringbuffer.c, weak import improvements.
+	* Memory allocation error checking for jack_client_new and jack_client_open (server and client side).
+	* Memory allocation error checking in server for RPC.
+	* Simplify server temporary mode : now use a JackTemporaryException.
+	* Lock/Unlock shared memory segments (to test...).
+
 2009-11-12 Stephane Letz  <letz at grame.fr>
 
-	* Better memory allocation error checking on client (library) side. 
-
+	* Better memory allocation error checking on client (library) side. 
+
 2009-11-11 Stephane Letz  <letz at grame.fr>
 
-	* Correct JackCoreAudio driver when empty strings are given as -C, -P or -d parameter. 
-
+	* Correct JackCoreAudio driver when empty strings are given as -C, -P or -d parameter. 
+
 2009-11-10 Stephane Letz  <letz at grame.fr>
 
-	* Correct JackInfoShutdownCallback prototype, two new JackClientProcessFailure and JackClientZombie JackStatus code.  
-
+	* Correct JackInfoShutdownCallback prototype, two new JackClientProcessFailure and JackClientZombie JackStatus code.  
+
 2009-11-09 Stephane Letz  <letz at grame.fr>
 
-	* Correct JackGraphManager::GetBuffer for the "client loop with one connection" case : buffer must be copied.
-
+	* Correct JackGraphManager::GetBuffer for the "client loop with one connection" case : buffer must be copied.
+
 2009-11-07 Stephane Letz  <letz at grame.fr>
 
-	* Fix AcquireRealTime and DropRealTime: now distinguish when called from another thread (AcquireRealTime/DropRealTime) and from the thread itself (AcquireSelfRealTime/DropSelfRealTime).
-	* Correct JackPosixThread::StartImp : thread priority setting now done in the RT case only.
-
+	* Fix AcquireRealTime and DropRealTime: now distinguish when called from another thread (AcquireRealTime/DropRealTime) and from the thread itself (AcquireSelfRealTime/DropSelfRealTime).
+	* Correct JackPosixThread::StartImp : thread priority setting now done in the RT case only.
+
 2009-11-06 Stephane Letz  <letz at grame.fr>
 
-	* Correctly save and restore RT mode state in freewheel mode.
-	* Correct freewheel code on client side.
-
+	* Correctly save and restore RT mode state in freewheel mode.
+	* Correct freewheel code on client side.
+
 2009-11-05 Stephane Letz  <letz at grame.fr>
 
-	* No reason to make jack_on_shutdown deprecated, so revert the incorrect change.
-	* Thread AcquireRealTime and DropRealTime were (incorrectly) using fThread field. Use pthread_self()) (or GetCurrentThread() on Windows) to get the calling thread.
-
+	* No reason to make jack_on_shutdown deprecated, so revert the incorrect change.
+	* Thread AcquireRealTime and DropRealTime were (incorrectly) using fThread field. Use pthread_self()) (or GetCurrentThread() on Windows) to get the calling thread.
+
 2009-10-30 Stephane Letz  <letz at grame.fr>
 
-	* In JackCoreAudioDriver, improve management of input/output channels: -1 is now used internally to indicate a wanted max value. 
-	* In JackCoreAudioDriver::OpenAUHAL, correct stream format setup and cleanup. 
-	* Correct crash bug in JackAudioAdapterInterface when not input is used in adapter (temporary fix...)
-	* Sync JackCoreAudioAdapter code on JackCoreAudioDriver one.
-	* JACK_SCHED_POLICY switched to SCHED_FIFO.
-	* Now can aggregate device that are themselves AD.
-
+	* In JackCoreAudioDriver, improve management of input/output channels: -1 is now used internally to indicate a wanted max value. 
+	* In JackCoreAudioDriver::OpenAUHAL, correct stream format setup and cleanup. 
+	* Correct crash bug in JackAudioAdapterInterface when not input is used in adapter (temporary fix...)
+	* Sync JackCoreAudioAdapter code on JackCoreAudioDriver one.
+	* JACK_SCHED_POLICY switched to SCHED_FIFO.
+	* Now can aggregate device that are themselves AD.
+
 2009-10-29 Stephane Letz  <letz at grame.fr>
 
-	* In JackCoreAudioDriver::Start, wait for the audio driver to effectively start (use the MeasureCallback).
-
+	* In JackCoreAudioDriver::Start, wait for the audio driver to effectively start (use the MeasureCallback).
+
 2009-10-28 Stephane Letz  <letz at grame.fr>
 
-	* In JackCoreAudioDriver, force the SR value to the wanted one *before* creating aggregate device (otherwise creation will fail). 
-	* In JackCoreAudioDriver, better cleanup of AD when intermediate open failure.
-
+	* In JackCoreAudioDriver, force the SR value to the wanted one *before* creating aggregate device (otherwise creation will fail). 
+	* In JackCoreAudioDriver, better cleanup of AD when intermediate open failure.
+
 2009-10-27 Stephane Letz  <letz at grame.fr>
 
-	* Dynamic system version detection in JackCoreAudioDriver to either create public or private aggregate device.
-
+	* Dynamic system version detection in JackCoreAudioDriver to either create public or private aggregate device.
+
 2009-10-26 Stephane Letz  <letz at grame.fr>
 
-	* Implement "hog mode" (exclusive access of the audio device) in JackCoreAudioDriver.
-	* Fix jack_set_sample_rate_callback to have he same behavior as in JACK1.
-
+	* Implement "hog mode" (exclusive access of the audio device) in JackCoreAudioDriver.
+	* Fix jack_set_sample_rate_callback to have he same behavior as in JACK1.
+
 2009-10-25 Stephane Letz  <letz at grame.fr>
 
-	* Improve aggregate device management in JackCoreAudioDriver : now a "private" device only and cleanup properly.
-	* Aggregate device code added to JackCoreAudioAdapter.
-
+	* Improve aggregate device management in JackCoreAudioDriver : now a "private" device only and cleanup properly.
+	* Aggregate device code added to JackCoreAudioAdapter.
+
 2009-10-23 Stephane Letz  <letz at grame.fr>
 
-	* Correct JackProcessSync::LockedTimedWait.
-	* Correct JACK_MESSAGE_SIZE value, particularly in OSX RPC code.
-	* Now start server channel thread only when backend has been started (so in JackServer::Start). Should solve race conditions at start time.
-	* jack_verbose moved to JackGlobals class.
-
+	* Correct JackProcessSync::LockedTimedWait.
+	* Correct JACK_MESSAGE_SIZE value, particularly in OSX RPC code.
+	* Now start server channel thread only when backend has been started (so in JackServer::Start). Should solve race conditions at start time.
+	* jack_verbose moved to JackGlobals class.
+
 2009-10-22 Stephane Letz  <letz at grame.fr>
 
-	* Correct jackdmp.cpp (failures case were not correct..). Improve JackCoreAudioDriver code. Raise default port number to 2048.
-
+	* Correct jackdmp.cpp (failures case were not correct..). Improve JackCoreAudioDriver code. Raise default port number to 2048.
+
 2009-10-20 Stephane Letz  <letz at grame.fr>
 
-	* Add a string parameter to server ==> client notification, add a new JackInfoShutdownCallback type.
-	* CoreAudio backend now issue a JackInfoShutdownCallback when an unrecoverable error is detected (sampling rate change, stream configuration changeÉ)
+	* Add a string parameter to server ==> client notification, add a new JackInfoShutdownCallback type.
+	* CoreAudio backend now issue a JackInfoShutdownCallback when an unrecoverable error is detected (sampling rate change, stream configuration changeÉ)
 
 2009-10-17 Stephane Letz  <letz at grame.fr>
 
-	* Correct server temporary mode : now set a global and quit after server/client message handling is finished.
-
+	* Correct server temporary mode : now set a global and quit after server/client message handling is finished.
+
 2009-10-15 Stephane Letz  <letz at grame.fr>
 
-	* Change CoreAudio notification thread setup for OSX Snow Leopard.
-
+	* Change CoreAudio notification thread setup for OSX Snow Leopard.
+
 2009-09-18 Stephane Letz  <letz at grame.fr>
 
-	* Simplify transport in NetJack2: master only can control transport.
+	* Simplify transport in NetJack2: master only can control transport.
 
 2009-09-15 Stephane Letz  <letz at grame.fr>
 
-	* Correct CPU timing in JackNetDriver, now take cycle begin time after Read.
+	* Correct CPU timing in JackNetDriver, now take cycle begin time after Read.
 	* Fix issues in JackNetDriver::DecodeTransportData and JackNetDriver::Initialize.
 
 2009-08-28 Stephane Letz  <letz at grame.fr>
@@ -593,7 +557,7 @@ Arnold Krille
 2008-11-21 Stephane Letz  <letz at grame.fr>
 
 	* Report ringbuffer.c fixes from JACK1.
-	* Better isolation of server and clients system resources to allow starting the server in several user account at the same time.
+	* Better isolation of server and clients system resources to allow starting the server in several user account at the same time.
 	* Correct ressource cleanup in case of driver open failure.
 
 2008-11-19 Stephane Letz  <letz at grame.fr>
diff --git a/common/JackAtomicArrayState.h b/common/JackAtomicArrayState.h
index 177158d..8a0daf0 100644
--- a/common/JackAtomicArrayState.h
+++ b/common/JackAtomicArrayState.h
@@ -1,21 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software 
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackAtomicArrayState__
 #define __JackAtomicArrayState__
diff --git a/common/JackConstants.h b/common/JackConstants.h
index e04906d..60a631c 100644
--- a/common/JackConstants.h
+++ b/common/JackConstants.h
@@ -24,7 +24,7 @@
 #include "config.h"
 #endif
 
-#define VERSION "1.9.6"
+#define VERSION "1.9.5"
 
 #define BUFFER_SIZE_MAX 8192
 
@@ -88,7 +88,7 @@
 
 #define ALL_CLIENTS -1 // for notification
 
-#define JACK_PROTOCOL_VERSION 8
+#define JACK_PROTOCOL_VERSION 7  
 
 #define SOCKET_TIME_OUT 5               // in sec
 #define DRIVER_OPEN_TIMEOUT 5           // in sec
diff --git a/common/JackControlAPI.h b/common/JackControlAPI.h
index d0b0cbc..cc07dca 100644
--- a/common/JackControlAPI.h
+++ b/common/JackControlAPI.h
@@ -47,7 +47,7 @@ typedef enum
 #define JACK_PARAM_MAX (JackParamBool + 1)
 
 /** @brief Max length of string parameter value, excluding terminating nul char */
-#define JACK_PARAM_STRING_MAX  127
+#define JACK_PARAM_STRING_MAX  63
 
 /** @brief Type for parameter value */
 /* intentionally similar to jack_driver_param_value_t */
diff --git a/common/JackError.cpp b/common/JackError.cpp
index 905bbef..3705c35 100644
--- a/common/JackError.cpp
+++ b/common/JackError.cpp
@@ -1,23 +1,23 @@
 /*
- Copyright (C) 2001 Paul Davis
- Copyright (C) 2004-2008 Grame
- Copyright (C) 2008 Nedko Arnaudov
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+    Copyright (C) 2001 Paul Davis
+	Copyright (C) 2004-2008 Grame
+    Copyright (C) 2008 Nedko Arnaudov
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include <stdarg.h>
 #include <stdio.h>
diff --git a/common/JackError.h b/common/JackError.h
index e16a65b..403c55a 100644
--- a/common/JackError.h
+++ b/common/JackError.h
@@ -1,21 +1,22 @@
 /*
- Copyright (C) 2001 Paul Davis
- Copyright (C) 2004-2008 Grame
- Copyright (C) 2008 Nedko Arnaudov
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
+Copyright (C) 2008 Nedko Arnaudov
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
 
 */
 
diff --git a/common/JackGraphManager.cpp b/common/JackGraphManager.cpp
index 1a92191..36e2943 100644
--- a/common/JackGraphManager.cpp
+++ b/common/JackGraphManager.cpp
@@ -385,7 +385,7 @@ void JackGraphManager::ActivatePort(jack_port_id_t port_index)
 void JackGraphManager::DeactivatePort(jack_port_id_t port_index)
 {
     JackPort* port = GetPort(port_index);
-    port->fFlags = (JackPortFlags)(port->fFlags & ~JackPortIsActive);
+    port->fFlags = (JackPortFlags)(port->fFlags | ~JackPortIsActive);
 }
 
 void JackGraphManager::GetInputPorts(int refnum, jack_int_t* res)
diff --git a/common/JackNetTool.cpp b/common/JackNetTool.cpp
index 82f0352..81e2404 100644
--- a/common/JackNetTool.cpp
+++ b/common/JackNetTool.cpp
@@ -283,7 +283,7 @@ namespace Jack
         jack_info ( "Sample rate : %u frames per second", params->fSampleRate );
         jack_info ( "Period size : %u frames per period", params->fPeriodSize );
         jack_info ( "Frames per packet : %u", params->fFramesPerPacket );
-        jack_info ( "Packet per period : %u", (params->fFramesPerPacket != 0) ? params->fPeriodSize / params->fFramesPerPacket : 0);
+        jack_info ( "Packet per period : %u", params->fPeriodSize / params->fFramesPerPacket );
         jack_info ( "Bitdepth : %s", bitdepth );
         jack_info ( "Slave mode : %s", ( params->fSlaveSyncMode ) ? "sync" : "async" );
         jack_info ( "Network mode : %s", mode );
diff --git a/common/JackShmMem.cpp b/common/JackShmMem.cpp
index 11c4f98..90d42e7 100644
--- a/common/JackShmMem.cpp
+++ b/common/JackShmMem.cpp
@@ -1,21 +1,22 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software 
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2009 Grame
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackError.h"
 #include "JackShmMem.h"
diff --git a/common/JackShmMem.h b/common/JackShmMem.h
index fdef507..0a00daa 100644
--- a/common/JackShmMem.h
+++ b/common/JackShmMem.h
@@ -1,21 +1,22 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software 
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2009 Grame
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackShmMem__
 #define __JackShmMem__
diff --git a/common/JackTools.cpp b/common/JackTools.cpp
index d74f34c..a7a7020 100644
--- a/common/JackTools.cpp
+++ b/common/JackTools.cpp
@@ -194,7 +194,7 @@ namespace Jack {
         }
 
         if (fgets(buf, sizeof(buf), in) == NULL) {
-            pclose(in);
+            fclose(in);
             return -1;
         }
 
@@ -202,7 +202,7 @@ namespace Jack {
 
         if (buf[len - 1] != '\n') {
             /* didn't get a whole line */
-            pclose(in);
+            fclose(in);
             return -1;
         }
 
@@ -210,7 +210,7 @@ namespace Jack {
         memcpy(jack_tmpdir, buf, len - 1);
         jack_tmpdir[len - 1] = '\0';
 
-        pclose(in);
+        fclose(in);
         return 0;
     }
 #endif
diff --git a/common/JackWeakAPI.cpp b/common/JackWeakAPI.cpp
index d516be7..81e21d3 100644
--- a/common/JackWeakAPI.cpp
+++ b/common/JackWeakAPI.cpp
@@ -1,36 +1,33 @@
-//=============================================================================
-//  MuseScore
-//  Linux Music Score Editor
-//  $Id:
-//
-//  jackWeakAPI based on code from Stéphane Letz (Grame)
-//  partly based on Julien Pommier (PianoTeq : http://www.pianoteq.com/) code.
-//
-//  Copyright (C) 2002-2007 Werner Schweer and others
-//  Copyright (C) 2009 Grame
+/*
+Copyright (C) 2009 Grame
 
-//  This program is free software; you can redistribute it and/or modify
-//  it under the terms of the GNU Lesser General Public License as published by
-//  the Free Software Foundation; either version 2.1 of the License, or
-//  (at your option) any later version.
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
 
-//  This program is distributed in the hope that it will be useful,
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-//  GNU Lesser General Public License for more details.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
 
-//  You should have received a copy of the GNU Lesser General Public License
-//  along with this program; if not, write to the Free Software
-//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+/*
+    Completed from Julien Pommier (PianoTeq : http://www.pianoteq.com/) code.
+*/
 
 #include <jack/jack.h>
 #include <jack/thread.h>
 #include <jack/midiport.h>
 #include <math.h>
-#ifndef WIN32
 #include <dlfcn.h>
-#endif
 #include <stdlib.h>
+#include <cassert>
 #include <iostream>
 
 /* dynamically load libjack and forward all registered calls to libjack 
@@ -43,21 +40,13 @@ typedef void *(*thread_routine)(void*);
 using std::cerr;
 
 int libjack_is_present = 0;     // public symbol, similar to what relaytool does.
-
-#ifdef WIN32
-HMODULE libjack_handle = 0;
-#else
 static void *libjack_handle = 0;
-#endif
-
 
 static void __attribute__((constructor)) tryload_libjack()
 {
     if (getenv("SKIP_LIBJACK") == 0) { // just in case libjack is causing troubles..
     #ifdef __APPLE__
         libjack_handle = dlopen("libjack.0.dylib", RTLD_LAZY);
-    #elif defined(WIN32)
-        libjack_handle = LoadLibrary("libjack.dll");
     #else
         libjack_handle = dlopen("libjack.so.0", RTLD_LAZY);
     #endif
@@ -70,22 +59,12 @@ void *load_jack_function(const char *fn_name)
 {
     void *fn = 0;
     if (!libjack_handle) { 
-        fprintf (stderr, "libjack not found, so do not try to load  %s ffs  !\n", fn_name);
+        std::cerr << "libjack not found, so do not try to load " << fn_name << " ffs !\n";
         return 0;
     }
-#ifdef WIN32
-    fn = (void*)GetProcAddress(libjack_handle, fn_name);
-#else
     fn = dlsym(libjack_handle, fn_name);
-#endif
     if (!fn) { 
-#ifdef WIN32
-        char* lpMsgBuf;
-        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,0,NULL );
-        fprintf (stderr, "could not GetProcAddress( %s ), %s \n", fn_name, lpMsgBuf) ;
-#else        
-        fprintf (stderr, "could not dlsym( %s ), %s \n", fn_name, dlerror()) ; 
-#endif
+        std::cerr << "could not dlsym(" << libjack_handle << "), " << dlerror() << "\n"; 
     }
     return fn;
 }
@@ -99,15 +78,6 @@ void *load_jack_function(const char *fn_name)
     else return (return_type)-1;                                                      \
   }
 
-#define DECL_FUNCTION_NULL(return_type, fn_name, arguments_types, arguments) \
-  typedef return_type (*fn_name##_ptr_t)arguments_types;                \
-  return_type fn_name arguments_types {                                 \
-    static fn_name##_ptr_t fn = 0;                                      \
-    if (fn == 0) { fn = (fn_name##_ptr_t)load_jack_function(#fn_name); } \
-    if (fn) return (*fn)arguments;                                      \
-    else return (return_type)0;                                                      \
-  }
-  
 #define DECL_VOID_FUNCTION(fn_name, arguments_types, arguments)         \
   typedef void (*fn_name##_ptr_t)arguments_types;                       \
   void fn_name arguments_types {                                        \
@@ -116,15 +86,14 @@ void *load_jack_function(const char *fn_name)
     if (fn) (*fn)arguments;                                             \
   }
 
-
 DECL_VOID_FUNCTION(jack_get_version, (int *major_ptr, int *minor_ptr, int *micro_ptr, int *proto_ptr), (major_ptr, minor_ptr, micro_ptr, proto_ptr));
-DECL_FUNCTION_NULL(const char *, jack_get_version_string, (), ());      
-DECL_FUNCTION_NULL(jack_client_t *, jack_client_open, (const char *client_name, jack_options_t options, jack_status_t *status, ...), 
+DECL_FUNCTION(const char *, jack_get_version_string, (), ());      
+DECL_FUNCTION(jack_client_t *, jack_client_open, (const char *client_name, jack_options_t options, jack_status_t *status, ...), 
               (client_name, options, status));
 DECL_FUNCTION(int, jack_client_close, (jack_client_t *client), (client));
-DECL_FUNCTION_NULL(jack_client_t *, jack_client_new, (const char *client_name), (client_name));
+DECL_FUNCTION(jack_client_t *, jack_client_new, (const char *client_name), (client_name));
 DECL_FUNCTION(int, jack_client_name_size, (), ());
-DECL_FUNCTION_NULL(char*, jack_get_client_name, (jack_client_t *client), (client));
+DECL_FUNCTION(char*, jack_get_client_name, (jack_client_t *client), (client));
 DECL_FUNCTION(int, jack_internal_client_new, (const char *client_name,
                                             const char *load_name,
                                             const char *load_init), (client_name, load_name, load_init));
@@ -177,21 +146,21 @@ DECL_FUNCTION(int, jack_set_xrun_callback, (jack_client_t *client,
                                             void *arg), (client, xrun_callback, arg));
 DECL_FUNCTION(int, jack_activate, (jack_client_t *client), (client));
 DECL_FUNCTION(int, jack_deactivate, (jack_client_t *client), (client));
-DECL_FUNCTION_NULL(jack_port_t *, jack_port_register, (jack_client_t *client, const char *port_name, const char *port_type,
+DECL_FUNCTION(jack_port_t *, jack_port_register, (jack_client_t *client, const char *port_name, const char *port_type,
                                                   unsigned long flags, unsigned long buffer_size),
               (client, port_name, port_type, flags, buffer_size));
 DECL_FUNCTION(int, jack_port_unregister, (jack_client_t *client, jack_port_t* port), (client, port));
-DECL_FUNCTION_NULL(void *, jack_port_get_buffer, (jack_port_t *port, jack_nframes_t nframes), (port, nframes));
-DECL_FUNCTION_NULL(const char*, jack_port_name, (const jack_port_t *port), (port));
-DECL_FUNCTION_NULL(const char*, jack_port_short_name, (const jack_port_t *port), (port));
+DECL_FUNCTION(void *, jack_port_get_buffer, (jack_port_t *port, jack_nframes_t nframes), (port, nframes));
+DECL_FUNCTION(const char*, jack_port_name, (const jack_port_t *port), (port));
+DECL_FUNCTION(const char*, jack_port_short_name, (const jack_port_t *port), (port));
 DECL_FUNCTION(int, jack_port_flags, (const jack_port_t *port), (port));
-DECL_FUNCTION_NULL(const char*, jack_port_type, (const jack_port_t *port), (port));
+DECL_FUNCTION(const char*, jack_port_type, (const jack_port_t *port), (port));
 DECL_FUNCTION(jack_port_type_id_t, jack_port_type_id, (const jack_port_t *port), (port));
 DECL_FUNCTION(int, jack_port_is_mine, (const jack_client_t *client, const jack_port_t* port), (client, port));
 DECL_FUNCTION(int, jack_port_connected, (const jack_port_t *port), (port));
 DECL_FUNCTION(int, jack_port_connected_to, (const jack_port_t *port, const char *port_name), (port, port_name));
-DECL_FUNCTION_NULL(const char**, jack_port_get_connections, (const jack_port_t *port), (port));
-DECL_FUNCTION_NULL(const char**, jack_port_get_all_connections, (const jack_client_t *client,const jack_port_t *port), (client, port));
+DECL_FUNCTION(const char**, jack_port_get_connections, (const jack_port_t *port), (port));
+DECL_FUNCTION(const char**, jack_port_get_all_connections, (const jack_client_t *client,const jack_port_t *port), (client, port));
 DECL_FUNCTION(int, jack_port_tie, (jack_port_t *src, jack_port_t *dst), (src, dst));
 DECL_FUNCTION(int, jack_port_untie, (jack_port_t *port), (port));
 DECL_FUNCTION(jack_nframes_t, jack_port_get_latency, (jack_port_t *port), (port));
@@ -216,10 +185,10 @@ DECL_FUNCTION(int, jack_port_type_size,(),());
             
 DECL_FUNCTION(jack_nframes_t, jack_get_sample_rate, (jack_client_t *client), (client));
 DECL_FUNCTION(jack_nframes_t, jack_get_buffer_size, (jack_client_t *client), (client));
-DECL_FUNCTION_NULL(const char**, jack_get_ports, (jack_client_t *client, const char *port_name_pattern, const char *	type_name_pattern,
+DECL_FUNCTION(const char**, jack_get_ports, (jack_client_t *client, const char *port_name_pattern, const char *	type_name_pattern,
                                              unsigned long flags), (client, port_name_pattern, type_name_pattern, flags));
-DECL_FUNCTION_NULL(jack_port_t *, jack_port_by_name, (jack_client_t * client, const char *port_name), (client, port_name));
-DECL_FUNCTION_NULL(jack_port_t *, jack_port_by_id, (jack_client_t *client, jack_port_id_t port_id), (client, port_id));
+DECL_FUNCTION(jack_port_t *, jack_port_by_name, (jack_client_t * client, const char *port_name), (client, port_name));
+DECL_FUNCTION(jack_port_t *, jack_port_by_id, (jack_client_t *client, jack_port_id_t port_id), (client, port_id));
 
 DECL_FUNCTION(int, jack_engine_takeover_timebase, (jack_client_t * client), (client));
 DECL_FUNCTION(jack_nframes_t, jack_frames_since_cycle_start, (const jack_client_t * client), (client));
@@ -229,7 +198,7 @@ DECL_FUNCTION(jack_time_t, jack_frames_to_time, (const jack_client_t *client, ja
 DECL_FUNCTION(jack_nframes_t, jack_frame_time, (const jack_client_t *client), (client));
 DECL_FUNCTION(jack_nframes_t, jack_last_frame_time, (const jack_client_t *client), (client));
 DECL_FUNCTION(float, jack_cpu_load, (jack_client_t *client), (client));
-DECL_FUNCTION_NULL(pthread_t, jack_client_thread_id, (jack_client_t *client), (client));
+DECL_FUNCTION(pthread_t, jack_client_thread_id, (jack_client_t *client), (client));
 DECL_VOID_FUNCTION(jack_set_error_function, (print_function fun), (fun));
 DECL_VOID_FUNCTION(jack_set_info_function, (print_function fun), (fun));
 
@@ -287,6 +256,6 @@ DECL_FUNCTION(jack_nframes_t, jack_midi_get_event_count, (void* port_buffer), (p
 DECL_FUNCTION(int, jack_midi_event_get, (jack_midi_event_t* event, void* port_buffer, jack_nframes_t event_index), (event, port_buffer, event_index)) ;
 DECL_VOID_FUNCTION(jack_midi_clear_buffer, (void* port_buffer), (port_buffer));
 DECL_FUNCTION(size_t, jack_midi_max_event_size, (void* port_buffer), (port_buffer));
-DECL_FUNCTION_NULL(jack_midi_data_t*, jack_midi_event_reserve, (void* port_buffer, jack_nframes_t time, size_t data_size), (port_buffer, time, data_size));
+DECL_FUNCTION(jack_midi_data_t*, jack_midi_event_reserve, (void* port_buffer, jack_nframes_t time, size_t data_size), (port_buffer, time, data_size));
 DECL_FUNCTION(int, jack_midi_event_write, (void* port_buffer, jack_nframes_t time, const jack_midi_data_t* data, size_t data_size), (port_buffer, time, data, data_size));
 DECL_FUNCTION(jack_nframes_t, jack_midi_get_lost_event_count, (void* port_buffer), (port_buffer));
diff --git a/common/driver_interface.h b/common/driver_interface.h
index 6c97099..d336f41 100644
--- a/common/driver_interface.h
+++ b/common/driver_interface.h
@@ -33,7 +33,7 @@ extern "C"
 
 #define JACK_DRIVER_NAME_MAX          15
 #define JACK_DRIVER_PARAM_NAME_MAX    15
-#define JACK_DRIVER_PARAM_STRING_MAX  127
+#define JACK_DRIVER_PARAM_STRING_MAX  63
 #define JACK_DRIVER_PARAM_DESC        255
 #define JACK_PATH_MAX                 511
 
diff --git a/common/jack/control.h b/common/jack/control.h
index caeb931..6360d30 100644
--- a/common/jack/control.h
+++ b/common/jack/control.h
@@ -48,8 +48,8 @@ typedef enum
 /** @brief Max value that jackctl_param_type_t type can have */
 #define JACK_PARAM_MAX (JackParamBool + 1)
 
-/** @brief Max length of string parameter value, excluding terminating null char */
-#define JACK_PARAM_STRING_MAX  127
+/** @brief Max length of string parameter value, excluding terminating nul char */
+#define JACK_PARAM_STRING_MAX  63
 
 /** @brief Type for parameter value */
 /* intentionally similar to jack_driver_param_value_t */
diff --git a/common/shm.c b/common/shm.c
index d0e62de..e74a213 100644
--- a/common/shm.c
+++ b/common/shm.c
@@ -1,3 +1,24 @@
+/*
+ * Copyright (C) 2003 Paul Davis
+ * Copyright (C) 2004 Jack O'Quin
+ * Copyright (C) 2006-2007 Grame
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
 /* This module provides a set of abstract shared memory interfaces
  * with support using both System V and POSIX shared memory
  * implementations.  The code is divided into three sections:
@@ -10,25 +31,6 @@
  * set in the ./configure step.
  */
 
-/*
- Copyright (C) 2001-2003 Paul Davis
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software 
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
-
 #include "JackConstants.h"
 
 #ifdef WIN32
@@ -146,7 +148,7 @@ static int semid = -1;
 static int
 semaphore_init () {return 0;}
 
-static  int
+static  int
 semaphore_add (int value) {return 0;}
 
 #else
@@ -532,7 +534,7 @@ jack_unregister_server (const char *server_name /* unused */)
 		}
 	}
 
-	jack_shm_unlock_registry ();
+	jack_shm_unlock_registry ();
 	return 0;
 }
 
diff --git a/dbus/controller_iface_control.c b/dbus/controller_iface_control.c
index 967cde1..ca3ab03 100644
--- a/dbus/controller_iface_control.c
+++ b/dbus/controller_iface_control.c
@@ -87,31 +87,34 @@ jack_control_run_method(
     {
         if (!jack_controller_start_server(controller_ptr, call))
         {
-            jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to start server");
-            return true;
+            jack_error ("Failed to start server");
+        }
+        else
+        {
+            jack_controller_control_send_signal_server_started();
         }
-
-        jack_controller_control_send_signal_server_started();
     }
     else if (strcmp (call->method_name, "StopServer") == 0)
     {
         if (!jack_controller_stop_server(controller_ptr, call))
         {
-            jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to stop server");
-            return true;
+            jack_error ("Failed to stop server");
+        }
+        else
+        {
+            jack_controller_control_send_signal_server_stopped();
         }
-
-        jack_controller_control_send_signal_server_stopped();
     }
     else if (strcmp (call->method_name, "SwitchMaster") == 0)
     {
         if (!jack_controller_switch_master(controller_ptr, call))
         {
-            jack_dbus_error(call, JACK_DBUS_ERROR_GENERIC, "Failed to switch master");
-            return true;
+            jack_error ("Failed to switch master");
+        }
+        else
+        {
+            jack_controller_control_send_signal_server_stopped();
         }
-
-        jack_controller_control_send_signal_server_stopped();
     }
     else if (strcmp (call->method_name, "GetLoad") == 0)
     {
diff --git a/doxyfile b/doxyfile
index a0d35e9..bc5116a 100644
--- a/doxyfile
+++ b/doxyfile
@@ -23,7 +23,7 @@ PROJECT_NAME           = "Jack2"
 # This could be handy for archiving the generated documentation or 
 # if some version control system is used.
 
-PROJECT_NUMBER         = 1.9.6
+PROJECT_NUMBER         = 1.9.5
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 # base path where the generated documentation will be put. 
diff --git a/example-clients/alsa_in.c b/example-clients/alsa_in.c
index 85259cd..a04271e 100644
--- a/example-clients/alsa_in.c
+++ b/example-clients/alsa_in.c
@@ -38,8 +38,6 @@ int jack_buffer_size;
 int quit = 0;
 double resample_mean = 1.0;
 double static_resample_factor = 1.0;
-double resample_lower_limit = 0.25;
-double resample_upper_limit = 4.0;
 
 double *offset_array;
 double *window_array;
@@ -390,8 +388,8 @@ int process (jack_nframes_t nframes, void *arg) {
     output_offset = (float) offset;
 
     // Clamp a bit.
-    if( current_resample_factor < resample_lower_limit ) current_resample_factor = resample_lower_limit;
-    if( current_resample_factor > resample_upper_limit ) current_resample_factor = resample_upper_limit;
+    if( current_resample_factor < 0.25 ) current_resample_factor = 0.25;
+    if( current_resample_factor > 4 ) current_resample_factor = 4;
 
     // Now Calculate how many samples we need.
     rlen = ceil( ((double)nframes) / current_resample_factor )+2;
@@ -677,8 +675,6 @@ int main (int argc, char *argv[]) {
     printf( "selected sample format: %s\n", formats[format].name );
 
     static_resample_factor = (double) jack_sample_rate / (double) sample_rate;
-    resample_lower_limit = static_resample_factor * 0.25;
-    resample_upper_limit = static_resample_factor * 4.0;
     resample_mean = static_resample_factor;
 
     offset_array = malloc( sizeof(double) * smooth_size );
diff --git a/example-clients/alsa_out.c b/example-clients/alsa_out.c
index 85b00e1..852e978 100644
--- a/example-clients/alsa_out.c
+++ b/example-clients/alsa_out.c
@@ -37,8 +37,6 @@ int jack_buffer_size;
 
 double resample_mean = 1.0;
 double static_resample_factor = 1.0;
-double resample_lower_limit = 0.25;
-double resample_upper_limit = 4.0;
 
 double *offset_array;
 double *window_array;
@@ -397,8 +395,8 @@ int process (jack_nframes_t nframes, void *arg) {
     output_offset = (float) offset;
 
     // Clamp a bit.
-    if( current_resample_factor < resample_lower_limit ) current_resample_factor = resample_lower_limit;
-    if( current_resample_factor > resample_upper_limit ) current_resample_factor = resample_upper_limit;
+    if( current_resample_factor < 0.25 ) current_resample_factor = 0.25;
+    if( current_resample_factor > 4 ) current_resample_factor = 4;
 
     // Now Calculate how many samples we need.
     rlen = ceil( ((double)nframes) * current_resample_factor )+2;
@@ -668,8 +666,6 @@ int main (int argc, char *argv[]) {
 	sample_rate = jack_sample_rate;
 
     static_resample_factor =  (double) sample_rate / (double) jack_sample_rate;
-    resample_lower_limit = static_resample_factor * 0.25;
-    resample_upper_limit = static_resample_factor * 4.0;
     resample_mean = static_resample_factor;
 
     offset_array = malloc( sizeof(double) * smooth_size );
diff --git a/example-clients/internal_metro.cpp b/example-clients/internal_metro.cpp
index 14747d6..59806c7 100644
--- a/example-clients/internal_metro.cpp
+++ b/example-clients/internal_metro.cpp
@@ -46,6 +46,7 @@ InternalMetro::InternalMetro(int freq, double max_amp, int dur_arg, int bpm, cha
 {
     sample_t scale;
     int i, attack_length, decay_length;
+    double *amp;
     int attack_percent = 1, decay_percent = 10;
     const char *bpm_string = "bpm";
 
@@ -58,7 +59,7 @@ InternalMetro::InternalMetro(int freq, double max_amp, int dur_arg, int bpm, cha
     }
     if ((client = jack_client_open (client_name, JackNullOption, NULL)) == 0) {
         fprintf (stderr, "jack server not running?\n");
-        return;
+        return ;
     }
 
     jack_set_process_callback (client, process_audio, this);
@@ -80,11 +81,11 @@ InternalMetro::InternalMetro(int freq, double max_amp, int dur_arg, int bpm, cha
         	 ", wave length = %" PRIu32 "\n", tone_length,
         	 wave_length);
         */ 
-        return;
+        return ;
     }
     if (attack_length + decay_length > (int)tone_length) {
         fprintf (stderr, "invalid attack/decay\n");
-        return;
+        return ;
     }
 
     /* Build the wave table */
@@ -109,6 +110,7 @@ InternalMetro::InternalMetro(int freq, double max_amp, int dur_arg, int bpm, cha
 
     if (jack_activate (client)) {
         fprintf(stderr, "cannot activate client");
+        return;
     }
 }
 
@@ -118,6 +120,4 @@ InternalMetro::~InternalMetro()
     jack_port_unregister(client, input_port);
     jack_port_unregister(client, output_port);
     jack_client_close(client);
-    free(amp);
-    free(wave);
 }
diff --git a/example-clients/internal_metro.h b/example-clients/internal_metro.h
index 7febb6d..bbe156a 100644
--- a/example-clients/internal_metro.h
+++ b/example-clients/internal_metro.h
@@ -53,7 +53,6 @@ extern "C"
         int bpm;
         jack_nframes_t tone_length, wave_length;
         sample_t *wave;
-        double *amp;
         long offset ;
 
         InternalMetro(int freq, double max_amp, int dur_arg, int bpm, char* client_name);
diff --git a/example-clients/metro.c b/example-clients/metro.c
index d2daaa7..9afc58b 100644
--- a/example-clients/metro.c
+++ b/example-clients/metro.c
@@ -257,7 +257,7 @@ main (int argc, char *argv[])
 
 	if (jack_activate (client)) {
 		fprintf (stderr, "cannot activate client\n");
-		goto error;
+		return 1;
 	}
     
     /* install a signal handler to properly quits jack client */
@@ -282,9 +282,5 @@ main (int argc, char *argv[])
 	};
 	
     jack_client_close(client);
-    
-error:
-    free(amp);
-    free(wave);
     exit (0);
 }
diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp
index 17df466..735aace 100644
--- a/linux/firewire/JackFFADODriver.cpp
+++ b/linux/firewire/JackFFADODriver.cpp
@@ -429,7 +429,7 @@ int JackFFADODriver::Attach()
 
         driver->capture_channels[chn].stream_type = ffado_streaming_get_capture_stream_type(driver->dev, chn);
         if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
-            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_in", portname);
+            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
             printMessage ("Registering audio capture port %s", buf);
             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
                               JACK_DEFAULT_AUDIO_TYPE,
@@ -455,7 +455,7 @@ int JackFFADODriver::Attach()
             fCaptureChannels++;
 
         } else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
-            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_in", portname);
+            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
             printMessage ("Registering midi capture port %s", buf);
             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
                               JACK_DEFAULT_MIDI_TYPE,
@@ -502,7 +502,7 @@ int JackFFADODriver::Attach()
         driver->playback_channels[chn].stream_type = ffado_streaming_get_playback_stream_type(driver->dev, chn);
 
         if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
-            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_out", portname);
+            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
             printMessage ("Registering audio playback port %s", buf);
             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
                               JACK_DEFAULT_AUDIO_TYPE,
@@ -530,7 +530,7 @@ int JackFFADODriver::Attach()
             jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
             fPlaybackChannels++;
         } else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
-            snprintf(buf, sizeof(buf) - 1, "firewire_pcm:%s_out", portname);
+            snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
             printMessage ("Registering midi playback port %s", buf);
             if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
                               JACK_DEFAULT_MIDI_TYPE,
@@ -753,20 +753,12 @@ extern "C"
         strcpy (desc->name, "firewire");                               // size MUST be less then JACK_DRIVER_NAME_MAX + 1
         strcpy(desc->desc, "Linux FFADO API based audio backend");     // size MUST be less then JACK_DRIVER_PARAM_DESC + 1
        
-        desc->nparams = 12;
+        desc->nparams = 11;
 
         params = (jack_driver_param_desc_t *)calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
         desc->params = params;
 
         i = 0;
-        strcpy (params[i].name, "device");
-        params[i].character  = 'd';
-        params[i].type       = JackDriverParamString;
-        strcpy (params[i].value.str,  "hw:0");
-        strcpy (params[i].short_desc, "The FireWire device to use.");
-        strcpy (params[i].long_desc,  "The FireWire device to use. Please consult the FFADO documentation for more info.");
-
-        i++;
         strcpy (params[i].name, "period");
         params[i].character  = 'p';
         params[i].type       = JackDriverParamUInt;
@@ -889,7 +881,7 @@ extern "C"
 
             switch (param->character) {
                 case 'd':
-                    device_name = const_cast<char*>(param->value.str);
+                    device_name = strdup (param->value.str);
                     break;
                 case 'p':
                     cmlparams.period_size = param->value.ui;
diff --git a/macosx/Jack-Info.plist b/macosx/Jack-Info.plist
index ce9bac0..8b6a61d 100644
--- a/macosx/Jack-Info.plist
+++ b/macosx/Jack-Info.plist
@@ -7,7 +7,7 @@
 	<key>CFBundleExecutable</key>
 	<string>Jackservermp</string>
 	<key>CFBundleGetInfoString</key>
-	<string>Jackdmp 1.9.6, @03-10 Paul Davis, Grame</string>
+	<string>Jackdmp 1.9.5, @03-09 Paul Davis, Grame</string>
 	<key>CFBundleIdentifier</key>
 	<string>com.grame.Jackmp</string>
 	<key>CFBundleInfoDictionaryVersion</key>
@@ -19,6 +19,6 @@
 	<key>CFBundleSignature</key>
 	<string>????</string>
 	<key>CFBundleVersion</key>
-	<string>1.9.6</string>
+	<string>1.9.5</string>
 </dict>
 </plist>
diff --git a/macosx/JackMachServerChannel.cpp b/macosx/JackMachServerChannel.cpp
index 411886a..fcf4fe8 100644
--- a/macosx/JackMachServerChannel.cpp
+++ b/macosx/JackMachServerChannel.cpp
@@ -159,7 +159,7 @@ bool JackMachServerChannel::Execute()
         kern_return_t res;
         if ((res = mach_msg_server(MessageHandler, 1024, fServerPort.GetPortSet(), 0)) != KERN_SUCCESS) {
             jack_log("JackMachServerChannel::Execute: err = %s", mach_error_string(res));
-            // A recoverable error, so keep running...
+            return false;
         }
         return true;
         
diff --git a/macosx/Jackdmp.xcodeproj/project.pbxproj b/macosx/Jackdmp.xcodeproj/project.pbxproj
index 1739570..461f827 100644
--- a/macosx/Jackdmp.xcodeproj/project.pbxproj
+++ b/macosx/Jackdmp.xcodeproj/project.pbxproj
@@ -106,6 +106,7 @@
 		4B19B3140E2362E800DD4A82 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
 		4B19B3150E2362E800DD4A82 /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */; };
 		4B19B3160E2362E800DD4A82 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+		4B19B3190E2362E800DD4A82 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
 		4B19B31B0E2362E800DD4A82 /* JackLibSampleRateResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B30E0E2362E700DD4A82 /* JackLibSampleRateResampler.cpp */; };
 		4B19B31C0E2362E800DD4A82 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
 		4B19B31F0E2362E800DD4A82 /* JackResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3120E2362E700DD4A82 /* JackResampler.cpp */; };
@@ -422,12 +423,15 @@
 		4B5DB9830CD2429A00EBA5EE /* JackDebugClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B98AE000931D30C0091932A /* JackDebugClient.cpp */; };
 		4B5DB9840CD2429B00EBA5EE /* JackDebugClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B98AE010931D30C0091932A /* JackDebugClient.h */; };
 		4B5E08C30E5B66EE00BEE4E0 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+		4B5E08C40E5B66EE00BEE4E0 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
 		4B5E08C60E5B66EE00BEE4E0 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
 		4B5E08CC0E5B66EE00BEE4E0 /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */; };
 		4B5E08CD0E5B66EE00BEE4E0 /* JackLibSampleRateResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B30E0E2362E700DD4A82 /* JackLibSampleRateResampler.cpp */; };
 		4B5E08CE0E5B66EE00BEE4E0 /* JackResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3120E2362E700DD4A82 /* JackResampler.cpp */; };
 		4B5E08E10E5B676C00BEE4E0 /* JackNetAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B5E08DF0E5B676C00BEE4E0 /* JackNetAdapter.cpp */; };
 		4B5E08E20E5B676D00BEE4E0 /* JackNetAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5E08E00E5B676C00BEE4E0 /* JackNetAdapter.h */; };
+		4B5E08EB0E5B67EA00BEE4E0 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+		4B5E08EC0E5B67EB00BEE4E0 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
 		4B5E08EE0E5B680200BEE4E0 /* JackAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */; };
 		4B5E08EF0E5B680200BEE4E0 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
 		4B5F253E0DEE9B8F0041E486 /* JackLockedEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5F253D0DEE9B8F0041E486 /* JackLockedEngine.h */; };
@@ -566,24 +570,16 @@
 		4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737D0CC60A6D001AFFD4 /* thread.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737E0CC60A6D001AFFD4 /* transport.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4B6F7AEE0CD0CDBD00F48A9D /* JackEngineControl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B6F7AEC0CD0CDBD00F48A9D /* JackEngineControl.cpp */; };
+		4B76C76A0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+		4B76C76B0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+		4B76C76C0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+		4B76C76D0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
 		4B80D7E80BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; };
 		4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; };
 		4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; };
 		4B80D7EB0BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; };
 		4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; };
 		4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; };
-		4B88D03B11298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D03C11298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D03D11298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D03E11298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D03F11298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04011298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04111298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04211298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04311298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04411298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04511298BEE007A87C1 /* weakjack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03911298BEE007A87C1 /* weakjack.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		4B88D04611298BEE007A87C1 /* weakmacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B88D03A11298BEE007A87C1 /* weakmacros.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4B93F1990E87992100E4ECCD /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; };
 		4B93F19A0E87992200E4ECCD /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; };
 		4B93F19C0E87998200E4ECCD /* JackPosixServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBBA0E878B9C003D2374 /* JackPosixServerLaunch.cpp */; };
@@ -747,22 +743,16 @@
 		4BC216850A444BAD00BDA09F /* JackServerAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1F50834EFB000C94B91 /* JackServerAPI.cpp */; };
 		4BC216890A444BDE00BDA09F /* JackServerGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */; };
 		4BC2168E0A444BED00BDA09F /* JackServerGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC2168D0A444BED00BDA09F /* JackServerGlobals.h */; };
-		4BC2CA55113C6C930076717C /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
-		4BC2CA56113C6C940076717C /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
-		4BC2CA57113C6C9B0076717C /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
-		4BC2CA58113C6C9C0076717C /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
-		4BC2CA59113C6CB60076717C /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
-		4BC2CA5A113C6CB80076717C /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
-		4BC2CA5B113C6CBE0076717C /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
-		4BC2CA5C113C6CC00076717C /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
-		4BC2CA5D113C6CC90076717C /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
-		4BC2CA5E113C6CCA0076717C /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
-		4BC2CA5F113C6CD10076717C /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
-		4BC2CA60113C6CD20076717C /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
 		4BC3B6A40E703B2E0066E42F /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; };
 		4BC3B6A50E703B2E0066E42F /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; };
 		4BC3B6A60E703B2E0066E42F /* JackPosixThread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6A20E703B2E0066E42F /* JackPosixThread.cpp */; };
 		4BC3B6A70E703B2E0066E42F /* JackPosixThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6A30E703B2E0066E42F /* JackPosixThread.h */; };
+		4BC3B6BB0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+		4BC3B6BC0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+		4BC3B6BD0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+		4BC3B6BE0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+		4BC3B6BF0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+		4BC3B6C00E703BCC0066E42F /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
 		4BCBCE5D10C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BCBCE5910C4FE3F00450FFE /* JackPhysicalMidiInput.cpp */; };
 		4BCBCE5E10C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BCBCE5A10C4FE3F00450FFE /* JackPhysicalMidiInput.h */; };
 		4BCBCE5F10C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BCBCE5B10C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp */; };
@@ -785,13 +775,25 @@
 		4BDCDB951001FB9C00B15929 /* JackCoreMidiDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF339140F8B86DC0080FB5B /* JackCoreMidiDriver.h */; };
 		4BDCDB971001FB9C00B15929 /* JackCoreMidiDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF339150F8B86DC0080FB5B /* JackCoreMidiDriver.cpp */; };
 		4BDCDBB91001FCC000B15929 /* JackNetDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = BA222ADD0DC882A5001A17F4 /* JackNetDriver.h */; };
+		4BDCDBBA1001FCC000B15929 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+		4BDCDBBB1001FCC000B15929 /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
 		4BDCDBBD1001FCC000B15929 /* JackNetDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BA222ADC0DC882A5001A17F4 /* JackNetDriver.cpp */; };
+		4BDCDBBE1001FCC000B15929 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+		4BDCDBBF1001FCC000B15929 /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
 		4BDCDBD11001FD0100B15929 /* JackWaitThreadedDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BBC93B80DF9736C002DF220 /* JackWaitThreadedDriver.cpp */; };
 		4BDCDBD21001FD0200B15929 /* JackWaitThreadedDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BBC93B90DF9736C002DF220 /* JackWaitThreadedDriver.h */; };
 		4BDCDBD91001FD2D00B15929 /* JackNetManager.h in Headers */ = {isa = PBXBuildFile; fileRef = BA222AEC0DC883B3001A17F4 /* JackNetManager.h */; };
+		4BDCDBDA1001FD2D00B15929 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
+		4BDCDBDB1001FD2D00B15929 /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
+		4BDCDBDC1001FD2D00B15929 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
 		4BDCDBDE1001FD2D00B15929 /* JackNetManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BA222AEB0DC883B3001A17F4 /* JackNetManager.cpp */; };
+		4BDCDBDF1001FD2D00B15929 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
+		4BDCDBE01001FD2D00B15929 /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
+		4BDCDBE11001FD2D00B15929 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
+		4BDCDBE21001FD2D00B15929 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
 		4BDCDBEE1001FD7300B15929 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
 		4BDCDBEF1001FD7300B15929 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+		4BDCDBF01001FD7300B15929 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
 		4BDCDBF11001FD7300B15929 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
 		4BDCDBF21001FD7300B15929 /* JackCoreAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BE5FED00E725C320020B576 /* JackCoreAudioAdapter.h */; };
 		4BDCDBF41001FD7300B15929 /* JackAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */; };
@@ -803,14 +805,19 @@
 		4BDCDC091001FDA800B15929 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
 		4BDCDC0A1001FDA800B15929 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
 		4BDCDC111001FDE300B15929 /* JackAudioAdapterInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3090E2362E700DD4A82 /* JackAudioAdapterInterface.h */; };
+		4BDCDC121001FDE300B15929 /* JackException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30C0E2362E700DD4A82 /* JackException.h */; };
 		4BDCDC131001FDE300B15929 /* JackLibSampleRateResampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B30F0E2362E700DD4A82 /* JackLibSampleRateResampler.h */; };
 		4BDCDC141001FDE300B15929 /* JackNetAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B5E08E00E5B676C00BEE4E0 /* JackNetAdapter.h */; };
+		4BDCDC151001FDE300B15929 /* JackNetInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B76C7690E5AB2DB00E2AC21 /* JackNetInterface.h */; };
 		4BDCDC161001FDE300B15929 /* JackAudioAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B19B3070E2362E700DD4A82 /* JackAudioAdapter.h */; };
+		4BDCDC171001FDE300B15929 /* JackNetUnixSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3B6BA0E703BCC0066E42F /* JackNetUnixSocket.h */; };
 		4BDCDC191001FDE300B15929 /* JackAudioAdapterInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3080E2362E700DD4A82 /* JackAudioAdapterInterface.cpp */; };
 		4BDCDC1A1001FDE300B15929 /* JackLibSampleRateResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B30E0E2362E700DD4A82 /* JackLibSampleRateResampler.cpp */; };
 		4BDCDC1B1001FDE300B15929 /* JackResampler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3120E2362E700DD4A82 /* JackResampler.cpp */; };
 		4BDCDC1C1001FDE300B15929 /* JackNetAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B5E08DF0E5B676C00BEE4E0 /* JackNetAdapter.cpp */; };
+		4BDCDC1D1001FDE300B15929 /* JackNetInterface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B76C7680E5AB2DB00E2AC21 /* JackNetInterface.cpp */; };
 		4BDCDC1E1001FDE300B15929 /* JackAudioAdapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B19B3060E2362E700DD4A82 /* JackAudioAdapter.cpp */; };
+		4BDCDC1F1001FDE300B15929 /* JackNetUnixSocket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3B6B90E703BCC0066E42F /* JackNetUnixSocket.cpp */; };
 		4BE3225A0CC611EF00AFA640 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737F0CC60A6D001AFFD4 /* types.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4BE3225B0CC611F500AFA640 /* types.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737F0CC60A6D001AFFD4 /* types.h */; settings = {ATTRIBUTES = (Public, ); }; };
 		4BE4CC010CDA153400CCF5BB /* JackTools.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BE4CBFF0CDA153400CCF5BB /* JackTools.cpp */; };
@@ -830,6 +837,8 @@
 		4BECB2FA0F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; };
 		4BECB2FB0F4451C10091B70A /* JackProcessSync.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BECB2F30F4451C10091B70A /* JackProcessSync.cpp */; };
 		4BECB2FC0F4451C10091B70A /* JackProcessSync.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BECB2F40F4451C10091B70A /* JackProcessSync.h */; };
+		4BF284180F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
+		4BF284190F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
 		4BF2841A0F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF284160F31B4BC00B05BE3 /* JackArgParser.cpp */; };
 		4BF2841B0F31B4BC00B05BE3 /* JackArgParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF284170F31B4BC00B05BE3 /* JackArgParser.h */; };
 		4BF3391A0F8B86DC0080FB5B /* JackCoreMidiDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF339140F8B86DC0080FB5B /* JackCoreMidiDriver.h */; };
@@ -844,6 +853,7 @@
 		4BF520590CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (); }; };
 		4BF5205A0CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (); }; };
 		4BF5FBBC0E878B9C003D2374 /* JackPosixServerLaunch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBBA0E878B9C003D2374 /* JackPosixServerLaunch.cpp */; };
+		4BF5FBC90E878D24003D2374 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
 		4BF5FBCA0E878D24003D2374 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
 		4BF5FBCB0E878D24003D2374 /* JackMachTime.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF5FBC80E878D24003D2374 /* JackMachTime.c */; };
 		4BFA5E9F0DEC4DD900FA4CDB /* testMutex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFA5E9E0DEC4DD900FA4CDB /* testMutex.cpp */; };
@@ -1557,8 +1567,6 @@
 		4B869B3D08C8D21C001CF041 /* driver_interface.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = driver_interface.h; path = ../common/driver_interface.h; sourceTree = SOURCE_ROOT; };
 		4B869B4208C8D22F001CF041 /* JackDriverLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackDriverLoader.h; path = ../common/JackDriverLoader.h; sourceTree = SOURCE_ROOT; };
 		4B869D7F08C9CB00001CF041 /* JackDriverLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackDriverLoader.cpp; path = ../common/JackDriverLoader.cpp; sourceTree = SOURCE_ROOT; };
-		4B88D03911298BEE007A87C1 /* weakjack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = weakjack.h; path = ../common/jack/weakjack.h; sourceTree = SOURCE_ROOT; };
-		4B88D03A11298BEE007A87C1 /* weakmacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = weakmacros.h; path = ../common/jack/weakmacros.h; sourceTree = SOURCE_ROOT; };
 		4B89B759076B731100D170DE /* JackRPCClientUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCClientUser.c; path = RPC/JackRPCClientUser.c; sourceTree = SOURCE_ROOT; };
 		4B89B769076B74D200D170DE /* JackRPCEngineUser.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = JackRPCEngineUser.c; path = RPC/JackRPCEngineUser.c; sourceTree = SOURCE_ROOT; };
 		4B940B9B06DDDE5B00D77F60 /* AudioHardware.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = AudioHardware.h; path = /System/Library/Frameworks/CoreAudio.framework/Versions/A/Headers/AudioHardware.h; sourceTree = "<absolute>"; };
@@ -2703,8 +2711,6 @@
 				4B6C737D0CC60A6D001AFFD4 /* thread.h */,
 				4B6C737E0CC60A6D001AFFD4 /* transport.h */,
 				4B6C737F0CC60A6D001AFFD4 /* types.h */,
-				4B88D03911298BEE007A87C1 /* weakjack.h */,
-				4B88D03A11298BEE007A87C1 /* weakmacros.h */,
 			);
 			name = jack;
 			path = ../common/jack;
@@ -3055,6 +3061,7 @@
 			files = (
 				4B19B3140E2362E800DD4A82 /* JackAudioAdapter.h in Headers */,
 				4B19B3160E2362E800DD4A82 /* JackAudioAdapterInterface.h in Headers */,
+				4B19B3190E2362E800DD4A82 /* JackException.h in Headers */,
 				4B19B31C0E2362E800DD4A82 /* JackLibSampleRateResampler.h in Headers */,
 				4BE5FED20E725C320020B576 /* JackCoreAudioAdapter.h in Headers */,
 			);
@@ -3152,8 +3159,6 @@
 				4B4F9C910DC20C0400706CB0 /* JackMessageBuffer.h in Headers */,
 				4B93F19E0E87998400E4ECCD /* JackPosixThread.h in Headers */,
 				4BECB2FA0F4451C10091B70A /* JackProcessSync.h in Headers */,
-				4B88D03F11298BEE007A87C1 /* weakjack.h in Headers */,
-				4B88D04011298BEE007A87C1 /* weakmacros.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3222,10 +3227,6 @@
 				4BDCDC0A1001FDA800B15929 /* JackArgParser.h in Headers */,
 				4BCBCE6210C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */,
 				4BCBCE6410C4FE3F00450FFE /* JackPhysicalMidiOutput.h in Headers */,
-				4B88D04311298BEE007A87C1 /* weakjack.h in Headers */,
-				4B88D04411298BEE007A87C1 /* weakmacros.h in Headers */,
-				4BC2CA5A113C6CB80076717C /* JackNetInterface.h in Headers */,
-				4BC2CA5C113C6CC00076717C /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3506,8 +3507,6 @@
 				4B47ACA910B5890100469C67 /* JackMessageBuffer.h in Headers */,
 				4B47ACAA10B5890100469C67 /* JackPosixThread.h in Headers */,
 				4B47ACAB10B5890100469C67 /* JackProcessSync.h in Headers */,
-				4B88D04111298BEE007A87C1 /* weakjack.h in Headers */,
-				4B88D04211298BEE007A87C1 /* weakmacros.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3530,9 +3529,12 @@
 			buildActionMask = 2147483647;
 			files = (
 				4B5E08C30E5B66EE00BEE4E0 /* JackAudioAdapterInterface.h in Headers */,
+				4B5E08C40E5B66EE00BEE4E0 /* JackException.h in Headers */,
 				4B5E08C60E5B66EE00BEE4E0 /* JackLibSampleRateResampler.h in Headers */,
 				4B5E08E20E5B676D00BEE4E0 /* JackNetAdapter.h in Headers */,
+				4B5E08EC0E5B67EB00BEE4E0 /* JackNetInterface.h in Headers */,
 				4B5E08EF0E5B680200BEE4E0 /* JackAudioAdapter.h in Headers */,
+				4BC3B6C00E703BCC0066E42F /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3590,8 +3592,6 @@
 				4BC3B6A50E703B2E0066E42F /* JackPosixThread.h in Headers */,
 				4BECB2F80F4451C10091B70A /* JackProcessSync.h in Headers */,
 				4B94334A10A5E666002A187F /* systemdeps.h in Headers */,
-				4B88D03B11298BEE007A87C1 /* weakjack.h in Headers */,
-				4B88D03C11298BEE007A87C1 /* weakmacros.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3664,10 +3664,6 @@
 				4B94334B10A5E666002A187F /* systemdeps.h in Headers */,
 				4BCBCE5E10C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */,
 				4BCBCE6010C4FE3F00450FFE /* JackPhysicalMidiOutput.h in Headers */,
-				4B88D03D11298BEE007A87C1 /* weakjack.h in Headers */,
-				4B88D03E11298BEE007A87C1 /* weakmacros.h in Headers */,
-				4BC2CA56113C6C940076717C /* JackNetInterface.h in Headers */,
-				4BC2CA58113C6C9C0076717C /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3845,10 +3841,6 @@
 				4BA3396F10B2E36800190E3B /* JackArgParser.h in Headers */,
 				4BCBCE6610C4FE3F00450FFE /* JackPhysicalMidiInput.h in Headers */,
 				4BCBCE6810C4FE3F00450FFE /* JackPhysicalMidiOutput.h in Headers */,
-				4B88D04511298BEE007A87C1 /* weakjack.h in Headers */,
-				4B88D04611298BEE007A87C1 /* weakmacros.h in Headers */,
-				4BC2CA5E113C6CCA0076717C /* JackNetInterface.h in Headers */,
-				4BC2CA60113C6CD20076717C /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3893,6 +3885,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				4BDCDBB91001FCC000B15929 /* JackNetDriver.h in Headers */,
+				4BDCDBBA1001FCC000B15929 /* JackNetInterface.h in Headers */,
+				4BDCDBBB1001FCC000B15929 /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3901,6 +3895,9 @@
 			buildActionMask = 2147483647;
 			files = (
 				4BDCDBD91001FD2D00B15929 /* JackNetManager.h in Headers */,
+				4BDCDBDA1001FD2D00B15929 /* JackNetInterface.h in Headers */,
+				4BDCDBDB1001FD2D00B15929 /* JackNetUnixSocket.h in Headers */,
+				4BDCDBDC1001FD2D00B15929 /* JackArgParser.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -3910,6 +3907,7 @@
 			files = (
 				4BDCDBEE1001FD7300B15929 /* JackAudioAdapter.h in Headers */,
 				4BDCDBEF1001FD7300B15929 /* JackAudioAdapterInterface.h in Headers */,
+				4BDCDBF01001FD7300B15929 /* JackException.h in Headers */,
 				4BDCDBF11001FD7300B15929 /* JackLibSampleRateResampler.h in Headers */,
 				4BDCDBF21001FD7300B15929 /* JackCoreAudioAdapter.h in Headers */,
 			);
@@ -3920,9 +3918,12 @@
 			buildActionMask = 2147483647;
 			files = (
 				4BDCDC111001FDE300B15929 /* JackAudioAdapterInterface.h in Headers */,
+				4BDCDC121001FDE300B15929 /* JackException.h in Headers */,
 				4BDCDC131001FDE300B15929 /* JackLibSampleRateResampler.h in Headers */,
 				4BDCDC141001FDE300B15929 /* JackNetAdapter.h in Headers */,
+				4BDCDC151001FDE300B15929 /* JackNetInterface.h in Headers */,
 				4BDCDC161001FDE300B15929 /* JackAudioAdapter.h in Headers */,
+				4BDCDC171001FDE300B15929 /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -4009,6 +4010,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				BA222ADF0DC882A5001A17F4 /* JackNetDriver.h in Headers */,
+				4B76C76B0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */,
+				4BC3B6BC0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -4017,6 +4020,9 @@
 			buildActionMask = 2147483647;
 			files = (
 				BA222AEE0DC883B3001A17F4 /* JackNetManager.h in Headers */,
+				4B76C76D0E5AB2DB00E2AC21 /* JackNetInterface.h in Headers */,
+				4BC3B6BE0E703BCC0066E42F /* JackNetUnixSocket.h in Headers */,
+				4BF284190F31B4BC00B05BE3 /* JackArgParser.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -6419,8 +6425,6 @@
 				4BDCDC091001FDA800B15929 /* JackArgParser.cpp in Sources */,
 				4BCBCE6110C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */,
 				4BCBCE6310C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */,
-				4BC2CA59113C6CB60076717C /* JackNetInterface.cpp in Sources */,
-				4BC2CA5B113C6CBE0076717C /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -6747,7 +6751,9 @@
 				4B5E08CD0E5B66EE00BEE4E0 /* JackLibSampleRateResampler.cpp in Sources */,
 				4B5E08CE0E5B66EE00BEE4E0 /* JackResampler.cpp in Sources */,
 				4B5E08E10E5B676C00BEE4E0 /* JackNetAdapter.cpp in Sources */,
+				4B5E08EB0E5B67EA00BEE4E0 /* JackNetInterface.cpp in Sources */,
 				4B5E08EE0E5B680200BEE4E0 /* JackAudioAdapter.cpp in Sources */,
+				4BC3B6BF0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -6857,8 +6863,6 @@
 				4BF339230F8B873E0080FB5B /* JackMidiDriver.cpp in Sources */,
 				4BCBCE5D10C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */,
 				4BCBCE5F10C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */,
-				4BC2CA55113C6C930076717C /* JackNetInterface.cpp in Sources */,
-				4BC2CA57113C6C9B0076717C /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -7039,8 +7043,6 @@
 				4BA339A410B2E36800190E3B /* JackArgParser.cpp in Sources */,
 				4BCBCE6510C4FE3F00450FFE /* JackPhysicalMidiInput.cpp in Sources */,
 				4BCBCE6710C4FE3F00450FFE /* JackPhysicalMidiOutput.cpp in Sources */,
-				4BC2CA5D113C6CC90076717C /* JackNetInterface.cpp in Sources */,
-				4BC2CA5F113C6CD10076717C /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -7089,6 +7091,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				4BDCDBBD1001FCC000B15929 /* JackNetDriver.cpp in Sources */,
+				4BDCDBBE1001FCC000B15929 /* JackNetInterface.cpp in Sources */,
+				4BDCDBBF1001FCC000B15929 /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -7097,6 +7101,10 @@
 			buildActionMask = 2147483647;
 			files = (
 				4BDCDBDE1001FD2D00B15929 /* JackNetManager.cpp in Sources */,
+				4BDCDBDF1001FD2D00B15929 /* JackNetInterface.cpp in Sources */,
+				4BDCDBE01001FD2D00B15929 /* JackNetUnixSocket.cpp in Sources */,
+				4BDCDBE11001FD2D00B15929 /* JackMachTime.c in Sources */,
+				4BDCDBE21001FD2D00B15929 /* JackArgParser.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -7121,7 +7129,9 @@
 				4BDCDC1A1001FDE300B15929 /* JackLibSampleRateResampler.cpp in Sources */,
 				4BDCDC1B1001FDE300B15929 /* JackResampler.cpp in Sources */,
 				4BDCDC1C1001FDE300B15929 /* JackNetAdapter.cpp in Sources */,
+				4BDCDC1D1001FDE300B15929 /* JackNetInterface.cpp in Sources */,
 				4BDCDC1E1001FDE300B15929 /* JackAudioAdapter.cpp in Sources */,
+				4BDCDC1F1001FDE300B15929 /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -7218,6 +7228,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				BA222ADE0DC882A5001A17F4 /* JackNetDriver.cpp in Sources */,
+				4B76C76A0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */,
+				4BC3B6BB0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -7226,6 +7238,10 @@
 			buildActionMask = 2147483647;
 			files = (
 				BA222AED0DC883B3001A17F4 /* JackNetManager.cpp in Sources */,
+				4B76C76C0E5AB2DB00E2AC21 /* JackNetInterface.cpp in Sources */,
+				4BC3B6BD0E703BCC0066E42F /* JackNetUnixSocket.cpp in Sources */,
+				4BF5FBC90E878D24003D2374 /* JackMachTime.c in Sources */,
+				4BF284180F31B4BC00B05BE3 /* JackArgParser.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/macosx/coreaudio/JackCoreAudioAdapter.cpp b/macosx/coreaudio/JackCoreAudioAdapter.cpp
index 8e25b58..cb05d62 100644
--- a/macosx/coreaudio/JackCoreAudioAdapter.cpp
+++ b/macosx/coreaudio/JackCoreAudioAdapter.cpp
@@ -545,23 +545,10 @@ int JackCoreAudioAdapter::SetupDevices(const char* capture_driver_uid,
         
             // Creates aggregate device
             AudioDeviceID captureID, playbackID;
-            
-            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
-                jack_log("Will take default input");
-                if (GetDefaultInputDevice(&captureID) != noErr) {
-                    jack_error("Cannot open default input device");
-                    return -1;
-                }
-            }
-            
-            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
-                jack_log("Will take default output");
-                if (GetDefaultOutputDevice(&playbackID) != noErr) {
-                    jack_error("Cannot open default output device");
-                    return -1;
-                }
-            }
-            
+            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr)
+                return -1;
+            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) 
+                return -1;
             if (CreateAggregateDevice(captureID, playbackID, samplerate, &fDeviceID) != noErr)
                 return -1;
         }
@@ -571,7 +558,7 @@ int JackCoreAudioAdapter::SetupDevices(const char* capture_driver_uid,
         jack_log("JackCoreAudioAdapter::Open capture only");
         if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) {
             if (GetDefaultInputDevice(&fDeviceID) != noErr) {
-                jack_error("Cannot open default input device");
+                jack_error("Cannot open default device");
                 return -1;
             }
         }
@@ -585,7 +572,7 @@ int JackCoreAudioAdapter::SetupDevices(const char* capture_driver_uid,
         jack_log("JackCoreAudioAdapter::Open playback only");
         if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) {
             if (GetDefaultOutputDevice(&fDeviceID) != noErr) {
-                jack_error("Cannot open default output device");
+                jack_error("Cannot open default device");
                 return -1;
             }
         }
@@ -596,31 +583,14 @@ int JackCoreAudioAdapter::SetupDevices(const char* capture_driver_uid,
 
     // Use default driver in duplex mode
     } else {
-        jack_log("JackCoreAudioDriver::Open default driver");
+        jack_log("JackCoreAudioAdapter::Open default driver");
         if (GetDefaultDevice(&fDeviceID) != noErr) {
-            jack_error("Cannot open default device in duplex mode, so aggregate default input and default output");
-            
-            // Creates aggregate device
-            AudioDeviceID captureID, playbackID;
-            
-            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
-                jack_log("Will take default input");
-                if (GetDefaultInputDevice(&captureID) != noErr) {
-                    jack_error("Cannot open default input device");
-                    return -1;
-                }
-            }
-            
-            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
-                jack_log("Will take default output");
-                if (GetDefaultOutputDevice(&playbackID) != noErr) {
-                    jack_error("Cannot open default output device");
-                    return -1;
-                }
-            }
-            
-            if (CreateAggregateDevice(captureID, playbackID, samplerate, &fDeviceID) != noErr)
-                return -1;
+            jack_error("Cannot open default device");
+            return -1;
+        }
+        if (GetDeviceNameFromID(fDeviceID, capture_driver_name) != noErr || GetDeviceNameFromID(fDeviceID, playback_driver_name) != noErr) {
+            jack_error("Cannot get device name from device ID");
+            return -1;
         }
     }
 
diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp
index f4b2478..2441375 100644
--- a/macosx/coreaudio/JackCoreAudioDriver.cpp
+++ b/macosx/coreaudio/JackCoreAudioDriver.cpp
@@ -922,7 +922,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
             if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
                 jack_log("Will take default input");
                 if (GetDefaultInputDevice(&captureID) != noErr) {
-                    jack_error("Cannot open default input device");
+                    jack_error("Cannot open default device");
                     return -1;
                 }
             }
@@ -930,7 +930,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
             if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
                 jack_log("Will take default output");
                 if (GetDefaultOutputDevice(&playbackID) != noErr) {
-                    jack_error("Cannot open default output device");
+                    jack_error("Cannot open default device");
                     return -1;
                 }
             }
@@ -945,7 +945,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
         if (GetDeviceIDFromUID(capture_driver_uid, &fDeviceID) != noErr) {
             jack_log("Will take default input");
             if (GetDefaultInputDevice(&fDeviceID) != noErr) {
-                jack_error("Cannot open default input device");
+                jack_error("Cannot open default device");
                 return -1;
             }
         }
@@ -960,7 +960,7 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
         if (GetDeviceIDFromUID(playback_driver_uid, &fDeviceID) != noErr) {
             jack_log("Will take default output");
             if (GetDefaultOutputDevice(&fDeviceID) != noErr) {
-                jack_error("Cannot open default output device");
+                jack_error("Cannot open default device");
                 return -1;
             }
         }
@@ -973,29 +973,12 @@ int JackCoreAudioDriver::SetupDevices(const char* capture_driver_uid,
     } else {
         jack_log("JackCoreAudioDriver::Open default driver");
         if (GetDefaultDevice(&fDeviceID) != noErr) {
-            jack_error("Cannot open default device in duplex mode, so aggregate default input and default output");
-            
-            // Creates aggregate device
-            AudioDeviceID captureID, playbackID;
-            
-            if (GetDeviceIDFromUID(capture_driver_uid, &captureID) != noErr) {
-                jack_log("Will take default input");
-                if (GetDefaultInputDevice(&captureID) != noErr) {
-                    jack_error("Cannot open default input device");
-                    return -1;
-                }
-            }
-            
-            if (GetDeviceIDFromUID(playback_driver_uid, &playbackID) != noErr) {
-                jack_log("Will take default output");
-                if (GetDefaultOutputDevice(&playbackID) != noErr) {
-                    jack_error("Cannot open default output device");
-                    return -1;
-                }
-            }
-            
-            if (CreateAggregateDevice(captureID, playbackID, samplerate, &fDeviceID) != noErr)
-                return -1;
+            jack_error("Cannot open default device");
+            return -1;
+        }
+        if (GetDeviceNameFromID(fDeviceID, capture_driver_name) != noErr || GetDeviceNameFromID(fDeviceID, playback_driver_name) != noErr) {
+            jack_error("Cannot get device name from device ID");
+            return -1;
         }
     }
     
@@ -2002,8 +1985,8 @@ extern "C"
             switch (param->character) {
 
                 case 'd':
-                    capture_driver_uid = param->value.str;
-                    playback_driver_uid = param->value.str;
+                    capture_driver_uid = strdup(param->value.str);
+                    playback_driver_uid = strdup(param->value.str);
                     break;
 
                 case 'D':
@@ -2026,14 +2009,14 @@ extern "C"
                 case 'C':
                     capture = true;
                     if (strcmp(param->value.str, "none") != 0) {
-                        capture_driver_uid = param->value.str;
+                        capture_driver_uid = strdup(param->value.str);
                     }
                     break;
 
                 case 'P':
                     playback = true;
                     if (strcmp(param->value.str, "none") != 0) {
-                        playback_driver_uid = param->value.str;
+                        playback_driver_uid = strdup(param->value.str);
                     }
                     break;
 
diff --git a/posix/JackNetUnixSocket.cpp b/posix/JackNetUnixSocket.cpp
index d110c5c..7649ca8 100644
--- a/posix/JackNetUnixSocket.cpp
+++ b/posix/JackNetUnixSocket.cpp
@@ -99,13 +99,6 @@ namespace Jack
             Reset();
         }
         fSockfd = socket ( AF_INET, SOCK_DGRAM, 0 );
-        
-        /* Enable address reuse */
-        int res, on = 1;
-        if ((res = setsockopt( fSockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0) {
-            StrError(NET_ERROR_CODE);
-        }
-            
         return fSockfd;
     }
 
diff --git a/solaris/oss/JackBoomerDriver.cpp b/solaris/oss/JackBoomerDriver.cpp
index f10b2e8..2505632 100644
--- a/solaris/oss/JackBoomerDriver.cpp
+++ b/solaris/oss/JackBoomerDriver.cpp
@@ -985,20 +985,20 @@ EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine
         case 'C':
             capture = true;
             if (strcmp(param->value.str, "none") != 0) {
-                capture_pcm_name = param->value.str;
+                capture_pcm_name = strdup(param->value.str);
             }
             break;
 
         case 'P':
             playback = true;
             if (strcmp(param->value.str, "none") != 0) {
-                playback_pcm_name = param->value.str;
+                playback_pcm_name = strdup(param->value.str);
             }
             break;
 
         case 'd':
-            playback_pcm_name = param->value.str;
-            capture_pcm_name = param->value.str;
+            playback_pcm_name = strdup (param->value.str);
+            capture_pcm_name = strdup (param->value.str);
             break;
             
         case 'e':
diff --git a/solaris/oss/JackOSSDriver.cpp b/solaris/oss/JackOSSDriver.cpp
index 7890f6a..af0ed43 100644
--- a/solaris/oss/JackOSSDriver.cpp
+++ b/solaris/oss/JackOSSDriver.cpp
@@ -904,20 +904,20 @@ EXPORT Jack::JackDriverClientInterface* driver_initialize(Jack::JackLockedEngine
         case 'C':
             capture = true;
             if (strcmp(param->value.str, "none") != 0) {
-                capture_pcm_name = param->value.str;
+                capture_pcm_name = strdup(param->value.str);
             }
             break;
 
         case 'P':
             playback = true;
             if (strcmp(param->value.str, "none") != 0) {
-                playback_pcm_name = param->value.str;
+                playback_pcm_name = strdup(param->value.str);
             }
             break;
 
         case 'd':
-            playback_pcm_name = param->value.str;
-            capture_pcm_name = param->value.str;
+            playback_pcm_name = strdup (param->value.str);
+            capture_pcm_name = strdup (param->value.str);
             break;
     
         case 'b':
diff --git a/svnversion.h b/svnversion.h
new file mode 100644
index 0000000..30125b6
--- /dev/null
+++ b/svnversion.h
@@ -0,0 +1 @@
+#define SVN_VERSION "3909"
diff --git a/svnversion_regenerate.sh b/svnversion_regenerate.sh
deleted file mode 100755
index f98f977..0000000
--- a/svnversion_regenerate.sh
+++ /dev/null
@@ -1,70 +0,0 @@
-#!/bin/bash
-
-#set -x
-
-if test $# -ne 1 -a $# -ne 2
-then
-  echo "Usage: "`basename "$0"`" <file> [define_name]"
-  exit 1
-fi
-
-OUTPUT_FILE="`pwd`/${1}"
-TEMP_FILE="${OUTPUT_FILE}.tmp"
-
-#echo svnversion...
-#pwd
-#echo $OUTPUT_FILE
-#echo $TEMP_FILE
-
-OLDPWD=`pwd`
-cd ..
-
-if test $# -eq 2
-then
-  DEFINE=${2}
-else
-  DEFINE=SVN_VERSION
-fi
-
-if test -d .svn
-then
-  REV=`svnversion 2> /dev/null`
-else
-  if test -d .git
-  then
-    git status >/dev/null # updates dirty state
-    REV=`git show | grep '^ *git-svn-id:' | sed 's/.*@\([0-9]*\) .*/\1/'`
-    if test ${REV}
-    then
-      test -z "$(git diff-index --name-only HEAD)" || REV="${REV}M"
-    else
-      REV=0+`git rev-parse HEAD`
-      test -z "$(git diff-index --name-only HEAD)" || REV="${REV}-dirty"
-    fi
-  fi
-fi
-
-if test -z ${REV}
-then
-  REV="unknown"
-fi
-
-echo "#define ${DEFINE} \"${REV}\"" > ${TEMP_FILE}
-if test ! -f ${OUTPUT_FILE}
-then
-  echo "Generated ${OUTPUT_FILE} (${REV})"
-  cp ${TEMP_FILE} ${OUTPUT_FILE}
-  if test $? -ne 0; then exit 1; fi
-else
-  if ! cmp -s ${OUTPUT_FILE} ${TEMP_FILE}
-  then echo "Regenerated ${OUTPUT_FILE} (${REV})"
-    cp ${TEMP_FILE} ${OUTPUT_FILE}
-    if test $? -ne 0; then exit 1; fi
-  fi
-fi
-
-cd "${OLDPWD}"
-
-rm ${TEMP_FILE}
-
-exit $?
diff --git a/tests/external_metro.cpp b/tests/external_metro.cpp
index 6ca8bc9..25600eb 100644
--- a/tests/external_metro.cpp
+++ b/tests/external_metro.cpp
@@ -60,6 +60,7 @@ ExternalMetro::ExternalMetro(int freq, double max_amp, int dur_arg, int bpm, con
 {
     sample_t scale;
     int i, attack_length, decay_length;
+    double *amp;
     int attack_percent = 1, decay_percent = 10;
     const char *bpm_string = "bpm";
     jack_options_t options = JackNullOption;
@@ -130,8 +131,6 @@ ExternalMetro::~ExternalMetro()
     jack_port_unregister(client, input_port);
     jack_port_unregister(client, output_port);
     jack_client_close(client);
-    free(amp);
-    free(wave);
 }
 
 int main (int argc, char *argv[])
diff --git a/tests/external_metro.h b/tests/external_metro.h
index 8c61841..e0bcc18 100644
--- a/tests/external_metro.h
+++ b/tests/external_metro.h
@@ -53,7 +53,6 @@ extern "C"
         int bpm;
         jack_nframes_t tone_length, wave_length;
         sample_t *wave;
-        double *amp;
         long offset ;
 
         ExternalMetro(int freq, double max_amp, int dur_arg, int bpm, const char* client_name = "metro");
diff --git a/windows/JackCompilerDeps_os.h b/windows/JackCompilerDeps_os.h
index 75cbc50..858cbd8 100644
--- a/windows/JackCompilerDeps_os.h
+++ b/windows/JackCompilerDeps_os.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2005 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackCompilerDeps_WIN32__
 #define __JackCompilerDeps_WIN32__
diff --git a/windows/JackNetWinSocket.cpp b/windows/JackNetWinSocket.cpp
index adf8a43..94390b4 100644
--- a/windows/JackNetWinSocket.cpp
+++ b/windows/JackNetWinSocket.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2008 Romain Moret at Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackNetWinSocket.h"
 
diff --git a/windows/JackNetWinSocket.h b/windows/JackNetWinSocket.h
index bd303ef..21ad275 100644
--- a/windows/JackNetWinSocket.h
+++ b/windows/JackNetWinSocket.h
@@ -1,21 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2008 Romain Moret at Grame
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackNetWinSocket__
 #define __JackNetWinSocket__
diff --git a/windows/JackPlatformPlug_os.h b/windows/JackPlatformPlug_os.h
index 87c2e40..536a601 100644
--- a/windows/JackPlatformPlug_os.h
+++ b/windows/JackPlatformPlug_os.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2008 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software 
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #ifndef __JackPlatformPlug_WIN32__
 #define __JackPlatformPlug_WIN32__
diff --git a/windows/JackShmMem_os.h b/windows/JackShmMem_os.h
index 31c9a05..37a419f 100644
--- a/windows/JackShmMem_os.h
+++ b/windows/JackShmMem_os.h
@@ -1,28 +1,28 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2008 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackShmMem_WIN32__
 #define __JackShmMem_WIN32__
 
-#include <windows.h>
-
+#include <windows.h>
+
 // See GetProcessWorkingSetSize and SetProcessWorkingSetSize
 
 #define CHECK_MLOCK(ptr, size) (VirtualLock((ptr), (size)) != 0)
diff --git a/windows/JackSystemDeps_os.h b/windows/JackSystemDeps_os.h
index cf64509..69b842b 100644
--- a/windows/JackSystemDeps_os.h
+++ b/windows/JackSystemDeps_os.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackSystemDeps_WIN32__
 #define __JackSystemDeps_WIN32__
diff --git a/windows/JackTypes_os.h b/windows/JackTypes_os.h
index 6551378..13e6734 100644
--- a/windows/JackTypes_os.h
+++ b/windows/JackTypes_os.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+  Copyright (C) 2001 Paul Davis
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #ifndef __JackTypes_WIN32__
 #define __JackTypes_WIN32__
diff --git a/windows/JackWinEvent.cpp b/windows/JackWinEvent.cpp
index be5ff65..c64fcf9 100644
--- a/windows/JackWinEvent.cpp
+++ b/windows/JackWinEvent.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2005 Grame
 
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackWinEvent.h"
 #include "JackTools.h"
diff --git a/windows/JackWinEvent.h b/windows/JackWinEvent.h
index 379c4c6..35fcb2f 100644
--- a/windows/JackWinEvent.h
+++ b/windows/JackWinEvent.h
@@ -1,21 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2005 Grame
+
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackWinEvent__
 #define __JackWinEvent__
diff --git a/windows/JackWinMutex.h b/windows/JackWinMutex.h
index 480f898..55434ac 100644
--- a/windows/JackWinMutex.h
+++ b/windows/JackWinMutex.h
@@ -1,22 +1,23 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
+ Copyright (C) 2006 Grame
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ Lesser General Public License for more details.
 
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+ Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France
+ grame at grame.fr
+*/
 
 #ifndef __JackWinMutex__
 #define __JackWinMutex__
diff --git a/windows/JackWinNamedPipe.cpp b/windows/JackWinNamedPipe.cpp
index 9d067cd..d332905 100644
--- a/windows/JackWinNamedPipe.cpp
+++ b/windows/JackWinNamedPipe.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackWinNamedPipe.h"
 #include "JackError.h"
diff --git a/windows/JackWinNamedPipe.h b/windows/JackWinNamedPipe.h
index 6487d4b..864b6c9 100644
--- a/windows/JackWinNamedPipe.h
+++ b/windows/JackWinNamedPipe.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackWinNamedPipe__
 #define __JackWinNamedPipe__
diff --git a/windows/JackWinNamedPipeClientChannel.cpp b/windows/JackWinNamedPipeClientChannel.cpp
index 9b3e247..fedc109 100644
--- a/windows/JackWinNamedPipeClientChannel.cpp
+++ b/windows/JackWinNamedPipeClientChannel.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #include "JackWinNamedPipeClientChannel.h"
 #include "JackRequest.h"
diff --git a/windows/JackWinNamedPipeClientChannel.h b/windows/JackWinNamedPipeClientChannel.h
index fc5617e..32bf6a5 100644
--- a/windows/JackWinNamedPipeClientChannel.h
+++ b/windows/JackWinNamedPipeClientChannel.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #ifndef __JackWinNamedPipeClientChannel__
 #define __JackWinNamedPipeClientChannel__
diff --git a/windows/JackWinNamedPipeNotifyChannel.cpp b/windows/JackWinNamedPipeNotifyChannel.cpp
index 1c559d8..a737508 100644
--- a/windows/JackWinNamedPipeNotifyChannel.cpp
+++ b/windows/JackWinNamedPipeNotifyChannel.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #include "JackRequest.h"
 #include "JackWinNamedPipeNotifyChannel.h"
diff --git a/windows/JackWinNamedPipeNotifyChannel.h b/windows/JackWinNamedPipeNotifyChannel.h
index d11b17a..9d90e26 100644
--- a/windows/JackWinNamedPipeNotifyChannel.h
+++ b/windows/JackWinNamedPipeNotifyChannel.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #ifndef __JackWinNamedPipeNotifyChannel__
 #define __JackWinNamedPipeNotifyChannel__
diff --git a/windows/JackWinNamedPipeServerChannel.cpp b/windows/JackWinNamedPipeServerChannel.cpp
index a8ce3a2..3e6daa9 100644
--- a/windows/JackWinNamedPipeServerChannel.cpp
+++ b/windows/JackWinNamedPipeServerChannel.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
+Copyright (C) 2004-2006 Grame
 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
+*/
 
 #include "JackWinNamedPipeServerChannel.h"
 #include "JackNotification.h"
@@ -74,7 +73,7 @@ void JackClientPipeThread::Close()					// Close the Server/Client connection
     	all ressources will be desallocated at the end.
     */
 
-    fThread.Kill();
+    fThread.Stop();
     fPipe->Close();
     fRefNum = -1;
 }
diff --git a/windows/JackWinNamedPipeServerChannel.h b/windows/JackWinNamedPipeServerChannel.h
index 21fad16..7404f04 100644
--- a/windows/JackWinNamedPipeServerChannel.h
+++ b/windows/JackWinNamedPipeServerChannel.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #ifndef __JackWinNamedPipeServerChannel__
 #define __JackWinNamedPipeServerChannel__
diff --git a/windows/JackWinNamedPipeServerNotifyChannel.h b/windows/JackWinNamedPipeServerNotifyChannel.h
index ae706fc..be4d7ff 100644
--- a/windows/JackWinNamedPipeServerNotifyChannel.h
+++ b/windows/JackWinNamedPipeServerNotifyChannel.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published by
+  the Free Software Foundation; either version 2.1 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #ifndef __JackWinNamedPipeServerNotifyChannel__
 #define __JackWinNamedPipeServerNotifyChannel__
diff --git a/windows/JackWinProcessSync.cpp b/windows/JackWinProcessSync.cpp
index 12dbcdc..56171fb 100644
--- a/windows/JackWinProcessSync.cpp
+++ b/windows/JackWinProcessSync.cpp
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackWinProcessSync.h"
 #include "JackError.h"
diff --git a/windows/JackWinProcessSync.h b/windows/JackWinProcessSync.h
index fd6d3d7..33a340c 100644
--- a/windows/JackWinProcessSync.h
+++ b/windows/JackWinProcessSync.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackWinProcessSync__
 #define __JackWinProcessSync__
diff --git a/windows/JackWinSemaphore.cpp b/windows/JackWinSemaphore.cpp
index 4500b10..8ce52d6 100644
--- a/windows/JackWinSemaphore.cpp
+++ b/windows/JackWinSemaphore.cpp
@@ -1,21 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2005 Grame
+
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackWinSemaphore.h"
 #include "JackConstants.h"
diff --git a/windows/JackWinSemaphore.h b/windows/JackWinSemaphore.h
index 0477969..d4330e5 100644
--- a/windows/JackWinSemaphore.h
+++ b/windows/JackWinSemaphore.h
@@ -1,22 +1,21 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2004-2005 Grame
 
+This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #ifndef __JackWinSemaphore__
 #define __JackWinSemaphore__
diff --git a/windows/JackWinThread.cpp b/windows/JackWinThread.cpp
index 99aed2f..3893d22 100644
--- a/windows/JackWinThread.cpp
+++ b/windows/JackWinThread.cpp
@@ -1,22 +1,22 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 #include "JackWinThread.h"
 #include "JackError.h"
diff --git a/windows/JackWinThread.h b/windows/JackWinThread.h
index 7bb745b..a3a5a25 100644
--- a/windows/JackWinThread.h
+++ b/windows/JackWinThread.h
@@ -1,22 +1,22 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2001 Paul Davis
+Copyright (C) 2004-2006 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
 
 
 #ifndef __JackWinThread__
diff --git a/windows/JackWinTime.c b/windows/JackWinTime.c
index 065ea9f..bd95080 100644
--- a/windows/JackWinTime.c
+++ b/windows/JackWinTime.c
@@ -1,22 +1,22 @@
 /*
- Copyright (C) 2004-2008 Grame
- 
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
- 
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- GNU Lesser General Public License for more details.
- 
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- 
- */
+Copyright (C) 2001-2003 Paul Davis
+Copyright (C) 2004-2008 Grame
 
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
 
 #include "JackTime.h"
 
diff --git a/windows/README b/windows/README
index 9653665..f7cbebb 100644
--- a/windows/README
+++ b/windows/README
@@ -1,35 +1,32 @@
 -------------------------------
-JACK2 on Windows
+Jackmp on Windows
 -------------------------------
 
 This folder contains all the windows specific sources.
 You will also find two sets of files :
-- VisualC++6 workspace and project files, in order to compile JACK with MSVC
-- Code::Blocks (8.02) workspace and project files, in order to compile JACK with MingW
+- VisualC++6 workspace and project files, in order to compile Jack with MSVC
+- Code::Blocks (8.02) workspace and project files, in order to compile Jack with MingW
 
 The built binaries will be located in '/Release/bin' (or '/Debug/bin' if you build the Debug target). Once compiled, you'll find there everything you need :
 - the two 'libjackmp.dll' and 'libjackservermp.dll', client and server jack libraries
-- the 'jackdmp.exe', main application : the JACK server
+- the 'jackdmp.exe', main application : the jack server
 - the 'jack_xxx.exe' utilities and examples
-- in the jackmp directory, you'll find the driver's DLL's ('jack_portaudio.dll' and 'jack_netdriver.dll') and some tools ('netmanager.dll', 'audioadapter.dll', 'netadapter.dll' for example)
+- in the jackmp directory, you'll find the driver's DLL's ('jack_portaudio.dll' and 'jack_netdriver.dll') and some tools ( 'netmanager.dll', 'audioadapter.dll', 'netadapter.dll' for example )
 
 In Code::Blocks all the projects are automatically built in a correct order (dll's then apps) by doing 'build->build workspace'.
 In VC6, you'll have to build the projects one by one.
 
-The needed regexp library TRE can be found here http://laurikari.net/tre/. Unzip and place the "tre-0.8.0" folder into the "windows" folder. 
-Then edit and comment "#define snprintf sprintf_s" at the end off the "tre-0.8.0/win32/config.h" file before building the JACK project.
-
 -------------------------------
 Notes about VC and GCC versions
 -------------------------------
 
-The Visual Studio workspace is limited to VC6. JACK will not compile on most recent MSVC's. The fact is recent compilers (MSVC7, 8 or 9) don't agree with some of the JACK sources.
-But now you can compile JACK using GCC, with MingW.
+The Visual Studio workspace is limited to VC6. Jack will not compile on most recent MSVC's. The fact is recent compilers (MSVC7, 8 or 9) don't agree with some of the Jack sources.
+But now you can compile Jack using GCC, with MingW.
 The project is actually organized in a Code::Blocks workspace. This is a simple and efficient way to compile the whole project.
 
-But for some reasons, you need to compile JACK using a SJLJ version of G++ (available on MingW website).
+But for some reasons, you need to compile Jack using a SJLJ version of G++ (available on MingW website).
 Current GCC/G++ version (3.4.5) doesn't includes SJLJ so you'll have to use another one.
-JACK needs the use of SJLJ exceptions instead of DW2 because exceptions are exchanged between DLL's, and DW2 does not allow to throw an exception out of a DLL, so it wouldn't be cought.
+Jack needs the use of SJLJ exceptions instead of DW2 because exceptions are exchanged between DLL's, and DW2 does not allow to throw an exception out of a DLL, so it wouldn't be cought.
 
 The ressources files has been created with ResEdit (ANSI build). VisualStudio uses 'ressource.rc' and 'ressource_vc.h'. The other files are used by MingW.
 
@@ -37,19 +34,20 @@ You can make a small installer ('setup.exe') with CreateInstallFree, a little fr
 A binary version of qjackctl is also included.
 
 -------------------------------
-Running JACK on Windows
+Running Jack on Windows
 -------------------------------
 
 You can use two drivers : PortAudio and NetDriver.
 The PortAudio backend allow the use of many soundcards, using ASIO, DirectSound or WMME drivers (any ASIO driver can be seen by PortAudio).
 The NetDriver allow you to use NetJack2 on windows. Thus you can easily exchange midi and audio streams bitween computers (Linux, MacOSX or Windows).
 In both cases, you have to use the minimalist :
-    'jackd -R -d ...' command. With PortAudio, you can have a list of supported drivers with :
+    'jackd -R -d ...'
+        command. With PortAudio, you can have a list of supported drivers with :
     'jackd -R -S -d portaudio -l'
 
 Other options still stay the same.
-You can also pick a binary of Qjackctl, but this is still in development.
-
+You can also pick a binary of Qjackctl, but this is still in development.
+
 -------------------------------
 Running Jack on windows
 -------------------------------
@@ -57,4 +55,4 @@ Running Jack on windows
 More information at : 'http://www.grame.fr/~letz/jackdmp.html'.
 
 For any question or suggestion, you can refer to the mailing list 'jack-devel at jackaudio.org'
-Enjoy JACK on windows... ;-)
+Enjoy Jack on windows... ;-)
diff --git a/windows/Setup/jack.ci b/windows/Setup/jack.ci
index df6e387..2523339 100644
--- a/windows/Setup/jack.ci
+++ b/windows/Setup/jack.ci
@@ -1,9 +1,9 @@
 <*project
       version = 4 civer = "Free v4.14.5" winver = "2.6/5.1.2600" > 
    <output> .</>
-   <exename> Jack_v1.9.6_setup.exe</>
+   <exename> Jack_v1.9.5_setup.exe</>
    <digitsign> </>
-   <appname> Jack v1.9.6</>
+   <appname> Jack v1.9.5</>
    <password> </>
    <addlang> </>
    <icon> Default - 2</>
@@ -92,8 +92,6 @@
 <_><src>..\..\common\jack\transport.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>0</></>
 <_><src>..\..\common\jack\types.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>0</></>
 <_><src>..\..\common\jack\systemdeps.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>1</></>
-<_><src>..\..\common\jack\weakjack.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>1</></>
-<_><src>..\..\common\jack\weakmacros.h</><dest>inst</><custom>includes\jack</><ifexist>overnewer</><recurs>1</></>
 <_><src>.\JackRouter.dll</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
 <_><src>.\JackRouter.ini</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
 <_><src>.\qjackctl\mingwm10.dll</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
diff --git a/windows/jackaudioadapter.rc b/windows/jackaudioadapter.rc
index aa57cf8..25d4b15 100644
--- a/windows/jackaudioadapter.rc
+++ b/windows/jackaudioadapter.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp Audio Adapter for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "audioadapter\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "audioadapter.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "audioadapter\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/jackd.rc b/windows/jackd.rc
index acdd050..db62e72 100644
--- a/windows/jackd.rc
+++ b/windows/jackd.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_APP
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jack server for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "jackd\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "jackd.exe\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "jackd\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/jackd.workspace b/windows/jackd.workspace
index e907e7e..2e5823e 100644
--- a/windows/jackd.workspace
+++ b/windows/jackd.workspace
@@ -20,7 +20,7 @@
 		<Project filename="jack_netmanager.cbp">
 			<Depends filename="libjackserver.cbp" />
 		</Project>
-		<Project filename="jack_audioadapter.cbp" active="1">
+		<Project filename="jack_audioadapter.cbp">
 			<Depends filename="libjackserver.cbp" />
 		</Project>
 		<Project filename="jack_netadapter.cbp">
@@ -36,7 +36,7 @@
 		<Project filename="jack_lsp.cbp">
 			<Depends filename="libjack.cbp" />
 		</Project>
-		<Project filename="jack_netsource.cbp">
+		<Project filename="jack_netsource.cbp" active="1">
 			<Depends filename="libjack.cbp" />
 			<Depends filename="jack_netonedriver.cbp" />
 		</Project>
diff --git a/windows/jacknetadapter.rc b/windows/jacknetadapter.rc
index 415b9fb..7488ea9 100644
--- a/windows/jacknetadapter.rc
+++ b/windows/jacknetadapter.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp Net Adapter for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "netadapter\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "netadapter.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "netadapter\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/jacknetdriver.rc b/windows/jacknetdriver.rc
index a1157d1..a98f2fc 100644
--- a/windows/jacknetdriver.rc
+++ b/windows/jacknetdriver.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp Net Driver for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "jack_netdriver\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "jack_netdriver.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "jack_netdriver\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/jacknetmanager.rc b/windows/jacknetmanager.rc
index f417048..c440861 100644
--- a/windows/jacknetmanager.rc
+++ b/windows/jacknetmanager.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp Net Manager for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "netmanager\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "netmanager.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "netmanager\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/jackportaudio.rc b/windows/jackportaudio.rc
index df29233..2c4e66d 100644
--- a/windows/jackportaudio.rc
+++ b/windows/jackportaudio.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp PortAudio Driver for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "jack_portaudio\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "jack_portaudio.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "jack_portaudio\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/jackwinmme.rc b/windows/jackwinmme.rc
index a11da0d..6d8e19f 100644
--- a/windows/jackwinmme.rc
+++ b/windows/jackwinmme.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp WinMMEo Driver for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "jack_portaudio\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "jack_winmme.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "jack_winmme\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/libjack.cbp b/windows/libjack.cbp
index 41a7188..6c1e5ba 100644
--- a/windows/libjack.cbp
+++ b/windows/libjack.cbp
@@ -25,13 +25,10 @@
 					<Add option="-DREGEX_MALLOC" />
 					<Add option="-DSTDC_HEADERS" />
 					<Add option="-D__SMP__" />
-					<Add option="-DHAVE_CONFIG_H" />
 					<Add directory="." />
 					<Add directory="..\windows" />
 					<Add directory="..\common\jack" />
 					<Add directory="..\common" />
-					<Add directory="tre-0.8.0\win32" />
-					<Add directory="tre-0.8.0\lib" />
 				</Compiler>
 				<Linker>
 					<Add library="kernel32" />
@@ -67,13 +64,10 @@
 					<Add option="-DREGEX_MALLOC" />
 					<Add option="-DSTDC_HEADERS" />
 					<Add option="-D__SMP__" />
-					<Add option="-DHAVE_CONFIG_H" />
 					<Add directory="." />
 					<Add directory="..\windows" />
 					<Add directory="..\common\jack" />
 					<Add directory="..\common" />
-					<Add directory="tre-0.8.0\win32" />
-					<Add directory="tre-0.8.0\lib" />
 				</Compiler>
 				<Linker>
 					<Add library="kernel32" />
@@ -110,13 +104,10 @@
 					<Add option="-DSTDC_HEADERS" />
 					<Add option="-D__SMP__" />
 					<Add option="-DJACK_MONITOR" />
-					<Add option="-DHAVE_CONFIG_H" />
 					<Add directory="." />
 					<Add directory="..\windows" />
 					<Add directory="..\common\jack" />
 					<Add directory="..\common" />
-					<Add directory="tre-0.8.0\win32" />
-					<Add directory="tre-0.8.0\lib" />
 				</Compiler>
 				<Linker>
 					<Add library="kernel32" />
@@ -189,52 +180,9 @@
 		<Unit filename="libjack.rc">
 			<Option compilerVar="WINDRES" />
 		</Unit>
-		<Unit filename="tre-0.8.0\lib\regcomp.c">
+		<Unit filename="regex.c">
 			<Option compilerVar="CC" />
 		</Unit>
-		<Unit filename="tre-0.8.0\lib\regerror.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\regex.h" />
-		<Unit filename="tre-0.8.0\lib\regexec.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-ast.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-ast.h" />
-		<Unit filename="tre-0.8.0\lib\tre-compile.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-compile.h" />
-		<Unit filename="tre-0.8.0\lib\tre-internal.h" />
-		<Unit filename="tre-0.8.0\lib\tre-match-approx.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-match-backtrack.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-match-parallel.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-match-utils.h" />
-		<Unit filename="tre-0.8.0\lib\tre-mem.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-mem.h" />
-		<Unit filename="tre-0.8.0\lib\tre-parse.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-parse.h" />
-		<Unit filename="tre-0.8.0\lib\tre-stack.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-stack.h" />
-		<Unit filename="tre-0.8.0\lib\tre.h" />
-		<Unit filename="tre-0.8.0\lib\xmalloc.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\xmalloc.h" />
 		<Extensions>
 			<code_completion />
 			<envvars />
diff --git a/windows/libjack.rc b/windows/libjack.rc
index b24e3f0..7beda3d 100644
--- a/windows/libjack.rc
+++ b/windows/libjack.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jack client library for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "libjack\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "libjack.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "libjack\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/libjackserver.cbp b/windows/libjackserver.cbp
index e4db213..b0b76f1 100644
--- a/windows/libjackserver.cbp
+++ b/windows/libjackserver.cbp
@@ -26,13 +26,10 @@
 					<Add option="-DSTDC_HEADERS" />
 					<Add option="-DSERVER_SIDE" />
 					<Add option="-D__SMP__" />
-					<Add option="-DHAVE_CONFIG_H" />
 					<Add directory="." />
 					<Add directory="..\windows" />
 					<Add directory="..\common\jack" />
 					<Add directory="..\common" />
-					<Add directory="tre-0.8.0\win32" />
-					<Add directory="tre-0.8.0\lib" />
 				</Compiler>
 				<Linker>
 					<Add directory="Release\bin" />
@@ -58,13 +55,10 @@
 					<Add option="-DSTDC_HEADERS" />
 					<Add option="-DSERVER_SIDE" />
 					<Add option="-D__SMP__" />
-					<Add option="-DHAVE_CONFIG_H" />
 					<Add directory="." />
 					<Add directory="..\windows" />
 					<Add directory="..\common\jack" />
 					<Add directory="..\common" />
-					<Add directory="tre-0.8.0\win32" />
-					<Add directory="tre-0.8.0\lib" />
 				</Compiler>
 				<Linker>
 					<Add directory="Debug\bin" />
@@ -91,13 +85,10 @@
 					<Add option="-DSERVER_SIDE" />
 					<Add option="-D__SMP__" />
 					<Add option="-DJACK_MONITOR" />
-					<Add option="-DHAVE_CONFIG_H" />
 					<Add directory="." />
 					<Add directory="..\windows" />
 					<Add directory="..\common\jack" />
 					<Add directory="..\common" />
-					<Add directory="tre-0.8.0\win32" />
-					<Add directory="tre-0.8.0\lib" />
 				</Compiler>
 				<Linker>
 					<Add directory="Release\bin" />
@@ -154,8 +145,6 @@
 		<Unit filename="..\common\JackMidiPort.cpp" />
 		<Unit filename="..\common\JackNetInterface.cpp" />
 		<Unit filename="..\common\JackNetTool.cpp" />
-		<Unit filename="..\common\JackPhysicalMidiInput.cpp" />
-		<Unit filename="..\common\JackPhysicalMidiOutput.cpp" />
 		<Unit filename="..\common\JackPort.cpp" />
 		<Unit filename="..\common\JackPortType.cpp" />
 		<Unit filename="..\common\JackRestartThreadedDriver.cpp" />
@@ -167,6 +156,8 @@
 		<Unit filename="..\common\JackTools.cpp" />
 		<Unit filename="..\common\JackTransportEngine.cpp" />
 		<Unit filename="..\common\JackWaitThreadedDriver.cpp" />
+		<Unit filename="..\common\JackPhysicalMidiInput.cpp" />
+		<Unit filename="..\common\JackPhysicalMidiOutput.cpp" />
 		<Unit filename="..\common\ringbuffer.c">
 			<Option compilerVar="CC" />
 		</Unit>
@@ -194,52 +185,9 @@
 		<Unit filename="libjackserver.rc">
 			<Option compilerVar="WINDRES" />
 		</Unit>
-		<Unit filename="tre-0.8.0\lib\regcomp.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\regerror.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\regex.h" />
-		<Unit filename="tre-0.8.0\lib\regexec.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-ast.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-ast.h" />
-		<Unit filename="tre-0.8.0\lib\tre-compile.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-compile.h" />
-		<Unit filename="tre-0.8.0\lib\tre-internal.h" />
-		<Unit filename="tre-0.8.0\lib\tre-match-approx.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-match-backtrack.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-match-parallel.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-match-utils.h" />
-		<Unit filename="tre-0.8.0\lib\tre-mem.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-mem.h" />
-		<Unit filename="tre-0.8.0\lib\tre-parse.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-parse.h" />
-		<Unit filename="tre-0.8.0\lib\tre-stack.c">
-			<Option compilerVar="CC" />
-		</Unit>
-		<Unit filename="tre-0.8.0\lib\tre-stack.h" />
-		<Unit filename="tre-0.8.0\lib\tre.h" />
-		<Unit filename="tre-0.8.0\lib\xmalloc.c">
+		<Unit filename="regex.c">
 			<Option compilerVar="CC" />
 		</Unit>
-		<Unit filename="tre-0.8.0\lib\xmalloc.h" />
 		<Extensions>
 			<code_completion />
 			<envvars />
diff --git a/windows/libjackserver.rc b/windows/libjackserver.rc
index 6fe89a1..b62a275 100644
--- a/windows/libjackserver.rc
+++ b/windows/libjackserver.rc
@@ -11,8 +11,8 @@
 //
 LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
 1 VERSIONINFO
-    FILEVERSION     1,9,6,0
-    PRODUCTVERSION  1,9,6,0
+    FILEVERSION     1,9,5,0
+    PRODUCTVERSION  1,9,5,0
     FILEOS          VOS_UNKNOWN
     FILETYPE        VFT_DLL
 BEGIN
@@ -23,14 +23,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jack server library for Windows\0"
-            VALUE "FileVersion", "1, 9, 56, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "libjackserver\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "libjackserver.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "libjackserver\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/windows/portaudio/JackPortAudioDriver.cpp b/windows/portaudio/JackPortAudioDriver.cpp
index d910bb9..01e3d94 100644
--- a/windows/portaudio/JackPortAudioDriver.cpp
+++ b/windows/portaudio/JackPortAudioDriver.cpp
@@ -404,8 +404,8 @@ extern "C"
             {
 
             case 'd':
-                capture_pcm_name = param->value.str;
-                playback_pcm_name = param->value.str;
+                capture_pcm_name = strdup(param->value.str);
+                playback_pcm_name = strdup(param->value.str);
                 break;
 
             case 'D':
@@ -428,14 +428,14 @@ extern "C"
             case 'C':
                 capture = true;
                 if (strcmp(param->value.str, "none") != 0) {
-                    capture_pcm_name = param->value.str;
+                    capture_pcm_name = strdup(param->value.str);
                 }
                 break;
 
             case 'P':
                 playback = TRUE;
                 if (strcmp(param->value.str, "none") != 0) {
-                    playback_pcm_name = param->value.str;
+                    playback_pcm_name = strdup(param->value.str);
                 }
                 break;
 
diff --git a/windows/regex.c b/windows/regex.c
new file mode 100644
index 0000000..db61116
--- /dev/null
+++ b/windows/regex.c
@@ -0,0 +1,4949 @@
+/* Extended regular expression matching and search library,
+   version 0.12.
+   (Implements POSIX draft P10003.2/D11.2, except for
+   internationalization features.)
+
+   Copyright (C) 1993 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* AIX requires this to be the first thing in the file. */
+#if defined (_AIX) && !defined (REGEX_MALLOC)
+  #pragma alloca
+#endif
+
+#define _GNU_SOURCE
+
+/* We need this for `regex.h', and perhaps for the Emacs include files.  */
+#include <sys/types.h>
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* The `emacs' switch turns on certain matching commands
+   that make sense only in Emacs. */
+#ifdef emacs
+
+#include "lisp.h"
+#include "buffer.h"
+#include "syntax.h"
+
+/* Emacs uses `NULL' as a predicate.  */
+#undef NULL
+
+#else  /* not emacs */
+
+/* We used to test for `BSTRING' here, but only GCC and Emacs define
+   `BSTRING', as far as I know, and neither of them use this code.  */
+#if HAVE_STRING_H || STDC_HEADERS
+#include <string.h>
+#ifndef bcmp
+#define bcmp(s1, s2, n)	memcmp ((s1), (s2), (n))
+#endif
+#ifndef bcopy
+#define bcopy(s, d, n)	memcpy ((d), (s), (n))
+#endif
+#ifndef bzero
+#define bzero(s, n)	memset ((s), 0, (n))
+#endif
+#else
+#include <strings.h>
+#endif
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else
+char *malloc ();
+char *realloc ();
+#endif
+
+
+/* Define the syntax stuff for \<, \>, etc.  */
+
+/* This must be nonzero for the wordchar and notwordchar pattern
+   commands in re_match_2.  */
+#ifndef Sword 
+#define Sword 1
+#endif
+
+#ifdef SYNTAX_TABLE
+
+extern char *re_syntax_table;
+
+#else /* not SYNTAX_TABLE */
+
+/* How many characters in the character set.  */
+#define CHAR_SET_SIZE 256
+
+static char re_syntax_table[CHAR_SET_SIZE];
+
+static void
+init_syntax_once ()
+{
+   register int c;
+   static int done = 0;
+
+   if (done)
+     return;
+
+   bzero (re_syntax_table, sizeof re_syntax_table);
+
+   for (c = 'a'; c <= 'z'; c++)
+     re_syntax_table[c] = Sword;
+
+   for (c = 'A'; c <= 'Z'; c++)
+     re_syntax_table[c] = Sword;
+
+   for (c = '0'; c <= '9'; c++)
+     re_syntax_table[c] = Sword;
+
+   re_syntax_table['_'] = Sword;
+
+   done = 1;
+}
+
+#endif /* not SYNTAX_TABLE */
+
+#define SYNTAX(c) re_syntax_table[c]
+
+#endif /* not emacs */
+
+/* Get the interface, including the syntax bits.  */
+#include "regex.h"
+
+/* isalpha etc. are used for the character classes.  */
+#include <ctype.h>
+
+#ifndef isascii
+#define isascii(c) 1
+#endif
+
+#ifdef isblank
+#define ISBLANK(c) (isascii (c) && isblank (c))
+#else
+#define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+#ifdef isgraph
+#define ISGRAPH(c) (isascii (c) && isgraph (c))
+#else
+#define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c))
+#endif
+
+#define ISPRINT(c) (isascii (c) && isprint (c))
+#define ISDIGIT(c) (isascii (c) && isdigit (c))
+#define ISALNUM(c) (isascii (c) && isalnum (c))
+#define ISALPHA(c) (isascii (c) && isalpha (c))
+#define ISCNTRL(c) (isascii (c) && iscntrl (c))
+#define ISLOWER(c) (isascii (c) && islower (c))
+#define ISPUNCT(c) (isascii (c) && ispunct (c))
+#define ISSPACE(c) (isascii (c) && isspace (c))
+#define ISUPPER(c) (isascii (c) && isupper (c))
+#define ISXDIGIT(c) (isascii (c) && isxdigit (c))
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* We remove any previous definition of `SIGN_EXTEND_CHAR',
+   since ours (we hope) works properly with all combinations of
+   machines, compilers, `char' and `unsigned char' argument types.
+   (Per Bothner suggested the basic approach.)  */
+#undef SIGN_EXTEND_CHAR
+#if __STDC__
+#define SIGN_EXTEND_CHAR(c) ((signed char) (c))
+#else  /* not __STDC__ */
+/* As in Harbison and Steele.  */
+#define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
+#endif
+
+/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
+   use `alloca' instead of `malloc'.  This is because using malloc in
+   re_search* or re_match* could cause memory leaks when C-g is used in
+   Emacs; also, malloc is slower and causes storage fragmentation.  On
+   the other hand, malloc is more portable, and easier to debug.  
+   
+   Because we sometimes use alloca, some routines have to be macros,
+   not functions -- `alloca'-allocated space disappears at the end of the
+   function it is called in.  */
+
+#ifdef REGEX_MALLOC
+
+#define REGEX_ALLOCATE malloc
+#define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
+
+#else /* not REGEX_MALLOC  */
+
+/* Emacs already defines alloca, sometimes.  */
+#ifndef alloca
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else /* not __GNUC__ or HAVE_ALLOCA_H */
+#ifndef _AIX /* Already did AIX, up at the top.  */
+char *alloca ();
+#endif /* not _AIX */
+#endif /* not HAVE_ALLOCA_H */ 
+#endif /* not __GNUC__ */
+
+#endif /* not alloca */
+
+#define REGEX_ALLOCATE alloca
+
+/* Assumes a `char *destination' variable.  */
+#define REGEX_REALLOCATE(source, osize, nsize)				\
+  (destination = (char *) alloca (nsize),				\
+   bcopy (source, destination, osize),					\
+   destination)
+
+#endif /* not REGEX_MALLOC */
+
+
+/* True if `size1' is non-NULL and PTR is pointing anywhere inside
+   `string1' or just past its end.  This works if PTR is NULL, which is
+   a good thing.  */
+#define FIRST_STRING_P(ptr) 					\
+  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
+
+/* (Re)Allocate N items of type T using malloc, or fail.  */
+#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
+#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
+#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
+
+#define BYTEWIDTH 8 /* In bits.  */
+
+#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+typedef char boolean;
+#define false 0
+#define true 1
+
+/* These are the command codes that appear in compiled regular
+   expressions.  Some opcodes are followed by argument bytes.  A
+   command code can specify any interpretation whatsoever for its
+   arguments.  Zero bytes may appear in the compiled regular expression.
+
+   The value of `exactn' is needed in search.c (search_buffer) in Emacs.
+   So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of
+   `exactn' we use here must also be 1.  */
+
+typedef enum
+{
+  no_op = 0,
+
+        /* Followed by one byte giving n, then by n literal bytes.  */
+  exactn = 1,
+
+        /* Matches any (more or less) character.  */
+  anychar,
+
+        /* Matches any one char belonging to specified set.  First
+           following byte is number of bitmap bytes.  Then come bytes
+           for a bitmap saying which chars are in.  Bits in each byte
+           are ordered low-bit-first.  A character is in the set if its
+           bit is 1.  A character too large to have a bit in the map is
+           automatically not in the set.  */
+  charset,
+
+        /* Same parameters as charset, but match any character that is
+           not one of those specified.  */
+  charset_not,
+
+        /* Start remembering the text that is matched, for storing in a
+           register.  Followed by one byte with the register number, in
+           the range 0 to one less than the pattern buffer's re_nsub
+           field.  Then followed by one byte with the number of groups
+           inner to this one.  (This last has to be part of the
+           start_memory only because we need it in the on_failure_jump
+           of re_match_2.)  */
+  start_memory,
+
+        /* Stop remembering the text that is matched and store it in a
+           memory register.  Followed by one byte with the register
+           number, in the range 0 to one less than `re_nsub' in the
+           pattern buffer, and one byte with the number of inner groups,
+           just like `start_memory'.  (We need the number of inner
+           groups here because we don't have any easy way of finding the
+           corresponding start_memory when we're at a stop_memory.)  */
+  stop_memory,
+
+        /* Match a duplicate of something remembered. Followed by one
+           byte containing the register number.  */
+  duplicate,
+
+        /* Fail unless at beginning of line.  */
+  begline,
+
+        /* Fail unless at end of line.  */
+  endline,
+
+        /* Succeeds if at beginning of buffer (if emacs) or at beginning
+           of string to be matched (if not).  */
+  begbuf,
+
+        /* Analogously, for end of buffer/string.  */
+  endbuf,
+ 
+        /* Followed by two byte relative address to which to jump.  */
+  jump, 
+
+	/* Same as jump, but marks the end of an alternative.  */
+  jump_past_alt,
+
+        /* Followed by two-byte relative address of place to resume at
+           in case of failure.  */
+  on_failure_jump,
+	
+        /* Like on_failure_jump, but pushes a placeholder instead of the
+           current string position when executed.  */
+  on_failure_keep_string_jump,
+  
+        /* Throw away latest failure point and then jump to following
+           two-byte relative address.  */
+  pop_failure_jump,
+
+        /* Change to pop_failure_jump if know won't have to backtrack to
+           match; otherwise change to jump.  This is used to jump
+           back to the beginning of a repeat.  If what follows this jump
+           clearly won't match what the repeat does, such that we can be
+           sure that there is no use backtracking out of repetitions
+           already matched, then we change it to a pop_failure_jump.
+           Followed by two-byte address.  */
+  maybe_pop_jump,
+
+        /* Jump to following two-byte address, and push a dummy failure
+           point. This failure point will be thrown away if an attempt
+           is made to use it for a failure.  A `+' construct makes this
+           before the first repeat.  Also used as an intermediary kind
+           of jump when compiling an alternative.  */
+  dummy_failure_jump,
+
+	/* Push a dummy failure point and continue.  Used at the end of
+	   alternatives.  */
+  push_dummy_failure,
+
+        /* Followed by two-byte relative address and two-byte number n.
+           After matching N times, jump to the address upon failure.  */
+  succeed_n,
+
+        /* Followed by two-byte relative address, and two-byte number n.
+           Jump to the address N times, then fail.  */
+  jump_n,
+
+        /* Set the following two-byte relative address to the
+           subsequent two-byte number.  The address *includes* the two
+           bytes of number.  */
+  set_number_at,
+
+  wordchar,	/* Matches any word-constituent character.  */
+  notwordchar,	/* Matches any char that is not a word-constituent.  */
+
+  wordbeg,	/* Succeeds if at word beginning.  */
+  wordend,	/* Succeeds if at word end.  */
+
+  wordbound,	/* Succeeds if at a word boundary.  */
+  notwordbound	/* Succeeds if not at a word boundary.  */
+
+#ifdef emacs
+  ,before_dot,	/* Succeeds if before point.  */
+  at_dot,	/* Succeeds if at point.  */
+  after_dot,	/* Succeeds if after point.  */
+
+	/* Matches any character whose syntax is specified.  Followed by
+           a byte which contains a syntax code, e.g., Sword.  */
+  syntaxspec,
+
+	/* Matches any character whose syntax is not that specified.  */
+  notsyntaxspec
+#endif /* emacs */
+} re_opcode_t;
+
+/* Common operations on the compiled pattern.  */
+
+/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
+
+#define STORE_NUMBER(destination, number)				\
+  do {									\
+    (destination)[0] = (number) & 0377;					\
+    (destination)[1] = (number) >> 8;					\
+  } while (0)
+
+/* Same as STORE_NUMBER, except increment DESTINATION to
+   the byte after where the number is stored.  Therefore, DESTINATION
+   must be an lvalue.  */
+
+#define STORE_NUMBER_AND_INCR(destination, number)			\
+  do {									\
+    STORE_NUMBER (destination, number);					\
+    (destination) += 2;							\
+  } while (0)
+
+/* Put into DESTINATION a number stored in two contiguous bytes starting
+   at SOURCE.  */
+
+#define EXTRACT_NUMBER(destination, source)				\
+  do {									\
+    (destination) = *(source) & 0377;					\
+    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;		\
+  } while (0)
+
+#ifdef DEBUG
+static void
+extract_number (dest, source)
+    int *dest;
+    unsigned char *source;
+{
+  int temp = SIGN_EXTEND_CHAR (*(source + 1)); 
+  *dest = *source & 0377;
+  *dest += temp << 8;
+}
+
+#ifndef EXTRACT_MACROS /* To debug the macros.  */
+#undef EXTRACT_NUMBER
+#define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
+#endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
+   SOURCE must be an lvalue.  */
+
+#define EXTRACT_NUMBER_AND_INCR(destination, source)			\
+  do {									\
+    EXTRACT_NUMBER (destination, source);				\
+    (source) += 2; 							\
+  } while (0)
+
+#ifdef DEBUG
+static void
+extract_number_and_incr (destination, source)
+    int *destination;
+    unsigned char **source;
+{ 
+  extract_number (destination, *source);
+  *source += 2;
+}
+
+#ifndef EXTRACT_MACROS
+#undef EXTRACT_NUMBER_AND_INCR
+#define EXTRACT_NUMBER_AND_INCR(dest, src) \
+  extract_number_and_incr (&dest, &src)
+#endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+/* If DEBUG is defined, Regex prints many voluminous messages about what
+   it is doing (if the variable `debug' is nonzero).  If linked with the
+   main program in `iregex.c', you can enter patterns and strings
+   interactively.  And if linked with the main program in `main.c' and
+   the other test files, you can run the already-written tests.  */
+
+#ifdef DEBUG
+
+/* We use standard I/O for debugging.  */
+#include <stdio.h>
+
+/* It is useful to test things that ``must'' be true when debugging.  */
+#include <assert.h>
+
+static int debug = 0;
+
+#define DEBUG_STATEMENT(e) e
+#define DEBUG_PRINT1(x) if (debug) printf (x)
+#define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
+#define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
+#define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
+#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) 				\
+  if (debug) print_partial_compiled_pattern (s, e)
+#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)			\
+  if (debug) print_double_string (w, s1, sz1, s2, sz2)
+
+
+//extern void printchar ();
+void printchar( int i ) {}
+
+/* Print the fastmap in human-readable form.  */
+
+void
+print_fastmap (fastmap)
+    char *fastmap;
+{
+  unsigned was_a_range = 0;
+  unsigned i = 0;  
+  
+  while (i < (1 << BYTEWIDTH))
+    {
+      if (fastmap[i++])
+	{
+	  was_a_range = 0;
+          printchar (i - 1);
+          while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
+            {
+              was_a_range = 1;
+              i++;
+            }
+	  if (was_a_range)
+            {
+              printf ("-");
+              printchar (i - 1);
+            }
+        }
+    }
+  putchar ('\n'); 
+}
+
+
+/* Print a compiled pattern string in human-readable form, starting at
+   the START pointer into it and ending just before the pointer END.  */
+
+void
+print_partial_compiled_pattern (start, end)
+    unsigned char *start;
+    unsigned char *end;
+{
+  int mcnt, mcnt2;
+  unsigned char *p = start;
+  unsigned char *pend = end;
+
+  if (start == NULL)
+    {
+      printf ("(null)\n");
+      return;
+    }
+    
+  /* Loop over pattern commands.  */
+  while (p < pend)
+    {
+      switch ((re_opcode_t) *p++)
+	{
+        case no_op:
+          printf ("/no_op");
+          break;
+
+	case exactn:
+	  mcnt = *p++;
+          printf ("/exactn/%d", mcnt);
+          do
+	    {
+              putchar ('/');
+	      printchar (*p++);
+            }
+          while (--mcnt);
+          break;
+
+	case start_memory:
+          mcnt = *p++;
+          printf ("/start_memory/%d/%d", mcnt, *p++);
+          break;
+
+	case stop_memory:
+          mcnt = *p++;
+	  printf ("/stop_memory/%d/%d", mcnt, *p++);
+          break;
+
+	case duplicate:
+	  printf ("/duplicate/%d", *p++);
+	  break;
+
+	case anychar:
+	  printf ("/anychar");
+	  break;
+
+	case charset:
+        case charset_not:
+          {
+            register int c;
+
+            printf ("/charset%s",
+	            (re_opcode_t) *(p - 1) == charset_not ? "_not" : "");
+            
+            assert (p + *p < pend);
+
+            for (c = 0; c < *p; c++)
+              {
+                unsigned bit;
+                unsigned char map_byte = p[1 + c];
+                
+                putchar ('/');
+
+		for (bit = 0; bit < BYTEWIDTH; bit++)
+                  if (map_byte & (1 << bit))
+                    printchar (c * BYTEWIDTH + bit);
+              }
+	    p += 1 + *p;
+	    break;
+	  }
+
+	case begline:
+	  printf ("/begline");
+          break;
+
+	case endline:
+          printf ("/endline");
+          break;
+
+	case on_failure_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/on_failure_jump/0/%d", mcnt);
+          break;
+
+	case on_failure_keep_string_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/on_failure_keep_string_jump/0/%d", mcnt);
+          break;
+
+	case dummy_failure_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/dummy_failure_jump/0/%d", mcnt);
+          break;
+
+	case push_dummy_failure:
+          printf ("/push_dummy_failure");
+          break;
+          
+        case maybe_pop_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/maybe_pop_jump/0/%d", mcnt);
+	  break;
+
+        case pop_failure_jump:
+	  extract_number_and_incr (&mcnt, &p);
+  	  printf ("/pop_failure_jump/0/%d", mcnt);
+	  break;          
+          
+        case jump_past_alt:
+	  extract_number_and_incr (&mcnt, &p);
+  	  printf ("/jump_past_alt/0/%d", mcnt);
+	  break;          
+          
+        case jump:
+	  extract_number_and_incr (&mcnt, &p);
+  	  printf ("/jump/0/%d", mcnt);
+	  break;
+
+        case succeed_n: 
+          extract_number_and_incr (&mcnt, &p);
+          extract_number_and_incr (&mcnt2, &p);
+ 	  printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2);
+          break;
+        
+        case jump_n: 
+          extract_number_and_incr (&mcnt, &p);
+          extract_number_and_incr (&mcnt2, &p);
+ 	  printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2);
+          break;
+        
+        case set_number_at: 
+          extract_number_and_incr (&mcnt, &p);
+          extract_number_and_incr (&mcnt2, &p);
+ 	  printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2);
+          break;
+        
+        case wordbound:
+	  printf ("/wordbound");
+	  break;
+
+	case notwordbound:
+	  printf ("/notwordbound");
+          break;
+
+	case wordbeg:
+	  printf ("/wordbeg");
+	  break;
+          
+	case wordend:
+	  printf ("/wordend");
+          
+#ifdef emacs
+	case before_dot:
+	  printf ("/before_dot");
+          break;
+
+	case at_dot:
+	  printf ("/at_dot");
+          break;
+
+	case after_dot:
+	  printf ("/after_dot");
+          break;
+
+	case syntaxspec:
+          printf ("/syntaxspec");
+	  mcnt = *p++;
+	  printf ("/%d", mcnt);
+          break;
+	  
+	case notsyntaxspec:
+          printf ("/notsyntaxspec");
+	  mcnt = *p++;
+	  printf ("/%d", mcnt);
+	  break;
+#endif /* emacs */
+
+	case wordchar:
+	  printf ("/wordchar");
+          break;
+	  
+	case notwordchar:
+	  printf ("/notwordchar");
+          break;
+
+	case begbuf:
+	  printf ("/begbuf");
+          break;
+
+	case endbuf:
+	  printf ("/endbuf");
+          break;
+
+        default:
+          printf ("?%d", *(p-1));
+	}
+    }
+  printf ("/\n");
+}
+
+
+void
+print_compiled_pattern (bufp)
+    struct re_pattern_buffer *bufp;
+{
+  unsigned char *buffer = bufp->buffer;
+
+  print_partial_compiled_pattern (buffer, buffer + bufp->used);
+  printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated);
+
+  if (bufp->fastmap_accurate && bufp->fastmap)
+    {
+      printf ("fastmap: ");
+      print_fastmap (bufp->fastmap);
+    }
+
+  printf ("re_nsub: %d\t", bufp->re_nsub);
+  printf ("regs_alloc: %d\t", bufp->regs_allocated);
+  printf ("can_be_null: %d\t", bufp->can_be_null);
+  printf ("newline_anchor: %d\n", bufp->newline_anchor);
+  printf ("no_sub: %d\t", bufp->no_sub);
+  printf ("not_bol: %d\t", bufp->not_bol);
+  printf ("not_eol: %d\t", bufp->not_eol);
+  printf ("syntax: %d\n", bufp->syntax);
+  /* Perhaps we should print the translate table?  */
+}
+
+
+void
+print_double_string (where, string1, size1, string2, size2)
+    const char *where;
+    const char *string1;
+    const char *string2;
+    int size1;
+    int size2;
+{
+  unsigned this_char;
+  
+  if (where == NULL)
+    printf ("(null)");
+  else
+    {
+      if (FIRST_STRING_P (where))
+        {
+          for (this_char = where - string1; this_char < size1; this_char++)
+            printchar (string1[this_char]);
+
+          where = string2;    
+        }
+
+      for (this_char = where - string2; this_char < size2; this_char++)
+        printchar (string2[this_char]);
+    }
+}
+
+#else /* not DEBUG */
+
+#undef assert
+#define assert(e)
+
+#define DEBUG_STATEMENT(e)
+#define DEBUG_PRINT1(x)
+#define DEBUG_PRINT2(x1, x2)
+#define DEBUG_PRINT3(x1, x2, x3)
+#define DEBUG_PRINT4(x1, x2, x3, x4)
+#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
+#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
+
+#endif /* not DEBUG */
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+reg_syntax_t
+re_set_syntax (syntax)
+    reg_syntax_t syntax;
+{
+  reg_syntax_t ret = re_syntax_options;
+  
+  re_syntax_options = syntax;
+  return ret;
+}
+
+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.  */
+
+static const char *re_error_msg[] =
+  { NULL,					/* REG_NOERROR */
+    "No match",					/* REG_NOMATCH */
+    "Invalid regular expression",		/* REG_BADPAT */
+    "Invalid collation character",		/* REG_ECOLLATE */
+    "Invalid character class name",		/* REG_ECTYPE */
+    "Trailing backslash",			/* REG_EESCAPE */
+    "Invalid back reference",			/* REG_ESUBREG */
+    "Unmatched [ or [^",			/* REG_EBRACK */
+    "Unmatched ( or \\(",			/* REG_EPAREN */
+    "Unmatched \\{",				/* REG_EBRACE */
+    "Invalid content of \\{\\}",		/* REG_BADBR */
+    "Invalid range end",			/* REG_ERANGE */
+    "Memory exhausted",				/* REG_ESPACE */
+    "Invalid preceding regular expression",	/* REG_BADRPT */
+    "Premature end of regular expression",	/* REG_EEND */
+    "Regular expression too big",		/* REG_ESIZE */
+    "Unmatched ) or \\)",			/* REG_ERPAREN */
+  };
+
+/* Subroutine declarations and macros for regex_compile.  */
+
+static void store_op1 (), store_op2 ();
+static void insert_op1 (), insert_op2 ();
+static boolean at_begline_loc_p (), at_endline_loc_p ();
+static boolean group_in_compile_stack ();
+static reg_errcode_t compile_range ();
+
+/* Fetch the next character in the uncompiled pattern---translating it 
+   if necessary.  Also cast from a signed character in the constant
+   string passed to us by the user to an unsigned char that we can use
+   as an array index (in, e.g., `translate').  */
+#define PATFETCH(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++;						\
+    if (translate) c = translate[c]; 					\
+  } while (0)
+
+/* Fetch the next character in the uncompiled pattern, with no
+   translation.  */
+#define PATFETCH_RAW(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++; 						\
+  } while (0)
+
+/* Go backwards one character in the pattern.  */
+#define PATUNFETCH p--
+
+
+/* If `translate' is non-null, return translate[D], else just D.  We
+   cast the subscript to translate because some data is declared as
+   `char *', to avoid warnings when a string constant is passed.  But
+   when we use a character as a subscript we must make it unsigned.  */
+#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
+
+
+/* Macros for outputting the compiled pattern into `buffer'.  */
+
+/* If the buffer isn't allocated when it comes in, use this.  */
+#define INIT_BUF_SIZE  32
+
+/* Make sure we have at least N more bytes of space in buffer.  */
+#define GET_BUFFER_SPACE(n)						\
+    while (b - bufp->buffer + (n) > bufp->allocated)			\
+      EXTEND_BUFFER ()
+
+/* Make sure we have one more byte of buffer space and then add C to it.  */
+#define BUF_PUSH(c)							\
+  do {									\
+    GET_BUFFER_SPACE (1);						\
+    *b++ = (unsigned char) (c);						\
+  } while (0)
+
+
+/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
+#define BUF_PUSH_2(c1, c2)						\
+  do {									\
+    GET_BUFFER_SPACE (2);						\
+    *b++ = (unsigned char) (c1);					\
+    *b++ = (unsigned char) (c2);					\
+  } while (0)
+
+
+/* As with BUF_PUSH_2, except for three bytes.  */
+#define BUF_PUSH_3(c1, c2, c3)						\
+  do {									\
+    GET_BUFFER_SPACE (3);						\
+    *b++ = (unsigned char) (c1);					\
+    *b++ = (unsigned char) (c2);					\
+    *b++ = (unsigned char) (c3);					\
+  } while (0)
+
+
+/* Store a jump with opcode OP at LOC to location TO.  We store a
+   relative address offset by the three bytes the jump itself occupies.  */
+#define STORE_JUMP(op, loc, to) \
+  store_op1 (op, loc, (to) - (loc) - 3)
+
+/* Likewise, for a two-argument jump.  */
+#define STORE_JUMP2(op, loc, to, arg) \
+  store_op2 (op, loc, (to) - (loc) - 3, arg)
+
+/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP(op, loc, to) \
+  insert_op1 (op, loc, (to) - (loc) - 3, b)
+
+/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP2(op, loc, to, arg) \
+  insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
+
+
+/* This is not an arbitrary limit: the arguments which represent offsets
+   into the pattern are two bytes long.  So if 2^16 bytes turns out to
+   be too small, many things would have to change.  */
+#define MAX_BUF_SIZE (1L << 16)
+
+
+/* Extend the buffer by twice its current size via realloc and
+   reset the pointers that pointed into the old block to point to the
+   correct places in the new one.  If extending the buffer results in it
+   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
+#define EXTEND_BUFFER()							\
+  do { 									\
+    unsigned char *old_buffer = bufp->buffer;				\
+    if (bufp->allocated == MAX_BUF_SIZE) 				\
+      return REG_ESIZE;							\
+    bufp->allocated <<= 1;						\
+    if (bufp->allocated > MAX_BUF_SIZE)					\
+      bufp->allocated = MAX_BUF_SIZE; 					\
+    bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
+    if (bufp->buffer == NULL)						\
+      return REG_ESPACE;						\
+    /* If the buffer moved, move all the pointers into it.  */		\
+    if (old_buffer != bufp->buffer)					\
+      {									\
+        b = (b - old_buffer) + bufp->buffer;				\
+        begalt = (begalt - old_buffer) + bufp->buffer;			\
+        if (fixup_alt_jump)						\
+          fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
+        if (laststart)							\
+          laststart = (laststart - old_buffer) + bufp->buffer;		\
+        if (pending_exact)						\
+          pending_exact = (pending_exact - old_buffer) + bufp->buffer;	\
+      }									\
+  } while (0)
+
+
+/* Since we have one byte reserved for the register number argument to
+   {start,stop}_memory, the maximum number of groups we can report
+   things about is what fits in that byte.  */
+#define MAX_REGNUM 255
+
+/* But patterns can have more than `MAX_REGNUM' registers.  We just
+   ignore the excess.  */
+typedef unsigned regnum_t;
+
+
+/* Macros for the compile stack.  */
+
+/* Since offsets can go either forwards or backwards, this type needs to
+   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
+typedef int pattern_offset_t;
+
+typedef struct
+{
+  pattern_offset_t begalt_offset;
+  pattern_offset_t fixup_alt_jump;
+  pattern_offset_t inner_group_offset;
+  pattern_offset_t laststart_offset;  
+  regnum_t regnum;
+} compile_stack_elt_t;
+
+
+typedef struct
+{
+  compile_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} compile_stack_type;
+
+
+#define INIT_COMPILE_STACK_SIZE 32
+
+#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
+#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
+
+/* The next available element.  */
+#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
+
+
+/* Set the bit for character C in a list.  */
+#define SET_LIST_BIT(c)                               \
+  (b[((unsigned char) (c)) / BYTEWIDTH]               \
+   |= 1 << (((unsigned char) c) % BYTEWIDTH))
+
+
+/* Get the next unsigned number in the uncompiled pattern.  */
+#define GET_UNSIGNED_NUMBER(num) 					\
+  { if (p != pend)							\
+     {									\
+       PATFETCH (c); 							\
+       while (ISDIGIT (c)) 						\
+         { 								\
+           if (num < 0)							\
+              num = 0;							\
+           num = num * 10 + c - '0'; 					\
+           if (p == pend) 						\
+              break; 							\
+           PATFETCH (c);						\
+         } 								\
+       } 								\
+    }		
+
+#define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#define IS_CHAR_CLASS(string)						\
+   (STREQ (string, "alpha") || STREQ (string, "upper")			\
+    || STREQ (string, "lower") || STREQ (string, "digit")		\
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")		\
+    || STREQ (string, "space") || STREQ (string, "print")		\
+    || STREQ (string, "punct") || STREQ (string, "graph")		\
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+
+/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
+   Returns one of error codes defined in `regex.h', or zero for success.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate'
+   fields are set in BUFP on entry.
+
+   If it succeeds, results are put in BUFP (if it returns an error, the
+   contents of BUFP are undefined):
+     `buffer' is the compiled pattern;
+     `syntax' is set to SYNTAX;
+     `used' is set to the length of the compiled pattern;
+     `fastmap_accurate' is zero;
+     `re_nsub' is the number of subexpressions in PATTERN;
+     `not_bol' and `not_eol' are zero;
+   
+   The `fastmap' and `newline_anchor' fields are neither
+   examined nor set.  */
+
+static reg_errcode_t
+regex_compile (pattern, size, syntax, bufp)
+     const char *pattern;
+     int size;
+     reg_syntax_t syntax;
+     struct re_pattern_buffer *bufp;
+{
+  /* We fetch characters from PATTERN here.  Even though PATTERN is
+     `char *' (i.e., signed), we declare these variables as unsigned, so
+     they can be reliably used as array indices.  */
+  register unsigned char c, c1;
+  
+  /* A random tempory spot in PATTERN.  */
+  const char *p1;
+
+  /* Points to the end of the buffer, where we should append.  */
+  register unsigned char *b;
+  
+  /* Keeps track of unclosed groups.  */
+  compile_stack_type compile_stack;
+
+  /* Points to the current (ending) position in the pattern.  */
+  const char *p = pattern;
+  const char *pend = pattern + size;
+  
+  /* How to translate the characters in the pattern.  */
+  char *translate = bufp->translate;
+
+  /* Address of the count-byte of the most recently inserted `exactn'
+     command.  This makes it possible to tell if a new exact-match
+     character can be added to that command or if the character requires
+     a new `exactn' command.  */
+  unsigned char *pending_exact = 0;
+
+  /* Address of start of the most recently finished expression.
+     This tells, e.g., postfix * where to find the start of its
+     operand.  Reset at the beginning of groups and alternatives.  */
+  unsigned char *laststart = 0;
+
+  /* Address of beginning of regexp, or inside of last group.  */
+  unsigned char *begalt;
+
+  /* Place in the uncompiled pattern (i.e., the {) to
+     which to go back if the interval is invalid.  */
+  const char *beg_interval;
+                
+  /* Address of the place where a forward jump should go to the end of
+     the containing expression.  Each alternative of an `or' -- except the
+     last -- ends with a forward jump of this sort.  */
+  unsigned char *fixup_alt_jump = 0;
+
+  /* Counts open-groups as they are encountered.  Remembered for the
+     matching close-group on the compile stack, so the same register
+     number is put in the stop_memory as the start_memory.  */
+  regnum_t regnum = 0;
+
+#ifdef DEBUG
+  DEBUG_PRINT1 ("\nCompiling pattern: ");
+  if (debug)
+    {
+      unsigned debug_count;
+      
+      for (debug_count = 0; debug_count < size; debug_count++)
+        printchar (pattern[debug_count]);
+      putchar ('\n');
+    }
+#endif /* DEBUG */
+
+  /* Initialize the compile stack.  */
+  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
+  if (compile_stack.stack == NULL)
+    return REG_ESPACE;
+
+  compile_stack.size = INIT_COMPILE_STACK_SIZE;
+  compile_stack.avail = 0;
+
+  /* Initialize the pattern buffer.  */
+  bufp->syntax = syntax;
+  bufp->fastmap_accurate = 0;
+  bufp->not_bol = bufp->not_eol = 0;
+
+  /* Set `used' to zero, so that if we return an error, the pattern
+     printer (for debugging) will think there's no pattern.  We reset it
+     at the end.  */
+  bufp->used = 0;
+  
+  /* Always count groups, whether or not bufp->no_sub is set.  */
+  bufp->re_nsub = 0;				
+
+#if !defined (emacs) && !defined (SYNTAX_TABLE)
+  /* Initialize the syntax table.  */
+   init_syntax_once ();
+#endif
+
+  if (bufp->allocated == 0)
+    {
+      if (bufp->buffer)
+	{ /* If zero allocated, but buffer is non-null, try to realloc
+             enough space.  This loses if buffer's address is bogus, but
+             that is the user's responsibility.  */
+          RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
+        }
+      else
+        { /* Caller did not allocate a buffer.  Do it for them.  */
+          bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
+        }
+      if (!bufp->buffer) return REG_ESPACE;
+
+      bufp->allocated = INIT_BUF_SIZE;
+    }
+
+  begalt = b = bufp->buffer;
+
+  /* Loop through the uncompiled pattern until we're at the end.  */
+  while (p != pend)
+    {
+      PATFETCH (c);
+
+      switch (c)
+        {
+        case '^':
+          {
+            if (   /* If at start of pattern, it's an operator.  */
+                   p == pattern + 1
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's come before.  */
+                || at_begline_loc_p (pattern, p, syntax))
+              BUF_PUSH (begline);
+            else
+              goto normal_char;
+          }
+          break;
+
+
+        case '$':
+          {
+            if (   /* If at end of pattern, it's an operator.  */
+                   p == pend 
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's next.  */
+                || at_endline_loc_p (p, pend, syntax))
+               BUF_PUSH (endline);
+             else
+               goto normal_char;
+           }
+           break;
+
+
+	case '+':
+        case '?':
+          if ((syntax & RE_BK_PLUS_QM)
+              || (syntax & RE_LIMITED_OPS))
+            goto normal_char;
+        handle_plus:
+        case '*':
+          /* If there is no previous pattern... */
+          if (!laststart)
+            {
+              if (syntax & RE_CONTEXT_INVALID_OPS)
+                return REG_BADRPT;
+              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
+                goto normal_char;
+            }
+
+          {
+            /* Are we optimizing this jump?  */
+            boolean keep_string_p = false;
+            
+            /* 1 means zero (many) matches is allowed.  */
+            char zero_times_ok = 0, many_times_ok = 0;
+
+            /* If there is a sequence of repetition chars, collapse it
+               down to just one (the right one).  We can't combine
+               interval operators with these because of, e.g., `a{2}*',
+               which should only match an even number of `a's.  */
+
+            for (;;)
+              {
+                zero_times_ok |= c != '+';
+                many_times_ok |= c != '?';
+
+                if (p == pend)
+                  break;
+
+                PATFETCH (c);
+
+                if (c == '*'
+                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
+                  ;
+
+                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
+                  {
+                    if (p == pend) return REG_EESCAPE;
+
+                    PATFETCH (c1);
+                    if (!(c1 == '+' || c1 == '?'))
+                      {
+                        PATUNFETCH;
+                        PATUNFETCH;
+                        break;
+                      }
+
+                    c = c1;
+                  }
+                else
+                  {
+                    PATUNFETCH;
+                    break;
+                  }
+
+                /* If we get here, we found another repeat character.  */
+               }
+
+            /* Star, etc. applied to an empty pattern is equivalent
+               to an empty pattern.  */
+            if (!laststart)  
+              break;
+
+            /* Now we know whether or not zero matches is allowed
+               and also whether or not two or more matches is allowed.  */
+            if (many_times_ok)
+              { /* More than one repetition is allowed, so put in at the
+                   end a backward relative jump from `b' to before the next
+                   jump we're going to put in below (which jumps from
+                   laststart to after this jump).  
+
+                   But if we are at the `*' in the exact sequence `.*\n',
+                   insert an unconditional jump backwards to the .,
+                   instead of the beginning of the loop.  This way we only
+                   push a failure point once, instead of every time
+                   through the loop.  */
+                assert (p - 1 > pattern);
+
+                /* Allocate the space for the jump.  */
+                GET_BUFFER_SPACE (3);
+
+                /* We know we are not at the first character of the pattern,
+                   because laststart was nonzero.  And we've already
+                   incremented `p', by the way, to be the character after
+                   the `*'.  Do we have to do something analogous here
+                   for null bytes, because of RE_DOT_NOT_NULL?  */
+                if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
+		    && zero_times_ok
+                    && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
+                    && !(syntax & RE_DOT_NEWLINE))
+                  { /* We have .*\n.  */
+                    STORE_JUMP (jump, b, laststart);
+                    keep_string_p = true;
+                  }
+                else
+                  /* Anything else.  */
+                  STORE_JUMP (maybe_pop_jump, b, laststart - 3);
+
+                /* We've added more stuff to the buffer.  */
+                b += 3;
+              }
+
+            /* On failure, jump from laststart to b + 3, which will be the
+               end of the buffer after this jump is inserted.  */
+            GET_BUFFER_SPACE (3);
+            INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
+                                       : on_failure_jump,
+                         laststart, b + 3);
+            pending_exact = 0;
+            b += 3;
+
+            if (!zero_times_ok)
+              {
+                /* At least one repetition is required, so insert a
+                   `dummy_failure_jump' before the initial
+                   `on_failure_jump' instruction of the loop. This
+                   effects a skip over that instruction the first time
+                   we hit that loop.  */
+                GET_BUFFER_SPACE (3);
+                INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
+                b += 3;
+              }
+            }
+	  break;
+
+
+	case '.':
+          laststart = b;
+          BUF_PUSH (anychar);
+          break;
+
+
+        case '[':
+          {
+            boolean had_char_class = false;
+
+            if (p == pend) return REG_EBRACK;
+
+            /* Ensure that we have enough space to push a charset: the
+               opcode, the length count, and the bitset; 34 bytes in all.  */
+	    GET_BUFFER_SPACE (34);
+
+            laststart = b;
+
+            /* We test `*p == '^' twice, instead of using an if
+               statement, so we only need one BUF_PUSH.  */
+            BUF_PUSH (*p == '^' ? charset_not : charset); 
+            if (*p == '^')
+              p++;
+
+            /* Remember the first position in the bracket expression.  */
+            p1 = p;
+
+            /* Push the number of bytes in the bitmap.  */
+            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* Clear the whole map.  */
+            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* charset_not matches newline according to a syntax bit.  */
+            if ((re_opcode_t) b[-2] == charset_not
+                && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
+              SET_LIST_BIT ('\n');
+
+            /* Read in characters and ranges, setting map bits.  */
+            for (;;)
+              {
+                if (p == pend) return REG_EBRACK;
+
+                PATFETCH (c);
+
+                /* \ might escape characters inside [...] and [^...].  */
+                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
+                  {
+                    if (p == pend) return REG_EESCAPE;
+
+                    PATFETCH (c1);
+                    SET_LIST_BIT (c1);
+                    continue;
+                  }
+
+                /* Could be the end of the bracket expression.  If it's
+                   not (i.e., when the bracket expression is `[]' so
+                   far), the ']' character bit gets set way below.  */
+                if (c == ']' && p != p1 + 1)
+                  break;
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character class.  */
+                if (had_char_class && c == '-' && *p != ']')
+                  return REG_ERANGE;
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character: if this is a hyphen not at the
+                   beginning or the end of a list, then it's the range
+                   operator.  */
+                if (c == '-' 
+                    && !(p - 2 >= pattern && p[-2] == '[') 
+                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+                    && *p != ']')
+                  {
+                    reg_errcode_t ret
+                      = compile_range (&p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) return ret;
+                  }
+
+                else if (p[0] == '-' && p[1] != ']')
+                  { /* This handles ranges made up of characters only.  */
+                    reg_errcode_t ret;
+
+		    /* Move past the `-'.  */
+                    PATFETCH (c1);
+                    
+                    ret = compile_range (&p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) return ret;
+                  }
+
+                /* See if we're at the beginning of a possible character
+                   class.  */
+
+                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
+                  { /* Leave room for the null.  */
+                    char str[CHAR_CLASS_MAX_LENGTH + 1];
+
+                    PATFETCH (c);
+                    c1 = 0;
+
+                    /* If pattern is `[[:'.  */
+                    if (p == pend) return REG_EBRACK;
+
+                    for (;;)
+                      {
+                        PATFETCH (c);
+                        if (c == ':' || c == ']' || p == pend
+                            || c1 == CHAR_CLASS_MAX_LENGTH)
+                          break;
+                        str[c1++] = c;
+                      }
+                    str[c1] = '\0';
+
+                    /* If isn't a word bracketed by `[:' and:`]':
+                       undo the ending character, the letters, and leave 
+                       the leading `:' and `[' (but set bits for them).  */
+                    if (c == ':' && *p == ']')
+                      {
+                        int ch;
+                        boolean is_alnum = STREQ (str, "alnum");
+                        boolean is_alpha = STREQ (str, "alpha");
+                        boolean is_blank = STREQ (str, "blank");
+                        boolean is_cntrl = STREQ (str, "cntrl");
+                        boolean is_digit = STREQ (str, "digit");
+                        boolean is_graph = STREQ (str, "graph");
+                        boolean is_lower = STREQ (str, "lower");
+                        boolean is_print = STREQ (str, "print");
+                        boolean is_punct = STREQ (str, "punct");
+                        boolean is_space = STREQ (str, "space");
+                        boolean is_upper = STREQ (str, "upper");
+                        boolean is_xdigit = STREQ (str, "xdigit");
+                        
+                        if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
+
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);					
+
+                        if (p == pend) return REG_EBRACK;
+
+                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
+                          {
+                            if (   (is_alnum  && ISALNUM (ch))
+                                || (is_alpha  && ISALPHA (ch))
+                                || (is_blank  && ISBLANK (ch))
+                                || (is_cntrl  && ISCNTRL (ch))
+                                || (is_digit  && ISDIGIT (ch))
+                                || (is_graph  && ISGRAPH (ch))
+                                || (is_lower  && ISLOWER (ch))
+                                || (is_print  && ISPRINT (ch))
+                                || (is_punct  && ISPUNCT (ch))
+                                || (is_space  && ISSPACE (ch))
+                                || (is_upper  && ISUPPER (ch))
+                                || (is_xdigit && ISXDIGIT (ch)))
+                            SET_LIST_BIT (ch);
+                          }
+                        had_char_class = true;
+                      }
+                    else
+                      {
+                        c1++;
+                        while (c1--)    
+                          PATUNFETCH;
+                        SET_LIST_BIT ('[');
+                        SET_LIST_BIT (':');
+                        had_char_class = false;
+                      }
+                  }
+                else
+                  {
+                    had_char_class = false;
+                    SET_LIST_BIT (c);
+                  }
+              }
+
+            /* Discard any (non)matching list bytes that are all 0 at the
+               end of the map.  Decrease the map-length byte too.  */
+            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) 
+              b[-1]--; 
+            b += b[-1];
+          }
+          break;
+
+
+	case '(':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_open;
+          else
+            goto normal_char;
+
+
+        case ')':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_close;
+          else
+            goto normal_char;
+
+
+        case '\n':
+          if (syntax & RE_NEWLINE_ALT)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+	case '|':
+          if (syntax & RE_NO_BK_VBAR)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+        case '{':
+           if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
+             goto handle_interval;
+           else
+             goto normal_char;
+
+
+        case '\\':
+          if (p == pend) return REG_EESCAPE;
+
+          /* Do not translate the character after the \, so that we can
+             distinguish, e.g., \B from \b, even if we normally would
+             translate, e.g., B to b.  */
+          PATFETCH_RAW (c);
+
+          switch (c)
+            {
+            case '(':
+              if (syntax & RE_NO_BK_PARENS)
+                goto normal_backslash;
+
+            handle_open:
+              bufp->re_nsub++;
+              regnum++;
+
+              if (COMPILE_STACK_FULL)
+                { 
+                  RETALLOC (compile_stack.stack, compile_stack.size << 1,
+                            compile_stack_elt_t);
+                  if (compile_stack.stack == NULL) return REG_ESPACE;
+
+                  compile_stack.size <<= 1;
+                }
+
+              /* These are the values to restore when we hit end of this
+                 group.  They are all relative offsets, so that if the
+                 whole pattern moves because of realloc, they will still
+                 be valid.  */
+              COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
+              COMPILE_STACK_TOP.fixup_alt_jump 
+                = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
+              COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
+              COMPILE_STACK_TOP.regnum = regnum;
+
+              /* We will eventually replace the 0 with the number of
+                 groups inner to this one.  But do not push a
+                 start_memory for groups beyond the last one we can
+                 represent in the compiled pattern.  */
+              if (regnum <= MAX_REGNUM)
+                {
+                  COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
+                  BUF_PUSH_3 (start_memory, regnum, 0);
+                }
+                
+              compile_stack.avail++;
+
+              fixup_alt_jump = 0;
+              laststart = 0;
+              begalt = b;
+	      /* If we've reached MAX_REGNUM groups, then this open
+		 won't actually generate any code, so we'll have to
+		 clear pending_exact explicitly.  */
+	      pending_exact = 0;
+              break;
+
+
+            case ')':
+              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
+
+              if (COMPILE_STACK_EMPTY)
+                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+                  goto normal_backslash;
+                else
+                  return REG_ERPAREN;
+
+            handle_close:
+              if (fixup_alt_jump)
+                { /* Push a dummy failure point at the end of the
+                     alternative for a possible future
+                     `pop_failure_jump' to pop.  See comments at
+                     `push_dummy_failure' in `re_match_2'.  */
+                  BUF_PUSH (push_dummy_failure);
+                  
+                  /* We allocated space for this jump when we assigned
+                     to `fixup_alt_jump', in the `handle_alt' case below.  */
+                  STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
+                }
+
+              /* See similar code for backslashed left paren above.  */
+              if (COMPILE_STACK_EMPTY)
+                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+                  goto normal_char;
+                else
+                  return REG_ERPAREN;
+
+              /* Since we just checked for an empty stack above, this
+                 ``can't happen''.  */
+              assert (compile_stack.avail != 0);
+              {
+                /* We don't just want to restore into `regnum', because
+                   later groups should continue to be numbered higher,
+                   as in `(ab)c(de)' -- the second group is #2.  */
+                regnum_t this_group_regnum;
+
+                compile_stack.avail--;		
+                begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
+                fixup_alt_jump
+                  = COMPILE_STACK_TOP.fixup_alt_jump
+                    ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 
+                    : 0;
+                laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
+                this_group_regnum = COMPILE_STACK_TOP.regnum;
+		/* If we've reached MAX_REGNUM groups, then this open
+		   won't actually generate any code, so we'll have to
+		   clear pending_exact explicitly.  */
+		pending_exact = 0;
+
+                /* We're at the end of the group, so now we know how many
+                   groups were inside this one.  */
+                if (this_group_regnum <= MAX_REGNUM)
+                  {
+                    unsigned char *inner_group_loc
+                      = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
+                    
+                    *inner_group_loc = regnum - this_group_regnum;
+                    BUF_PUSH_3 (stop_memory, this_group_regnum,
+                                regnum - this_group_regnum);
+                  }
+              }
+              break;
+
+
+            case '|':					/* `\|'.  */
+              if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
+                goto normal_backslash;
+            handle_alt:
+              if (syntax & RE_LIMITED_OPS)
+                goto normal_char;
+
+              /* Insert before the previous alternative a jump which
+                 jumps to this alternative if the former fails.  */
+              GET_BUFFER_SPACE (3);
+              INSERT_JUMP (on_failure_jump, begalt, b + 6);
+              pending_exact = 0;
+              b += 3;
+
+              /* The alternative before this one has a jump after it
+                 which gets executed if it gets matched.  Adjust that
+                 jump so it will jump to this alternative's analogous
+                 jump (put in below, which in turn will jump to the next
+                 (if any) alternative's such jump, etc.).  The last such
+                 jump jumps to the correct final destination.  A picture:
+                          _____ _____ 
+                          |   | |   |   
+                          |   v |   v 
+                         a | b   | c   
+
+                 If we are at `b', then fixup_alt_jump right now points to a
+                 three-byte space after `a'.  We'll put in the jump, set
+                 fixup_alt_jump to right after `b', and leave behind three
+                 bytes which we'll fill in when we get to after `c'.  */
+
+              if (fixup_alt_jump)
+                STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+
+              /* Mark and leave space for a jump after this alternative,
+                 to be filled in later either by next alternative or
+                 when know we're at the end of a series of alternatives.  */
+              fixup_alt_jump = b;
+              GET_BUFFER_SPACE (3);
+              b += 3;
+
+              laststart = 0;
+              begalt = b;
+              break;
+
+
+            case '{': 
+              /* If \{ is a literal.  */
+              if (!(syntax & RE_INTERVALS)
+                     /* If we're at `\{' and it's not the open-interval 
+                        operator.  */
+                  || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                  || (p - 2 == pattern  &&  p == pend))
+                goto normal_backslash;
+
+            handle_interval:
+              {
+                /* If got here, then the syntax allows intervals.  */
+
+                /* At least (most) this many matches must be made.  */
+                int lower_bound = -1, upper_bound = -1;
+
+                beg_interval = p - 1;
+
+                if (p == pend)
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else
+                      return REG_EBRACE;
+                  }
+
+                GET_UNSIGNED_NUMBER (lower_bound);
+
+                if (c == ',')
+                  {
+                    GET_UNSIGNED_NUMBER (upper_bound);
+                    if (upper_bound < 0) upper_bound = RE_DUP_MAX;
+                  }
+                else
+                  /* Interval such as `{1}' => match exactly once. */
+                  upper_bound = lower_bound;
+
+                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
+                    || lower_bound > upper_bound)
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else 
+                      return REG_BADBR;
+                  }
+
+                if (!(syntax & RE_NO_BK_BRACES)) 
+                  {
+                    if (c != '\\') return REG_EBRACE;
+
+                    PATFETCH (c);
+                  }
+
+                if (c != '}')
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else 
+                      return REG_BADBR;
+                  }
+
+                /* We just parsed a valid interval.  */
+
+                /* If it's invalid to have no preceding re.  */
+                if (!laststart)
+                  {
+                    if (syntax & RE_CONTEXT_INVALID_OPS)
+                      return REG_BADRPT;
+                    else if (syntax & RE_CONTEXT_INDEP_OPS)
+                      laststart = b;
+                    else
+                      goto unfetch_interval;
+                  }
+
+                /* If the upper bound is zero, don't want to succeed at
+                   all; jump from `laststart' to `b + 3', which will be
+                   the end of the buffer after we insert the jump.  */
+                 if (upper_bound == 0)
+                   {
+                     GET_BUFFER_SPACE (3);
+                     INSERT_JUMP (jump, laststart, b + 3);
+                     b += 3;
+                   }
+
+                 /* Otherwise, we have a nontrivial interval.  When
+                    we're all done, the pattern will look like:
+                      set_number_at <jump count> <upper bound>
+                      set_number_at <succeed_n count> <lower bound>
+                      succeed_n <after jump addr> <succed_n count>
+                      <body of loop>
+                      jump_n <succeed_n addr> <jump count>
+                    (The upper bound and `jump_n' are omitted if
+                    `upper_bound' is 1, though.)  */
+                 else 
+                   { /* If the upper bound is > 1, we need to insert
+                        more at the end of the loop.  */
+                     unsigned nbytes = 10 + (upper_bound > 1) * 10;
+
+                     GET_BUFFER_SPACE (nbytes);
+
+                     /* Initialize lower bound of the `succeed_n', even
+                        though it will be set during matching by its
+                        attendant `set_number_at' (inserted next),
+                        because `re_compile_fastmap' needs to know.
+                        Jump to the `jump_n' we might insert below.  */
+                     INSERT_JUMP2 (succeed_n, laststart,
+                                   b + 5 + (upper_bound > 1) * 5,
+                                   lower_bound);
+                     b += 5;
+
+                     /* Code to initialize the lower bound.  Insert 
+                        before the `succeed_n'.  The `5' is the last two
+                        bytes of this `set_number_at', plus 3 bytes of
+                        the following `succeed_n'.  */
+                     insert_op2 (set_number_at, laststart, 5, lower_bound, b);
+                     b += 5;
+
+                     if (upper_bound > 1)
+                       { /* More than one repetition is allowed, so
+                            append a backward jump to the `succeed_n'
+                            that starts this interval.
+                            
+                            When we've reached this during matching,
+                            we'll have matched the interval once, so
+                            jump back only `upper_bound - 1' times.  */
+                         STORE_JUMP2 (jump_n, b, laststart + 5,
+                                      upper_bound - 1);
+                         b += 5;
+
+                         /* The location we want to set is the second
+                            parameter of the `jump_n'; that is `b-2' as
+                            an absolute address.  `laststart' will be
+                            the `set_number_at' we're about to insert;
+                            `laststart+3' the number to set, the source
+                            for the relative address.  But we are
+                            inserting into the middle of the pattern --
+                            so everything is getting moved up by 5.
+                            Conclusion: (b - 2) - (laststart + 3) + 5,
+                            i.e., b - laststart.
+                            
+                            We insert this at the beginning of the loop
+                            so that if we fail during matching, we'll
+                            reinitialize the bounds.  */
+                         insert_op2 (set_number_at, laststart, b - laststart,
+                                     upper_bound - 1, b);
+                         b += 5;
+                       }
+                   }
+                pending_exact = 0;
+                beg_interval = NULL;
+              }
+              break;
+
+            unfetch_interval:
+              /* If an invalid interval, match the characters as literals.  */
+               assert (beg_interval);
+               p = beg_interval;
+               beg_interval = NULL;
+
+               /* normal_char and normal_backslash need `c'.  */
+               PATFETCH (c);	
+
+               if (!(syntax & RE_NO_BK_BRACES))
+                 {
+                   if (p > pattern  &&  p[-1] == '\\')
+                     goto normal_backslash;
+                 }
+               goto normal_char;
+
+#ifdef emacs
+            /* There is no way to specify the before_dot and after_dot
+               operators.  rms says this is ok.  --karl  */
+            case '=':
+              BUF_PUSH (at_dot);
+              break;
+
+            case 's':	
+              laststart = b;
+              PATFETCH (c);
+              BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
+              break;
+
+            case 'S':
+              laststart = b;
+              PATFETCH (c);
+              BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
+              break;
+#endif /* emacs */
+
+
+            case 'w':
+              laststart = b;
+              BUF_PUSH (wordchar);
+              break;
+
+
+            case 'W':
+              laststart = b;
+              BUF_PUSH (notwordchar);
+              break;
+
+
+            case '<':
+              BUF_PUSH (wordbeg);
+              break;
+
+            case '>':
+              BUF_PUSH (wordend);
+              break;
+
+            case 'b':
+              BUF_PUSH (wordbound);
+              break;
+
+            case 'B':
+              BUF_PUSH (notwordbound);
+              break;
+
+            case '`':
+              BUF_PUSH (begbuf);
+              break;
+
+            case '\'':
+              BUF_PUSH (endbuf);
+              break;
+
+            case '1': case '2': case '3': case '4': case '5':
+            case '6': case '7': case '8': case '9':
+              if (syntax & RE_NO_BK_REFS)
+                goto normal_char;
+
+              c1 = c - '0';
+
+              if (c1 > regnum)
+                return REG_ESUBREG;
+
+              /* Can't back reference to a subexpression if inside of it.  */
+              if (group_in_compile_stack (compile_stack, c1))
+                goto normal_char;
+
+              laststart = b;
+              BUF_PUSH_2 (duplicate, c1);
+              break;
+
+
+            case '+':
+            case '?':
+              if (syntax & RE_BK_PLUS_QM)
+                goto handle_plus;
+              else
+                goto normal_backslash;
+
+            default:
+            normal_backslash:
+              /* You might think it would be useful for \ to mean
+                 not to translate; but if we don't translate it
+                 it will never match anything.  */
+              c = TRANSLATE (c);
+              goto normal_char;
+            }
+          break;
+
+
+	default:
+        /* Expects the character in `c'.  */
+	normal_char:
+	      /* If no exactn currently being built.  */
+          if (!pending_exact 
+
+              /* If last exactn not at current position.  */
+              || pending_exact + *pending_exact + 1 != b
+              
+              /* We have only one byte following the exactn for the count.  */
+	      || *pending_exact == (1 << BYTEWIDTH) - 1
+
+              /* If followed by a repetition operator.  */
+              || *p == '*' || *p == '^'
+	      || ((syntax & RE_BK_PLUS_QM)
+		  ? *p == '\\' && (p[1] == '+' || p[1] == '?')
+		  : (*p == '+' || *p == '?'))
+	      || ((syntax & RE_INTERVALS)
+                  && ((syntax & RE_NO_BK_BRACES)
+		      ? *p == '{'
+                      : (p[0] == '\\' && p[1] == '{'))))
+	    {
+	      /* Start building a new exactn.  */
+              
+              laststart = b;
+
+	      BUF_PUSH_2 (exactn, 0);
+	      pending_exact = b - 1;
+            }
+            
+	  BUF_PUSH (c);
+          (*pending_exact)++;
+	  break;
+        } /* switch (c) */
+    } /* while p != pend */
+
+  
+  /* Through the pattern now.  */
+  
+  if (fixup_alt_jump)
+    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+
+  if (!COMPILE_STACK_EMPTY) 
+    return REG_EPAREN;
+
+  free (compile_stack.stack);
+
+  /* We have succeeded; set the length of the buffer.  */
+  bufp->used = b - bufp->buffer;
+
+#ifdef DEBUG
+  if (debug)
+    {
+      DEBUG_PRINT1 ("\nCompiled pattern: ");
+      print_compiled_pattern (bufp);
+    }
+#endif /* DEBUG */
+
+  return REG_NOERROR;
+} /* regex_compile */
+
+/* Subroutines for `regex_compile'.  */
+
+/* Store OP at LOC followed by two-byte integer parameter ARG.  */
+
+static void
+store_op1 (op, loc, arg)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg;
+{
+  *loc = (unsigned char) op;
+  STORE_NUMBER (loc + 1, arg);
+}
+
+
+/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+store_op2 (op, loc, arg1, arg2)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg1, arg2;
+{
+  *loc = (unsigned char) op;
+  STORE_NUMBER (loc + 1, arg1);
+  STORE_NUMBER (loc + 3, arg2);
+}
+
+
+/* Copy the bytes from LOC to END to open up three bytes of space at LOC
+   for OP followed by two-byte integer parameter ARG.  */
+
+static void
+insert_op1 (op, loc, arg, end)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg;
+    unsigned char *end;    
+{
+  register unsigned char *pfrom = end;
+  register unsigned char *pto = end + 3;
+
+  while (pfrom != loc)
+    *--pto = *--pfrom;
+    
+  store_op1 (op, loc, arg);
+}
+
+
+/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+insert_op2 (op, loc, arg1, arg2, end)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg1, arg2;
+    unsigned char *end;    
+{
+  register unsigned char *pfrom = end;
+  register unsigned char *pto = end + 5;
+
+  while (pfrom != loc)
+    *--pto = *--pfrom;
+    
+  store_op2 (op, loc, arg1, arg2);
+}
+
+
+/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
+   after an alternative or a begin-subexpression.  We assume there is at
+   least one character before the ^.  */
+
+static boolean
+at_begline_loc_p (pattern, p, syntax)
+    const char *pattern, *p;
+    reg_syntax_t syntax;
+{
+  const char *prev = p - 2;
+  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
+  
+  return
+       /* After a subexpression?  */
+       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
+       /* After an alternative?  */
+    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
+}
+
+
+/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
+   at least one character after the $, i.e., `P < PEND'.  */
+
+static boolean
+at_endline_loc_p (p, pend, syntax)
+    const char *p, *pend;
+    int syntax;
+{
+  const char *next = p;
+  boolean next_backslash = *next == '\\';
+  const char *next_next = p + 1 < pend ? p + 1 : NULL;
+  
+  return
+       /* Before a subexpression?  */
+       (syntax & RE_NO_BK_PARENS ? *next == ')'
+        : next_backslash && next_next && *next_next == ')')
+       /* Before an alternative?  */
+    || (syntax & RE_NO_BK_VBAR ? *next == '|'
+        : next_backslash && next_next && *next_next == '|');
+}
+
+
+/* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
+   false if it's not.  */
+
+static boolean
+group_in_compile_stack (compile_stack, regnum)
+    compile_stack_type compile_stack;
+    regnum_t regnum;
+{
+  int this_element;
+
+  for (this_element = compile_stack.avail - 1;  
+       this_element >= 0; 
+       this_element--)
+    if (compile_stack.stack[this_element].regnum == regnum)
+      return true;
+
+  return false;
+}
+
+
+/* Read the ending character of a range (in a bracket expression) from the
+   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
+   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
+   Then we set the translation of all bits between the starting and
+   ending characters (inclusive) in the compiled pattern B.
+   
+   Return an error code.
+   
+   We use these short variable names so we can use the same macros as
+   `regex_compile' itself.  */
+
+static reg_errcode_t
+compile_range (p_ptr, pend, translate, syntax, b)
+    const char **p_ptr, *pend;
+    char *translate;
+    reg_syntax_t syntax;
+    unsigned char *b;
+{
+  unsigned this_char;
+
+  const char *p = *p_ptr;
+  int range_start, range_end;
+  
+  if (p == pend)
+    return REG_ERANGE;
+
+  /* Even though the pattern is a signed `char *', we need to fetch
+     with unsigned char *'s; if the high bit of the pattern character
+     is set, the range endpoints will be negative if we fetch using a
+     signed char *.
+
+     We also want to fetch the endpoints without translating them; the 
+     appropriate translation is done in the bit-setting loop below.  */
+  range_start = ((unsigned char *) p)[-2];
+  range_end   = ((unsigned char *) p)[0];
+
+  /* Have to increment the pointer into the pattern string, so the
+     caller isn't still at the ending character.  */
+  (*p_ptr)++;
+
+  /* If the start is after the end, the range is empty.  */
+  if (range_start > range_end)
+    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+
+  /* Here we see why `this_char' has to be larger than an `unsigned
+     char' -- the range is inclusive, so if `range_end' == 0xff
+     (assuming 8-bit characters), we would otherwise go into an infinite
+     loop, since all characters <= 0xff.  */
+  for (this_char = range_start; this_char <= range_end; this_char++)
+    {
+      SET_LIST_BIT (TRANSLATE (this_char));
+    }
+  
+  return REG_NOERROR;
+}
+
+/* Failure stack declarations and macros; both re_compile_fastmap and
+   re_match_2 use a failure stack.  These have to be macros because of
+   REGEX_ALLOCATE.  */
+   
+
+/* Number of failure points for which to initially allocate space
+   when matching.  If this number is exceeded, we allocate more
+   space, so it is not a hard limit.  */
+#ifndef INIT_FAILURE_ALLOC
+#define INIT_FAILURE_ALLOC 5
+#endif
+
+/* Roughly the maximum number of failure points on the stack.  Would be
+   exactly that if always used MAX_FAILURE_SPACE each time we failed.
+   This is a variable only so users of regex can assign to it; we never
+   change it ourselves.  */
+int re_max_failures = 2000;
+
+typedef const unsigned char *fail_stack_elt_t;
+
+typedef struct
+{
+  fail_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} fail_stack_type;
+
+#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
+#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
+#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
+#define FAIL_STACK_TOP()       (fail_stack.stack[fail_stack.avail])
+
+
+/* Initialize `fail_stack'.  Do `return -2' if the alloc fails.  */
+
+#define INIT_FAIL_STACK()						\
+  do {									\
+    fail_stack.stack = (fail_stack_elt_t *)				\
+      REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t));	\
+									\
+    if (fail_stack.stack == NULL)					\
+      return -2;							\
+									\
+    fail_stack.size = INIT_FAILURE_ALLOC;				\
+    fail_stack.avail = 0;						\
+  } while (0)
+
+
+/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
+
+   Return 1 if succeeds, and 0 if either ran out of memory
+   allocating space for it or it was already too large.  
+   
+   REGEX_REALLOCATE requires `destination' be declared.   */
+
+#define DOUBLE_FAIL_STACK(fail_stack)					\
+  ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS		\
+   ? 0									\
+   : ((fail_stack).stack = (fail_stack_elt_t *)				\
+        REGEX_REALLOCATE ((fail_stack).stack, 				\
+          (fail_stack).size * sizeof (fail_stack_elt_t),		\
+          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),	\
+									\
+      (fail_stack).stack == NULL					\
+      ? 0								\
+      : ((fail_stack).size <<= 1, 					\
+         1)))
+
+
+/* Push PATTERN_OP on FAIL_STACK. 
+
+   Return 1 if was able to do so and 0 if ran out of memory allocating
+   space to do so.  */
+#define PUSH_PATTERN_OP(pattern_op, fail_stack)				\
+  ((FAIL_STACK_FULL ()							\
+    && !DOUBLE_FAIL_STACK (fail_stack))					\
+    ? 0									\
+    : ((fail_stack).stack[(fail_stack).avail++] = pattern_op,		\
+       1))
+
+/* This pushes an item onto the failure stack.  Must be a four-byte
+   value.  Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_ITEM(item)						\
+  fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item
+
+/* The complement operation.  Assumes `fail_stack' is nonempty.  */
+#define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail]
+
+/* Used to omit pushing failure point id's when we're not debugging.  */
+#ifdef DEBUG
+#define DEBUG_PUSH PUSH_FAILURE_ITEM
+#define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM ()
+#else
+#define DEBUG_PUSH(item)
+#define DEBUG_POP(item_addr)
+#endif
+
+
+/* Push the information about the state we will need
+   if we ever fail back to it.  
+   
+   Requires variables fail_stack, regstart, regend, reg_info, and
+   num_regs be declared.  DOUBLE_FAIL_STACK requires `destination' be
+   declared.
+   
+   Does `return FAILURE_CODE' if runs out of memory.  */
+
+#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)	\
+  do {									\
+    char *destination;							\
+    /* Must be int, so when we don't save any registers, the arithmetic	\
+       of 0 + -1 isn't done as unsigned.  */				\
+    int this_reg;							\
+    									\
+    DEBUG_STATEMENT (failure_id++);					\
+    DEBUG_STATEMENT (nfailure_points_pushed++);				\
+    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);		\
+    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
+    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
+									\
+    DEBUG_PRINT2 ("  slots needed: %d\n", NUM_FAILURE_ITEMS);		\
+    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);	\
+									\
+    /* Ensure we have enough space allocated for what we will push.  */	\
+    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)			\
+      {									\
+        if (!DOUBLE_FAIL_STACK (fail_stack))			\
+          return failure_code;						\
+									\
+        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",		\
+		       (fail_stack).size);				\
+        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
+      }									\
+									\
+    /* Push the info, starting with the registers.  */			\
+    DEBUG_PRINT1 ("\n");						\
+									\
+    for (this_reg = lowest_active_reg; this_reg <= highest_active_reg;	\
+         this_reg++)							\
+      {									\
+	DEBUG_PRINT2 ("  Pushing reg: %d\n", this_reg);			\
+        DEBUG_STATEMENT (num_regs_pushed++);				\
+									\
+	DEBUG_PRINT2 ("    start: 0x%x\n", regstart[this_reg]);		\
+        PUSH_FAILURE_ITEM (regstart[this_reg]);				\
+                                                                        \
+	DEBUG_PRINT2 ("    end: 0x%x\n", regend[this_reg]);		\
+        PUSH_FAILURE_ITEM (regend[this_reg]);				\
+									\
+	DEBUG_PRINT2 ("    info: 0x%x\n      ", reg_info[this_reg]);	\
+        DEBUG_PRINT2 (" match_null=%d",					\
+                      REG_MATCH_NULL_STRING_P (reg_info[this_reg]));	\
+        DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));	\
+        DEBUG_PRINT2 (" matched_something=%d",				\
+                      MATCHED_SOMETHING (reg_info[this_reg]));		\
+        DEBUG_PRINT2 (" ever_matched=%d",				\
+                      EVER_MATCHED_SOMETHING (reg_info[this_reg]));	\
+	DEBUG_PRINT1 ("\n");						\
+        PUSH_FAILURE_ITEM (reg_info[this_reg].word);			\
+      }									\
+									\
+    DEBUG_PRINT2 ("  Pushing  low active reg: %d\n", lowest_active_reg);\
+    PUSH_FAILURE_ITEM (lowest_active_reg);				\
+									\
+    DEBUG_PRINT2 ("  Pushing high active reg: %d\n", highest_active_reg);\
+    PUSH_FAILURE_ITEM (highest_active_reg);				\
+									\
+    DEBUG_PRINT2 ("  Pushing pattern 0x%x: ", pattern_place);		\
+    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);		\
+    PUSH_FAILURE_ITEM (pattern_place);					\
+									\
+    DEBUG_PRINT2 ("  Pushing string 0x%x: `", string_place);		\
+    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
+				 size2);				\
+    DEBUG_PRINT1 ("'\n");						\
+    PUSH_FAILURE_ITEM (string_place);					\
+									\
+    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);		\
+    DEBUG_PUSH (failure_id);						\
+  } while (0)
+
+/* This is the number of items that are pushed and popped on the stack
+   for each register.  */
+#define NUM_REG_ITEMS  3
+
+/* Individual items aside from the registers.  */
+#ifdef DEBUG
+#define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
+#else
+#define NUM_NONREG_ITEMS 4
+#endif
+
+/* We push at most this many items on the stack.  */
+#define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
+
+/* We actually push this many items.  */
+#define NUM_FAILURE_ITEMS						\
+  ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS 	\
+    + NUM_NONREG_ITEMS)
+
+/* How many items can still be added to the stack without overflowing it.  */
+#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
+
+
+/* Pops what PUSH_FAIL_STACK pushes.
+
+   We restore into the parameters, all of which should be lvalues:
+     STR -- the saved data position.
+     PAT -- the saved pattern position.
+     LOW_REG, HIGH_REG -- the highest and lowest active registers.
+     REGSTART, REGEND -- arrays of string positions.
+     REG_INFO -- array of information about each subexpression.
+   
+   Also assumes the variables `fail_stack' and (if debugging), `bufp',
+   `pend', `string1', `size1', `string2', and `size2'.  */
+
+#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
+{									\
+  DEBUG_STATEMENT (fail_stack_elt_t failure_id;)			\
+  int this_reg;								\
+  const unsigned char *string_temp;					\
+									\
+  assert (!FAIL_STACK_EMPTY ());					\
+									\
+  /* Remove failure points and point to how many regs pushed.  */	\
+  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");				\
+  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);	\
+  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);	\
+									\
+  assert (fail_stack.avail >= NUM_NONREG_ITEMS);			\
+									\
+  DEBUG_POP (&failure_id);						\
+  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);		\
+									\
+  /* If the saved string location is NULL, it came from an		\
+     on_failure_keep_string_jump opcode, and we want to throw away the	\
+     saved NULL, thus retaining our current position in the string.  */	\
+  string_temp = POP_FAILURE_ITEM ();					\
+  if (string_temp != NULL)						\
+    str = (const char *) string_temp;					\
+									\
+  DEBUG_PRINT2 ("  Popping string 0x%x: `", str);			\
+  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);	\
+  DEBUG_PRINT1 ("'\n");							\
+									\
+  pat = (unsigned char *) POP_FAILURE_ITEM ();				\
+  DEBUG_PRINT2 ("  Popping pattern 0x%x: ", pat);			\
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);			\
+									\
+  /* Restore register info.  */						\
+  high_reg = (unsigned) POP_FAILURE_ITEM ();				\
+  DEBUG_PRINT2 ("  Popping high active reg: %d\n", high_reg);		\
+									\
+  low_reg = (unsigned) POP_FAILURE_ITEM ();				\
+  DEBUG_PRINT2 ("  Popping  low active reg: %d\n", low_reg);		\
+									\
+  for (this_reg = high_reg; this_reg >= low_reg; this_reg--)		\
+    {									\
+      DEBUG_PRINT2 ("    Popping reg: %d\n", this_reg);			\
+									\
+      reg_info[this_reg].word = POP_FAILURE_ITEM ();			\
+      DEBUG_PRINT2 ("      info: 0x%x\n", reg_info[this_reg]);		\
+									\
+      regend[this_reg] = (const char *) POP_FAILURE_ITEM ();		\
+      DEBUG_PRINT2 ("      end: 0x%x\n", regend[this_reg]);		\
+									\
+      regstart[this_reg] = (const char *) POP_FAILURE_ITEM ();		\
+      DEBUG_PRINT2 ("      start: 0x%x\n", regstart[this_reg]);		\
+    }									\
+									\
+  DEBUG_STATEMENT (nfailure_points_popped++);				\
+} /* POP_FAILURE_POINT */
+
+/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
+   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
+   characters can start a string that matches the pattern.  This fastmap
+   is used by re_search to skip quickly over impossible starting points.
+
+   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
+   area as BUFP->fastmap.
+   
+   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
+   the pattern buffer.
+
+   Returns 0 if we succeed, -2 if an internal error.   */
+
+int
+re_compile_fastmap (bufp)
+     struct re_pattern_buffer *bufp;
+{
+  int j, k;
+  fail_stack_type fail_stack;
+#ifndef REGEX_MALLOC
+  char *destination;
+#endif
+  /* We don't push any register information onto the failure stack.  */
+  unsigned num_regs = 0;
+  
+  register char *fastmap = bufp->fastmap;
+  unsigned char *pattern = bufp->buffer;
+  unsigned long size = bufp->used;
+  const unsigned char *p = pattern;
+  register unsigned char *pend = pattern + size;
+
+  /* Assume that each path through the pattern can be null until
+     proven otherwise.  We set this false at the bottom of switch
+     statement, to which we get only if a particular path doesn't
+     match the empty string.  */
+  boolean path_can_be_null = true;
+
+  /* We aren't doing a `succeed_n' to begin with.  */
+  boolean succeed_n_p = false;
+
+  assert (fastmap != NULL && p != NULL);
+  
+  INIT_FAIL_STACK ();
+  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
+  bufp->fastmap_accurate = 1;	    /* It will be when we're done.  */
+  bufp->can_be_null = 0;
+      
+  while (p != pend || !FAIL_STACK_EMPTY ())
+    {
+      if (p == pend)
+        {
+          bufp->can_be_null |= path_can_be_null;
+          
+          /* Reset for next path.  */
+          path_can_be_null = true;
+          
+          p = fail_stack.stack[--fail_stack.avail];
+	}
+
+      /* We should never be about to go beyond the end of the pattern.  */
+      assert (p < pend);
+      
+#ifdef SWITCH_ENUM_BUG
+      switch ((int) ((re_opcode_t) *p++))
+#else
+      switch ((re_opcode_t) *p++)
+#endif
+	{
+
+        /* I guess the idea here is to simply not bother with a fastmap
+           if a backreference is used, since it's too hard to figure out
+           the fastmap for the corresponding group.  Setting
+           `can_be_null' stops `re_search_2' from using the fastmap, so
+           that is all we do.  */
+	case duplicate:
+	  bufp->can_be_null = 1;
+          return 0;
+
+
+      /* Following are the cases which match a character.  These end
+         with `break'.  */
+
+	case exactn:
+          fastmap[p[1]] = 1;
+	  break;
+
+
+        case charset:
+          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+	    if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
+              fastmap[j] = 1;
+	  break;
+
+
+	case charset_not:
+	  /* Chars beyond end of map must be allowed.  */
+	  for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
+            fastmap[j] = 1;
+
+	  for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+	    if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
+              fastmap[j] = 1;
+          break;
+
+
+	case wordchar:
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) == Sword)
+	      fastmap[j] = 1;
+	  break;
+
+
+	case notwordchar:
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) != Sword)
+	      fastmap[j] = 1;
+	  break;
+
+
+        case anychar:
+          /* `.' matches anything ...  */
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+            fastmap[j] = 1;
+
+          /* ... except perhaps newline.  */
+          if (!(bufp->syntax & RE_DOT_NEWLINE))
+            fastmap['\n'] = 0;
+
+          /* Return if we have already set `can_be_null'; if we have,
+             then the fastmap is irrelevant.  Something's wrong here.  */
+	  else if (bufp->can_be_null)
+	    return 0;
+
+          /* Otherwise, have to check alternative paths.  */
+	  break;
+
+
+#ifdef emacs
+        case syntaxspec:
+	  k = *p++;
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) == (enum syntaxcode) k)
+	      fastmap[j] = 1;
+	  break;
+
+
+	case notsyntaxspec:
+	  k = *p++;
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) != (enum syntaxcode) k)
+	      fastmap[j] = 1;
+	  break;
+
+
+      /* All cases after this match the empty string.  These end with
+         `continue'.  */
+
+
+	case before_dot:
+	case at_dot:
+	case after_dot:
+          continue;
+#endif /* not emacs */
+
+
+        case no_op:
+        case begline:
+        case endline:
+	case begbuf:
+	case endbuf:
+	case wordbound:
+	case notwordbound:
+	case wordbeg:
+	case wordend:
+        case push_dummy_failure:
+          continue;
+
+
+	case jump_n:
+        case pop_failure_jump:
+	case maybe_pop_jump:
+	case jump:
+        case jump_past_alt:
+	case dummy_failure_jump:
+          EXTRACT_NUMBER_AND_INCR (j, p);
+	  p += j;	
+	  if (j > 0)
+	    continue;
+            
+          /* Jump backward implies we just went through the body of a
+             loop and matched nothing.  Opcode jumped to should be
+             `on_failure_jump' or `succeed_n'.  Just treat it like an
+             ordinary jump.  For a * loop, it has pushed its failure
+             point already; if so, discard that as redundant.  */
+          if ((re_opcode_t) *p != on_failure_jump
+	      && (re_opcode_t) *p != succeed_n)
+	    continue;
+
+          p++;
+          EXTRACT_NUMBER_AND_INCR (j, p);
+          p += j;		
+	  
+          /* If what's on the stack is where we are now, pop it.  */
+          if (!FAIL_STACK_EMPTY () 
+	      && fail_stack.stack[fail_stack.avail - 1] == p)
+            fail_stack.avail--;
+
+          continue;
+
+
+        case on_failure_jump:
+        case on_failure_keep_string_jump:
+	handle_on_failure_jump:
+          EXTRACT_NUMBER_AND_INCR (j, p);
+
+          /* For some patterns, e.g., `(a?)?', `p+j' here points to the
+             end of the pattern.  We don't want to push such a point,
+             since when we restore it above, entering the switch will
+             increment `p' past the end of the pattern.  We don't need
+             to push such a point since we obviously won't find any more
+             fastmap entries beyond `pend'.  Such a pattern can match
+             the null string, though.  */
+          if (p + j < pend)
+            {
+              if (!PUSH_PATTERN_OP (p + j, fail_stack))
+                return -2;
+            }
+          else
+            bufp->can_be_null = 1;
+
+          if (succeed_n_p)
+            {
+              EXTRACT_NUMBER_AND_INCR (k, p);	/* Skip the n.  */
+              succeed_n_p = false;
+	    }
+
+          continue;
+
+
+	case succeed_n:
+          /* Get to the number of times to succeed.  */
+          p += 2;		
+
+          /* Increment p past the n for when k != 0.  */
+          EXTRACT_NUMBER_AND_INCR (k, p);
+          if (k == 0)
+	    {
+              p -= 4;
+  	      succeed_n_p = true;  /* Spaghetti code alert.  */
+              goto handle_on_failure_jump;
+            }
+          continue;
+
+
+	case set_number_at:
+          p += 4;
+          continue;
+
+
+	case start_memory:
+        case stop_memory:
+	  p += 2;
+	  continue;
+
+
+	default:
+          abort (); /* We have listed all the cases.  */
+        } /* switch *p++ */
+
+      /* Getting here means we have found the possible starting
+         characters for one path of the pattern -- and that the empty
+         string does not match.  We need not follow this path further.
+         Instead, look at the next alternative (remembered on the
+         stack), or quit if no more.  The test at the top of the loop
+         does these things.  */
+      path_can_be_null = false;
+      p = pend;
+    } /* while p */
+
+  /* Set `can_be_null' for the last path (also the first path, if the
+     pattern is empty).  */
+  bufp->can_be_null |= path_can_be_null;
+  return 0;
+} /* re_compile_fastmap */
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+    struct re_pattern_buffer *bufp;
+    struct re_registers *regs;
+    unsigned num_regs;
+    regoff_t *starts, *ends;
+{
+  if (num_regs)
+    {
+      bufp->regs_allocated = REGS_REALLOCATE;
+      regs->num_regs = num_regs;
+      regs->start = starts;
+      regs->end = ends;
+    }
+  else
+    {
+      bufp->regs_allocated = REGS_UNALLOCATED;
+      regs->num_regs = 0;
+      regs->start = regs->end = (regoff_t) 0;
+    }
+}
+
+/* Searching routines.  */
+
+/* Like re_search_2, below, but only one string is specified, and
+   doesn't let you say where to stop matching. */
+
+int
+re_search (bufp, string, size, startpos, range, regs)
+     struct re_pattern_buffer *bufp;
+     const char *string;
+     int size, startpos, range;
+     struct re_registers *regs;
+{
+  return re_search_2 (bufp, NULL, 0, string, size, startpos, range, 
+		      regs, size);
+}
+
+
+/* Using the compiled pattern in BUFP->buffer, first tries to match the
+   virtual concatenation of STRING1 and STRING2, starting first at index
+   STARTPOS, then at STARTPOS + 1, and so on.
+   
+   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
+   
+   RANGE is how far to scan while trying to match.  RANGE = 0 means try
+   only at STARTPOS; in general, the last start tried is STARTPOS +
+   RANGE.
+   
+   In REGS, return the indices of the virtual concatenation of STRING1
+   and STRING2 that matched the entire BUFP->buffer and its contained
+   subexpressions.
+   
+   Do not consider matching one past the index STOP in the virtual
+   concatenation of STRING1 and STRING2.
+
+   We return either the position in the strings at which the match was
+   found, -1 if no match, or -2 if error (such as failure
+   stack overflow).  */
+
+int
+re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int startpos;
+     int range;
+     struct re_registers *regs;
+     int stop;
+{
+  int val;
+  register char *fastmap = bufp->fastmap;
+  register char *translate = bufp->translate;
+  int total_size = size1 + size2;
+  int endpos = startpos + range;
+
+  /* Check for out-of-range STARTPOS.  */
+  if (startpos < 0 || startpos > total_size)
+    return -1;
+    
+  /* Fix up RANGE if it might eventually take us outside
+     the virtual concatenation of STRING1 and STRING2.  */
+  if (endpos < -1)
+    range = -1 - startpos;
+  else if (endpos > total_size)
+    range = total_size - startpos;
+
+  /* If the search isn't to be a backwards one, don't waste time in a
+     search for a pattern that must be anchored.  */
+  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
+    {
+      if (startpos > 0)
+	return -1;
+      else
+	range = 1;
+    }
+
+  /* Update the fastmap now if not correct already.  */
+  if (fastmap && !bufp->fastmap_accurate)
+    if (re_compile_fastmap (bufp) == -2)
+      return -2;
+  
+  /* Loop through the string, looking for a place to start matching.  */
+  for (;;)
+    { 
+      /* If a fastmap is supplied, skip quickly over characters that
+         cannot be the start of a match.  If the pattern can match the
+         null string, however, we don't need to skip characters; we want
+         the first null string.  */
+      if (fastmap && startpos < total_size && !bufp->can_be_null)
+	{
+	  if (range > 0)	/* Searching forwards.  */
+	    {
+	      register const char *d;
+	      register int lim = 0;
+	      int irange = range;
+
+              if (startpos < size1 && startpos + range >= size1)
+                lim = range - (size1 - startpos);
+
+	      d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
+   
+              /* Written out as an if-else to avoid testing `translate'
+                 inside the loop.  */
+	      if (translate)
+                while (range > lim
+                       && !fastmap[(unsigned char)
+				   translate[(unsigned char) *d++]])
+                  range--;
+	      else
+                while (range > lim && !fastmap[(unsigned char) *d++])
+                  range--;
+
+	      startpos += irange - range;
+	    }
+	  else				/* Searching backwards.  */
+	    {
+	      register char c = (size1 == 0 || startpos >= size1
+                                 ? string2[startpos - size1] 
+                                 : string1[startpos]);
+
+	      if (!fastmap[(unsigned char) TRANSLATE (c)])
+		goto advance;
+	    }
+	}
+
+      /* If can't match the null string, and that's all we have left, fail.  */
+      if (range >= 0 && startpos == total_size && fastmap
+          && !bufp->can_be_null)
+	return -1;
+
+      val = re_match_2 (bufp, string1, size1, string2, size2,
+	                startpos, regs, stop);
+      if (val >= 0)
+	return startpos;
+        
+      if (val == -2)
+	return -2;
+
+    advance:
+      if (!range) 
+        break;
+      else if (range > 0) 
+        {
+          range--; 
+          startpos++;
+        }
+      else
+        {
+          range++; 
+          startpos--;
+        }
+    }
+  return -1;
+} /* re_search_2 */
+
+/* Declarations and macros for re_match_2.  */
+
+static int bcmp_translate ();
+static boolean alt_match_null_string_p (),
+               common_op_match_null_string_p (),
+               group_match_null_string_p ();
+
+/* Structure for per-register (a.k.a. per-group) information.
+   This must not be longer than one word, because we push this value
+   onto the failure stack.  Other register information, such as the
+   starting and ending positions (which are addresses), and the list of
+   inner groups (which is a bits list) are maintained in separate
+   variables.  
+   
+   We are making a (strictly speaking) nonportable assumption here: that
+   the compiler will pack our bit fields into something that fits into
+   the type of `word', i.e., is something that fits into one item on the
+   failure stack.  */
+typedef union
+{
+  fail_stack_elt_t word;
+  struct
+  {
+      /* This field is one if this group can match the empty string,
+         zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
+#define MATCH_NULL_UNSET_VALUE 3
+    unsigned match_null_string_p : 2;
+    unsigned is_active : 1;
+    unsigned matched_something : 1;
+    unsigned ever_matched_something : 1;
+  } bits;
+} register_info_type;
+
+#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
+#define IS_ACTIVE(R)  ((R).bits.is_active)
+#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
+#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
+
+
+/* Call this when have matched a real character; it sets `matched' flags
+   for the subexpressions which we are currently inside.  Also records
+   that those subexprs have matched.  */
+#define SET_REGS_MATCHED()						\
+  do									\
+    {									\
+      unsigned r;							\
+      for (r = lowest_active_reg; r <= highest_active_reg; r++)		\
+        {								\
+          MATCHED_SOMETHING (reg_info[r])				\
+            = EVER_MATCHED_SOMETHING (reg_info[r])			\
+            = 1;							\
+        }								\
+    }									\
+  while (0)
+
+
+/* This converts PTR, a pointer into one of the search strings `string1'
+   and `string2' into an offset from the beginning of that string.  */
+#define POINTER_TO_OFFSET(ptr)						\
+  (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1)
+
+/* Registers are set to a sentinel when they haven't yet matched.  */
+#define REG_UNSET_VALUE ((char *) -1)
+#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
+
+
+/* Macros for dealing with the split strings in re_match_2.  */
+
+#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
+
+/* Call before fetching a character with *d.  This switches over to
+   string2 if necessary.  */
+#define PREFETCH()							\
+  while (d == dend)						    	\
+    {									\
+      /* End of string2 => fail.  */					\
+      if (dend == end_match_2) 						\
+        goto fail;							\
+      /* End of string1 => advance to string2.  */ 			\
+      d = string2;						        \
+      dend = end_match_2;						\
+    }
+
+
+/* Test if at very beginning or at very end of the virtual concatenation
+   of `string1' and `string2'.  If only one string, it's `string2'.  */
+#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
+#define AT_STRINGS_END(d) ((d) == end2)	
+
+
+/* Test if D points to a character which is word-constituent.  We have
+   two special cases to check for: if past the end of string1, look at
+   the first character in string2; and if before the beginning of
+   string2, look at the last character in string1.  */
+#define WORDCHAR_P(d)							\
+  (SYNTAX ((d) == end1 ? *string2					\
+           : (d) == string2 - 1 ? *(end1 - 1) : *(d))			\
+   == Sword)
+
+/* Test if the character before D and the one at D differ with respect
+   to being word-constituent.  */
+#define AT_WORD_BOUNDARY(d)						\
+  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
+   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
+
+
+/* Free everything we malloc.  */
+#ifdef REGEX_MALLOC
+#define FREE_VAR(var) if (var) free (var); var = NULL
+#define FREE_VARIABLES()						\
+  do {									\
+    FREE_VAR (fail_stack.stack);					\
+    FREE_VAR (regstart);						\
+    FREE_VAR (regend);							\
+    FREE_VAR (old_regstart);						\
+    FREE_VAR (old_regend);						\
+    FREE_VAR (best_regstart);						\
+    FREE_VAR (best_regend);						\
+    FREE_VAR (reg_info);						\
+    FREE_VAR (reg_dummy);						\
+    FREE_VAR (reg_info_dummy);						\
+  } while (0)
+#else /* not REGEX_MALLOC */
+/* Some MIPS systems (at least) want this to free alloca'd storage.  */
+#define FREE_VARIABLES() alloca (0)
+#endif /* not REGEX_MALLOC */
+
+
+/* These values must meet several constraints.  They must not be valid
+   register values; since we have a limit of 255 registers (because
+   we use only one byte in the pattern for the register number), we can
+   use numbers larger than 255.  They must differ by 1, because of
+   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
+   be larger than the value for the highest register, so we do not try
+   to actually save any registers when none are active.  */
+#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
+#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
+
+/* Matching routines.  */
+
+#ifndef emacs   /* Emacs never uses this.  */
+/* re_match is like re_match_2 except it takes only a single string.  */
+
+int
+re_match (bufp, string, size, pos, regs)
+     struct re_pattern_buffer *bufp;
+     const char *string;
+     int size, pos;
+     struct re_registers *regs;
+ {
+  return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); 
+}
+#endif /* not emacs */
+
+
+/* re_match_2 matches the compiled pattern in BUFP against the
+   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
+   and SIZE2, respectively).  We start matching at POS, and stop
+   matching at STOP.
+   
+   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
+   store offsets for the substring each group matched in REGS.  See the
+   documentation for exactly how many groups we fill.
+
+   We return -1 if no match, -2 if an internal error (such as the
+   failure stack overflowing).  Otherwise, we return the length of the
+   matched substring.  */
+
+int
+re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int pos;
+     struct re_registers *regs;
+     int stop;
+{
+  /* General temporaries.  */
+  int mcnt;
+  unsigned char *p1;
+
+  /* Just past the end of the corresponding string.  */
+  const char *end1, *end2;
+
+  /* Pointers into string1 and string2, just past the last characters in
+     each to consider matching.  */
+  const char *end_match_1, *end_match_2;
+
+  /* Where we are in the data, and the end of the current string.  */
+  const char *d, *dend;
+  
+  /* Where we are in the pattern, and the end of the pattern.  */
+  unsigned char *p = bufp->buffer;
+  register unsigned char *pend = p + bufp->used;
+
+  /* We use this to map every character in the string.  */
+  char *translate = bufp->translate;
+
+  /* Failure point stack.  Each place that can handle a failure further
+     down the line pushes a failure point on this stack.  It consists of
+     restart, regend, and reg_info for all registers corresponding to
+     the subexpressions we're currently inside, plus the number of such
+     registers, and, finally, two char *'s.  The first char * is where
+     to resume scanning the pattern; the second one is where to resume
+     scanning the strings.  If the latter is zero, the failure point is
+     a ``dummy''; if a failure happens and the failure point is a dummy,
+     it gets discarded and the next next one is tried.  */
+  fail_stack_type fail_stack;
+#ifdef DEBUG
+  static unsigned failure_id = 0;
+  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
+#endif
+
+  /* We fill all the registers internally, independent of what we
+     return, for use in backreferences.  The number here includes
+     an element for register zero.  */
+  unsigned num_regs = bufp->re_nsub + 1;
+  
+  /* The currently active registers.  */
+  unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+  unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+
+  /* Information on the contents of registers. These are pointers into
+     the input strings; they record just what was matched (on this
+     attempt) by a subexpression part of the pattern, that is, the
+     regnum-th regstart pointer points to where in the pattern we began
+     matching and the regnum-th regend points to right after where we
+     stopped matching the regnum-th subexpression.  (The zeroth register
+     keeps track of what the whole pattern matches.)  */
+  const char **regstart, **regend;
+
+  /* If a group that's operated upon by a repetition operator fails to
+     match anything, then the register for its start will need to be
+     restored because it will have been set to wherever in the string we
+     are when we last see its open-group operator.  Similarly for a
+     register's end.  */
+  const char **old_regstart, **old_regend;
+
+  /* The is_active field of reg_info helps us keep track of which (possibly
+     nested) subexpressions we are currently in. The matched_something
+     field of reg_info[reg_num] helps us tell whether or not we have
+     matched any of the pattern so far this time through the reg_num-th
+     subexpression.  These two fields get reset each time through any
+     loop their register is in.  */
+  register_info_type *reg_info; 
+
+  /* The following record the register info as found in the above
+     variables when we find a match better than any we've seen before. 
+     This happens as we backtrack through the failure points, which in
+     turn happens only if we have not yet matched the entire string. */
+  unsigned best_regs_set = false;
+  const char **best_regstart, **best_regend;
+  
+  /* Logically, this is `best_regend[0]'.  But we don't want to have to
+     allocate space for that if we're not allocating space for anything
+     else (see below).  Also, we never need info about register 0 for
+     any of the other register vectors, and it seems rather a kludge to
+     treat `best_regend' differently than the rest.  So we keep track of
+     the end of the best match so far in a separate variable.  We
+     initialize this to NULL so that when we backtrack the first time
+     and need to test it, it's not garbage.  */
+  const char *match_end = NULL;
+
+  /* Used when we pop values we don't care about.  */
+  const char **reg_dummy;
+  register_info_type *reg_info_dummy;
+
+#ifdef DEBUG
+  /* Counts the total number of registers pushed.  */
+  unsigned num_regs_pushed = 0; 	
+#endif
+
+  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
+  
+  INIT_FAIL_STACK ();
+  
+  /* Do not bother to initialize all the register variables if there are
+     no groups in the pattern, as it takes a fair amount of time.  If
+     there are groups, we include space for register 0 (the whole
+     pattern), even though we never use it, since it simplifies the
+     array indexing.  We should fix this.  */
+  if (bufp->re_nsub)
+    {
+      regstart = REGEX_TALLOC (num_regs, const char *);
+      regend = REGEX_TALLOC (num_regs, const char *);
+      old_regstart = REGEX_TALLOC (num_regs, const char *);
+      old_regend = REGEX_TALLOC (num_regs, const char *);
+      best_regstart = REGEX_TALLOC (num_regs, const char *);
+      best_regend = REGEX_TALLOC (num_regs, const char *);
+      reg_info = REGEX_TALLOC (num_regs, register_info_type);
+      reg_dummy = REGEX_TALLOC (num_regs, const char *);
+      reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
+
+      if (!(regstart && regend && old_regstart && old_regend && reg_info 
+            && best_regstart && best_regend && reg_dummy && reg_info_dummy)) 
+        {
+          FREE_VARIABLES ();
+          return -2;
+        }
+    }
+#ifdef REGEX_MALLOC
+  else
+    {
+      /* We must initialize all our variables to NULL, so that
+         `FREE_VARIABLES' doesn't try to free them.  */
+      regstart = regend = old_regstart = old_regend = best_regstart
+        = best_regend = reg_dummy = NULL;
+      reg_info = reg_info_dummy = (register_info_type *) NULL;
+    }
+#endif /* REGEX_MALLOC */
+
+  /* The starting position is bogus.  */
+  if (pos < 0 || pos > size1 + size2)
+    {
+      FREE_VARIABLES ();
+      return -1;
+    }
+    
+  /* Initialize subexpression text positions to -1 to mark ones that no
+     start_memory/stop_memory has been seen for. Also initialize the
+     register information struct.  */
+  for (mcnt = 1; mcnt < num_regs; mcnt++)
+    {
+      regstart[mcnt] = regend[mcnt] 
+        = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
+        
+      REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
+      IS_ACTIVE (reg_info[mcnt]) = 0;
+      MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+      EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+    }
+  
+  /* We move `string1' into `string2' if the latter's empty -- but not if
+     `string1' is null.  */
+  if (size2 == 0 && string1 != NULL)
+    {
+      string2 = string1;
+      size2 = size1;
+      string1 = 0;
+      size1 = 0;
+    }
+  end1 = string1 + size1;
+  end2 = string2 + size2;
+
+  /* Compute where to stop matching, within the two strings.  */
+  if (stop <= size1)
+    {
+      end_match_1 = string1 + stop;
+      end_match_2 = string2;
+    }
+  else
+    {
+      end_match_1 = end1;
+      end_match_2 = string2 + stop - size1;
+    }
+
+  /* `p' scans through the pattern as `d' scans through the data. 
+     `dend' is the end of the input string that `d' points within.  `d'
+     is advanced into the following input string whenever necessary, but
+     this happens before fetching; therefore, at the beginning of the
+     loop, `d' can be pointing at the end of a string, but it cannot
+     equal `string2'.  */
+  if (size1 > 0 && pos <= size1)
+    {
+      d = string1 + pos;
+      dend = end_match_1;
+    }
+  else
+    {
+      d = string2 + pos - size1;
+      dend = end_match_2;
+    }
+
+  DEBUG_PRINT1 ("The compiled pattern is: ");
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
+  DEBUG_PRINT1 ("The string to match is: `");
+  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
+  DEBUG_PRINT1 ("'\n");
+  
+  /* This loops over pattern commands.  It exits by returning from the
+     function if the match is complete, or it drops through if the match
+     fails at this starting point in the input data.  */
+  for (;;)
+    {
+      DEBUG_PRINT2 ("\n0x%x: ", p);
+
+      if (p == pend)
+	{ /* End of pattern means we might have succeeded.  */
+          DEBUG_PRINT1 ("end of pattern ... ");
+          
+	  /* If we haven't matched the entire string, and we want the
+             longest match, try backtracking.  */
+          if (d != end_match_2)
+	    {
+              DEBUG_PRINT1 ("backtracking.\n");
+              
+              if (!FAIL_STACK_EMPTY ())
+                { /* More failure points to try.  */
+                  boolean same_str_p = (FIRST_STRING_P (match_end) 
+	        	                == MATCHING_IN_FIRST_STRING);
+
+                  /* If exceeds best match so far, save it.  */
+                  if (!best_regs_set
+                      || (same_str_p && d > match_end)
+                      || (!same_str_p && !MATCHING_IN_FIRST_STRING))
+                    {
+                      best_regs_set = true;
+                      match_end = d;
+                      
+                      DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
+                      
+                      for (mcnt = 1; mcnt < num_regs; mcnt++)
+                        {
+                          best_regstart[mcnt] = regstart[mcnt];
+                          best_regend[mcnt] = regend[mcnt];
+                        }
+                    }
+                  goto fail;	       
+                }
+
+              /* If no failure points, don't restore garbage.  */
+              else if (best_regs_set)   
+                {
+  	        restore_best_regs:
+                  /* Restore best match.  It may happen that `dend ==
+                     end_match_1' while the restored d is in string2.
+                     For example, the pattern `x.*y.*z' against the
+                     strings `x-' and `y-z-', if the two strings are
+                     not consecutive in memory.  */
+                  DEBUG_PRINT1 ("Restoring best registers.\n");
+                  
+                  d = match_end;
+                  dend = ((d >= string1 && d <= end1)
+		           ? end_match_1 : end_match_2);
+
+		  for (mcnt = 1; mcnt < num_regs; mcnt++)
+		    {
+		      regstart[mcnt] = best_regstart[mcnt];
+		      regend[mcnt] = best_regend[mcnt];
+		    }
+                }
+            } /* d != end_match_2 */
+
+          DEBUG_PRINT1 ("Accepting match.\n");
+
+          /* If caller wants register contents data back, do it.  */
+          if (regs && !bufp->no_sub)
+	    {
+              /* Have the register data arrays been allocated?  */
+              if (bufp->regs_allocated == REGS_UNALLOCATED)
+                { /* No.  So allocate them with malloc.  We need one
+                     extra element beyond `num_regs' for the `-1' marker
+                     GNU code uses.  */
+                  regs->num_regs = MAX (RE_NREGS, num_regs + 1);
+                  regs->start = TALLOC (regs->num_regs, regoff_t);
+                  regs->end = TALLOC (regs->num_regs, regoff_t);
+                  if (regs->start == NULL || regs->end == NULL)
+                    return -2;
+                  bufp->regs_allocated = REGS_REALLOCATE;
+                }
+              else if (bufp->regs_allocated == REGS_REALLOCATE)
+                { /* Yes.  If we need more elements than were already
+                     allocated, reallocate them.  If we need fewer, just
+                     leave it alone.  */
+                  if (regs->num_regs < num_regs + 1)
+                    {
+                      regs->num_regs = num_regs + 1;
+                      RETALLOC (regs->start, regs->num_regs, regoff_t);
+                      RETALLOC (regs->end, regs->num_regs, regoff_t);
+                      if (regs->start == NULL || regs->end == NULL)
+                        return -2;
+                    }
+                }
+              else
+                assert (bufp->regs_allocated == REGS_FIXED);
+
+              /* Convert the pointer data in `regstart' and `regend' to
+                 indices.  Register zero has to be set differently,
+                 since we haven't kept track of any info for it.  */
+              if (regs->num_regs > 0)
+                {
+                  regs->start[0] = pos;
+                  regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1
+			          : d - string2 + size1);
+                }
+              
+              /* Go through the first `min (num_regs, regs->num_regs)'
+                 registers, since that is all we initialized.  */
+	      for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++)
+		{
+                  if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
+                    regs->start[mcnt] = regs->end[mcnt] = -1;
+                  else
+                    {
+		      regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]);
+                      regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]);
+                    }
+		}
+              
+              /* If the regs structure we return has more elements than
+                 were in the pattern, set the extra elements to -1.  If
+                 we (re)allocated the registers, this is the case,
+                 because we always allocate enough to have at least one
+                 -1 at the end.  */
+              for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
+                regs->start[mcnt] = regs->end[mcnt] = -1;
+	    } /* regs && !bufp->no_sub */
+
+          FREE_VARIABLES ();
+          DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
+                        nfailure_points_pushed, nfailure_points_popped,
+                        nfailure_points_pushed - nfailure_points_popped);
+          DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
+
+          mcnt = d - pos - (MATCHING_IN_FIRST_STRING 
+			    ? string1 
+			    : string2 - size1);
+
+          DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
+
+          return mcnt;
+        }
+
+      /* Otherwise match next pattern command.  */
+#ifdef SWITCH_ENUM_BUG
+      switch ((int) ((re_opcode_t) *p++))
+#else
+      switch ((re_opcode_t) *p++)
+#endif
+	{
+        /* Ignore these.  Used to ignore the n of succeed_n's which
+           currently have n == 0.  */
+        case no_op:
+          DEBUG_PRINT1 ("EXECUTING no_op.\n");
+          break;
+
+
+        /* Match the next n pattern characters exactly.  The following
+           byte in the pattern defines n, and the n bytes after that
+           are the characters to match.  */
+	case exactn:
+	  mcnt = *p++;
+          DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
+
+          /* This is written out as an if-else so we don't waste time
+             testing `translate' inside the loop.  */
+          if (translate)
+	    {
+	      do
+		{
+		  PREFETCH ();
+		  if (translate[(unsigned char) *d++] != (char) *p++)
+                    goto fail;
+		}
+	      while (--mcnt);
+	    }
+	  else
+	    {
+	      do
+		{
+		  PREFETCH ();
+		  if (*d++ != (char) *p++) goto fail;
+		}
+	      while (--mcnt);
+	    }
+	  SET_REGS_MATCHED ();
+          break;
+
+
+        /* Match any character except possibly a newline or a null.  */
+	case anychar:
+          DEBUG_PRINT1 ("EXECUTING anychar.\n");
+
+          PREFETCH ();
+
+          if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
+              || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
+	    goto fail;
+
+          SET_REGS_MATCHED ();
+          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
+          d++;
+	  break;
+
+
+	case charset:
+	case charset_not:
+	  {
+	    register unsigned char c;
+	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
+
+            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
+
+	    PREFETCH ();
+	    c = TRANSLATE (*d); /* The character to match.  */
+
+            /* Cast to `unsigned' instead of `unsigned char' in case the
+               bit list is a full 32 bytes long.  */
+	    if (c < (unsigned) (*p * BYTEWIDTH)
+		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+	      not = !not;
+
+	    p += 1 + *p;
+
+	    if (!not) goto fail;
+            
+	    SET_REGS_MATCHED ();
+            d++;
+	    break;
+	  }
+
+
+        /* The beginning of a group is represented by start_memory.
+           The arguments are the register number in the next byte, and the
+           number of groups inner to this one in the next.  The text
+           matched within the group is recorded (in the internal
+           registers data structure) under the register number.  */
+        case start_memory:
+	  DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
+
+          /* Find out if this group can match the empty string.  */
+	  p1 = p;		/* To send to group_match_null_string_p.  */
+          
+          if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
+            REG_MATCH_NULL_STRING_P (reg_info[*p]) 
+              = group_match_null_string_p (&p1, pend, reg_info);
+
+          /* Save the position in the string where we were the last time
+             we were at this open-group operator in case the group is
+             operated upon by a repetition operator, e.g., with `(a*)*b'
+             against `ab'; then we want to ignore where we are now in
+             the string in case this attempt to match fails.  */
+          old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                             ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
+                             : regstart[*p];
+	  DEBUG_PRINT2 ("  old_regstart: %d\n", 
+			 POINTER_TO_OFFSET (old_regstart[*p]));
+
+          regstart[*p] = d;
+	  DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
+
+          IS_ACTIVE (reg_info[*p]) = 1;
+          MATCHED_SOMETHING (reg_info[*p]) = 0;
+          
+          /* This is the new highest active register.  */
+          highest_active_reg = *p;
+          
+          /* If nothing was active before, this is the new lowest active
+             register.  */
+          if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+            lowest_active_reg = *p;
+
+          /* Move past the register number and inner group count.  */
+          p += 2;
+          break;
+
+
+        /* The stop_memory opcode represents the end of a group.  Its
+           arguments are the same as start_memory's: the register
+           number, and the number of inner groups.  */
+	case stop_memory:
+	  DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
+             
+          /* We need to save the string position the last time we were at
+             this close-group operator in case the group is operated
+             upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
+             against `aba'; then we want to ignore where we are now in
+             the string in case this attempt to match fails.  */
+          old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                           ? REG_UNSET (regend[*p]) ? d : regend[*p]
+			   : regend[*p];
+	  DEBUG_PRINT2 ("      old_regend: %d\n", 
+			 POINTER_TO_OFFSET (old_regend[*p]));
+
+          regend[*p] = d;
+	  DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
+
+          /* This register isn't active anymore.  */
+          IS_ACTIVE (reg_info[*p]) = 0;
+          
+          /* If this was the only register active, nothing is active
+             anymore.  */
+          if (lowest_active_reg == highest_active_reg)
+            {
+              lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+              highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+            }
+          else
+            { /* We must scan for the new highest active register, since
+                 it isn't necessarily one less than now: consider
+                 (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
+                 new highest active register is 1.  */
+              unsigned char r = *p - 1;
+              while (r > 0 && !IS_ACTIVE (reg_info[r]))
+                r--;
+              
+              /* If we end up at register zero, that means that we saved
+                 the registers as the result of an `on_failure_jump', not
+                 a `start_memory', and we jumped to past the innermost
+                 `stop_memory'.  For example, in ((.)*) we save
+                 registers 1 and 2 as a result of the *, but when we pop
+                 back to the second ), we are at the stop_memory 1.
+                 Thus, nothing is active.  */
+	      if (r == 0)
+                {
+                  lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+                  highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+                }
+              else
+                highest_active_reg = r;
+            }
+          
+          /* If just failed to match something this time around with a
+             group that's operated on by a repetition operator, try to
+             force exit from the ``loop'', and restore the register
+             information for this group that we had before trying this
+             last match.  */
+          if ((!MATCHED_SOMETHING (reg_info[*p])
+               || (re_opcode_t) p[-3] == start_memory)
+	      && (p + 2) < pend)              
+            {
+              boolean is_a_jump_n = false;
+              
+              p1 = p + 2;
+              mcnt = 0;
+              switch ((re_opcode_t) *p1++)
+                {
+                  case jump_n:
+		    is_a_jump_n = true;
+                  case pop_failure_jump:
+		  case maybe_pop_jump:
+		  case jump:
+		  case dummy_failure_jump:
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+		    if (is_a_jump_n)
+		      p1 += 2;
+                    break;
+                  
+                  default:
+                    /* do nothing */ ;
+                }
+	      p1 += mcnt;
+        
+              /* If the next operation is a jump backwards in the pattern
+	         to an on_failure_jump right before the start_memory
+                 corresponding to this stop_memory, exit from the loop
+                 by forcing a failure after pushing on the stack the
+                 on_failure_jump's jump in the pattern, and d.  */
+              if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
+                  && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
+		{
+                  /* If this group ever matched anything, then restore
+                     what its registers were before trying this last
+                     failed match, e.g., with `(a*)*b' against `ab' for
+                     regstart[1], and, e.g., with `((a*)*(b*)*)*'
+                     against `aba' for regend[3].
+                     
+                     Also restore the registers for inner groups for,
+                     e.g., `((a*)(b*))*' against `aba' (register 3 would
+                     otherwise get trashed).  */
+                     
+                  if (EVER_MATCHED_SOMETHING (reg_info[*p]))
+		    {
+		      unsigned r; 
+        
+                      EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
+                      
+		      /* Restore this and inner groups' (if any) registers.  */
+                      for (r = *p; r < *p + *(p + 1); r++)
+                        {
+                          regstart[r] = old_regstart[r];
+
+                          /* xx why this test?  */
+                          if ((int) old_regend[r] >= (int) regstart[r])
+                            regend[r] = old_regend[r];
+                        }     
+                    }
+		  p1++;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
+
+                  goto fail;
+                }
+            }
+          
+          /* Move past the register number and the inner group count.  */
+          p += 2;
+          break;
+
+
+	/* \<digit> has been turned into a `duplicate' command which is
+           followed by the numeric value of <digit> as the register number.  */
+        case duplicate:
+	  {
+	    register const char *d2, *dend2;
+	    int regno = *p++;   /* Get which register to match against.  */
+	    DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
+
+	    /* Can't back reference a group which we've never matched.  */
+            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
+              goto fail;
+              
+            /* Where in input to try to start matching.  */
+            d2 = regstart[regno];
+            
+            /* Where to stop matching; if both the place to start and
+               the place to stop matching are in the same string, then
+               set to the place to stop, otherwise, for now have to use
+               the end of the first string.  */
+
+            dend2 = ((FIRST_STRING_P (regstart[regno]) 
+		      == FIRST_STRING_P (regend[regno]))
+		     ? regend[regno] : end_match_1);
+	    for (;;)
+	      {
+		/* If necessary, advance to next segment in register
+                   contents.  */
+		while (d2 == dend2)
+		  {
+		    if (dend2 == end_match_2) break;
+		    if (dend2 == regend[regno]) break;
+
+                    /* End of string1 => advance to string2. */
+                    d2 = string2;
+                    dend2 = regend[regno];
+		  }
+		/* At end of register contents => success */
+		if (d2 == dend2) break;
+
+		/* If necessary, advance to next segment in data.  */
+		PREFETCH ();
+
+		/* How many characters left in this segment to match.  */
+		mcnt = dend - d;
+                
+		/* Want how many consecutive characters we can match in
+                   one shot, so, if necessary, adjust the count.  */
+                if (mcnt > dend2 - d2)
+		  mcnt = dend2 - d2;
+                  
+		/* Compare that many; failure if mismatch, else move
+                   past them.  */
+		if (translate 
+                    ? bcmp_translate (d, d2, mcnt, translate) 
+                    : bcmp (d, d2, mcnt))
+		  goto fail;
+		d += mcnt, d2 += mcnt;
+	      }
+	  }
+	  break;
+
+
+        /* begline matches the empty string at the beginning of the string
+           (unless `not_bol' is set in `bufp'), and, if
+           `newline_anchor' is set, after newlines.  */
+	case begline:
+          DEBUG_PRINT1 ("EXECUTING begline.\n");
+          
+          if (AT_STRINGS_BEG (d))
+            {
+              if (!bufp->not_bol) break;
+            }
+          else if (d[-1] == '\n' && bufp->newline_anchor)
+            {
+              break;
+            }
+          /* In all other cases, we fail.  */
+          goto fail;
+
+
+        /* endline is the dual of begline.  */
+	case endline:
+          DEBUG_PRINT1 ("EXECUTING endline.\n");
+
+          if (AT_STRINGS_END (d))
+            {
+              if (!bufp->not_eol) break;
+            }
+          
+          /* We have to ``prefetch'' the next character.  */
+          else if ((d == end1 ? *string2 : *d) == '\n'
+                   && bufp->newline_anchor)
+            {
+              break;
+            }
+          goto fail;
+
+
+	/* Match at the very beginning of the data.  */
+        case begbuf:
+          DEBUG_PRINT1 ("EXECUTING begbuf.\n");
+          if (AT_STRINGS_BEG (d))
+            break;
+          goto fail;
+
+
+	/* Match at the very end of the data.  */
+        case endbuf:
+          DEBUG_PRINT1 ("EXECUTING endbuf.\n");
+	  if (AT_STRINGS_END (d))
+	    break;
+          goto fail;
+
+
+        /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
+           pushes NULL as the value for the string on the stack.  Then
+           `pop_failure_point' will keep the current value for the
+           string, instead of restoring it.  To see why, consider
+           matching `foo\nbar' against `.*\n'.  The .* matches the foo;
+           then the . fails against the \n.  But the next thing we want
+           to do is match the \n against the \n; if we restored the
+           string value, we would be back at the foo.
+           
+           Because this is used only in specific cases, we don't need to
+           check all the things that `on_failure_jump' does, to make
+           sure the right things get saved on the stack.  Hence we don't
+           share its code.  The only reason to push anything on the
+           stack at all is that otherwise we would have to change
+           `anychar's code to do something besides goto fail in this
+           case; that seems worse than this.  */
+        case on_failure_keep_string_jump:
+          DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
+          
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
+
+          PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
+          break;
+
+
+	/* Uses of on_failure_jump:
+        
+           Each alternative starts with an on_failure_jump that points
+           to the beginning of the next alternative.  Each alternative
+           except the last ends with a jump that in effect jumps past
+           the rest of the alternatives.  (They really jump to the
+           ending jump of the following alternative, because tensioning
+           these jumps is a hassle.)
+
+           Repeats start with an on_failure_jump that points past both
+           the repetition text and either the following jump or
+           pop_failure_jump back to this on_failure_jump.  */
+	case on_failure_jump:
+        on_failure:
+          DEBUG_PRINT1 ("EXECUTING on_failure_jump");
+
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
+
+          /* If this on_failure_jump comes right before a group (i.e.,
+             the original * applied to a group), save the information
+             for that group and all inner ones, so that if we fail back
+             to this point, the group's information will be correct.
+             For example, in \(a*\)*\1, we need the preceding group,
+             and in \(\(a*\)b*\)\2, we need the inner group.  */
+
+          /* We can't use `p' to check ahead because we push
+             a failure point to `p + mcnt' after we do this.  */
+          p1 = p;
+
+          /* We need to skip no_op's before we look for the
+             start_memory in case this on_failure_jump is happening as
+             the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
+             against aba.  */
+          while (p1 < pend && (re_opcode_t) *p1 == no_op)
+            p1++;
+
+          if (p1 < pend && (re_opcode_t) *p1 == start_memory)
+            {
+              /* We have a new highest active register now.  This will
+                 get reset at the start_memory we are about to get to,
+                 but we will have saved all the registers relevant to
+                 this repetition op, as described above.  */
+              highest_active_reg = *(p1 + 1) + *(p1 + 2);
+              if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+                lowest_active_reg = *(p1 + 1);
+            }
+
+          DEBUG_PRINT1 (":\n");
+          PUSH_FAILURE_POINT (p + mcnt, d, -2);
+          break;
+
+
+        /* A smart repeat ends with `maybe_pop_jump'.
+	   We change it to either `pop_failure_jump' or `jump'.  */
+        case maybe_pop_jump:
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
+          {
+	    register unsigned char *p2 = p;
+
+            /* Compare the beginning of the repeat with what in the
+               pattern follows its end. If we can establish that there
+               is nothing that they would both match, i.e., that we
+               would have to backtrack because of (as in, e.g., `a*a')
+               then we can change to pop_failure_jump, because we'll
+               never have to backtrack.
+               
+               This is not true in the case of alternatives: in
+               `(a|ab)*' we do need to backtrack to the `ab' alternative
+               (e.g., if the string was `ab').  But instead of trying to
+               detect that here, the alternative has put on a dummy
+               failure point which is what we will end up popping.  */
+
+	    /* Skip over open/close-group commands.  */
+	    while (p2 + 2 < pend
+		   && ((re_opcode_t) *p2 == stop_memory
+		       || (re_opcode_t) *p2 == start_memory))
+	      p2 += 3;			/* Skip over args, too.  */
+
+            /* If we're at the end of the pattern, we can change.  */
+            if (p2 == pend)
+	      {
+		/* Consider what happens when matching ":\(.*\)"
+		   against ":/".  I don't really understand this code
+		   yet.  */
+  	        p[-3] = (unsigned char) pop_failure_jump;
+                DEBUG_PRINT1
+                  ("  End of pattern: change to `pop_failure_jump'.\n");
+              }
+
+            else if ((re_opcode_t) *p2 == exactn
+		     || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
+	      {
+		register unsigned char c
+                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
+		p1 = p + mcnt;
+
+                /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
+                   to the `maybe_finalize_jump' of this case.  Examine what 
+                   follows.  */
+                if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
+                  {
+  		    p[-3] = (unsigned char) pop_failure_jump;
+                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+                                  c, p1[5]);
+                  }
+                  
+		else if ((re_opcode_t) p1[3] == charset
+			 || (re_opcode_t) p1[3] == charset_not)
+		  {
+		    int not = (re_opcode_t) p1[3] == charset_not;
+                    
+		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+		      not = !not;
+
+                    /* `not' is equal to 1 if c would match, which means
+                        that we can't change to pop_failure_jump.  */
+		    if (!not)
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+	      }
+	  }
+	  p -= 2;		/* Point at relative address again.  */
+	  if ((re_opcode_t) p[-1] != pop_failure_jump)
+	    {
+	      p[-1] = (unsigned char) jump;
+              DEBUG_PRINT1 ("  Match => jump.\n");
+	      goto unconditional_jump;
+	    }
+        /* Note fall through.  */
+
+
+	/* The end of a simple repeat has a pop_failure_jump back to
+           its matching on_failure_jump, where the latter will push a
+           failure point.  The pop_failure_jump takes off failure
+           points put on by this pop_failure_jump's matching
+           on_failure_jump; we got through the pattern to here from the
+           matching on_failure_jump, so didn't fail.  */
+        case pop_failure_jump:
+          {
+            /* We need to pass separate storage for the lowest and
+               highest registers, even though we don't care about the
+               actual values.  Otherwise, we will restore only one
+               register from the stack, since lowest will == highest in
+               `pop_failure_point'.  */
+            unsigned dummy_low_reg, dummy_high_reg;
+            unsigned char *pdummy;
+            const char *sdummy;
+
+            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
+            POP_FAILURE_POINT (sdummy, pdummy,
+                               dummy_low_reg, dummy_high_reg,
+                               reg_dummy, reg_dummy, reg_info_dummy);
+          }
+          /* Note fall through.  */
+
+          
+        /* Unconditionally jump (without popping any failure points).  */
+        case jump:
+	unconditional_jump:
+	  EXTRACT_NUMBER_AND_INCR (mcnt, p);	/* Get the amount to jump.  */
+          DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
+	  p += mcnt;				/* Do the jump.  */
+          DEBUG_PRINT2 ("(to 0x%x).\n", p);
+	  break;
+
+	
+        /* We need this opcode so we can detect where alternatives end
+           in `group_match_null_string_p' et al.  */
+        case jump_past_alt:
+          DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
+          goto unconditional_jump;
+
+
+        /* Normally, the on_failure_jump pushes a failure point, which
+           then gets popped at pop_failure_jump.  We will end up at
+           pop_failure_jump, also, and with a pattern of, say, `a+', we
+           are skipping over the on_failure_jump, so we have to push
+           something meaningless for pop_failure_jump to pop.  */
+        case dummy_failure_jump:
+          DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
+          /* It doesn't matter what we push for the string here.  What
+             the code at `fail' tests is the value for the pattern.  */
+          PUSH_FAILURE_POINT (0, 0, -2);
+          goto unconditional_jump;
+
+
+        /* At the end of an alternative, we need to push a dummy failure
+           point in case we are followed by a `pop_failure_jump', because
+           we don't want the failure point for the alternative to be
+           popped.  For example, matching `(a|ab)*' against `aab'
+           requires that we match the `ab' alternative.  */
+        case push_dummy_failure:
+          DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
+          /* See comments just above at `dummy_failure_jump' about the
+             two zeroes.  */
+          PUSH_FAILURE_POINT (0, 0, -2);
+          break;
+
+        /* Have to succeed matching what follows at least n times.
+           After that, handle like `on_failure_jump'.  */
+        case succeed_n: 
+          EXTRACT_NUMBER (mcnt, p + 2);
+          DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
+
+          assert (mcnt >= 0);
+          /* Originally, this is how many times we HAVE to succeed.  */
+          if (mcnt > 0)
+            {
+               mcnt--;
+	       p += 2;
+               STORE_NUMBER_AND_INCR (p, mcnt);
+               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p, mcnt);
+            }
+	  else if (mcnt == 0)
+            {
+              DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
+	      p[2] = (unsigned char) no_op;
+              p[3] = (unsigned char) no_op;
+              goto on_failure;
+            }
+          break;
+        
+        case jump_n: 
+          EXTRACT_NUMBER (mcnt, p + 2);
+          DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
+
+          /* Originally, this is how many times we CAN jump.  */
+          if (mcnt)
+            {
+               mcnt--;
+               STORE_NUMBER (p + 2, mcnt);
+	       goto unconditional_jump;	     
+            }
+          /* If don't have to jump any more, skip over the rest of command.  */
+	  else      
+	    p += 4;		     
+          break;
+        
+	case set_number_at:
+	  {
+            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
+
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            p1 = p + mcnt;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
+	    STORE_NUMBER (p1, mcnt);
+            break;
+          }
+
+        case wordbound:
+          DEBUG_PRINT1 ("EXECUTING wordbound.\n");
+          if (AT_WORD_BOUNDARY (d))
+	    break;
+          goto fail;
+
+	case notwordbound:
+          DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
+	  if (AT_WORD_BOUNDARY (d))
+	    goto fail;
+          break;
+
+	case wordbeg:
+          DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
+	  if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
+	    break;
+          goto fail;
+
+	case wordend:
+          DEBUG_PRINT1 ("EXECUTING wordend.\n");
+	  if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
+              && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
+	    break;
+          goto fail;
+
+#ifdef emacs
+#ifdef emacs19
+  	case before_dot:
+          DEBUG_PRINT1 ("EXECUTING before_dot.\n");
+ 	  if (PTR_CHAR_POS ((unsigned char *) d) >= point)
+  	    goto fail;
+  	  break;
+  
+  	case at_dot:
+          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+ 	  if (PTR_CHAR_POS ((unsigned char *) d) != point)
+  	    goto fail;
+  	  break;
+  
+  	case after_dot:
+          DEBUG_PRINT1 ("EXECUTING after_dot.\n");
+          if (PTR_CHAR_POS ((unsigned char *) d) <= point)
+  	    goto fail;
+  	  break;
+#else /* not emacs19 */
+	case at_dot:
+          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+	  if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point)
+	    goto fail;
+	  break;
+#endif /* not emacs19 */
+
+	case syntaxspec:
+          DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
+	  mcnt = *p++;
+	  goto matchsyntax;
+
+        case wordchar:
+          DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
+	  mcnt = (int) Sword;
+        matchsyntax:
+	  PREFETCH ();
+	  if (SYNTAX (*d++) != (enum syntaxcode) mcnt)
+            goto fail;
+          SET_REGS_MATCHED ();
+	  break;
+
+	case notsyntaxspec:
+          DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
+	  mcnt = *p++;
+	  goto matchnotsyntax;
+
+        case notwordchar:
+          DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
+	  mcnt = (int) Sword;
+        matchnotsyntax:
+	  PREFETCH ();
+	  if (SYNTAX (*d++) == (enum syntaxcode) mcnt)
+            goto fail;
+	  SET_REGS_MATCHED ();
+          break;
+
+#else /* not emacs */
+	case wordchar:
+          DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
+	  PREFETCH ();
+          if (!WORDCHAR_P (d))
+            goto fail;
+	  SET_REGS_MATCHED ();
+          d++;
+	  break;
+	  
+	case notwordchar:
+          DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
+	  PREFETCH ();
+	  if (WORDCHAR_P (d))
+            goto fail;
+          SET_REGS_MATCHED ();
+          d++;
+	  break;
+#endif /* not emacs */
+          
+        default:
+          abort ();
+	}
+      continue;  /* Successfully executed one pattern command; keep going.  */
+
+
+    /* We goto here if a matching operation fails. */
+    fail:
+      if (!FAIL_STACK_EMPTY ())
+	{ /* A restart point is known.  Restore to that state.  */
+          DEBUG_PRINT1 ("\nFAIL:\n");
+          POP_FAILURE_POINT (d, p,
+                             lowest_active_reg, highest_active_reg,
+                             regstart, regend, reg_info);
+
+          /* If this failure point is a dummy, try the next one.  */
+          if (!p)
+	    goto fail;
+
+          /* If we failed to the end of the pattern, don't examine *p.  */
+	  assert (p <= pend);
+          if (p < pend)
+            {
+              boolean is_a_jump_n = false;
+              
+              /* If failed to a backwards jump that's part of a repetition
+                 loop, need to pop this failure point and use the next one.  */
+              switch ((re_opcode_t) *p)
+                {
+                case jump_n:
+                  is_a_jump_n = true;
+                case maybe_pop_jump:
+                case pop_failure_jump:
+                case jump:
+                  p1 = p + 1;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  p1 += mcnt;	
+
+                  if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
+                      || (!is_a_jump_n
+                          && (re_opcode_t) *p1 == on_failure_jump))
+                    goto fail;
+                  break;
+                default:
+                  /* do nothing */ ;
+                }
+            }
+
+          if (d >= string1 && d <= end1)
+	    dend = end_match_1;
+        }
+      else
+        break;   /* Matching at this starting point really fails.  */
+    } /* for (;;) */
+
+  if (best_regs_set)
+    goto restore_best_regs;
+
+  FREE_VARIABLES ();
+
+  return -1;         			/* Failure to match.  */
+} /* re_match_2 */
+
+/* Subroutine definitions for re_match_2.  */
+
+
+/* We are passed P pointing to a register number after a start_memory.
+   
+   Return true if the pattern up to the corresponding stop_memory can
+   match the empty string, and false otherwise.
+   
+   If we find the matching stop_memory, sets P to point to one past its number.
+   Otherwise, sets P to an undefined byte less than or equal to END.
+
+   We don't handle duplicates properly (yet).  */
+
+static boolean
+group_match_null_string_p (p, end, reg_info)
+    unsigned char **p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  /* Point to after the args to the start_memory.  */
+  unsigned char *p1 = *p + 2;
+  
+  while (p1 < end)
+    {
+      /* Skip over opcodes that can match nothing, and return true or
+	 false, as appropriate, when we get to one that can't, or to the
+         matching stop_memory.  */
+      
+      switch ((re_opcode_t) *p1)
+        {
+        /* Could be either a loop or a series of alternatives.  */
+        case on_failure_jump:
+          p1++;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          
+          /* If the next operation is not a jump backwards in the
+	     pattern.  */
+
+	  if (mcnt >= 0)
+	    {
+              /* Go through the on_failure_jumps of the alternatives,
+                 seeing if any of the alternatives cannot match nothing.
+                 The last alternative starts with only a jump,
+                 whereas the rest start with on_failure_jump and end
+                 with a jump, e.g., here is the pattern for `a|b|c':
+
+                 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
+                 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
+                 /exactn/1/c						
+
+                 So, we have to first go through the first (n-1)
+                 alternatives and then deal with the last one separately.  */
+
+
+              /* Deal with the first (n-1) alternatives, which start
+                 with an on_failure_jump (see above) that jumps to right
+                 past a jump_past_alt.  */
+
+              while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
+                {
+                  /* `mcnt' holds how many bytes long the alternative
+                     is, including the ending `jump_past_alt' and
+                     its number.  */
+
+                  if (!alt_match_null_string_p (p1, p1 + mcnt - 3, 
+				                      reg_info))
+                    return false;
+
+                  /* Move to right after this alternative, including the
+		     jump_past_alt.  */
+                  p1 += mcnt;	
+
+                  /* Break if it's the beginning of an n-th alternative
+                     that doesn't begin with an on_failure_jump.  */
+                  if ((re_opcode_t) *p1 != on_failure_jump)
+                    break;
+		
+		  /* Still have to check that it's not an n-th
+		     alternative that starts with an on_failure_jump.  */
+		  p1++;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
+                    {
+		      /* Get to the beginning of the n-th alternative.  */
+                      p1 -= 3;
+                      break;
+                    }
+                }
+
+              /* Deal with the last alternative: go back and get number
+                 of the `jump_past_alt' just before it.  `mcnt' contains
+                 the length of the alternative.  */
+              EXTRACT_NUMBER (mcnt, p1 - 2);
+
+              if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
+                return false;
+
+              p1 += mcnt;	/* Get past the n-th alternative.  */
+            } /* if mcnt > 0 */
+          break;
+
+          
+        case stop_memory:
+	  assert (p1[1] == **p);
+          *p = p1 + 2;
+          return true;
+
+        
+        default: 
+          if (!common_op_match_null_string_p (&p1, end, reg_info))
+            return false;
+        }
+    } /* while p1 < end */
+
+  return false;
+} /* group_match_null_string_p */
+
+
+/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
+   It expects P to be the first byte of a single alternative and END one
+   byte past the last. The alternative can contain groups.  */
+   
+static boolean
+alt_match_null_string_p (p, end, reg_info)
+    unsigned char *p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  unsigned char *p1 = p;
+  
+  while (p1 < end)
+    {
+      /* Skip over opcodes that can match nothing, and break when we get 
+         to one that can't.  */
+      
+      switch ((re_opcode_t) *p1)
+        {
+	/* It's a loop.  */
+        case on_failure_jump:
+          p1++;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          p1 += mcnt;
+          break;
+          
+	default: 
+          if (!common_op_match_null_string_p (&p1, end, reg_info))
+            return false;
+        }
+    }  /* while p1 < end */
+
+  return true;
+} /* alt_match_null_string_p */
+
+
+/* Deals with the ops common to group_match_null_string_p and
+   alt_match_null_string_p.  
+   
+   Sets P to one after the op and its arguments, if any.  */
+
+static boolean
+common_op_match_null_string_p (p, end, reg_info)
+    unsigned char **p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  boolean ret;
+  int reg_no;
+  unsigned char *p1 = *p;
+
+  switch ((re_opcode_t) *p1++)
+    {
+    case no_op:
+    case begline:
+    case endline:
+    case begbuf:
+    case endbuf:
+    case wordbeg:
+    case wordend:
+    case wordbound:
+    case notwordbound:
+#ifdef emacs
+    case before_dot:
+    case at_dot:
+    case after_dot:
+#endif
+      break;
+
+    case start_memory:
+      reg_no = *p1;
+      assert (reg_no > 0 && reg_no <= MAX_REGNUM);
+      ret = group_match_null_string_p (&p1, end, reg_info);
+      
+      /* Have to set this here in case we're checking a group which
+         contains a group and a back reference to it.  */
+
+      if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
+        REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
+
+      if (!ret)
+        return false;
+      break;
+          
+    /* If this is an optimized succeed_n for zero times, make the jump.  */
+    case jump:
+      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+      if (mcnt >= 0)
+        p1 += mcnt;
+      else
+        return false;
+      break;
+
+    case succeed_n:
+      /* Get to the number of times to succeed.  */
+      p1 += 2;		
+      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+
+      if (mcnt == 0)
+        {
+          p1 -= 4;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          p1 += mcnt;
+        }
+      else
+        return false;
+      break;
+
+    case duplicate: 
+      if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
+        return false;
+      break;
+
+    case set_number_at:
+      p1 += 4;
+
+    default:
+      /* All other opcodes mean we cannot match the empty string.  */
+      return false;
+  }
+
+  *p = p1;
+  return true;
+} /* common_op_match_null_string_p */
+
+
+/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
+   bytes; nonzero otherwise.  */
+   
+static int
+bcmp_translate (s1, s2, len, translate)
+     unsigned char *s1, *s2;
+     register int len;
+     char *translate;
+{
+  register unsigned char *p1 = s1, *p2 = s2;
+  while (len)
+    {
+      if (translate[*p1++] != translate[*p2++]) return 1;
+      len--;
+    }
+  return 0;
+}
+
+/* Entry points for GNU code.  */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length SIZE) and puts the result in BUFP.
+   Returns 0 if the pattern was valid, otherwise an error string.
+   
+   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+   are set in BUFP on entry.
+   
+   We call regex_compile to do the actual compilation.  */
+
+const char *
+re_compile_pattern (pattern, length, bufp)
+     const char *pattern;
+     int length;
+     struct re_pattern_buffer *bufp;
+{
+  reg_errcode_t ret;
+  
+  /* GNU code is written to assume at least RE_NREGS registers will be set
+     (and at least one extra will be -1).  */
+  bufp->regs_allocated = REGS_UNALLOCATED;
+  
+  /* And GNU code determines whether or not to get register information
+     by passing null for the REGS argument to re_match, etc., not by
+     setting no_sub.  */
+  bufp->no_sub = 0;
+  
+  /* Match anchors at newline.  */
+  bufp->newline_anchor = 1;
+  
+  ret = regex_compile (pattern, length, re_syntax_options, bufp);
+
+  return re_error_msg[(int) ret];
+}     
+
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them if this is an Emacs or POSIX compilation.  */
+
+#if !defined (emacs) && !defined (_POSIX_SOURCE)
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+re_comp (s)
+    const char *s;
+{
+  reg_errcode_t ret;
+  
+  if (!s)
+    {
+      if (!re_comp_buf.buffer)
+	return "No previous regular expression";
+      return 0;
+    }
+
+  if (!re_comp_buf.buffer)
+    {
+      re_comp_buf.buffer = (unsigned char *) malloc (200);
+      if (re_comp_buf.buffer == NULL)
+        return "Memory exhausted";
+      re_comp_buf.allocated = 200;
+
+      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
+      if (re_comp_buf.fastmap == NULL)
+	return "Memory exhausted";
+    }
+
+  /* Since `re_exec' always passes NULL for the `regs' argument, we
+     don't need to initialize the pattern buffer fields which affect it.  */
+
+  /* Match anchors at newlines.  */
+  re_comp_buf.newline_anchor = 1;
+
+  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
+  
+  /* Yes, we're discarding `const' here.  */
+  return (char *) re_error_msg[(int) ret];
+}
+
+
+int
+re_exec (s)
+    const char *s;
+{
+  const int len = strlen (s);
+  return
+    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
+}
+#endif /* not emacs and not _POSIX_SOURCE */
+
+/* POSIX.2 functions.  Don't define these for Emacs.  */
+
+#ifndef emacs
+
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     `buffer' to the compiled pattern;
+     `used' to the length of the compiled pattern;
+     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     `fastmap' and `fastmap_accurate' to zero;
+     `re_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+int
+regcomp (preg, pattern, cflags)
+    regex_t *preg;
+    const char *pattern; 
+    int cflags;
+{
+  reg_errcode_t ret;
+  unsigned syntax
+    = (cflags & REG_EXTENDED) ?
+      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
+
+  /* regex_compile will allocate the space for the compiled pattern.  */
+  preg->buffer = 0;
+  preg->allocated = 0;
+  
+  /* Don't bother to use a fastmap when searching.  This simplifies the
+     REG_NEWLINE case: if we used a fastmap, we'd have to put all the
+     characters after newlines into the fastmap.  This way, we just try
+     every character.  */
+  preg->fastmap = 0;
+  
+  if (cflags & REG_ICASE)
+    {
+      unsigned i;
+      
+      preg->translate = (char *) malloc (CHAR_SET_SIZE);
+      if (preg->translate == NULL)
+        return (int) REG_ESPACE;
+
+      /* Map uppercase characters to corresponding lowercase ones.  */
+      for (i = 0; i < CHAR_SET_SIZE; i++)
+        preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
+    }
+  else
+    preg->translate = NULL;
+
+  /* If REG_NEWLINE is set, newlines are treated differently.  */
+  if (cflags & REG_NEWLINE)
+    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+      syntax &= ~RE_DOT_NEWLINE;
+      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+      /* It also changes the matching behavior.  */
+      preg->newline_anchor = 1;
+    }
+  else
+    preg->newline_anchor = 0;
+
+  preg->no_sub = !!(cflags & REG_NOSUB);
+
+  /* POSIX says a null character in the pattern terminates it, so we 
+     can use strlen here in compiling the pattern.  */
+  ret = regex_compile (pattern, strlen (pattern), syntax, preg);
+  
+  /* POSIX doesn't distinguish between an unmatched open-group and an
+     unmatched close-group: both are REG_EPAREN.  */
+  if (ret == REG_ERPAREN) ret = REG_EPAREN;
+  
+  return (int) ret;
+}
+
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+   
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+   
+   EFLAGS specifies `execution flags' which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+   
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+    const regex_t *preg;
+    const char *string; 
+    size_t nmatch; 
+    regmatch_t pmatch[]; 
+    int eflags;
+{
+  int ret;
+  struct re_registers regs;
+  regex_t private_preg;
+  int len = strlen (string);
+  boolean want_reg_info = !preg->no_sub && nmatch > 0;
+
+  private_preg = *preg;
+  
+  private_preg.not_bol = !!(eflags & REG_NOTBOL);
+  private_preg.not_eol = !!(eflags & REG_NOTEOL);
+  
+  /* The user has told us exactly how many registers to return
+     information about, via `nmatch'.  We have to pass that on to the
+     matching routines.  */
+  private_preg.regs_allocated = REGS_FIXED;
+  
+  if (want_reg_info)
+    {
+      regs.num_regs = nmatch;
+      regs.start = TALLOC (nmatch, regoff_t);
+      regs.end = TALLOC (nmatch, regoff_t);
+      if (regs.start == NULL || regs.end == NULL)
+        return (int) REG_NOMATCH;
+    }
+
+  /* Perform the searching operation.  */
+  ret = re_search (&private_preg, string, len,
+                   /* start: */ 0, /* range: */ len,
+                   want_reg_info ? &regs : (struct re_registers *) 0);
+  
+  /* Copy the register information to the POSIX structure.  */
+  if (want_reg_info)
+    {
+      if (ret >= 0)
+        {
+          unsigned r;
+
+          for (r = 0; r < nmatch; r++)
+            {
+              pmatch[r].rm_so = regs.start[r];
+              pmatch[r].rm_eo = regs.end[r];
+            }
+        }
+
+      /* If we needed the temporary register info, free the space now.  */
+      free (regs.start);
+      free (regs.end);
+    }
+
+  /* We want zero return to mean success, unlike `re_search'.  */
+  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
+}
+
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   We don't use PREG here.  */
+
+size_t
+regerror (errcode_vc, preg, errbuf, errbuf_size)
+    int errcode_vc; 
+    const regex_t *preg; 
+    char *errbuf; 
+    size_t errbuf_size; 
+{
+  const char *msg;
+  size_t msg_size;
+
+  if (errcode_vc < 0
+      || errcode_vc >= (sizeof (re_error_msg) / sizeof (re_error_msg[0])))
+    /* Only error codes returned by the rest of the code should be passed 
+       to this routine.  If we are given anything else, or if other regex
+       code generates an invalid error code, then the program has a bug.
+       Dump core so we can fix it.  */
+    abort ();
+
+  msg = re_error_msg[errcode_vc];
+
+  /* POSIX doesn't require that we do anything in this case, but why
+     not be nice.  */
+  if (! msg)
+    msg = "Success";
+
+  msg_size = strlen (msg) + 1; /* Includes the null.  */
+  
+  if (errbuf_size != 0)
+    {
+      if (msg_size > errbuf_size)
+        {
+          strncpy (errbuf, msg, errbuf_size - 1);
+          errbuf[errbuf_size - 1] = 0;
+        }
+      else
+        strcpy (errbuf, msg);
+    }
+
+  return msg_size;
+}
+
+
+/* Free dynamically allocated space used by PREG.  */
+
+void
+regfree (preg)
+    regex_t *preg;
+{
+  if (preg->buffer != NULL)
+    free (preg->buffer);
+  preg->buffer = NULL;
+  
+  preg->allocated = 0;
+  preg->used = 0;
+
+  if (preg->fastmap != NULL)
+    free (preg->fastmap);
+  preg->fastmap = NULL;
+  preg->fastmap_accurate = 0;
+
+  if (preg->translate != NULL)
+    free (preg->translate);
+  preg->translate = NULL;
+}
+
+#endif /* not emacs  */
+
+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
diff --git a/windows/regex.h b/windows/regex.h
new file mode 100644
index 0000000..adcf40c
--- /dev/null
+++ b/windows/regex.h
@@ -0,0 +1,506 @@
+/* Definitions for data structures and routines for the regular
+  expression library, version 0.12.
+
+  Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2, or (at your option)
+  any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef __REGEXP_LIBRARY_H__
+#define __REGEXP_LIBRARY_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /* POSIX says that <sys/types.h> must be included (by the caller) before
+       <regex.h>.  */
+
+#ifdef VMS
+    /* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+       should be there.  */
+#include <stddef.h>
+#endif
+
+
+    /* The following bits are used to determine the regexp syntax we
+       recognize.  The set/not-set meanings are chosen so that Emacs syntax
+       remains the value 0.  The bits are given in alphabetical order, and
+       the definitions shifted by one from the previous bit; thus, when we
+       add or remove a bit, only one other definition need change.  */
+    typedef unsigned reg_syntax_t;
+
+    /* If this bit is not set, then \ inside a bracket expression is literal.
+       If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
+
+    /* If this bit is not set, then + and ? are operators, and \+ and \? are
+         literals. 
+       If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+    /* If this bit is set, then character classes are supported.  They are:
+         [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+         [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+       If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+    /* If this bit is set, then ^ and $ are always anchors (outside bracket
+         expressions, of course).
+       If this bit is not set, then it depends:
+            ^  is an anchor if it is at the beginning of a regular
+               expression or after an open-group or an alternation operator;
+            $  is an anchor if it is at the end of a regular expression, or
+               before a close-group or an alternation operator.  
+     
+       This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+       POSIX draft 11.2 says that * etc. in leading positions is undefined.
+       We already implemented a previous draft which made those constructs
+       invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+    /* If this bit is set, then special characters are always special
+         regardless of where they are in the pattern.
+       If this bit is not set, then special characters are special only in
+         some contexts; otherwise they are ordinary.  Specifically, 
+         * + ? and intervals are only special when not after the beginning,
+         open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+    /* If this bit is set, then *, +, ?, and { cannot be first in an re or
+         immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+    /* If this bit is set, then . matches newline.
+       If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+    /* If this bit is set, then . doesn't match NUL.
+       If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+    /* If this bit is set, nonmatching lists [^...] do not match newline.
+       If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+    /* If this bit is set, either \{...\} or {...} defines an
+         interval, depending on RE_NO_BK_BRACES. 
+       If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+    /* If this bit is set, +, ? and | aren't recognized as operators.
+       If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+    /* If this bit is set, newline is an alternation operator.
+       If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+    /* If this bit is set, then `{...}' defines an interval, and \{ and \}
+         are literals.
+      If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+    /* If this bit is set, (...) defines a group, and \( and \) are literals.
+       If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+    /* If this bit is set, then \<digit> matches <digit>.
+       If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+    /* If this bit is set, then | is an alternation operator, and \| is literal.
+       If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+    /* If this bit is set, then an ending range point collating higher
+         than the starting range point, as in [z-a], is invalid.
+       If not set, then when ending range point collates higher than the
+         starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+    /* If this bit is set, then an unmatched ) is ordinary.
+       If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+    /* This global variable defines the particular regexp syntax to use (for
+       some interfaces).  When a regexp is compiled, the syntax used is
+       stored in the pattern buffer, so changing this does not affect
+       already-compiled regexps.  */
+    extern reg_syntax_t re_syntax_options;
+    
+    /* Define combinations of the above bits for the standard possibilities.
+       (The [[[ comments delimit what gets put into the Texinfo file, so
+       don't delete them!)  */
+    /* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS 0
+
+#define RE_SYNTAX_AWK							\
+  (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL			\
+   | RE_NO_BK_PARENS            | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR               | RE_NO_EMPTY_RANGES			\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+#define RE_SYNTAX_POSIX_AWK 						\
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
+
+#define RE_SYNTAX_GREP							\
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS				\
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP							\
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE			\
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS				\
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP						\
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+    /* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+    /* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON						\
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC						\
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+    /* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+       RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+       isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR				\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+    /* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+       replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
+    /* [[[end syntaxes]]] */
+    
+    /* Maximum number of duplicates an interval can allow.  Some systems
+       (erroneously) define this in other header files, but we want our
+       value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+#undef RE_DUP_MAX
+#endif
+#define RE_DUP_MAX ((1 << 15) - 1)
+
+
+    /* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+    /* If this bit is set, then use extended regular expression syntax.
+       If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+    /* If this bit is set, then ignore case when matching.
+       If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+
+    /* If this bit is set, then anchors do not match at newline
+         characters in the string.
+       If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+    /* If this bit is set, then report only success or fail in regexec.
+       If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+    /* POSIX `eflags' bits (i.e., information for regexec).  */
+
+    /* If this bit is set, then the beginning-of-line operator doesn't match
+         the beginning of the string (presumably because it's not the
+         beginning of a line).
+       If not set, then the beginning-of-line operator does match the
+         beginning of the string.  */
+#define REG_NOTBOL 1
+
+    /* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+
+    /* If any error codes are removed, changed, or added, update the
+       `re_error_msg' table in regex.c.  */
+    typedef enum {
+        REG_NOERROR = 0, 	/* Success.  */
+        REG_NOMATCH, 		/* Didn't find a match (for regexec).  */
+
+        /* POSIX regcomp return error codes.  (In the order listed in the
+           standard.)  */
+        REG_BADPAT, 		/* Invalid pattern.  */
+        REG_ECOLLATE, 		/* Not implemented.  */
+        REG_ECTYPE, 		/* Invalid character class name.  */
+        REG_EESCAPE, 		/* Trailing backslash.  */
+        REG_ESUBREG, 		/* Invalid back reference.  */
+        REG_EBRACK, 		/* Unmatched left bracket.  */
+        REG_EPAREN, 		/* Parenthesis imbalance.  */
+        REG_EBRACE, 		/* Unmatched \{.  */
+        REG_BADBR, 		/* Invalid contents of \{\}.  */
+        REG_ERANGE, 		/* Invalid range end.  */
+        REG_ESPACE, 		/* Ran out of memory.  */
+        REG_BADRPT, 		/* No preceding re for repetition op.  */
+
+        /* Error codes we've added.  */
+        REG_EEND, 		/* Premature end.  */
+        REG_ESIZE, 		/* Compiled pattern bigger than 2^16 bytes.  */
+        REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp.  */
+    }
+    reg_errcode_t;
+    
+    /* This data structure represents a compiled pattern.  Before calling
+       the pattern compiler, the fields `buffer', `allocated', `fastmap',
+       `translate', and `no_sub' can be set.  After the pattern has been
+       compiled, the `re_nsub' field is available.  All other fields are
+       private to the regex routines.  */
+
+    struct re_pattern_buffer {
+        /* [[[begin pattern_buffer]]] */
+        /* Space that holds the compiled pattern.  It is declared as
+                 `unsigned char *' because its elements are
+                  sometimes used as array indexes.  */
+        unsigned char *buffer;
+
+        /* Number of bytes to which `buffer' points.  */
+        unsigned long allocated;
+
+        /* Number of bytes actually used in `buffer'.  */
+        unsigned long used;
+
+        /* Syntax setting with which the pattern was compiled.  */
+        reg_syntax_t syntax;
+
+        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+           the fastmap, if there is one, to skip over impossible
+           starting points for matches.  */
+        char *fastmap;
+
+        /* Either a translate table to apply to all characters before
+           comparing them, or zero for no translation.  The translation
+           is applied to a pattern when it is compiled and to a string
+           when it is matched.  */
+        char *translate;
+
+        /* Number of subexpressions found by the compiler.  */
+        size_t re_nsub;
+
+        /* Zero if this pattern cannot match the empty string, one else.
+           Well, in truth it's used only in `re_search_2', to see
+           whether or not we should use the fastmap, so we don't set
+           this absolutely perfectly; see `re_compile_fastmap' (the
+           `duplicate' case).  */
+unsigned can_be_null :
+        1;
+
+        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+             for `max (RE_NREGS, re_nsub + 1)' groups.
+           If REGS_REALLOCATE, reallocate space if necessary.
+           If REGS_FIXED, use what's there.  */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+
+unsigned regs_allocated :
+        2;
+
+        /* Set to zero when `regex_compile' compiles a pattern; set to one
+           by `re_compile_fastmap' if it updates the fastmap.  */
+unsigned fastmap_accurate :
+        1;
+
+        /* If set, `re_match_2' does not return information about
+           subexpressions.  */
+unsigned no_sub :
+        1;
+
+        /* If set, a beginning-of-line anchor doesn't match at the
+           beginning of the string.  */
+unsigned not_bol :
+        1;
+
+        /* Similarly for an end-of-line anchor.  */
+unsigned not_eol :
+        1;
+
+        /* If true, an anchor at a newline matches.  */
+unsigned newline_anchor :
+        1;
+
+        /* [[[end pattern_buffer]]] */
+    };
+
+    typedef struct re_pattern_buffer regex_t;
+
+
+    /* search.c (search_buffer) in Emacs needs this one opcode value.  It is
+       defined both in `regex.c' and here.  */
+#define RE_EXACTN_VALUE 1
+    
+    /* Type for byte offsets within the string.  POSIX mandates this.  */
+    typedef int regoff_t;
+
+
+    /* This is the structure we store register match data in.  See
+       regex.texinfo for a full description of what registers match.  */
+    struct re_registers {
+        unsigned num_regs;
+        regoff_t *start;
+        regoff_t *end;
+    };
+
+
+    /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+       `re_match_2' returns information about at least this many registers
+       the first time a `regs' structure is passed.  */
+#ifndef RE_NREGS
+#define RE_NREGS 30
+#endif
+
+
+    /* POSIX specification for registers.  Aside from the different names than
+       `re_registers', POSIX uses an array of structures, instead of a
+       structure of arrays.  */
+    typedef struct {
+        regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+        regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+    }
+    regmatch_t;
+    
+    /* Declarations for routines.  */
+
+    /* To avoid duplicating every routine declaration -- once with a
+       prototype (if we are ANSI), and once without (if we aren't) -- we
+       use the following macro to declare argument types.  This
+       unfortunately clutters up the declarations a bit, but I think it's
+       worth it.  */
+
+#if __STDC__
+
+#define _RE_ARGS(args) args
+
+#else /* not __STDC__ */
+
+#define _RE_ARGS(args) ()
+
+#endif /* not __STDC__ */
+
+    /* Sets the current default syntax to SYNTAX, and return the old syntax.
+       You can also simply assign to the `re_syntax_options' variable.  */
+    extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
+
+    /* Compile the regular expression PATTERN, with length LENGTH
+       and syntax given by the global `re_syntax_options', into the buffer
+       BUFFER.  Return NULL if successful, and an error string if not.  */
+    extern const char *re_compile_pattern
+        _RE_ARGS ((const char *pattern, int length,
+                   struct re_pattern_buffer *buffer));
+
+
+    /* Compile a fastmap for the compiled pattern in BUFFER; used to
+       accelerate searches.  Return 0 if successful and -2 if was an
+       internal error.  */
+    extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+
+
+    /* Search in the string STRING (with length LENGTH) for the pattern
+       compiled into BUFFER.  Start searching at position START, for RANGE
+       characters.  Return the starting position of the match, -1 for no
+       match, or -2 for an internal error.  Also return register
+       information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+    extern int re_search
+        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+                   int length, int start, int range, struct re_registers *regs));
+
+
+    /* Like `re_search', but search in the concatenation of STRING1 and
+       STRING2.  Also, stop searching at index START + STOP.  */
+    extern int re_search_2
+        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+                   int length1, const char *string2, int length2,
+                   int start, int range, struct re_registers *regs, int stop));
+
+
+    /* Like `re_search', but return how many characters in STRING the regexp
+       in BUFFER matched, starting at position START.  */
+    extern int re_match
+        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+                   int length, int start, struct re_registers *regs));
+
+
+    /* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+    extern int re_match_2
+        _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+                   int length1, const char *string2, int length2,
+                   int start, struct re_registers *regs, int stop));
+
+
+    /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+       ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+       for recording register information.  STARTS and ENDS must be
+       allocated with malloc, and must each be at least `NUM_REGS * sizeof
+       (regoff_t)' bytes long.
+     
+       If NUM_REGS == 0, then subsequent matches should allocate their own
+       register data.
+     
+       Unless this function is called, the first search or match using
+       PATTERN_BUFFER will allocate its own register data, without
+       freeing the old data.  */
+    extern void re_set_registers
+        _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
+                   unsigned num_regs, regoff_t *starts, regoff_t *ends));
+
+    /* 4.2 bsd compatibility.  */
+    extern char *re_comp _RE_ARGS ((const char *));
+    extern int re_exec _RE_ARGS ((const char *));
+
+    /* POSIX compatibility.  */
+    extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags));
+    extern int regexec
+        _RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch,
+                   regmatch_t pmatch[], int eflags));
+    extern size_t regerror
+        _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf,
+                   size_t errbuf_size));
+    extern void regfree _RE_ARGS ((regex_t *preg));
+
+#endif /* not __REGEXP_LIBRARY_H__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
diff --git a/windows/resource.rc b/windows/resource.rc
index 6b41c2a..e5d5f15 100644
--- a/windows/resource.rc
+++ b/windows/resource.rc
@@ -14,8 +14,8 @@ LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
 
 #ifndef _MAC
 VS_VERSION_INFO VERSIONINFO
- FILEVERSION 1,9,6,0
- PRODUCTVERSION 1,9,6,0
+ FILEVERSION 1,9,5,0
+ PRODUCTVERSION 1,9,5,0
  FILEFLAGSMASK 0x3fL
 #ifdef _DEBUG
  FILEFLAGS 0x1L
@@ -33,14 +33,14 @@ BEGIN
             VALUE "Comments", "\0"
             VALUE "CompanyName", "Grame\0"
             VALUE "FileDescription", "Jackmp for Windows\0"
-            VALUE "FileVersion", "1, 9, 6, 0\0"
+            VALUE "FileVersion", "1, 9, 5, 0\0"
             VALUE "InternalName", "libjackmp\0"
-            VALUE "LegalCopyright", "Copyright Grame © 2006-2010\0"
+            VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
             VALUE "LegalTrademarks", "\0"
             VALUE "OriginalFilename", "libjackmp.dll\0"
             VALUE "PrivateBuild", "\0"
             VALUE "ProductName", "libjackmp\0"
-            VALUE "ProductVersion", "1, 9, 6, 0\0"
+            VALUE "ProductVersion", "1, 9, 5, 0\0"
             VALUE "SpecialBuild", "\0"
         END
     END
diff --git a/wscript b/wscript
index bc88c49..8d8d8e6 100644
--- a/wscript
+++ b/wscript
@@ -11,7 +11,7 @@ import Task
 import re
 import Logs
 
-VERSION='1.9.6'
+VERSION='1.9.5'
 APPNAME='jack'
 JACK_API_VERSION = '0.1.0'
 
@@ -69,10 +69,7 @@ def set_options(opt):
     opt.add_option('--mixed', action='store_true', default=False, help='Build with 32/64 bits mixed mode')
     opt.add_option('--clients', default=64, type="int", dest="clients", help='Maximum number of JACK clients')
     opt.add_option('--ports-per-application', default=768, type="int", dest="application_ports", help='Maximum number of ports per application')
-    opt.add_option('--debug', action='store_true', default=False, dest='debug', help='Build debuggable binaries')
-    opt.add_option('--firewire', action='store_true', default=False, help='Enable FireWire driver (FFADO)')
-    opt.add_option('--freebob', action='store_true', default=False, help='Enable FreeBob driver')
-    opt.add_option('--alsa', action='store_true', default=False, help='Enable ALSA driver')
+    opt.add_option('--debug', action='store_true', default=False, dest='debug', help="Build debuggable binaries")
     opt.sub_options('dbus')
 
 def configure(conf):
@@ -113,15 +110,6 @@ def configure(conf):
     conf.sub_config('common')
     if conf.env['IS_LINUX']:
         conf.sub_config('linux')
-        if Options.options.alsa and not conf.env['BUILD_DRIVER_ALSA']:
-            conf.fatal('ALSA driver was explicitly requested but cannot be built')
-        if Options.options.freebob and not conf.env['BUILD_DRIVER_FREEBOB']:
-            conf.fatal('FreeBob driver was explicitly requested but cannot be built')
-        if Options.options.firewire and not conf.env['BUILD_DRIVER_FFADO']:
-            conf.fatal('FFADO driver was explicitly requested but cannot be built')
-        conf.env['BUILD_DRIVER_ALSA'] = Options.options.alsa
-        conf.env['BUILD_DRIVER_FFADO'] = Options.options.firewire
-        conf.env['BUILD_DRIVER_FREEBOB'] = Options.options.freebob
     if Options.options.dbus:
         conf.sub_config('dbus')
         if conf.env['BUILD_JACKDBUS'] != True:

-- 
Debian packaging for jack-audio-connection-kit



More information about the pkg-multimedia-commits mailing list