# Attributes and dot patterns for the printable ASCII characters
#
#  Copyright (C) 2008 JJB Software, Inc. www.jjb-software.com
#  Copyright (C) 2012 Mesar Hameed <mesar.hameed@gmail.com>
#
#  This file is part of liblouis.
#
#  liblouis 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.
#
#  liblouis 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 liblouis. If not, see
#  <http://www.gnu.org/licenses/>.

space \t 0 tab          # 9
space \x000A 0
space \x000D 0
space \s 0 blank				# 32
punctuation ! 5					# 33
punctuation " 4					# 34
sign # 3456							# 35
sign $ 46								# 36
sign % 123456						% 37
sign & 12346						# 38
punctuation ' 6					# 39 apostrophe
punctuation ( 236				# 40
punctuation ) 356				# 41
sign * 35								# 42 asterisk
math + 235							# 43
punctuation , 2					# 44 comma
punctuation - 36				# 45 hyphen minus
punctuation . 3					# 46
math / 256							# 47

include digits6DotsPlusDot6.uti

punctuation : 25				# 58
punctuation ; 23				# 59
math < 56								# 60
math = 2356							# 61
math > 45								# 62
punctuation ? 26				# 63
sign @ 345							# 64

include latinLetterDef6Dots.uti

punctuation [ 123567					# 91
sign \\ 347										# 92 backslash
punctuation ] 234567					# 93
sign ^ 23467									# 94 circumflex accent
sign _ 456										# 95 underscore
sign ` 3458										# 96 grave accent

# a - z												# 97 - 122

punctuation { 12356						# 123
sign | 34											# 124 vertical line
punctuation } 23456						# 125
math ~ 2346										# 126

space \X00A0 0							# no-break space
sign \x00A2 4-14						# ¢ cents sign
sign \x00A3 4-123						# £ pounds sign
sign \x00A5 4-13456					#	¥ yen sign
sign \x00A7 356							# § section sign
sign \x00A9 2356-46-14-2356 # 169				© copyright sign
punctuation \x00Ad 36				# 173				soft hyphen
sign \x00B0 4-356						# 176				° degrees sign
sign \x00B5 46-134					# 181				µ micro sign
sign \x00B6 346							#						¶ pilcrow sign
math \x00D7 4-236						#						× multiplication sign
math \x00F7 4-256						#						÷ division sign

punctuation \x2010 36					# 8208			hyphen
punctuation \x2013 56-36			# 8211			en dash
punctuation \x2014 6-36				# 8212			em dash
punctuation	\x2018 6-236			# 8216			smart single left quotation mark
punctuation	\x2019 6-356			# 8217			smart single right quotation mark
punctuation	\x201C 236				# 8220			smart opening double quote
punctuation	\x201D 356				# 8221			smart closing double quote
punctuation	\x201E 236				# 8222			smart double low quotation mark
punctuation	\x201F 356				# 8223			smart double high reverse quotation mark
punctuation \x2026 3-3-3			#	8230			smart ellipsis

noback sign \X25CF 35						# 9679			black circle




















