Compare commits

..

113 Commits

Author SHA1 Message Date
Dan Brown
e86901ca20 Updated assets for release v0.9.3 2016-05-03 21:13:02 +01:00
Dan Brown
bdfa61c8b2 Merge branch 'v0.9' into release 2016-05-03 21:11:01 +01:00
Dan Brown
4e8722661f Added bookstack version in settings
Gets the app version via git. Closes #99
2016-05-03 21:10:05 +01:00
Dan Brown
9dc1b35e82 Made settings ui a little less jumpy 2016-04-24 10:28:47 +01:00
Dan Brown
2dc1180a41 Added custom, More consistent hr insertion
Since the previous hr plugin caused large empty p tags
2016-04-23 19:15:49 +01:00
Dan Brown
8b36ca95a3 Improved font quality and cyrillic support
Fixes dodgy font rendering on windows
2016-04-20 19:11:33 +01:00
Dan Brown
2cc36787f5 Updated assets for release 0.9.2 2016-04-15 19:57:02 +01:00
Dan Brown
448ac61b48 Merge branch 'master' into release 2016-04-15 19:52:59 +01:00
Dan Brown
8933179017 Prevented drafts from showing up in a book sort
Added tests to cover regresssion.
In reference to #100.
2016-04-15 19:51:27 +01:00
Dan Brown
792e786880 Added lists plugin to TinyMCE, Fixed strange nested list behaviour
Fixes #97
2016-04-14 22:34:33 +01:00
Dan Brown
753f6394f7 Merge branch 'master' into release 2016-04-12 20:09:14 +01:00
Dan Brown
0a8030306e Fixed redis config not being set if not using redis 2016-04-12 20:08:49 +01:00
Dan Brown
b1faf65934 Updated assets for release 0.9.0 2016-04-09 15:49:02 +01:00
Dan Brown
09f478bd74 Merge branch 'master' into release 2016-04-09 15:47:14 +01:00
Dan Brown
d6bad01130 Fixed draft time display, Cleaned up some code
Cleaned up some comment spacing in book controller and refactored some of the view service functions.
2016-04-09 14:26:42 +01:00
Dan Brown
a33deed26b Added user listing to role edit screen 2016-04-09 13:57:38 +01:00
Dan Brown
2e7345f4f0 Localised draft save time display
In reference to #83.
2016-04-09 13:36:32 +01:00
Dan Brown
1a7de4c2d6 Fixed and cleaned some permisison/role based components 2016-04-09 12:37:58 +01:00
Dan Brown
66ba773367 Updated composer dependancies 2016-04-09 10:56:10 +01:00
Dan Brown
afc3583be8 Made new pages in chapters have a better inital priority 2016-04-07 19:03:00 +01:00
Dan Brown
cbff2c6035 Added uploaded to book/page filters & search in image manager
Also refactored tab styles which affected the settings area.

Closes #41
2016-04-03 14:59:54 +01:00
Dan Brown
8e614ecb6e Updated tests to match recent email confirmation changes 2016-04-03 12:34:10 +01:00
Dan Brown
d099885fd1 Fixed some label casing and fixed incorrect notifications
Fixed the book & chapter permission update notification stating the 'page permissions' have been updated.
2016-04-03 12:19:44 +01:00
Dan Brown
2bb8c3d914 Made email confirmations work with LDAP auth
The email_confirmed user field now actually indicates if an email is confirmed rather than defaulting to true if not checked.
 This ensures toggleing the 'Require email confirmation' setting actually makes all currently unconfirmed users confirm thier emails.
2016-04-03 12:16:54 +01:00
Dan Brown
4caa61fe96 Added a friendlier error for LDAP new user mismatches 2016-04-03 11:16:49 +01:00
Dan Brown
c5960f9b6a Added Redis cache/session support 2016-04-03 11:00:14 +01:00
Dan Brown
412eed19c3 Removed old input checks on entity permission checkboxes
Old input check potentialy causing issues (#89) and is not needed on the pages which it shows.
2016-04-03 10:23:16 +01:00
Dan Brown
e9b596d3bc Merge bugfixes from branch 'v0.8' 2016-03-30 21:49:25 +01:00
Dan Brown
a0497feddd Updated assets for release 0.8.2 2016-03-30 21:44:30 +01:00
Dan Brown
789693bde9 Merge branch 'v0.8' into release 2016-03-30 21:32:46 +01:00
Dan Brown
8b109bac13 Trimmed long names in header
Fixes #87
2016-03-30 21:28:38 +01:00
Dan Brown
097d9c9f3c Updated entity restrictions to allow permissions, Not just restrict
Also changed wording from 'Restrictions' to 'Permissions' to keep things more familiar and to better reflect what they do.

Referenced in issue #89.
2016-03-30 20:15:44 +01:00
Dan Brown
e7d8a041a8 Merge pull request #84 from ssddanbrown/markdown_editor
Initial implementation of a markdown editor. Closes #57.
2016-03-29 20:18:11 +01:00
Dan Brown
dc2978824e Added basic system tests for markdown editor, Added extra test helpers
Added test helpers for checking if an element exists / does not exist on a page.
Also fixed markdown editor bugs found while creating tests.
2016-03-29 20:13:23 +01:00
Dan Brown
e1994ef2cf Added editor control in admin settings & Fixed some markdown editor bugs
Also updated the setting system with a more sane approach to handling default values. (Now done via the setting-defaults config file)
2016-03-29 19:26:13 +01:00
Dan Brown
efb49019d4 Integrated the markdown editor with the image manager 2016-03-29 18:25:54 +01:00
Dan Brown
ef874712bb Cut readme down and added useful links
Remove a lot of the instructions/config info since much of it is now on the BookStack docs site.
2016-03-25 15:17:04 +00:00
Dan Brown
26965fa08f Added a markdown editor 2016-03-25 14:41:15 +00:00
Dan Brown
1fe933e4ea Merge branch 'master' into release 2016-03-13 15:38:06 +00:00
Dan Brown
491f73e0cd Fixed bug causing permission error on save and fixed non-gallery image save 2016-03-13 15:37:46 +00:00
Dan Brown
724b4b5a70 Updated assets for release 0.8.0 2016-03-13 15:15:14 +00:00
Dan Brown
1778a56146 Merge branch 'master' into release 2016-03-13 15:13:23 +00:00
Dan Brown
4656c12f6d Fixed bug causing editing notification to always show
Updated tests to prevent happening again
2016-03-13 14:33:43 +00:00
Dan Brown
a06321675a Forced browser scrollbar, Added custom theme compatible logo
Also removed link to search all pages if no pages mached search on global search page.
Closes #74.
2016-03-13 14:00:24 +00:00
Dan Brown
dbe11c1360 Attached images to pages and added restriction filtering
Closes #79
2016-03-13 13:30:47 +00:00
Dan Brown
75ecf1c44d Fixed inset chapter list colors
The colors were being overridden by the custom theme color.
Styles added to force color to page and/or page draft.
2016-03-13 12:43:42 +00:00
Dan Brown
5283919d24 Added new page drafts and started image entity attaching
Closes #80.
2016-03-13 12:04:08 +00:00
Dan Brown
ced8c8e497 Merged branch autosaving_drafts into master 2016-03-12 16:31:37 +00:00
Dan Brown
bf7852ce85 Organised test files & added page update draft tests
Also cleaned styling for new autosave ui parts.
Closes #36.
2016-03-12 16:31:02 +00:00
Dan Brown
30214fde74 Added UI components of page autosaving 2016-03-12 15:52:19 +00:00
Dan Brown
e9c213f803 Fixed firefox list editing bug and made button text size more consistent
Fixes #77
2016-03-09 23:23:28 +00:00
Dan Brown
9f11e045a5 Updated tinyMCE library from 4.3.2 to 4.3.7 2016-03-09 23:20:47 +00:00
Dan Brown
93ebdf724b Changed direct attributes to prevent conflicts 2016-03-09 22:54:18 +00:00
Dan Brown
59ce228c2e Moved page editing to angular controller and started work on update drafts 2016-03-09 22:32:07 +00:00
Dan Brown
744865fcb2 Updated assets for release 0.7.6 2016-03-06 13:28:44 +00:00
Dan Brown
7f8c8b448d Merged branch master into release 2016-03-06 13:26:29 +00:00
Dan Brown
1d6137f7e2 Added restrictions to user profile lists 2016-03-06 13:17:46 +00:00
Dan Brown
66c56e9d02 Added settings helper and formatted code in some files 2016-03-06 12:55:08 +00:00
Dan Brown
e744d4c82c Changed color picker library and moved color logic to front end
Since the old library was GPLv3 i changed the color picker to tiny-color-picker which is MIT.
Also extracted the styles to a shared view and move color calculation logic to javascript side.
2016-03-06 10:52:10 +00:00
Dan Brown
0774ecc89c Merge branch 'master' into nwalke-update_site_color 2016-03-06 09:08:20 +00:00
Dan Brown
5e7a4c7fb5 Fixed incorrect recents pages on homescreen
Fixed the bug causing the recently updated pages to be exaclty the same as the recently create pages.
Also added in tests to prevent regression.
2016-03-05 22:54:53 +00:00
Dan Brown
76eaf64f94 Fixed errors that occured when merging & refactored entity repositories
Also deleted the git '.orig' files that got added in last merge.
2016-03-05 19:00:26 +00:00
Dan Brown
80865b30a5 Merge branch 'custom_role_system'
Conflicts:
	app/Repos/BookRepo.php
	app/Repos/ChapterRepo.php
	app/Repos/PageRepo.php
2016-03-05 18:21:44 +00:00
Dan Brown
8e6248f57f Added restriction tests and fixed any bugs in the process
Also updated many styles within areas affected by the new permission and roles system.
2016-03-05 18:09:21 +00:00
Dan Brown
268db6b1d0 Added a whole load of permission & role tests 2016-03-05 12:09:09 +00:00
Dan Brown
479dd80a8c Made memcached config allow mulitple servers 2016-03-05 09:47:24 +00:00
Dan Brown
069431db72 Merge branch 'add_memcached' of git://github.com/nwalke/BookStack into nwalke-add_memcached 2016-03-05 09:05:27 +00:00
Dan Brown
bc2b310638 Updated fulltext search with custom escaped query
Changed pdo quoted query to use custom escaping and added like searches when quoted terms are used.
2016-03-04 20:49:35 +00:00
Nick Walke
33bf20cfc8 Found the source of the issue, not sure how to fix 2016-03-04 02:33:57 -06:00
Nick Walke
e3bdc391cd Closes #55. Allows you to set the primary color.
This certainly should not be seen as the final implementation of this.
I imagine that requests like this will happen for many other colors in
the system, it might be good at some point to allow them to upload their
own stylesheet to be used.
2016-03-03 12:01:14 -06:00
Nick Walke
5681f4dd69 Closes #70.
Added the ability to search by multi-word terms using double quotes.
2016-03-02 21:38:23 -06:00
Nick Walke
38d822e04c Closes #69. Implemented and tested memcached. 2016-03-02 20:44:00 -06:00
Dan Brown
8e274a5a84 Refactored some permission controls and increased testing for roles system 2016-03-02 22:35:01 +00:00
Dan Brown
985d2f1c2c Tied entity restriction system into userCan checks 2016-02-29 20:31:21 +00:00
Dan Brown
7f5872372d Added in restriction queries for most lists 2016-02-28 19:03:13 +00:00
Dan Brown
201f788806 Implemented database structure and inital interfaces for entity restrictions 2016-02-28 10:49:41 +00:00
Dan Brown
a14b5c33fd Added missing permission checkboxes and improved image AJAX permission responses 2016-02-27 20:52:46 +00:00
Dan Brown
473261be35 Finished initial implementation of custom role system 2016-02-27 19:24:42 +00:00
Dan Brown
a54be85185 Started work on exposing the role system as editable 2016-02-26 23:44:02 +00:00
Dan Brown
a67c53826d Updated assets for release 0.7.5 2016-02-25 21:24:09 +00:00
Dan Brown
14b131e850 Merge branch 'master' into release 2016-02-25 21:23:06 +00:00
Dan Brown
54e3122540 Added smarter page finding so changing the page name does not break old urls
Added page & book slug history to revisions so they can be looked up if a page is not found.
2016-02-25 20:01:59 +00:00
Dan Brown
d339ab1125 Updated phpunit testing mail settings due to laravel 5.2 changes 2016-02-22 21:28:53 +00:00
Dan Brown
3ab09ef708 Fixed issue with the book sort not showing all books in sidebar 2016-02-22 21:28:20 +00:00
Dan Brown
c86a122d80 Added table header row styling, made code blocks horizontally scrollbable fixed link popup on firefox 2016-02-22 20:18:08 +00:00
Dan Brown
3a58e37838 Updated phpunit environment variables with some required defaults 2016-02-22 19:39:51 +00:00
Dan Brown
6bd49bcd4b Fixed page listing excerpts not showing due to encoding issues 2016-02-21 13:15:46 +00:00
Dan Brown
61577cf6bf Added entity-specific search results pages. Cleaned & Fixed search results bugs
Added search result pages for pages, chapters and books.
Limited the results on the global search as it just listed out an infinate amount.
Fixed styling on new detailed page listings and also removed the 'bars' from the side to create  a cleaner view.
Fixed bad sql fulltext query format that may have thrown off searches.
Reduced the number of database queries down a thousand or so.
2016-02-21 12:53:58 +00:00
Dan Brown
b4dec2a99c Made page anchor hashes more relevant to the page content
This will help when adding support for new kinds of page content such as markdown as we won't be able to reference the same ID's as before thus they would break on every save.
2016-02-21 11:29:46 +00:00
Dan Brown
fe0b122aca Merge pull request #63 from AkibaWolf/patch-1
Fixes encoding issues the page HTML is formatted on save
2016-02-20 19:24:32 +00:00
Dan Brown
8eb2960950 Added recently created & updated page listings
Closes #46.
2016-02-20 18:51:01 +00:00
AkibaWolf
c2369a740d Update PageRepo.php
Fix encoding problem.

By default DOMDocument::loadHTML treats a string as being encoded with ISO-8859-1. This causes a problem with saving cyrillic pages' text that becomes completely unreadable (like Проверка instead of normal symbols).
2016-02-20 21:31:21 +05:00
Dan Brown
bab6fd1f2f Added recent pages to home view and made the home content more compact 2016-02-20 12:37:06 +00:00
Dan Brown
86fbc9a936 Added tests for profile pages 2016-02-18 19:32:07 +00:00
Dan Brown
4d9726dbdd Added content to user profile pages 2016-02-17 22:11:48 +00:00
Dan Brown
4442a2e6d1 Started work on user profile pages 2016-02-16 21:25:11 +00:00
Dan Brown
293be7093c Merged origin/master into master 2016-02-11 22:36:49 +00:00
Dan Brown
9b55a52b85 Updated assets for release 0.7.4 2016-02-11 22:35:01 +00:00
Dan Brown
db1d10e80f Merge branch 'master' into release 2016-02-11 22:29:29 +00:00
Dan Brown
354912a1df Made book-navigation sidebar on pages sticky 2016-02-11 22:23:19 +00:00
Nick Walke
eacff3a9f0 Fixes #45 2016-02-11 14:02:17 -06:00
Dan Brown
990acbb9ac Merge pull request #59 from nwalke/master
Updated email on users list to be a link
2016-02-11 18:53:12 +00:00
Nick Walke
17d4533e45 Fixes #58 2016-02-11 01:18:01 -06:00
Dan Brown
d6c00a85ad Fixed incorrect notification when deleting a page 2016-02-10 12:48:29 +00:00
Dan Brown
1be576966f Updated assets for release 0.7.3 2016-02-08 20:47:33 +00:00
Dan Brown
b97e792c5f Merge branch 'master' into release 2016-02-08 20:45:48 +00:00
Dan Brown
e0279f93f9 Added a back-to-top button on all pages
The new back-to-top button will show after scrolling a short distance down a long page.
Closes #44.
2016-02-08 20:42:41 +00:00
Dan Brown
9b83c57316 Fixed some design issues and improved page export styling
Fixed alignment on export options dropdown.
Fixed bullet list items sitting too close next to floated content. Fixes #34.
Fixed text overlaying images in PDF exports (Floats removed for now). Fixes #53.
Fixed spaced table cells on html & PDF exports.
2016-02-08 20:41:40 +00:00
Dan Brown
5d73d17c74 Fixed bug preventing LDAP users updating thier profile
Made email not required when a profile is updated. LDAP users without admin privileges could did not have an email field to submit therefore could previously not update thier profile.
2016-02-08 20:35:23 +00:00
Dan Brown
d32460070f Made ldap auth use the 'dn' if a 'uid' is not present.
Fixes #56
2016-02-08 19:45:01 +00:00
Dan Brown
105500e506 Tweaked page form header and added public uploads folder into repo 2016-02-07 10:21:09 +00:00
Dan Brown
8296782149 Updated image controller styling and added preview option
The notification system was also updated so it can be used from JavaScript events such as image manager uploads.

Closes #25
2016-02-07 10:17:38 +00:00
Dan Brown
8e8d582bc6 Updated app requirements & Added some friendlier errors 2016-02-03 20:55:37 +00:00
287 changed files with 6700 additions and 6967 deletions

View File

@@ -12,8 +12,17 @@ DB_PASSWORD=database_user_password
# Cache and session
CACHE_DRIVER=file
SESSION_DRIVER=file
# If using Memcached, comment the above and uncomment these
#CACHE_DRIVER=memcached
#SESSION_DRIVER=memcached
QUEUE_DRIVER=sync
# Memcached settings
# If using a UNIX socket path for the host, set the port to 0
# This follows the following format: HOST:PORT:WEIGHT
# For multiple servers separate with a comma
MEMCACHED_SERVERS=127.0.0.1:11211:100
# Storage
STORAGE_TYPE=local
# Amazon S3 Config
@@ -53,4 +62,4 @@ MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_ENCRYPTION=null

1
.gitignore vendored
View File

@@ -7,7 +7,6 @@ Homestead.yaml
/public/plugins
/public/css/*.map
/public/js/*.map
/public/uploads
/public/bower
/storage/images
_ide_helper.php

View File

@@ -15,15 +15,11 @@ class Activity extends Model
/**
* Get the entity for this activity.
* @return bool
*/
public function entity()
{
if ($this->entity_id) {
return $this->morphTo('entity')->first();
} else {
return false;
}
if ($this->entity_type === '') $this->entity_type = null;
return $this->morphTo('entity');
}
/**

View File

@@ -1,14 +1,9 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
abstract class Entity extends Model
abstract class Entity extends Ownable
{
use Ownable;
/**
* Compares this entity to another given entity.
* Matches by comparing class and id.
@@ -53,13 +48,31 @@ abstract class Entity extends Model
/**
* Get View objects for this entity.
* @return mixed
*/
public function views()
{
return $this->morphMany('BookStack\View', 'viewable');
}
/**
* Get this entities restrictions.
*/
public function restrictions()
{
return $this->morphMany('BookStack\Restriction', 'restrictable');
}
/**
* Check if this entity has a specific restriction set against it.
* @param $role_id
* @param $action
* @return bool
*/
public function hasRestriction($role_id, $action)
{
return $this->restrictions->where('role_id', $role_id)->where('action', $action)->count() > 0;
}
/**
* Allows checking of the exact class, Used to check entity type.
* Cleaner method for is_a.
@@ -72,23 +85,14 @@ abstract class Entity extends Model
}
/**
* Gets the class name.
* @return string
*/
public static function getClassName()
{
return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]);
}
/**
*Gets a limited-length version of the entities name.
* Gets a limited-length version of the entities name.
* @param int $length
* @return string
*/
public function getShortName($length = 25)
{
if(strlen($this->name) <= $length) return $this->name;
return substr($this->name, 0, $length-3) . '...';
if (strlen($this->name) <= $length) return $this->name;
return substr($this->name, 0, $length - 3) . '...';
}
/**
@@ -98,27 +102,48 @@ abstract class Entity extends Model
* @param string[] array $wheres
* @return mixed
*/
public static function fullTextSearch($fieldsToSearch, $terms, $wheres = [])
public static function fullTextSearchQuery($fieldsToSearch, $terms, $wheres = [])
{
$termString = '';
foreach ($terms as $term) {
$termString .= htmlentities($term) . '* ';
$exactTerms = [];
foreach ($terms as $key => $term) {
$term = htmlentities($term, ENT_QUOTES);
$term = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $term);
if (preg_match('/\s/', $term)) {
$exactTerms[] = '%' . $term . '%';
$term = '"' . $term . '"';
} else {
$term = '' . $term . '*';
}
if ($term !== '*') $terms[$key] = $term;
}
$termString = implode(' ', $terms);
$fields = implode(',', $fieldsToSearch);
$termStringEscaped = \DB::connection()->getPdo()->quote($termString);
$search = static::addSelect(\DB::raw('*, MATCH(name) AGAINST('.$termStringEscaped.' IN BOOLEAN MODE) AS title_relevance'));
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termStringEscaped]);
$search = static::selectRaw('*, MATCH(name) AGAINST(? IN BOOLEAN MODE) AS title_relevance', [$termString]);
$search = $search->whereRaw('MATCH(' . $fields . ') AGAINST(? IN BOOLEAN MODE)', [$termString]);
// Ensure at least one exact term matches if in search
if (count($exactTerms) > 0) {
$search = $search->where(function ($query) use ($exactTerms, $fieldsToSearch) {
foreach ($exactTerms as $exactTerm) {
foreach ($fieldsToSearch as $field) {
$query->orWhere($field, 'like', $exactTerm);
}
}
});
}
// Add additional where terms
foreach ($wheres as $whereTerm) {
$search->where($whereTerm[0], $whereTerm[1], $whereTerm[2]);
}
// Load in relations
if (!static::isA('book')) $search = $search->with('book');
if (static::isA('page')) $search = $search->with('chapter');
if (static::isA('page')) {
$search = $search->with('book', 'chapter', 'createdBy', 'updatedBy');
} else if (static::isA('chapter')) {
$search = $search->with('book');
}
return $search->orderBy('title_relevance', 'desc')->get();
return $search->orderBy('title_relevance', 'desc');
}
/**

View File

@@ -0,0 +1,4 @@
<?php namespace BookStack\Exceptions;
class AuthException extends PrettyException {}

View File

@@ -1,7 +1,4 @@
<?php namespace BookStack\Exceptions;
class ConfirmationEmailException extends NotifyException
{
}
class ConfirmationEmailException extends NotifyException {}

View File

@@ -5,6 +5,7 @@ namespace BookStack\Exceptions;
use Exception;
use Illuminate\Contracts\Validation\ValidationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use PhpSpec\Exception\Example\ErrorException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Auth\Access\AuthorizationException;
@@ -38,17 +39,27 @@ class Handler extends ExceptionHandler
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if($e instanceof NotifyException) {
// Handle notify exceptions which will redirect to the
// specified location then show a notification message.
if ($e instanceof NotifyException) {
\Session::flash('error', $e->message);
return response()->redirectTo($e->redirectLocation);
}
// Handle pretty exceptions which will show a friendly application-fitting page
// Which will include the basic message to point the user roughly to the cause.
if (($e instanceof PrettyException || $e->getPrevious() instanceof PrettyException) && !config('app.debug')) {
$message = ($e instanceof PrettyException) ? $e->getMessage() : $e->getPrevious()->getMessage();
$code = ($e->getCode() === 0) ? 500 : $e->getCode();
return response()->view('errors/' . $code, ['message' => $message], $code);
}
return parent::render($request, $e);
}
}

View File

@@ -1,6 +1,3 @@
<?php namespace BookStack\Exceptions;
use Exception;
class ImageUploadException extends Exception {}
class ImageUploadException extends PrettyException {}

View File

@@ -1,9 +1,3 @@
<?php namespace BookStack\Exceptions;
use Exception;
class LdapException extends Exception
{
}
class LdapException extends PrettyException {}

View File

@@ -0,0 +1,14 @@
<?php namespace BookStack\Exceptions;
class NotFoundException extends PrettyException {
/**
* NotFoundException constructor.
* @param string $message
*/
public function __construct($message = 'Item not found')
{
parent::__construct($message, 404);
}
}

View File

@@ -0,0 +1,6 @@
<?php namespace BookStack\Exceptions;
use Exception;
class PermissionsException extends Exception {}

View File

@@ -0,0 +1,5 @@
<?php namespace BookStack\Exceptions;
use Exception;
class PrettyException extends Exception {}

View File

@@ -1,6 +1,4 @@
<?php namespace BookStack\Exceptions;
class SocialDriverNotConfigured extends \Exception
{
}
class SocialDriverNotConfigured extends PrettyException {}

View File

@@ -1,7 +1,4 @@
<?php namespace BookStack\Exceptions;
class SocialSignInException extends NotifyException
{
}
class SocialSignInException extends NotifyException {}

View File

@@ -1,7 +1,4 @@
<?php namespace BookStack\Exceptions;
class UserRegistrationException extends NotifyException
{
}
class UserRegistrationException extends NotifyException {}

View File

@@ -2,6 +2,8 @@
namespace BookStack\Http\Controllers\Auth;
use BookStack\Exceptions\AuthException;
use BookStack\Exceptions\PrettyException;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Http\Request;
use BookStack\Exceptions\SocialSignInException;
@@ -41,9 +43,9 @@ class AuthController extends Controller
/**
* Create a new authentication controller instance.
* @param SocialAuthService $socialAuthService
* @param SocialAuthService $socialAuthService
* @param EmailConfirmationService $emailConfirmationService
* @param UserRepo $userRepo
* @param UserRepo $userRepo
*/
public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
{
@@ -63,15 +65,15 @@ class AuthController extends Controller
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|min:6',
]);
}
protected function checkRegistrationAllowed()
{
if (!\Setting::get('registration-enabled')) {
if (!setting('registration-enabled')) {
throw new UserRegistrationException('Registrations are currently disabled.', '/login');
}
}
@@ -112,9 +114,10 @@ class AuthController extends Controller
/**
* Overrides the action when a user is authenticated.
* If the user authenticated but does not exist in the user table we create them.
* @param Request $request
* @param Request $request
* @param Authenticatable $user
* @return \Illuminate\Http\RedirectResponse
* @throws AuthException
*/
protected function authenticated(Request $request, Authenticatable $user)
{
@@ -132,6 +135,13 @@ class AuthController extends Controller
}
if (!$user->exists) {
// Check for users with same email already
$alreadyUser = $user->newQuery()->where('email', '=', $user->email)->count() > 0;
if ($alreadyUser) {
throw new AuthException('A user with the email ' . $user->email . ' already exists but with different credentials.');
}
$user->save();
$this->userRepo->attachDefaultRole($user);
auth()->login($user);
@@ -153,8 +163,8 @@ class AuthController extends Controller
// Create an array of the user data to create a new user instance
$userData = [
'name' => $socialUser->getName(),
'email' => $socialUser->getEmail(),
'name' => $socialUser->getName(),
'email' => $socialUser->getEmail(),
'password' => str_random(30)
];
return $this->registerUser($userData, $socialAccount);
@@ -162,7 +172,7 @@ class AuthController extends Controller
/**
* The registrations flow for all users.
* @param array $userData
* @param array $userData
* @param bool|false|SocialAccount $socialAccount
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
* @throws UserRegistrationException
@@ -170,8 +180,8 @@ class AuthController extends Controller
*/
protected function registerUser(array $userData, $socialAccount = false)
{
if (\Setting::get('registration-restrict')) {
$restrictedEmailDomains = explode(',', str_replace(' ', '', \Setting::get('registration-restrict')));
if (setting('registration-restrict')) {
$restrictedEmailDomains = explode(',', str_replace(' ', '', setting('registration-restrict')));
$userEmailDomain = $domain = substr(strrchr($userData['email'], "@"), 1);
if (!in_array($userEmailDomain, $restrictedEmailDomains)) {
throw new UserRegistrationException('That email domain does not have access to this application', '/register');
@@ -183,15 +193,12 @@ class AuthController extends Controller
$newUser->socialAccounts()->save($socialAccount);
}
if (\Setting::get('registration-confirmation') || \Setting::get('registration-restrict')) {
$newUser->email_confirmed = false;
if (setting('registration-confirmation') || setting('registration-restrict')) {
$newUser->save();
$this->emailConfirmationService->sendConfirmation($newUser);
return redirect('/register/confirm');
}
$newUser->email_confirmed = true;
auth()->login($newUser);
session()->flash('success', 'Thanks for signing up! You are now registered and signed in.');
return redirect($this->redirectPath());

View File

@@ -1,12 +1,9 @@
<?php
namespace BookStack\Http\Controllers;
<?php namespace BookStack\Http\Controllers;
use Activity;
use BookStack\Repos\UserRepo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use BookStack\Http\Requests;
use BookStack\Repos\BookRepo;
use BookStack\Repos\ChapterRepo;
@@ -19,24 +16,26 @@ class BookController extends Controller
protected $bookRepo;
protected $pageRepo;
protected $chapterRepo;
protected $userRepo;
/**
* BookController constructor.
* @param BookRepo $bookRepo
* @param PageRepo $pageRepo
* @param BookRepo $bookRepo
* @param PageRepo $pageRepo
* @param ChapterRepo $chapterRepo
* @param UserRepo $userRepo
*/
public function __construct(BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo)
public function __construct(BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
{
$this->bookRepo = $bookRepo;
$this->pageRepo = $pageRepo;
$this->chapterRepo = $chapterRepo;
$this->userRepo = $userRepo;
parent::__construct();
}
/**
* Display a listing of the book.
*
* @return Response
*/
public function index()
@@ -50,12 +49,11 @@ class BookController extends Controller
/**
* Show the form for creating a new book.
*
* @return Response
*/
public function create()
{
$this->checkPermission('book-create');
$this->checkPermission('book-create-all');
$this->setPageTitle('Create New Book');
return view('books/create');
}
@@ -68,9 +66,9 @@ class BookController extends Controller
*/
public function store(Request $request)
{
$this->checkPermission('book-create');
$this->checkPermission('book-create-all');
$this->validate($request, [
'name' => 'required|string|max:255',
'name' => 'required|string|max:255',
'description' => 'string|max:1000'
]);
$book = $this->bookRepo->newFromInput($request->all());
@@ -84,7 +82,6 @@ class BookController extends Controller
/**
* Display the specified book.
*
* @param $slug
* @return Response
*/
@@ -99,31 +96,29 @@ class BookController extends Controller
/**
* Show the form for editing the specified book.
*
* @param $slug
* @return Response
*/
public function edit($slug)
{
$this->checkPermission('book-update');
$book = $this->bookRepo->getBySlug($slug);
$this->checkOwnablePermission('book-update', $book);
$this->setPageTitle('Edit Book ' . $book->getShortName());
return view('books/edit', ['book' => $book, 'current' => $book]);
}
/**
* Update the specified book in storage.
*
* @param Request $request
* @param $slug
* @return Response
*/
public function update(Request $request, $slug)
{
$this->checkPermission('book-update');
$book = $this->bookRepo->getBySlug($slug);
$this->checkOwnablePermission('book-update', $book);
$this->validate($request, [
'name' => 'required|string|max:255',
'name' => 'required|string|max:255',
'description' => 'string|max:1000'
]);
$book->fill($request->all());
@@ -141,8 +136,8 @@ class BookController extends Controller
*/
public function showDelete($bookSlug)
{
$this->checkPermission('book-delete');
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('book-delete', $book);
$this->setPageTitle('Delete Book ' . $book->getShortName());
return view('books/delete', ['book' => $book, 'current' => $book]);
}
@@ -154,10 +149,10 @@ class BookController extends Controller
*/
public function sort($bookSlug)
{
$this->checkPermission('book-update');
$book = $this->bookRepo->getBySlug($bookSlug);
$bookChildren = $this->bookRepo->getChildren($book);
$books = $this->bookRepo->getAll();
$this->checkOwnablePermission('book-update', $book);
$bookChildren = $this->bookRepo->getChildren($book, true);
$books = $this->bookRepo->getAll(false);
$this->setPageTitle('Sort Book ' . $book->getShortName());
return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]);
}
@@ -177,15 +172,14 @@ class BookController extends Controller
/**
* Saves an array of sort mapping to pages and chapters.
*
* @param string $bookSlug
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function saveSort($bookSlug, Request $request)
{
$this->checkPermission('book-update');
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('book-update', $book);
// Return if no map sent
if (!$request->has('sort-tree')) {
@@ -223,17 +217,48 @@ class BookController extends Controller
/**
* Remove the specified book from storage.
*
* @param $bookSlug
* @return Response
*/
public function destroy($bookSlug)
{
$this->checkPermission('book-delete');
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('book-delete', $book);
Activity::addMessage('book_delete', 0, $book->name);
Activity::removeEntity($book);
$this->bookRepo->destroyBySlug($bookSlug);
return redirect('/books');
}
/**
* Show the Restrictions view.
* @param $bookSlug
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showRestrict($bookSlug)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('restrictions-manage', $book);
$roles = $this->userRepo->getRestrictableRoles();
return view('books/restrictions', [
'book' => $book,
'roles' => $roles
]);
}
/**
* Set the restrictions for this book.
* @param $bookSlug
* @param $bookSlug
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function restrict($bookSlug, Request $request)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('restrictions-manage', $book);
$this->bookRepo->updateRestrictionsFromRequest($request, $book);
session()->flash('success', 'Book Restrictions Updated');
return redirect($book->getUrl());
}
}

View File

@@ -1,13 +1,9 @@
<?php
namespace BookStack\Http\Controllers;
<?php namespace BookStack\Http\Controllers;
use Activity;
use BookStack\Repos\UserRepo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use BookStack\Http\Requests;
use BookStack\Http\Controllers\Controller;
use BookStack\Repos\BookRepo;
use BookStack\Repos\ChapterRepo;
use Views;
@@ -17,20 +13,22 @@ class ChapterController extends Controller
protected $bookRepo;
protected $chapterRepo;
protected $userRepo;
/**
* ChapterController constructor.
* @param $bookRepo
* @param $chapterRepo
* @param BookRepo $bookRepo
* @param ChapterRepo $chapterRepo
* @param UserRepo $userRepo
*/
public function __construct(BookRepo $bookRepo, ChapterRepo $chapterRepo)
public function __construct(BookRepo $bookRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
{
$this->bookRepo = $bookRepo;
$this->chapterRepo = $chapterRepo;
$this->userRepo = $userRepo;
parent::__construct();
}
/**
* Show the form for creating a new chapter.
* @param $bookSlug
@@ -38,8 +36,8 @@ class ChapterController extends Controller
*/
public function create($bookSlug)
{
$this->checkPermission('chapter-create');
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('chapter-create', $book);
$this->setPageTitle('Create New Chapter');
return view('chapters/create', ['book' => $book, 'current' => $book]);
}
@@ -52,12 +50,13 @@ class ChapterController extends Controller
*/
public function store($bookSlug, Request $request)
{
$this->checkPermission('chapter-create');
$this->validate($request, [
'name' => 'required|string|max:255'
]);
$book = $this->bookRepo->getBySlug($bookSlug);
$this->checkOwnablePermission('chapter-create', $book);
$chapter = $this->chapterRepo->newFromInput($request->all());
$chapter->slug = $this->chapterRepo->findSuitableSlug($chapter->name, $book->id);
$chapter->priority = $this->bookRepo->getNewPriority($book);
@@ -81,7 +80,14 @@ class ChapterController extends Controller
$sidebarTree = $this->bookRepo->getChildren($book);
Views::add($chapter);
$this->setPageTitle($chapter->getShortName());
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter, 'sidebarTree' => $sidebarTree]);
$pages = $this->chapterRepo->getChildren($chapter);
return view('chapters/show', [
'book' => $book,
'chapter' => $chapter,
'current' => $chapter,
'sidebarTree' => $sidebarTree,
'pages' => $pages
]);
}
/**
@@ -92,9 +98,9 @@ class ChapterController extends Controller
*/
public function edit($bookSlug, $chapterSlug)
{
$this->checkPermission('chapter-update');
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-update', $chapter);
$this->setPageTitle('Edit Chapter' . $chapter->getShortName());
return view('chapters/edit', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
}
@@ -108,9 +114,9 @@ class ChapterController extends Controller
*/
public function update(Request $request, $bookSlug, $chapterSlug)
{
$this->checkPermission('chapter-update');
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-update', $chapter);
$chapter->fill($request->all());
$chapter->slug = $this->chapterRepo->findSuitableSlug($chapter->name, $book->id, $chapter->id);
$chapter->updated_by = auth()->user()->id;
@@ -127,9 +133,9 @@ class ChapterController extends Controller
*/
public function showDelete($bookSlug, $chapterSlug)
{
$this->checkPermission('chapter-delete');
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-delete', $chapter);
$this->setPageTitle('Delete Chapter' . $chapter->getShortName());
return view('chapters/delete', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
}
@@ -142,11 +148,46 @@ class ChapterController extends Controller
*/
public function destroy($bookSlug, $chapterSlug)
{
$this->checkPermission('chapter-delete');
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('chapter-delete', $chapter);
Activity::addMessage('chapter_delete', $book->id, $chapter->name);
$this->chapterRepo->destroy($chapter);
return redirect($book->getUrl());
}
/**
* Show the Restrictions view.
* @param $bookSlug
* @param $chapterSlug
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showRestrict($bookSlug, $chapterSlug)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('restrictions-manage', $chapter);
$roles = $this->userRepo->getRestrictableRoles();
return view('chapters/restrictions', [
'chapter' => $chapter,
'roles' => $roles
]);
}
/**
* Set the restrictions for this chapter.
* @param $bookSlug
* @param $chapterSlug
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function restrict($bookSlug, $chapterSlug, Request $request)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
$this->checkOwnablePermission('restrictions-manage', $chapter);
$this->chapterRepo->updateRestrictionsFromRequest($request, $chapter);
session()->flash('success', 'Chapter Restrictions Updated');
return redirect($chapter->getUrl());
}
}

View File

@@ -2,6 +2,7 @@
namespace BookStack\Http\Controllers;
use BookStack\Ownable;
use HttpRequestException;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Exception\HttpResponseException;
@@ -61,21 +62,19 @@ abstract class Controller extends BaseController
}
/**
* On a permission error redirect to home and display
* On a permission error redirect to home and display.
* the error as a notification.
*/
protected function showPermissionError()
{
Session::flash('error', trans('errors.permission'));
throw new HttpResponseException(
redirect('/')
);
$response = request()->wantsJson() ? response()->json(['error' => trans('errors.permissionJson')], 403) : redirect('/');
throw new HttpResponseException($response);
}
/**
* Checks for a permission.
*
* @param $permissionName
* @param string $permissionName
* @return bool|\Illuminate\Http\RedirectResponse
*/
protected function checkPermission($permissionName)
@@ -83,10 +82,21 @@ abstract class Controller extends BaseController
if (!$this->currentUser || !$this->currentUser->can($permissionName)) {
$this->showPermissionError();
}
return true;
}
/**
* Check the current user's permissions against an ownable item.
* @param $permission
* @param Ownable $ownable
* @return bool
*/
protected function checkOwnablePermission($permission, Ownable $ownable)
{
if (userCan($permission, $ownable)) return true;
return $this->showPermissionError();
}
/**
* Check if a user has a permission or bypass if the callback is true.
* @param $permissionName

View File

@@ -3,39 +3,44 @@
namespace BookStack\Http\Controllers;
use Activity;
use Illuminate\Http\Request;
use BookStack\Repos\EntityRepo;
use BookStack\Http\Requests;
use BookStack\Repos\BookRepo;
use Views;
class HomeController extends Controller
{
protected $activityService;
protected $bookRepo;
protected $entityRepo;
/**
* HomeController constructor.
* @param BookRepo $bookRepo
* @param EntityRepo $entityRepo
*/
public function __construct(BookRepo $bookRepo)
public function __construct(EntityRepo $entityRepo)
{
$this->bookRepo = $bookRepo;
$this->entityRepo = $entityRepo;
parent::__construct();
}
/**
* Display the homepage.
*
* @return Response
*/
public function index()
{
$activity = Activity::latest();
$recents = $this->signedIn ? Views::getUserRecentlyViewed(10, 0) : $this->bookRepo->getLatest(10);
return view('home', ['activity' => $activity, 'recents' => $recents]);
$activity = Activity::latest(10);
$draftPages = $this->signedIn ? $this->entityRepo->getUserDraftPages(6) : [];
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
$recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreatedBooks(10*$recentFactor);
$recentlyCreatedPages = $this->entityRepo->getRecentlyCreatedPages(5);
$recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdatedPages(5);
return view('home', [
'activity' => $activity,
'recents' => $recents,
'recentlyCreatedPages' => $recentlyCreatedPages,
'recentlyUpdatedPages' => $recentlyUpdatedPages,
'draftPages' => $draftPages
]);
}
}

View File

@@ -1,14 +1,9 @@
<?php
namespace BookStack\Http\Controllers;
<?php namespace BookStack\Http\Controllers;
use BookStack\Exceptions\ImageUploadException;
use BookStack\Repos\ImageRepo;
use Illuminate\Filesystem\Filesystem as File;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Intervention\Image\Facades\Image as ImageTool;
use Illuminate\Support\Facades\DB;
use BookStack\Image;
use BookStack\Repos\PageRepo;
@@ -20,8 +15,8 @@ class ImageController extends Controller
/**
* ImageController constructor.
* @param Image $image
* @param File $file
* @param Image $image
* @param File $file
* @param ImageRepo $imageRepo
*/
public function __construct(Image $image, File $file, ImageRepo $imageRepo)
@@ -32,9 +27,9 @@ class ImageController extends Controller
parent::__construct();
}
/**
* Get all images for a specific type, Paginated
* @param string $type
* @param int $page
* @return \Illuminate\Http\JsonResponse
*/
@@ -44,6 +39,24 @@ class ImageController extends Controller
return response()->json($imgData);
}
/**
* Search through images within a particular type.
* @param $type
* @param int $page
* @param Request $request
* @return mixed
*/
public function searchByType($type, $page = 0, Request $request)
{
$this->validate($request, [
'term' => 'required|string'
]);
$searchTerm = $request->get('term');
$imgData = $this->imageRepo->searchPaginatedByType($type, $page,24, $searchTerm);
return response()->json($imgData);
}
/**
* Get all images for a user.
* @param int $page
@@ -55,16 +68,36 @@ class ImageController extends Controller
return response()->json($imgData);
}
/**
* Get gallery images with a specific filter such as book or page
* @param $filter
* @param int $page
* @param Request $request
*/
public function getGalleryFiltered($filter, $page = 0, Request $request)
{
$this->validate($request, [
'page_id' => 'required|integer'
]);
$validFilters = collect(['page', 'book']);
if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
$pageId = $request->get('page_id');
$imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
return response()->json($imgData);
}
/**
* Handles image uploads for use on pages.
* @param string $type
* @param string $type
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function uploadByType($type, Request $request)
{
$this->checkPermission('image-create');
$this->checkPermission('image-create-all');
$this->validate($request, [
'file' => 'image|mimes:jpeg,gif,png'
]);
@@ -72,7 +105,8 @@ class ImageController extends Controller
$imageUpload = $request->file('file');
try {
$image = $this->imageRepo->saveNew($imageUpload, $type);
$uploadedTo = $request->has('uploaded_to') ? $request->get('uploaded_to') : 0;
$image = $this->imageRepo->saveNew($imageUpload, $type, $uploadedTo);
} catch (ImageUploadException $e) {
return response($e->getMessage(), 500);
}
@@ -90,7 +124,7 @@ class ImageController extends Controller
*/
public function getThumbnail($id, $width, $height, $crop)
{
$this->checkPermission('image-create');
$this->checkPermission('image-create-all');
$image = $this->imageRepo->getById($id);
$thumbnailUrl = $this->imageRepo->getThumbnail($image, $width, $height, $crop == 'false');
return response()->json(['url' => $thumbnailUrl]);
@@ -98,33 +132,32 @@ class ImageController extends Controller
/**
* Update image details
* @param $imageId
* @param integer $imageId
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function update($imageId, Request $request)
{
$this->checkPermission('image-update');
$this->validate($request, [
'name' => 'required|min:2|string'
]);
$image = $this->imageRepo->getById($imageId);
$this->checkOwnablePermission('image-update', $image);
$image = $this->imageRepo->updateImageDetails($image, $request->all());
return response()->json($image);
}
/**
* Deletes an image and all thumbnail/image files
* @param PageRepo $pageRepo
* @param Request $request
* @param int $id
* @param Request $request
* @param int $id
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(PageRepo $pageRepo, Request $request, $id)
{
$this->checkPermission('image-delete');
$image = $this->imageRepo->getById($id);
$this->checkOwnablePermission('image-delete', $image);
// Check if this image is used on any pages
$isForced = ($request->has('force') && ($request->get('force') === 'true') || $request->get('force') === true);

View File

@@ -1,16 +1,16 @@
<?php
namespace BookStack\Http\Controllers;
<?php namespace BookStack\Http\Controllers;
use Activity;
use BookStack\Exceptions\NotFoundException;
use BookStack\Repos\UserRepo;
use BookStack\Services\ExportService;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use BookStack\Http\Requests;
use BookStack\Repos\BookRepo;
use BookStack\Repos\ChapterRepo;
use BookStack\Repos\PageRepo;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Views;
class PageController extends Controller
@@ -20,26 +20,28 @@ class PageController extends Controller
protected $bookRepo;
protected $chapterRepo;
protected $exportService;
protected $userRepo;
/**
* PageController constructor.
* @param PageRepo $pageRepo
* @param BookRepo $bookRepo
* @param ChapterRepo $chapterRepo
* @param PageRepo $pageRepo
* @param BookRepo $bookRepo
* @param ChapterRepo $chapterRepo
* @param ExportService $exportService
* @param UserRepo $userRepo
*/
public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService)
public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService, UserRepo $userRepo)
{
$this->pageRepo = $pageRepo;
$this->bookRepo = $bookRepo;
$this->chapterRepo = $chapterRepo;
$this->exportService = $exportService;
$this->userRepo = $userRepo;
parent::__construct();
}
/**
* Show the form for creating a new page.
*
* @param $bookSlug
* @param bool $chapterSlug
* @return Response
@@ -47,33 +49,60 @@ class PageController extends Controller
*/
public function create($bookSlug, $chapterSlug = false)
{
$this->checkPermission('page-create');
$book = $this->bookRepo->getBySlug($bookSlug);
$chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false;
$chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : null;
$parent = $chapter ? $chapter : $book;
$this->checkOwnablePermission('page-create', $parent);
$this->setPageTitle('Create New Page');
return view('pages/create', ['book' => $book, 'chapter' => $chapter]);
$draft = $this->pageRepo->getDraftPage($book, $chapter);
return redirect($draft->getUrl());
}
/**
* Store a newly created page in storage.
*
* Show form to continue editing a draft page.
* @param $bookSlug
* @param $pageId
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function editDraft($bookSlug, $pageId)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$draft = $this->pageRepo->getById($pageId, true);
$this->checkOwnablePermission('page-create', $draft);
$this->setPageTitle('Edit Page Draft');
return view('pages/create', ['draft' => $draft, 'book' => $book]);
}
/**
* Store a new page by changing a draft into a page.
* @param Request $request
* @param $bookSlug
* @param string $bookSlug
* @return Response
*/
public function store(Request $request, $bookSlug)
public function store(Request $request, $bookSlug, $pageId)
{
$this->checkPermission('page-create');
$this->validate($request, [
'name' => 'required|string|max:255'
'name' => 'required|string|max:255'
]);
$input = $request->all();
$book = $this->bookRepo->getBySlug($bookSlug);
$chapterId = ($request->has('chapter') && $this->chapterRepo->idExists($request->get('chapter'))) ? $request->get('chapter') : null;
$input['priority'] = $this->bookRepo->getNewPriority($book);
$page = $this->pageRepo->saveNew($input, $book, $chapterId);
$draftPage = $this->pageRepo->getById($pageId, true);
$chapterId = $draftPage->chapter_id;
$parent = $chapterId !== 0 ? $this->chapterRepo->getById($chapterId) : $book;
$this->checkOwnablePermission('page-create', $parent);
if ($parent->isA('chapter')) {
$input['priority'] = $this->chapterRepo->getNewPriority($parent);
} else {
$input['priority'] = $this->bookRepo->getNewPriority($parent);
}
$page = $this->pageRepo->publishDraft($draftPage, $input);
Activity::add($page, 'page_create', $book->id);
return redirect($page->getUrl());
@@ -81,7 +110,8 @@ class PageController extends Controller
/**
* Display the specified page.
*
* If the page is not found via the slug the
* revisions are searched for a match.
* @param $bookSlug
* @param $pageSlug
* @return Response
@@ -89,32 +119,69 @@ class PageController extends Controller
public function show($bookSlug, $pageSlug)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
try {
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
} catch (NotFoundException $e) {
$page = $this->pageRepo->findPageUsingOldSlug($pageSlug, $bookSlug);
if ($page === null) abort(404);
return redirect($page->getUrl());
}
$sidebarTree = $this->bookRepo->getChildren($book);
Views::add($page);
$this->setPageTitle($page->getShortName());
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]);
}
/**
* Get page from an ajax request.
* @param $pageId
* @return \Illuminate\Http\JsonResponse
*/
public function getPageAjax($pageId)
{
$page = $this->pageRepo->getById($pageId);
return response()->json($page);
}
/**
* Show the form for editing the specified page.
*
* @param $bookSlug
* @param $pageSlug
* @return Response
*/
public function edit($bookSlug, $pageSlug)
{
$this->checkPermission('page-update');
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-update', $page);
$this->setPageTitle('Editing Page ' . $page->getShortName());
$page->isDraft = false;
// Check for active editing
$warnings = [];
if ($this->pageRepo->isPageEditingActive($page, 60)) {
$warnings[] = $this->pageRepo->getPageEditingActiveMessage($page, 60);
}
// Check for a current draft version for this user
if ($this->pageRepo->hasUserGotPageDraft($page, $this->currentUser->id)) {
$draft = $this->pageRepo->getUserPageDraft($page, $this->currentUser->id);
$page->name = $draft->name;
$page->html = $draft->html;
$page->markdown = $draft->markdown;
$page->isDraft = true;
$warnings [] = $this->pageRepo->getUserPageDraftMessage($draft);
}
if (count($warnings) > 0) session()->flash('warning', implode("\n", $warnings));
return view('pages/edit', ['page' => $page, 'book' => $book, 'current' => $page]);
}
/**
* Update the specified page in storage.
*
* @param Request $request
* @param $bookSlug
* @param $pageSlug
@@ -122,17 +189,42 @@ class PageController extends Controller
*/
public function update(Request $request, $bookSlug, $pageSlug)
{
$this->checkPermission('page-update');
$this->validate($request, [
'name' => 'required|string|max:255'
'name' => 'required|string|max:255'
]);
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-update', $page);
$this->pageRepo->updatePage($page, $book->id, $request->all());
Activity::add($page, 'page_update', $book->id);
return redirect($page->getUrl());
}
/**
* Save a draft update as a revision.
* @param Request $request
* @param $pageId
* @return \Illuminate\Http\JsonResponse
*/
public function saveDraft(Request $request, $pageId)
{
$page = $this->pageRepo->getById($pageId, true);
$this->checkOwnablePermission('page-update', $page);
if ($page->draft) {
$draft = $this->pageRepo->updateDraftPage($page, $request->only(['name', 'html', 'markdown']));
} else {
$draft = $this->pageRepo->saveUpdateDraft($page, $request->only(['name', 'html', 'markdown']));
}
$updateTime = $draft->updated_at->timestamp;
$utcUpdateTimestamp = $updateTime + Carbon::createFromTimestamp(0)->offset;
return response()->json([
'status' => 'success',
'message' => 'Draft saved at ',
'timestamp' => $utcUpdateTimestamp
]);
}
/**
* Redirect from a special link url which
* uses the page id rather than the name.
@@ -153,16 +245,32 @@ class PageController extends Controller
*/
public function showDelete($bookSlug, $pageSlug)
{
$this->checkPermission('page-delete');
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-delete', $page);
$this->setPageTitle('Delete Page ' . $page->getShortName());
return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
}
/**
* Show the deletion page for the specified page.
* @param $bookSlug
* @param $pageId
* @return \Illuminate\View\View
* @throws NotFoundException
*/
public function showDeleteDraft($bookSlug, $pageId)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getById($pageId, true);
$this->checkOwnablePermission('page-update', $page);
$this->setPageTitle('Delete Draft Page ' . $page->getShortName());
return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
}
/**
* Remove the specified page from storage.
*
* @param $bookSlug
* @param $pageSlug
* @return Response
@@ -170,10 +278,28 @@ class PageController extends Controller
*/
public function destroy($bookSlug, $pageSlug)
{
$this->checkPermission('page-delete');
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-delete', $page);
Activity::addMessage('page_delete', $book->id, $page->name);
session()->flash('success', 'Page deleted');
$this->pageRepo->destroy($page);
return redirect($book->getUrl());
}
/**
* Remove the specified draft page from storage.
* @param $bookSlug
* @param $pageId
* @return Response
* @throws NotFoundException
*/
public function destroyDraft($bookSlug, $pageId)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getById($pageId, true);
$this->checkOwnablePermission('page-update', $page);
session()->flash('success', 'Draft deleted');
$this->pageRepo->destroy($page);
return redirect($book->getUrl());
}
@@ -218,9 +344,9 @@ class PageController extends Controller
*/
public function restoreRevision($bookSlug, $pageSlug, $revisionId)
{
$this->checkPermission('page-update');
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('page-update', $page);
$page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
Activity::add($page, 'page_restore', $book->id);
return redirect($page->getUrl());
@@ -239,8 +365,8 @@ class PageController extends Controller
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$pdfContent = $this->exportService->pageToPdf($page);
return response()->make($pdfContent, 200, [
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.pdf'
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.pdf'
]);
}
@@ -256,8 +382,8 @@ class PageController extends Controller
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$containedHtml = $this->exportService->pageToContainedHtml($page);
return response()->make($containedHtml, 200, [
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.html'
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.html'
]);
}
@@ -273,9 +399,70 @@ class PageController extends Controller
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$containedHtml = $this->exportService->pageToPlainText($page);
return response()->make($containedHtml, 200, [
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.txt'
'Content-Type' => 'application/octet-stream',
'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.txt'
]);
}
/**
* Show a listing of recently created pages
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showRecentlyCreated()
{
$pages = $this->pageRepo->getRecentlyCreatedPaginated(20);
return view('pages/detailed-listing', [
'title' => 'Recently Created Pages',
'pages' => $pages
]);
}
/**
* Show a listing of recently created pages
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showRecentlyUpdated()
{
$pages = $this->pageRepo->getRecentlyUpdatedPaginated(20);
return view('pages/detailed-listing', [
'title' => 'Recently Updated Pages',
'pages' => $pages
]);
}
/**
* Show the Restrictions view.
* @param $bookSlug
* @param $pageSlug
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showRestrict($bookSlug, $pageSlug)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('restrictions-manage', $page);
$roles = $this->userRepo->getRestrictableRoles();
return view('pages/restrictions', [
'page' => $page,
'roles' => $roles
]);
}
/**
* Set the restrictions for this page.
* @param $bookSlug
* @param $pageSlug
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function restrict($bookSlug, $pageSlug, Request $request)
{
$book = $this->bookRepo->getBySlug($bookSlug);
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
$this->checkOwnablePermission('restrictions-manage', $page);
$this->pageRepo->updateRestrictionsFromRequest($request, $page);
session()->flash('success', 'Page Restrictions Updated');
return redirect($page->getUrl());
}
}

View File

@@ -0,0 +1,129 @@
<?php namespace BookStack\Http\Controllers;
use BookStack\Exceptions\PermissionsException;
use BookStack\Repos\PermissionsRepo;
use Illuminate\Http\Request;
use BookStack\Http\Requests;
class PermissionController extends Controller
{
protected $permissionsRepo;
/**
* PermissionController constructor.
* @param PermissionsRepo $permissionsRepo
*/
public function __construct(PermissionsRepo $permissionsRepo)
{
$this->permissionsRepo = $permissionsRepo;
parent::__construct();
}
/**
* Show a listing of the roles in the system.
*/
public function listRoles()
{
$this->checkPermission('user-roles-manage');
$roles = $this->permissionsRepo->getAllRoles();
return view('settings/roles/index', ['roles' => $roles]);
}
/**
* Show the form to create a new role
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function createRole()
{
$this->checkPermission('user-roles-manage');
return view('settings/roles/create');
}
/**
* Store a new role in the system.
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function storeRole(Request $request)
{
$this->checkPermission('user-roles-manage');
$this->validate($request, [
'display_name' => 'required|min:3|max:200',
'description' => 'max:250'
]);
$this->permissionsRepo->saveNewRole($request->all());
session()->flash('success', 'Role successfully created');
return redirect('/settings/roles');
}
/**
* Show the form for editing a user role.
* @param $id
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function editRole($id)
{
$this->checkPermission('user-roles-manage');
$role = $this->permissionsRepo->getRoleById($id);
return view('settings/roles/edit', ['role' => $role]);
}
/**
* Updates a user role.
* @param $id
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function updateRole($id, Request $request)
{
$this->checkPermission('user-roles-manage');
$this->validate($request, [
'display_name' => 'required|min:3|max:200',
'description' => 'max:250'
]);
$this->permissionsRepo->updateRole($id, $request->all());
session()->flash('success', 'Role successfully updated');
return redirect('/settings/roles');
}
/**
* Show the view to delete a role.
* Offers the chance to migrate users.
* @param $id
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showDeleteRole($id)
{
$this->checkPermission('user-roles-manage');
$role = $this->permissionsRepo->getRoleById($id);
$roles = $this->permissionsRepo->getAllRolesExcept($role);
$blankRole = $role->newInstance(['display_name' => 'Don\'t migrate users']);
$roles->prepend($blankRole);
return view('settings/roles/delete', ['role' => $role, 'roles' => $roles]);
}
/**
* Delete a role from the system,
* Migrate from a previous role if set.
* @param $id
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function deleteRole($id, Request $request)
{
$this->checkPermission('user-roles-manage');
try {
$this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id'));
} catch (PermissionsException $e) {
session()->flash('error', $e->getMessage());
return redirect()->back();
}
session()->flash('success', 'Role successfully deleted');
return redirect('/settings/roles');
}
}

View File

@@ -42,11 +42,77 @@ class SearchController extends Controller
return redirect()->back();
}
$searchTerm = $request->get('term');
$pages = $this->pageRepo->getBySearch($searchTerm);
$books = $this->bookRepo->getBySearch($searchTerm);
$chapters = $this->chapterRepo->getBySearch($searchTerm);
$paginationAppends = $request->only('term');
$pages = $this->pageRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
$books = $this->bookRepo->getBySearch($searchTerm, 10, $paginationAppends);
$chapters = $this->chapterRepo->getBySearch($searchTerm, [], 10, $paginationAppends);
$this->setPageTitle('Search For ' . $searchTerm);
return view('search/all', ['pages' => $pages, 'books' => $books, 'chapters' => $chapters, 'searchTerm' => $searchTerm]);
return view('search/all', [
'pages' => $pages,
'books' => $books,
'chapters' => $chapters,
'searchTerm' => $searchTerm
]);
}
/**
* Search only the pages in the system.
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
*/
public function searchPages(Request $request)
{
if (!$request->has('term')) return redirect()->back();
$searchTerm = $request->get('term');
$paginationAppends = $request->only('term');
$pages = $this->pageRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
$this->setPageTitle('Page Search For ' . $searchTerm);
return view('search/entity-search-list', [
'entities' => $pages,
'title' => 'Page Search Results',
'searchTerm' => $searchTerm
]);
}
/**
* Search only the chapters in the system.
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
*/
public function searchChapters(Request $request)
{
if (!$request->has('term')) return redirect()->back();
$searchTerm = $request->get('term');
$paginationAppends = $request->only('term');
$chapters = $this->chapterRepo->getBySearch($searchTerm, [], 20, $paginationAppends);
$this->setPageTitle('Chapter Search For ' . $searchTerm);
return view('search/entity-search-list', [
'entities' => $chapters,
'title' => 'Chapter Search Results',
'searchTerm' => $searchTerm
]);
}
/**
* Search only the books in the system.
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
*/
public function searchBooks(Request $request)
{
if (!$request->has('term')) return redirect()->back();
$searchTerm = $request->get('term');
$paginationAppends = $request->only('term');
$books = $this->bookRepo->getBySearch($searchTerm, 20, $paginationAppends);
$this->setPageTitle('Book Search For ' . $searchTerm);
return view('search/entity-search-list', [
'entities' => $books,
'title' => 'Book Search Results',
'searchTerm' => $searchTerm
]);
}
/**

View File

@@ -1,42 +1,43 @@
<?php
namespace BookStack\Http\Controllers;
<?php namespace BookStack\Http\Controllers;
use Illuminate\Http\Request;
use BookStack\Http\Requests;
use BookStack\Http\Controllers\Controller;
use Setting;
class SettingController extends Controller
{
/**
* Display a listing of the settings.
*
* @return Response
*/
public function index()
{
$this->checkPermission('settings-update');
$this->checkPermission('settings-manage');
$this->setPageTitle('Settings');
return view('settings/index');
}
// Get application version
$version = false;
if (function_exists('exec')) {
$version = exec('git describe --always --tags ');
}
return view('settings/index', ['version' => $version]);
}
/**
* Update the specified settings in storage.
*
* @param Request $request
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
$this->preventAccessForDemoUsers();
$this->checkPermission('settings-update');
$this->checkPermission('settings-manage');
// Cycles through posted settings and update them
foreach($request->all() as $name => $value) {
if(strpos($name, 'setting-') !== 0) continue;
foreach ($request->all() as $name => $value) {
if (strpos($name, 'setting-') !== 0) continue;
$key = str_replace('setting-', '', trim($name));
Setting::put($key, $value);
}

View File

@@ -2,6 +2,7 @@
namespace BookStack\Http\Controllers;
use BookStack\Activity;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
@@ -34,7 +35,8 @@ class UserController extends Controller
*/
public function index()
{
$users = $this->user->all();
$this->checkPermission('users-manage');
$users = $this->userRepo->getAllUsers();
$this->setPageTitle('Users');
return view('users/index', ['users' => $users]);
}
@@ -45,7 +47,7 @@ class UserController extends Controller
*/
public function create()
{
$this->checkPermission('user-create');
$this->checkPermission('users-manage');
$authMethod = config('auth.method');
return view('users/create', ['authMethod' => $authMethod]);
}
@@ -57,11 +59,10 @@ class UserController extends Controller
*/
public function store(Request $request)
{
$this->checkPermission('user-create');
$this->checkPermission('users-manage');
$validationRules = [
'name' => 'required',
'email' => 'required|email|unique:users,email',
'role' => 'required|exists:roles,id'
'email' => 'required|email|unique:users,email'
];
$authMethod = config('auth.method');
@@ -83,7 +84,11 @@ class UserController extends Controller
}
$user->save();
$user->attachRoleId($request->get('role'));
if ($request->has('roles')) {
$roles = $request->get('roles');
$user->roles()->sync($roles);
}
// Get avatar from gravatar and save
if (!config('services.disable_services')) {
@@ -92,10 +97,9 @@ class UserController extends Controller
$user->save();
}
return redirect('/users');
return redirect('/settings/users');
}
/**
* Show the form for editing the specified user.
* @param int $id
@@ -104,7 +108,7 @@ class UserController extends Controller
*/
public function edit($id, SocialAuthService $socialAuthService)
{
$this->checkPermissionOr('user-update', function () use ($id) {
$this->checkPermissionOr('users-manage', function () use ($id) {
return $this->currentUser->id == $id;
});
@@ -125,16 +129,15 @@ class UserController extends Controller
public function update(Request $request, $id)
{
$this->preventAccessForDemoUsers();
$this->checkPermissionOr('user-update', function () use ($id) {
$this->checkPermissionOr('users-manage', function () use ($id) {
return $this->currentUser->id == $id;
});
$this->validate($request, [
'name' => 'required',
'email' => 'required|email|unique:users,email,' . $id,
'name' => 'min:2',
'email' => 'min:2|email|unique:users,email,' . $id,
'password' => 'min:5|required_with:password_confirm',
'password-confirm' => 'same:password|required_with:password',
'role' => 'exists:roles,id'
'password-confirm' => 'same:password|required_with:password'
], [
'password-confirm.required_with' => 'Password confirmation required'
]);
@@ -143,8 +146,9 @@ class UserController extends Controller
$user->fill($request->all());
// Role updates
if ($this->currentUser->can('user-update') && $request->has('role')) {
$user->attachRoleId($request->get('role'));
if (userCan('users-manage') && $request->has('roles')) {
$roles = $request->get('roles');
$user->roles()->sync($roles);
}
// Password updates
@@ -154,12 +158,15 @@ class UserController extends Controller
}
// External auth id updates
if ($this->currentUser->can('user-update') && $request->has('external_auth_id')) {
if ($this->currentUser->can('users-manage') && $request->has('external_auth_id')) {
$user->external_auth_id = $request->get('external_auth_id');
}
$user->save();
return redirect('/users');
session()->flash('success', 'User successfully updated');
$redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
return redirect($redirectUrl);
}
/**
@@ -169,7 +176,7 @@ class UserController extends Controller
*/
public function delete($id)
{
$this->checkPermissionOr('user-delete', function () use ($id) {
$this->checkPermissionOr('users-manage', function () use ($id) {
return $this->currentUser->id == $id;
});
@@ -186,7 +193,7 @@ class UserController extends Controller
public function destroy($id)
{
$this->preventAccessForDemoUsers();
$this->checkPermissionOr('user-delete', function () use ($id) {
$this->checkPermissionOr('users-manage', function () use ($id) {
return $this->currentUser->id == $id;
});
@@ -197,6 +204,25 @@ class UserController extends Controller
}
$this->userRepo->destroy($user);
return redirect('/users');
return redirect('/settings/users');
}
/**
* Show the user profile page
* @param $id
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function showProfilePage($id)
{
$user = $this->userRepo->getById($id);
$userActivity = $this->userRepo->getActivity($user);
$recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
$assetCounts = $this->userRepo->getAssetCounts($user);
return view('users/profile', [
'user' => $user,
'activity' => $userActivity,
'recentlyCreated' => $recentlyCreated,
'assetCounts' => $assetCounts
]);
}
}

View File

@@ -11,14 +11,12 @@ class Authenticate
{
/**
* The Guard implementation.
*
* @var Guard
*/
protected $auth;
/**
* Create a new filter instance.
*
* @param Guard $auth
*/
public function __construct(Guard $auth)
@@ -28,18 +26,17 @@ class Authenticate
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(auth()->check() && auth()->user()->email_confirmed == false) {
if ($this->auth->check() && setting('registration-confirmation') && !$this->auth->user()->email_confirmed) {
return redirect()->guest('/register/confirm/awaiting');
}
if ($this->auth->guest() && !Setting::get('app-public')) {
if ($this->auth->guest() && !setting('app-public')) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {

View File

@@ -3,6 +3,11 @@
// Authenticated routes...
Route::group(['middleware' => 'auth'], function () {
Route::group(['prefix' => 'pages'], function() {
Route::get('/recently-created', 'PageController@showRecentlyCreated');
Route::get('/recently-updated', 'PageController@showRecentlyUpdated');
});
Route::group(['prefix' => 'books'], function () {
// Books
@@ -14,21 +19,28 @@ Route::group(['middleware' => 'auth'], function () {
Route::delete('/{id}', 'BookController@destroy');
Route::get('/{slug}/sort-item', 'BookController@getSortItem');
Route::get('/{slug}', 'BookController@show');
Route::get('/{bookSlug}/permissions', 'BookController@showRestrict');
Route::put('/{bookSlug}/permissions', 'BookController@restrict');
Route::get('/{slug}/delete', 'BookController@showDelete');
Route::get('/{bookSlug}/sort', 'BookController@sort');
Route::put('/{bookSlug}/sort', 'BookController@saveSort');
// Pages
Route::get('/{bookSlug}/page/create', 'PageController@create');
Route::post('/{bookSlug}/page', 'PageController@store');
Route::get('/{bookSlug}/draft/{pageId}', 'PageController@editDraft');
Route::post('/{bookSlug}/page/{pageId}', 'PageController@store');
Route::get('/{bookSlug}/page/{pageSlug}', 'PageController@show');
Route::get('/{bookSlug}/page/{pageSlug}/export/pdf', 'PageController@exportPdf');
Route::get('/{bookSlug}/page/{pageSlug}/export/html', 'PageController@exportHtml');
Route::get('/{bookSlug}/page/{pageSlug}/export/plaintext', 'PageController@exportPlainText');
Route::get('/{bookSlug}/page/{pageSlug}/edit', 'PageController@edit');
Route::get('/{bookSlug}/page/{pageSlug}/delete', 'PageController@showDelete');
Route::get('/{bookSlug}/draft/{pageId}/delete', 'PageController@showDeleteDraft');
Route::get('/{bookSlug}/page/{pageSlug}/permissions', 'PageController@showRestrict');
Route::put('/{bookSlug}/page/{pageSlug}/permissions', 'PageController@restrict');
Route::put('/{bookSlug}/page/{pageSlug}', 'PageController@update');
Route::delete('/{bookSlug}/page/{pageSlug}', 'PageController@destroy');
Route::delete('/{bookSlug}/draft/{pageId}', 'PageController@destroyDraft');
// Revisions
Route::get('/{bookSlug}/page/{pageSlug}/revisions', 'PageController@showRevisions');
@@ -42,19 +54,15 @@ Route::group(['middleware' => 'auth'], function () {
Route::get('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@show');
Route::put('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@update');
Route::get('/{bookSlug}/chapter/{chapterSlug}/edit', 'ChapterController@edit');
Route::get('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@showRestrict');
Route::put('/{bookSlug}/chapter/{chapterSlug}/permissions', 'ChapterController@restrict');
Route::get('/{bookSlug}/chapter/{chapterSlug}/delete', 'ChapterController@showDelete');
Route::delete('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@destroy');
});
// Users
Route::get('/users', 'UserController@index');
Route::get('/users/create', 'UserController@create');
Route::get('/users/{id}/delete', 'UserController@delete');
Route::post('/users/create', 'UserController@store');
Route::get('/users/{id}', 'UserController@edit');
Route::put('/users/{id}', 'UserController@update');
Route::delete('/users/{id}', 'UserController@destroy');
// User Profile routes
Route::get('/user/{userId}', 'UserController@showProfilePage');
// Image routes
Route::group(['prefix' => 'images'], function() {
@@ -67,14 +75,24 @@ Route::group(['middleware' => 'auth'], function () {
Route::post('/{type}/upload', 'ImageController@uploadByType');
Route::get('/{type}/all', 'ImageController@getAllByType');
Route::get('/{type}/all/{page}', 'ImageController@getAllByType');
Route::get('/{type}/search/{page}', 'ImageController@searchByType');
Route::get('/gallery/{filter}/{page}', 'ImageController@getGalleryFiltered');
Route::delete('/{imageId}', 'ImageController@destroy');
});
// Ajax routes
Route::put('/ajax/page/{id}/save-draft', 'PageController@saveDraft');
Route::get('/ajax/page/{id}', 'PageController@getPageAjax');
Route::delete('/ajax/page/{id}', 'PageController@ajaxDestroy');
// Links
Route::get('/link/{id}', 'PageController@redirectFromLink');
// Search
Route::get('/search/all', 'SearchController@searchAll');
Route::get('/search/pages', 'SearchController@searchPages');
Route::get('/search/books', 'SearchController@searchBooks');
Route::get('/search/chapters', 'SearchController@searchChapters');
Route::get('/search/book/{bookId}', 'SearchController@searchBook');
// Other Pages
@@ -82,8 +100,28 @@ Route::group(['middleware' => 'auth'], function () {
Route::get('/home', 'HomeController@index');
// Settings
Route::get('/settings', 'SettingController@index');
Route::post('/settings', 'SettingController@update');
Route::group(['prefix' => 'settings'], function() {
Route::get('/', 'SettingController@index');
Route::post('/', 'SettingController@update');
// Users
Route::get('/users', 'UserController@index');
Route::get('/users/create', 'UserController@create');
Route::get('/users/{id}/delete', 'UserController@delete');
Route::post('/users/create', 'UserController@store');
Route::get('/users/{id}', 'UserController@edit');
Route::put('/users/{id}', 'UserController@update');
Route::delete('/users/{id}', 'UserController@destroy');
// Roles
Route::get('/roles', 'PermissionController@listRoles');
Route::get('/roles/new', 'PermissionController@createRole');
Route::post('/roles/new', 'PermissionController@storeRole');
Route::get('/roles/delete/{id}', 'PermissionController@showDeleteRole');
Route::delete('/roles/delete/{id}', 'PermissionController@deleteRole');
Route::get('/roles/{id}', 'PermissionController@editRole');
Route::put('/roles/{id}', 'PermissionController@updateRole');
});
});

View File

@@ -1,14 +1,9 @@
<?php
<?php namespace BookStack;
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
use Images;
class Image extends Model
class Image extends Ownable
{
use Ownable;
protected $fillable = ['name'];

View File

@@ -1,7 +1,8 @@
<?php namespace BookStack;
use Illuminate\Database\Eloquent\Model;
trait Ownable
abstract class Ownable extends Model
{
/**
* Relation for the user that created this entity.
@@ -20,4 +21,14 @@ trait Ownable
{
return $this->belongsTo('BookStack\User', 'updated_by');
}
/**
* Gets the class name.
* @return string
*/
public static function getClassName()
{
return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]);
}
}

View File

@@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model;
class Page extends Entity
{
protected $fillable = ['name', 'html', 'priority'];
protected $fillable = ['name', 'html', 'priority', 'markdown'];
protected $simpleAttributes = ['name', 'id', 'slug'];
@@ -34,18 +34,21 @@ class Page extends Entity
public function revisions()
{
return $this->hasMany('BookStack\PageRevision')->orderBy('created_at', 'desc');
return $this->hasMany('BookStack\PageRevision')->where('type', '=', 'version')->orderBy('created_at', 'desc');
}
public function getUrl()
{
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
return '/books/' . $bookSlug . '/page/' . $this->slug;
$midText = $this->draft ? '/draft/' : '/page/';
$idComponent = $this->draft ? $this->id : $this->slug;
return '/books/' . $bookSlug . $midText . $idComponent;
}
public function getExcerpt($length = 100)
{
return strlen($this->text) > $length ? substr($this->text, 0, $length-3) . '...' : $this->text;
$text = strlen($this->text) > $length ? substr($this->text, 0, $length-3) . '...' : $this->text;
return mb_convert_encoding($text, 'UTF-8');
}
}

View File

@@ -1,23 +1,33 @@
<?php
namespace BookStack;
<?php namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class PageRevision extends Model
{
protected $fillable = ['name', 'html', 'text'];
protected $fillable = ['name', 'html', 'text', 'markdown'];
/**
* Get the user that created the page revision
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function createdBy()
{
return $this->belongsTo('BookStack\User', 'created_by');
}
/**
* Get the page this revision originates from.
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function page()
{
return $this->belongsTo('BookStack\Page');
}
/**
* Get the url for this revision.
* @return string
*/
public function getUrl()
{
return $this->page->getUrl() . '/revisions/' . $this->id;

View File

@@ -11,6 +11,16 @@ class Permission extends Model
*/
public function roles()
{
return $this->belongsToMany('BookStack\Permissions');
return $this->belongsToMany('BookStack\Role');
}
/**
* Get the permission object by name.
* @param $roleName
* @return mixed
*/
public static function getByName($name)
{
return static::where('name', '=', $name)->first();
}
}

View File

@@ -28,11 +28,17 @@ class CustomFacadeProvider extends ServiceProvider
public function register()
{
$this->app->bind('activity', function() {
return new ActivityService($this->app->make('BookStack\Activity'));
return new ActivityService(
$this->app->make('BookStack\Activity'),
$this->app->make('BookStack\Services\RestrictionService')
);
});
$this->app->bind('views', function() {
return new ViewService($this->app->make('BookStack\View'));
return new ViewService(
$this->app->make('BookStack\View'),
$this->app->make('BookStack\Services\RestrictionService')
);
});
$this->app->bind('setting', function() {
@@ -41,6 +47,7 @@ class CustomFacadeProvider extends ServiceProvider
$this->app->make('Illuminate\Contracts\Cache\Repository')
);
});
$this->app->bind('images', function() {
return new ImageService(
$this->app->make('Intervention\Image\ImageManager'),

View File

@@ -115,7 +115,7 @@ class LdapUserProvider implements UserProvider
$model->name = $userDetails['name'];
$model->external_auth_id = $userDetails['uid'];
$model->email = $userDetails['email'];
$model->email_confirmed = true;
$model->email_confirmed = false;
return $model;
}

View File

@@ -1,28 +1,35 @@
<?php namespace BookStack\Repos;
use Activity;
use BookStack\Exceptions\NotFoundException;
use Illuminate\Support\Str;
use BookStack\Book;
use Views;
class BookRepo
class BookRepo extends EntityRepo
{
protected $book;
protected $pageRepo;
protected $chapterRepo;
/**
* BookRepo constructor.
* @param Book $book
* @param PageRepo $pageRepo
* @param PageRepo $pageRepo
* @param ChapterRepo $chapterRepo
*/
public function __construct(Book $book, PageRepo $pageRepo, ChapterRepo $chapterRepo)
public function __construct(PageRepo $pageRepo, ChapterRepo $chapterRepo)
{
$this->book = $book;
$this->pageRepo = $pageRepo;
$this->chapterRepo = $chapterRepo;
parent::__construct();
}
/**
* Base query for getting books.
* Takes into account any restrictions.
* @return mixed
*/
private function bookQuery()
{
return $this->restrictionService->enforceBookRestrictions($this->book, 'view');
}
/**
@@ -32,7 +39,7 @@ class BookRepo
*/
public function getById($id)
{
return $this->book->findOrFail($id);
return $this->bookQuery()->findOrFail($id);
}
/**
@@ -42,7 +49,9 @@ class BookRepo
*/
public function getAll($count = 10)
{
return $this->book->orderBy('name', 'asc')->take($count)->get();
$bookQuery = $this->bookQuery()->orderBy('name', 'asc');
if (!$count) return $bookQuery->get();
return $bookQuery->take($count)->get();
}
/**
@@ -52,7 +61,8 @@ class BookRepo
*/
public function getAllPaginated($count = 10)
{
return $this->book->orderBy('name', 'asc')->paginate($count);
return $this->bookQuery()
->orderBy('name', 'asc')->paginate($count);
}
@@ -63,7 +73,7 @@ class BookRepo
*/
public function getLatest($count = 10)
{
return $this->book->orderBy('created_at', 'desc')->take($count)->get();
return $this->bookQuery()->orderBy('created_at', 'desc')->take($count)->get();
}
/**
@@ -92,11 +102,12 @@ class BookRepo
* Get a book by slug
* @param $slug
* @return mixed
* @throws NotFoundException
*/
public function getBySlug($slug)
{
$book = $this->book->where('slug', '=', $slug)->first();
if ($book === null) abort(404);
$book = $this->bookQuery()->where('slug', '=', $slug)->first();
if ($book === null) throw new NotFoundException('Book not found');
return $book;
}
@@ -107,7 +118,7 @@ class BookRepo
*/
public function exists($id)
{
return $this->book->where('id', '=', $id)->exists();
return $this->bookQuery()->where('id', '=', $id)->exists();
}
/**
@@ -117,17 +128,7 @@ class BookRepo
*/
public function newFromInput($input)
{
return $this->book->fill($input);
}
/**
* Count the amount of books that have a specific slug.
* @param $slug
* @return mixed
*/
public function countBySlug($slug)
{
return $this->book->where('slug', '=', $slug)->count();
return $this->book->newInstance($input);
}
/**
@@ -144,6 +145,7 @@ class BookRepo
$this->chapterRepo->destroy($chapter);
}
$book->views()->delete();
$book->restrictions()->delete();
$book->delete();
}
@@ -159,7 +161,7 @@ class BookRepo
}
/**
* @param string $slug
* @param string $slug
* @param bool|false $currentId
* @return bool
*/
@@ -175,7 +177,7 @@ class BookRepo
/**
* Provides a suitable slug for the given book name.
* Ensures the returned slug is unique in the system.
* @param string $name
* @param string $name
* @param bool|false $currentId
* @return string
*/
@@ -196,34 +198,63 @@ class BookRepo
* Returns a sorted collection of Pages and Chapters.
* Loads the bookslug onto child elements to prevent access database access for getting the slug.
* @param Book $book
* @param bool $filterDrafts
* @return mixed
*/
public function getChildren(Book $book)
public function getChildren(Book $book, $filterDrafts = false)
{
$pages = $book->pages()->where('chapter_id', '=', 0)->get();
$chapters = $book->chapters()->with('pages')->get();
$pageQuery = $book->pages()->where('chapter_id', '=', 0);
$pageQuery = $this->restrictionService->enforcePageRestrictions($pageQuery, 'view');
if ($filterDrafts) {
$pageQuery = $pageQuery->where('draft', '=', false);
}
$pages = $pageQuery->get();
$chapterQuery = $book->chapters()->with(['pages' => function($query) use ($filterDrafts) {
$this->restrictionService->enforcePageRestrictions($query, 'view');
if ($filterDrafts) $query->where('draft', '=', false);
}]);
$chapterQuery = $this->restrictionService->enforceChapterRestrictions($chapterQuery, 'view');
$chapters = $chapterQuery->get();
$children = $pages->merge($chapters);
$bookSlug = $book->slug;
$children->each(function ($child) use ($bookSlug) {
$child->setAttribute('bookSlug', $bookSlug);
if ($child->isA('chapter')) {
$child->pages->each(function ($page) use ($bookSlug) {
$page->setAttribute('bookSlug', $bookSlug);
});
$child->pages = $child->pages->sortBy(function($child, $key) {
$score = $child->priority;
if ($child->draft) $score -= 100;
return $score;
});
}
});
return $children->sortBy('priority');
// Sort items with drafts first then by priority.
return $children->sortBy(function($child, $key) {
$score = $child->priority;
if ($child->isA('page') && $child->draft) $score -= 100;
return $score;
});
}
/**
* Get books by search term.
* @param $term
* @param int $count
* @param array $paginationAppends
* @return mixed
*/
public function getBySearch($term)
public function getBySearch($term, $count = 20, $paginationAppends = [])
{
$terms = explode(' ', $term);
$books = $this->book->fullTextSearch(['name', 'description'], $terms);
$terms = $this->prepareSearchTerms($term);
$books = $this->restrictionService->enforceBookRestrictions($this->book->fullTextSearchQuery(['name', 'description'], $terms))
->paginate($count)->appends($paginationAppends);
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
foreach ($books as $book) {
//highlight

View File

@@ -2,21 +2,19 @@
use Activity;
use BookStack\Exceptions\NotFoundException;
use Illuminate\Support\Str;
use BookStack\Chapter;
class ChapterRepo
class ChapterRepo extends EntityRepo
{
protected $chapter;
/**
* ChapterRepo constructor.
* @param $chapter
* Base query for getting chapters, Takes restrictions into account.
* @return mixed
*/
public function __construct(Chapter $chapter)
private function chapterQuery()
{
$this->chapter = $chapter;
return $this->restrictionService->enforceChapterRestrictions($this->chapter, 'view');
}
/**
@@ -26,7 +24,7 @@ class ChapterRepo
*/
public function idExists($id)
{
return $this->chapter->where('id', '=', $id)->count() > 0;
return $this->chapterQuery()->where('id', '=', $id)->count() > 0;
}
/**
@@ -36,7 +34,7 @@ class ChapterRepo
*/
public function getById($id)
{
return $this->chapter->findOrFail($id);
return $this->chapterQuery()->findOrFail($id);
}
/**
@@ -45,7 +43,7 @@ class ChapterRepo
*/
public function getAll()
{
return $this->chapter->all();
return $this->chapterQuery()->all();
}
/**
@@ -53,14 +51,30 @@ class ChapterRepo
* @param $slug
* @param $bookId
* @return mixed
* @throws NotFoundException
*/
public function getBySlug($slug, $bookId)
{
$chapter = $this->chapter->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
if ($chapter === null) abort(404);
$chapter = $this->chapterQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
if ($chapter === null) throw new NotFoundException('Chapter not found');
return $chapter;
}
/**
* Get the child items for a chapter
* @param Chapter $chapter
*/
public function getChildren(Chapter $chapter)
{
$pages = $this->restrictionService->enforcePageRestrictions($chapter->pages())->get();
// Sort items with drafts first then by priority.
return $pages->sortBy(function($child, $key) {
$score = $child->priority;
if ($child->draft) $score -= 100;
return $score;
});
}
/**
* Create a new chapter from request input.
* @param $input
@@ -85,6 +99,7 @@ class ChapterRepo
}
Activity::removeEntity($chapter);
$chapter->views()->delete();
$chapter->restrictions()->delete();
$chapter->delete();
}
@@ -121,16 +136,31 @@ class ChapterRepo
return $slug;
}
/**
* Get a new priority value for a new page to be added
* to the given chapter.
* @param Chapter $chapter
* @return int
*/
public function getNewPriority(Chapter $chapter)
{
$lastPage = $chapter->pages->last();
return $lastPage !== null ? $lastPage->priority + 1 : 0;
}
/**
* Get chapters by the given search term.
* @param $term
* @param string $term
* @param array $whereTerms
* @param int $count
* @param array $paginationAppends
* @return mixed
*/
public function getBySearch($term, $whereTerms = [])
public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
{
$terms = explode(' ', $term);
$chapters = $this->chapter->fullTextSearch(['name', 'description'], $terms, $whereTerms);
$terms = $this->prepareSearchTerms($term);
$chapters = $this->restrictionService->enforceChapterRestrictions($this->chapter->fullTextSearchQuery(['name', 'description'], $terms, $whereTerms))
->paginate($count)->appends($paginationAppends);
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
foreach ($chapters as $chapter) {
//highlight

177
app/Repos/EntityRepo.php Normal file
View File

@@ -0,0 +1,177 @@
<?php namespace BookStack\Repos;
use BookStack\Book;
use BookStack\Chapter;
use BookStack\Entity;
use BookStack\Page;
use BookStack\Services\RestrictionService;
use BookStack\User;
class EntityRepo
{
/**
* @var Book $book
*/
public $book;
/**
* @var Chapter
*/
public $chapter;
/**
* @var Page
*/
public $page;
/**
* @var RestrictionService
*/
protected $restrictionService;
/**
* EntityService constructor.
*/
public function __construct()
{
$this->book = app(Book::class);
$this->chapter = app(Chapter::class);
$this->page = app(Page::class);
$this->restrictionService = app(RestrictionService::class);
}
/**
* Get the latest books added to the system.
* @param int $count
* @param int $page
* @param bool $additionalQuery
* @return
*/
public function getRecentlyCreatedBooks($count = 20, $page = 0, $additionalQuery = false)
{
$query = $this->restrictionService->enforceBookRestrictions($this->book)
->orderBy('created_at', 'desc');
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
return $query->skip($page * $count)->take($count)->get();
}
/**
* Get the most recently updated books.
* @param $count
* @param int $page
* @return mixed
*/
public function getRecentlyUpdatedBooks($count = 20, $page = 0)
{
return $this->restrictionService->enforceBookRestrictions($this->book)
->orderBy('updated_at', 'desc')->skip($page * $count)->take($count)->get();
}
/**
* Get the latest pages added to the system.
* @param int $count
* @param int $page
* @param bool $additionalQuery
* @return
*/
public function getRecentlyCreatedPages($count = 20, $page = 0, $additionalQuery = false)
{
$query = $this->restrictionService->enforcePageRestrictions($this->page)
->orderBy('created_at', 'desc')->where('draft', '=', false);
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
return $query->with('book')->skip($page * $count)->take($count)->get();
}
/**
* Get the latest chapters added to the system.
* @param int $count
* @param int $page
* @param bool $additionalQuery
* @return
*/
public function getRecentlyCreatedChapters($count = 20, $page = 0, $additionalQuery = false)
{
$query = $this->restrictionService->enforceChapterRestrictions($this->chapter)
->orderBy('created_at', 'desc');
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
return $query->skip($page * $count)->take($count)->get();
}
/**
* Get the most recently updated pages.
* @param $count
* @param int $page
* @return mixed
*/
public function getRecentlyUpdatedPages($count = 20, $page = 0)
{
return $this->restrictionService->enforcePageRestrictions($this->page)
->where('draft', '=', false)
->orderBy('updated_at', 'desc')->with('book')->skip($page * $count)->take($count)->get();
}
/**
* Get draft pages owned by the current user.
* @param int $count
* @param int $page
*/
public function getUserDraftPages($count = 20, $page = 0)
{
$user = auth()->user();
return $this->page->where('draft', '=', true)
->where('created_by', '=', $user->id)
->orderBy('updated_at', 'desc')
->skip($count * $page)->take($count)->get();
}
/**
* Updates entity restrictions from a request
* @param $request
* @param Entity $entity
*/
public function updateRestrictionsFromRequest($request, Entity $entity)
{
$entity->restricted = $request->has('restricted') && $request->get('restricted') === 'true';
$entity->restrictions()->delete();
if ($request->has('restrictions')) {
foreach ($request->get('restrictions') as $roleId => $restrictions) {
foreach ($restrictions as $action => $value) {
$entity->restrictions()->create([
'role_id' => $roleId,
'action' => strtolower($action)
]);
}
}
}
$entity->save();
}
/**
* Prepare a string of search terms by turning
* it into an array of terms.
* Keeps quoted terms together.
* @param $termString
* @return array
*/
protected function prepareSearchTerms($termString)
{
preg_match_all('/"(.*?)"/', $termString, $matches);
if (count($matches[1]) > 0) {
$terms = $matches[1];
$termString = trim(preg_replace('/"(.*?)"/', '', $termString));
} else {
$terms = [];
}
if (!empty($termString)) $terms = array_merge($terms, explode(' ', $termString));
return $terms;
}
}

View File

@@ -2,7 +2,9 @@
use BookStack\Image;
use BookStack\Page;
use BookStack\Services\ImageService;
use BookStack\Services\RestrictionService;
use Setting;
use Symfony\Component\HttpFoundation\File\UploadedFile;
@@ -11,16 +13,22 @@ class ImageRepo
protected $image;
protected $imageService;
protected $restictionService;
protected $page;
/**
* ImageRepo constructor.
* @param Image $image
* @param Image $image
* @param ImageService $imageService
* @param RestrictionService $restrictionService
* @param Page $page
*/
public function __construct(Image $image, ImageService $imageService)
public function __construct(Image $image, ImageService $imageService, RestrictionService $restrictionService, Page $page)
{
$this->image = $image;
$this->imageService = $imageService;
$this->restictionService = $restrictionService;
$this->page = $page;
}
@@ -34,23 +42,17 @@ class ImageRepo
return $this->image->findOrFail($id);
}
/**
* Gets a load images paginated, filtered by image type.
* @param string $type
* @param int $page
* @param int $pageSize
* @param bool|int $userFilter
* Execute a paginated query, returning in a standard format.
* Also runs the query through the restriction system.
* @param $query
* @param int $page
* @param int $pageSize
* @return array
*/
public function getPaginatedByType($type, $page = 0, $pageSize = 24, $userFilter = false)
private function returnPaginated($query, $page = 0, $pageSize = 24)
{
$images = $this->image->where('type', '=', strtolower($type));
if ($userFilter !== false) {
$images = $images->where('created_by', '=', $userFilter);
}
$images = $this->restictionService->filterRelatedPages($query, 'images', 'uploaded_to');
$images = $images->orderBy('created_at', 'desc')->skip($pageSize * $page)->take($pageSize + 1)->get();
$hasMore = count($images) > $pageSize;
@@ -65,15 +67,74 @@ class ImageRepo
];
}
/**
* Gets a load images paginated, filtered by image type.
* @param string $type
* @param int $page
* @param int $pageSize
* @param bool|int $userFilter
* @return array
*/
public function getPaginatedByType($type, $page = 0, $pageSize = 24, $userFilter = false)
{
$images = $this->image->where('type', '=', strtolower($type));
if ($userFilter !== false) {
$images = $images->where('created_by', '=', $userFilter);
}
return $this->returnPaginated($images, $page, $pageSize);
}
/**
* Search for images by query, of a particular type.
* @param string $type
* @param int $page
* @param int $pageSize
* @param string $searchTerm
* @return array
*/
public function searchPaginatedByType($type, $page = 0, $pageSize = 24, $searchTerm)
{
$images = $this->image->where('type', '=', strtolower($type))->where('name', 'LIKE', '%' . $searchTerm . '%');
return $this->returnPaginated($images, $page, $pageSize);
}
/**
* Get gallery images with a particular filter criteria such as
* being within the current book or page.
* @param int $pagination
* @param int $pageSize
* @param $filter
* @param $pageId
* @return array
*/
public function getGalleryFiltered($pagination = 0, $pageSize = 24, $filter, $pageId)
{
$images = $this->image->where('type', '=', 'gallery');
$page = $this->page->findOrFail($pageId);
if ($filter === 'page') {
$images = $images->where('uploaded_to', '=', $page->id);
} elseif ($filter === 'book') {
$validPageIds = $page->book->pages->pluck('id')->toArray();
$images = $images->whereIn('uploaded_to', $validPageIds);
}
return $this->returnPaginated($images, $pagination, $pageSize);
}
/**
* Save a new image into storage and return the new image.
* @param UploadedFile $uploadFile
* @param string $type
* @param string $type
* @param int $uploadedTo
* @return Image
*/
public function saveNew(UploadedFile $uploadFile, $type)
public function saveNew(UploadedFile $uploadFile, $type, $uploadedTo = 0)
{
$image = $this->imageService->saveNewFromUpload($uploadFile, $type);
$image = $this->imageService->saveNewFromUpload($uploadFile, $type, $uploadedTo);
$this->loadThumbs($image);
return $image;
}
@@ -123,9 +184,9 @@ class ImageRepo
* Checks the cache then storage to avoid creating / accessing the filesystem on every check.
*
* @param Image $image
* @param int $width
* @param int $height
* @param bool $keepRatio
* @param int $width
* @param int $height
* @param bool $keepRatio
* @return string
*/
public function getThumbnail(Image $image, $width = 220, $height = 220, $keepRatio = false)

View File

@@ -1,59 +1,53 @@
<?php namespace BookStack\Repos;
use Activity;
use BookStack\Book;
use BookStack\Chapter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use BookStack\Exceptions\NotFoundException;
use Carbon\Carbon;
use DOMDocument;
use Illuminate\Support\Str;
use BookStack\Page;
use BookStack\PageRevision;
class PageRepo
class PageRepo extends EntityRepo
{
protected $page;
protected $pageRevision;
/**
* PageRepo constructor.
* @param Page $page
* @param PageRevision $pageRevision
*/
public function __construct(Page $page, PageRevision $pageRevision)
public function __construct(PageRevision $pageRevision)
{
$this->page = $page;
$this->pageRevision = $pageRevision;
parent::__construct();
}
/**
* Check if a page id exists.
* @param $id
* @return bool
* Base query for getting pages, Takes restrictions into account.
* @param bool $allowDrafts
* @return mixed
*/
public function idExists($id)
private function pageQuery($allowDrafts = false)
{
return $this->page->where('page_id', '=', $id)->count() > 0;
$query = $this->restrictionService->enforcePageRestrictions($this->page, 'view');
if (!$allowDrafts) {
$query = $query->where('draft', '=', false);
}
return $query;
}
/**
* Get a page via a specific ID.
* @param $id
* @param bool $allowDrafts
* @return mixed
*/
public function getById($id)
public function getById($id, $allowDrafts = false)
{
return $this->page->findOrFail($id);
}
/**
* Get all pages.
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public function getAll()
{
return $this->page->all();
return $this->pageQuery($allowDrafts)->findOrFail($id);
}
/**
@@ -61,15 +55,37 @@ class PageRepo
* @param $slug
* @param $bookId
* @return mixed
* @throws NotFoundException
*/
public function getBySlug($slug, $bookId)
{
$page = $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
if ($page === null) abort(404);
$page = $this->pageQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
if ($page === null) throw new NotFoundException('Page not found');
return $page;
}
/**
* Search through page revisions and retrieve
* the last page in the current book that
* has a slug equal to the one given.
* @param $pageSlug
* @param $bookSlug
* @return null | Page
*/
public function findPageUsingOldSlug($pageSlug, $bookSlug)
{
$revision = $this->pageRevision->where('slug', '=', $pageSlug)
->whereHas('page', function ($query) {
$this->restrictionService->enforcePageRestrictions($query);
})
->where('type', '=', 'version')
->where('book_slug', '=', $bookSlug)->orderBy('created_at', 'desc')
->with('page')->first();
return $revision !== null ? $revision->page : null;
}
/**
* Get a new Page instance from the given input.
* @param $input
* @return Page
*/
@@ -94,8 +110,8 @@ class PageRepo
* Save a new page into the system.
* Input validation must be done beforehand.
* @param array $input
* @param Book $book
* @param int $chapterId
* @param Book $book
* @param int $chapterId
* @return Page
*/
public function saveNew(array $input, Book $book, $chapterId = null)
@@ -114,6 +130,47 @@ class PageRepo
return $page;
}
/**
* Publish a draft page to make it a normal page.
* Sets the slug and updates the content.
* @param Page $draftPage
* @param array $input
* @return Page
*/
public function publishDraft(Page $draftPage, array $input)
{
$draftPage->fill($input);
$draftPage->slug = $this->findSuitableSlug($draftPage->name, $draftPage->book->id);
$draftPage->html = $this->formatHtml($input['html']);
$draftPage->text = strip_tags($draftPage->html);
$draftPage->draft = false;
$draftPage->save();
return $draftPage;
}
/**
* Get a new draft page instance.
* @param Book $book
* @param Chapter|bool $chapter
* @return static
*/
public function getDraftPage(Book $book, $chapter = false)
{
$page = $this->page->newInstance();
$page->name = 'New Page';
$page->created_by = auth()->user()->id;
$page->updated_by = auth()->user()->id;
$page->draft = true;
if ($chapter) $page->chapter_id = $chapter->id;
$book->pages()->save($page);
return $page;
}
/**
* Formats a page's html to be tagged correctly
* within the system.
@@ -122,24 +179,23 @@ class PageRepo
*/
protected function formatHtml($htmlText)
{
if($htmlText == '') return $htmlText;
if ($htmlText == '') return $htmlText;
libxml_use_internal_errors(true);
$doc = new \DOMDocument();
$doc->loadHTML($htmlText);
$doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($htmlText, 'HTML-ENTITIES', 'UTF-8'));
$container = $doc->documentElement;
$body = $container->childNodes->item(0);
$childNodes = $body->childNodes;
// Ensure no duplicate ids are used
$lastId = false;
$idArray = [];
foreach ($childNodes as $index => $childNode) {
/** @var \DOMElement $childNode */
if (get_class($childNode) !== 'DOMElement') continue;
// Overwrite id if not a bookstack custom id
// Overwrite id if not a BookStack custom id
if ($childNode->hasAttribute('id')) {
$id = $childNode->getAttribute('id');
if (strpos($id, 'bkmrk') === 0 && array_search($id, $idArray) === false) {
@@ -149,13 +205,18 @@ class PageRepo
}
// Create an unique id for the element
do {
$id = 'bkmrk-' . substr(uniqid(), -5);
} while ($id == $lastId);
$lastId = $id;
// Uses the content as a basis to ensure output is the same every time
// the same content is passed through.
$contentId = 'bkmrk-' . substr(strtolower(preg_replace('/\s+/', '-', trim($childNode->nodeValue))), 0, 20);
$newId = urlencode($contentId);
$loopIndex = 0;
while (in_array($newId, $idArray)) {
$newId = urlencode($contentId . '-' . $loopIndex);
$loopIndex++;
}
$childNode->setAttribute('id', $id);
$idArray[] = $id;
$childNode->setAttribute('id', $newId);
$idArray[] = $newId;
}
// Generate inner html as a string
@@ -171,14 +232,17 @@ class PageRepo
/**
* Gets pages by a search term.
* Highlights page content for showing in results.
* @param string $term
* @param string $term
* @param array $whereTerms
* @param int $count
* @param array $paginationAppends
* @return mixed
*/
public function getBySearch($term, $whereTerms = [])
public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
{
$terms = explode(' ', $term);
$pages = $this->page->fullTextSearch(['name', 'text'], $terms, $whereTerms);
$terms = $this->prepareSearchTerms($term);
$pages = $this->restrictionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms))
->paginate($count)->appends($paginationAppends);
// Add highlights to page text.
$words = join('|', explode(' ', preg_quote(trim($term), '/')));
@@ -215,7 +279,7 @@ class PageRepo
*/
public function searchForImage($imageString)
{
$pages = $this->page->where('html', 'like', '%' . $imageString . '%')->get();
$pages = $this->pageQuery()->where('html', 'like', '%' . $imageString . '%')->get();
foreach ($pages as $page) {
$page->url = $page->getUrl();
$page->html = '';
@@ -226,8 +290,8 @@ class PageRepo
/**
* Updates a page with any fillable data and saves it into the database.
* @param Page $page
* @param int $book_id
* @param Page $page
* @param int $book_id
* @param string $input
* @return Page
*/
@@ -238,13 +302,23 @@ class PageRepo
$this->saveRevision($page);
}
// Prevent slug being updated if no name change
if ($page->name !== $input['name']) {
$page->slug = $this->findSuitableSlug($input['name'], $book_id, $page->id);
}
// Update with new details
$userId = auth()->user()->id;
$page->fill($input);
$page->slug = $this->findSuitableSlug($page->name, $book_id, $page->id);
$page->html = $this->formatHtml($input['html']);
$page->text = strip_tags($page->html);
$page->updated_by = auth()->user()->id;
if (setting('app-editor') !== 'markdown') $page->markdown = '';
$page->updated_by = $userId;
$page->save();
// Remove all update drafts for this user & page.
$this->userUpdateDraftsQuery($page, $userId)->delete();
return $page;
}
@@ -275,9 +349,13 @@ class PageRepo
public function saveRevision(Page $page)
{
$revision = $this->pageRevision->fill($page->toArray());
if (setting('app-editor') !== 'markdown') $revision->markdown = '';
$revision->page_id = $page->id;
$revision->slug = $page->slug;
$revision->book_slug = $page->book->slug;
$revision->created_by = auth()->user()->id;
$revision->created_at = $page->updated_at;
$revision->type = 'version';
$revision->save();
// Clear old revisions
if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
@@ -287,6 +365,155 @@ class PageRepo
return $revision;
}
/**
* Save a page update draft.
* @param Page $page
* @param array $data
* @return PageRevision
*/
public function saveUpdateDraft(Page $page, $data = [])
{
$userId = auth()->user()->id;
$drafts = $this->userUpdateDraftsQuery($page, $userId)->get();
if ($drafts->count() > 0) {
$draft = $drafts->first();
} else {
$draft = $this->pageRevision->newInstance();
$draft->page_id = $page->id;
$draft->slug = $page->slug;
$draft->book_slug = $page->book->slug;
$draft->created_by = $userId;
$draft->type = 'update_draft';
}
$draft->fill($data);
if (setting('app-editor') !== 'markdown') $draft->markdown = '';
$draft->save();
return $draft;
}
/**
* Update a draft page.
* @param Page $page
* @param array $data
* @return Page
*/
public function updateDraftPage(Page $page, $data = [])
{
$page->fill($data);
if (isset($data['html'])) {
$page->text = strip_tags($data['html']);
}
$page->save();
return $page;
}
/**
* The base query for getting user update drafts.
* @param Page $page
* @param $userId
* @return mixed
*/
private function userUpdateDraftsQuery(Page $page, $userId)
{
return $this->pageRevision->where('created_by', '=', $userId)
->where('type', 'update_draft')
->where('page_id', '=', $page->id)
->orderBy('created_at', 'desc');
}
/**
* Checks whether a user has a draft version of a particular page or not.
* @param Page $page
* @param $userId
* @return bool
*/
public function hasUserGotPageDraft(Page $page, $userId)
{
return $this->userUpdateDraftsQuery($page, $userId)->count() > 0;
}
/**
* Get the latest updated draft revision for a particular page and user.
* @param Page $page
* @param $userId
* @return mixed
*/
public function getUserPageDraft(Page $page, $userId)
{
return $this->userUpdateDraftsQuery($page, $userId)->first();
}
/**
* Get the notification message that informs the user that they are editing a draft page.
* @param PageRevision $draft
* @return string
*/
public function getUserPageDraftMessage(PageRevision $draft)
{
$message = 'You are currently editing a draft that was last saved ' . $draft->updated_at->diffForHumans() . '.';
if ($draft->page->updated_at->timestamp > $draft->updated_at->timestamp) {
$message .= "\n This page has been updated by since that time. It is recommended that you discard this draft.";
}
return $message;
}
/**
* Check if a page is being actively editing.
* Checks for edits since last page updated.
* Passing in a minuted range will check for edits
* within the last x minutes.
* @param Page $page
* @param null $minRange
* @return bool
*/
public function isPageEditingActive(Page $page, $minRange = null)
{
$draftSearch = $this->activePageEditingQuery($page, $minRange);
return $draftSearch->count() > 0;
}
/**
* Get a notification message concerning the editing activity on
* a particular page.
* @param Page $page
* @param null $minRange
* @return string
*/
public function getPageEditingActiveMessage(Page $page, $minRange = null)
{
$pageDraftEdits = $this->activePageEditingQuery($page, $minRange)->get();
$userMessage = $pageDraftEdits->count() > 1 ? $pageDraftEdits->count() . ' users have' : $pageDraftEdits->first()->createdBy->name . ' has';
$timeMessage = $minRange === null ? 'since the page was last updated' : 'in the last ' . $minRange . ' minutes';
$message = '%s started editing this page %s. Take care not to overwrite each other\'s updates!';
return sprintf($message, $userMessage, $timeMessage);
}
/**
* A query to check for active update drafts on a particular page.
* @param Page $page
* @param null $minRange
* @return mixed
*/
private function activePageEditingQuery(Page $page, $minRange = null)
{
$query = $this->pageRevision->where('type', '=', 'update_draft')
->where('page_id', '=', $page->id)
->where('updated_at', '>', $page->updated_at)
->where('created_by', '!=', auth()->user()->id)
->with('createdBy');
if ($minRange !== null) {
$query = $query->where('updated_at', '>=', Carbon::now()->subMinutes($minRange));
}
return $query;
}
/**
* Gets a single revision via it's id.
* @param $id
@@ -314,7 +541,7 @@ class PageRepo
/**
* Changes the related book for the specified page.
* Changes the book id of any relations to the page that store the book id.
* @param int $bookId
* @param int $bookId
* @param Page $page
* @return Page
*/
@@ -355,8 +582,26 @@ class PageRepo
Activity::removeEntity($page);
$page->views()->delete();
$page->revisions()->delete();
$page->restrictions()->delete();
$page->delete();
}
/**
* Get the latest pages added to the system.
* @param $count
*/
public function getRecentlyCreatedPaginated($count = 20)
{
return $this->pageQuery()->orderBy('created_at', 'desc')->paginate($count);
}
}
/**
* Get the latest pages added to the system.
* @param $count
*/
public function getRecentlyUpdatedPaginated($count = 20)
{
return $this->pageQuery()->orderBy('updated_at', 'desc')->paginate($count);
}
}

View File

@@ -0,0 +1,142 @@
<?php namespace BookStack\Repos;
use BookStack\Exceptions\PermissionsException;
use BookStack\Permission;
use BookStack\Role;
use Setting;
class PermissionsRepo
{
protected $permission;
protected $role;
/**
* PermissionsRepo constructor.
* @param $permission
* @param $role
*/
public function __construct(Permission $permission, Role $role)
{
$this->permission = $permission;
$this->role = $role;
}
/**
* Get all the user roles from the system.
* @return \Illuminate\Database\Eloquent\Collection|static[]
*/
public function getAllRoles()
{
return $this->role->all();
}
/**
* Get all the roles except for the provided one.
* @param Role $role
* @return mixed
*/
public function getAllRolesExcept(Role $role)
{
return $this->role->where('id', '!=', $role->id)->get();
}
/**
* Get a role via its ID.
* @param $id
* @return mixed
*/
public function getRoleById($id)
{
return $this->role->findOrFail($id);
}
/**
* Save a new role into the system.
* @param array $roleData
* @return Role
*/
public function saveNewRole($roleData)
{
$role = $this->role->newInstance($roleData);
$role->name = str_replace(' ', '-', strtolower($roleData['display_name']));
// Prevent duplicate names
while ($this->role->where('name', '=', $role->name)->count() > 0) {
$role->name .= strtolower(str_random(2));
}
$role->save();
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
$this->assignRolePermissions($role, $permissions);
return $role;
}
/**
* Updates an existing role.
* Ensure Admin role always has all permissions.
* @param $roleId
* @param $roleData
*/
public function updateRole($roleId, $roleData)
{
$role = $this->role->findOrFail($roleId);
$permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
$this->assignRolePermissions($role, $permissions);
if ($role->name === 'admin') {
$permissions = $this->permission->all()->pluck('id')->toArray();
$role->permissions()->sync($permissions);
}
$role->fill($roleData);
$role->save();
}
/**
* Assign an list of permission names to an role.
* @param Role $role
* @param array $permissionNameArray
*/
public function assignRolePermissions(Role $role, $permissionNameArray = [])
{
$permissions = [];
$permissionNameArray = array_values($permissionNameArray);
if ($permissionNameArray && count($permissionNameArray) > 0) {
$permissions = $this->permission->whereIn('name', $permissionNameArray)->pluck('id')->toArray();
}
$role->permissions()->sync($permissions);
}
/**
* Delete a role from the system.
* Check it's not an admin role or set as default before deleting.
* If an migration Role ID is specified the users assign to the current role
* will be added to the role of the specified id.
* @param $roleId
* @param $migrateRoleId
* @throws PermissionsException
*/
public function deleteRole($roleId, $migrateRoleId)
{
$role = $this->role->findOrFail($roleId);
// Prevent deleting admin role or default registration role.
if ($role->name === 'admin') {
throw new PermissionsException('The admin role cannot be deleted');
} else if ($role->id == setting('registration-role')) {
throw new PermissionsException('This role cannot be deleted while set as the default registration role.');
}
if ($migrateRoleId) {
$newRole = $this->role->find($migrateRoleId);
if ($newRole) {
$users = $role->users->pluck('id')->toArray();
$newRole->users()->sync($users);
}
}
$role->delete();
}
}

View File

@@ -1,6 +1,5 @@
<?php namespace BookStack\Repos;
use BookStack\Role;
use BookStack\User;
use Setting;
@@ -10,15 +9,19 @@ class UserRepo
protected $user;
protected $role;
protected $entityRepo;
/**
* UserRepo constructor.
* @param $user
* @param User $user
* @param Role $role
* @param EntityRepo $entityRepo
*/
public function __construct(User $user, Role $role)
public function __construct(User $user, Role $role, EntityRepo $entityRepo)
{
$this->user = $user;
$this->role = $role;
$this->entityRepo = $entityRepo;
}
/**
@@ -39,6 +42,15 @@ class UserRepo
return $this->user->findOrFail($id);
}
/**
* Get all the users with their permissions.
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function getAllUsers()
{
return $this->user->with('roles', 'avatar')->orderBy('name', 'asc')->get();
}
/**
* Creates a new user and attaches a role to them.
* @param array $data
@@ -65,8 +77,8 @@ class UserRepo
*/
public function attachDefaultRole($user)
{
$roleId = Setting::get('registration-role');
if ($roleId === false) $roleId = $this->role->getDefault()->id;
$roleId = setting('registration-role');
if ($roleId === false) $roleId = $this->role->first()->id;
$user->attachRoleId($roleId);
}
@@ -77,15 +89,10 @@ class UserRepo
*/
public function isOnlyAdmin(User $user)
{
if ($user->role->name != 'admin') {
return false;
}
$adminRole = $this->role->where('name', '=', 'admin')->first();
if (count($adminRole->users) > 1) {
return false;
}
if (!$user->roles->pluck('name')->contains('admin')) return false;
$adminRole = $this->role->getRole('admin');
if ($adminRole->users->count() > 1) return false;
return true;
}
@@ -99,7 +106,8 @@ class UserRepo
return $this->user->forceCreate([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password'])
'password' => bcrypt($data['password']),
'email_confirmed' => false
]);
}
@@ -112,4 +120,62 @@ class UserRepo
$user->socialAccounts()->delete();
$user->delete();
}
/**
* Get the latest activity for a user.
* @param User $user
* @param int $count
* @param int $page
* @return array
*/
public function getActivity(User $user, $count = 20, $page = 0)
{
return \Activity::userActivity($user, $count, $page);
}
/**
* Get the recently created content for this given user.
* @param User $user
* @param int $count
* @return mixed
*/
public function getRecentlyCreated(User $user, $count = 20)
{
return [
'pages' => $this->entityRepo->getRecentlyCreatedPages($count, 0, function ($query) use ($user) {
$query->where('created_by', '=', $user->id);
}),
'chapters' => $this->entityRepo->getRecentlyCreatedChapters($count, 0, function ($query) use ($user) {
$query->where('created_by', '=', $user->id);
}),
'books' => $this->entityRepo->getRecentlyCreatedBooks($count, 0, function ($query) use ($user) {
$query->where('created_by', '=', $user->id);
})
];
}
/**
* Get asset created counts for the give user.
* @param User $user
* @return array
*/
public function getAssetCounts(User $user)
{
return [
'pages' => $this->entityRepo->page->where('created_by', '=', $user->id)->count(),
'chapters' => $this->entityRepo->chapter->where('created_by', '=', $user->id)->count(),
'books' => $this->entityRepo->book->where('created_by', '=', $user->id)->count(),
];
}
/**
* Get all the roles which can be given restricted access to
* other entities in the system.
* @return mixed
*/
public function getRestrictableRoles()
{
return $this->role->where('name', '!=', 'admin')->get();
}
}

21
app/Restriction.php Normal file
View File

@@ -0,0 +1,21 @@
<?php
namespace BookStack;
use Illuminate\Database\Eloquent\Model;
class Restriction extends Model
{
protected $fillable = ['role_id', 'action'];
public $timestamps = false;
/**
* Get all this restriction's attached entity.
* @return \Illuminate\Database\Eloquent\Relations\MorphTo
*/
public function restrictable()
{
return $this->morphTo();
}
}

View File

@@ -6,11 +6,8 @@ use Illuminate\Database\Eloquent\Model;
class Role extends Model
{
/**
* Sets the default role name for newly registered users.
* @var string
*/
protected static $default = 'viewer';
protected $fillable = ['display_name', 'description'];
/**
* The roles that belong to the role.
@@ -28,6 +25,15 @@ class Role extends Model
return $this->belongsToMany('BookStack\Permission');
}
/**
* Check if this role has a permission.
* @param $permission
*/
public function hasPermission($permission)
{
return $this->permissions->pluck('name')->contains($permission);
}
/**
* Add a permission to this role.
* @param Permission $permission
@@ -38,12 +44,12 @@ class Role extends Model
}
/**
* Get an instance of the default role.
* @return Role
* Detach a single permission from this role.
* @param Permission $permission
*/
public static function getDefault()
public function detachPermission(Permission $permission)
{
return static::getRole(static::$default);
$this->permissions()->detach($permission->id);
}
/**

View File

@@ -1,6 +1,5 @@
<?php namespace BookStack\Services;
use Illuminate\Support\Facades\Auth;
use BookStack\Activity;
use BookStack\Entity;
use Session;
@@ -9,14 +8,17 @@ class ActivityService
{
protected $activity;
protected $user;
protected $restrictionService;
/**
* ActivityService constructor.
* @param $activity
* @param Activity $activity
* @param RestrictionService $restrictionService
*/
public function __construct(Activity $activity)
public function __construct(Activity $activity, RestrictionService $restrictionService)
{
$this->activity = $activity;
$this->restrictionService = $restrictionService;
$this->user = auth()->user();
}
@@ -24,25 +26,26 @@ class ActivityService
* Add activity data to database.
* @param Entity $entity
* @param $activityKey
* @param int $bookId
* @param bool $extra
* @param int $bookId
* @param bool $extra
*/
public function add(Entity $entity, $activityKey, $bookId = 0, $extra = false)
{
$this->activity->user_id = $this->user->id;
$this->activity->book_id = $bookId;
$this->activity->key = strtolower($activityKey);
$activity = $this->activity->newInstance();
$activity->user_id = $this->user->id;
$activity->book_id = $bookId;
$activity->key = strtolower($activityKey);
if ($extra !== false) {
$this->activity->extra = $extra;
$activity->extra = $extra;
}
$entity->activity()->save($this->activity);
$entity->activity()->save($activity);
$this->setNotification($activityKey);
}
/**
* Adds a activity history with a message & without binding to a entitiy.
* Adds a activity history with a message & without binding to a entity.
* @param $activityKey
* @param int $bookId
* @param int $bookId
* @param bool|false $extra
*/
public function addMessage($activityKey, $bookId = 0, $extra = false)
@@ -85,20 +88,22 @@ class ActivityService
*/
public function latest($count = 20, $page = 0)
{
$activityList = $this->activity->orderBy('created_at', 'desc')
->skip($count * $page)->take($count)->get();
$activityList = $this->restrictionService
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
return $this->filterSimilar($activityList);
}
/**
* Gets the latest activity for an entitiy, Filtering out similar
* Gets the latest activity for an entity, Filtering out similar
* items to prevent a message activity list.
* @param Entity $entity
* @param int $count
* @param int $page
* @param int $count
* @param int $page
* @return array
*/
function entityActivity($entity, $count = 20, $page = 0)
public function entityActivity($entity, $count = 20, $page = 0)
{
$activity = $entity->hasMany('BookStack\Activity')->orderBy('created_at', 'desc')
->skip($count * $page)->take($count)->get();
@@ -107,15 +112,31 @@ class ActivityService
}
/**
* Filters out similar activity.
* @param Activity[] $activity
* Get latest activity for a user, Filtering out similar
* items.
* @param $user
* @param int $count
* @param int $page
* @return array
*/
protected function filterSimilar($activity)
public function userActivity($user, $count = 20, $page = 0)
{
$activityList = $this->restrictionService
->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
->orderBy('created_at', 'desc')->where('user_id', '=', $user->id)->skip($count * $page)->take($count)->get();
return $this->filterSimilar($activityList);
}
/**
* Filters out similar activity.
* @param Activity[] $activities
* @return array
*/
protected function filterSimilar($activities)
{
$newActivity = [];
$previousItem = false;
foreach ($activity as $activityItem) {
foreach ($activities as $activityItem) {
if ($previousItem === false) {
$previousItem = $activityItem;
$newActivity[] = $activityItem;

View File

@@ -45,7 +45,7 @@ class EmailConfirmationService
'token' => $token,
]);
$this->mailer->send('emails/email-confirmation', ['token' => $token], function (Message $message) use ($user) {
$appName = \Setting::get('app-name', 'BookStack');
$appName = setting('app-name', 'BookStack');
$message->to($user->email, $user->name)->subject('Confirm your email on ' . $appName . '.');
});
}

View File

@@ -4,6 +4,7 @@ use BookStack\Exceptions\ImageUploadException;
use BookStack\Image;
use BookStack\User;
use Exception;
use Intervention\Image\Exception\NotSupportedException;
use Intervention\Image\ImageManager;
use Illuminate\Contracts\Filesystem\Factory as FileSystem;
use Illuminate\Contracts\Filesystem\Filesystem as FileSystemInstance;
@@ -40,14 +41,16 @@ class ImageService
/**
* Saves a new image from an upload.
* @param UploadedFile $uploadedFile
* @param string $type
* @param string $type
* @param int $uploadedTo
* @return mixed
* @throws ImageUploadException
*/
public function saveNewFromUpload(UploadedFile $uploadedFile, $type)
public function saveNewFromUpload(UploadedFile $uploadedFile, $type, $uploadedTo = 0)
{
$imageName = $uploadedFile->getClientOriginalName();
$imageData = file_get_contents($uploadedFile->getRealPath());
return $this->saveNew($imageName, $imageData, $type);
return $this->saveNew($imageName, $imageData, $type, $uploadedTo);
}
@@ -72,13 +75,14 @@ class ImageService
* @param string $imageName
* @param string $imageData
* @param string $type
* @param int $uploadedTo
* @return Image
* @throws ImageUploadException
*/
private function saveNew($imageName, $imageData, $type)
private function saveNew($imageName, $imageData, $type, $uploadedTo = 0)
{
$storage = $this->getStorage();
$secureUploads = Setting::get('app-secure-images');
$secureUploads = setting('app-secure-images');
$imageName = str_replace(' ', '-', $imageName);
if ($secureUploads) $imageName = str_random(16) . '-' . $imageName;
@@ -99,7 +103,8 @@ class ImageService
'name' => $imageName,
'path' => $fullPath,
'url' => $this->getPublicUrl($fullPath),
'type' => $type
'type' => $type,
'uploaded_to' => $uploadedTo
];
if (auth()->user() && auth()->user()->id !== 0) {
@@ -119,10 +124,12 @@ class ImageService
* Checks the cache then storage to avoid creating / accessing the filesystem on every check.
*
* @param Image $image
* @param int $width
* @param int $height
* @param bool $keepRatio
* @param int $width
* @param int $height
* @param bool $keepRatio
* @return string
* @throws Exception
* @throws ImageUploadException
*/
public function getThumbnail(Image $image, $width = 220, $height = 220, $keepRatio = false)
{
@@ -139,8 +146,16 @@ class ImageService
return $this->getPublicUrl($thumbFilePath);
}
// Otherwise create the thumbnail
$thumb = $this->imageTool->make($storage->get($image->path));
try {
$thumb = $this->imageTool->make($storage->get($image->path));
} catch (Exception $e) {
if ($e instanceof \ErrorException || $e instanceof NotSupportedException) {
throw new ImageUploadException('The server cannot create thumbnails. Please check you have the GD PHP extension installed.');
} else {
throw $e;
}
}
if ($keepRatio) {
$thumb->resize($width, null, function ($constraint) {
$constraint->aspectRatio();

View File

@@ -46,7 +46,7 @@ class LdapService
$user = $users[0];
return [
'uid' => $user['uid'][0],
'uid' => (isset($user['uid'])) ? $user['uid'][0] : $user['dn'],
'name' => $user['cn'][0],
'dn' => $user['dn'],
'email' => (isset($user['mail'])) ? $user['mail'][0] : null

View File

@@ -0,0 +1,326 @@
<?php namespace BookStack\Services;
use BookStack\Entity;
class RestrictionService
{
protected $userRoles;
protected $isAdmin;
protected $currentAction;
protected $currentUser;
/**
* RestrictionService constructor.
*/
public function __construct()
{
$this->currentUser = auth()->user();
$this->userRoles = $this->currentUser ? $this->currentUser->roles->pluck('id') : [];
$this->isAdmin = $this->currentUser ? $this->currentUser->hasRole('admin') : false;
}
/**
* Checks if an entity has a restriction set upon it.
* @param Entity $entity
* @param $action
* @return bool
*/
public function checkIfEntityRestricted(Entity $entity, $action)
{
if ($this->isAdmin) return true;
$this->currentAction = $action;
$baseQuery = $entity->where('id', '=', $entity->id);
if ($entity->isA('page')) {
return $this->pageRestrictionQuery($baseQuery)->count() > 0;
} elseif ($entity->isA('chapter')) {
return $this->chapterRestrictionQuery($baseQuery)->count() > 0;
} elseif ($entity->isA('book')) {
return $this->bookRestrictionQuery($baseQuery)->count() > 0;
}
return false;
}
/**
* Check if an entity has restrictions set on itself or its
* parent tree.
* @param Entity $entity
* @param $action
* @return bool|mixed
*/
public function checkIfRestrictionsSet(Entity $entity, $action)
{
$this->currentAction = $action;
if ($entity->isA('page')) {
return $entity->restricted || ($entity->chapter && $entity->chapter->restricted) || $entity->book->restricted;
} elseif ($entity->isA('chapter')) {
return $entity->restricted || $entity->book->restricted;
} elseif ($entity->isA('book')) {
return $entity->restricted;
}
}
/**
* Add restrictions for a page query
* @param $query
* @param string $action
* @return mixed
*/
public function enforcePageRestrictions($query, $action = 'view')
{
// Prevent drafts being visible to others.
$query = $query->where(function ($query) {
$query->where('draft', '=', false);
if ($this->currentUser) {
$query->orWhere(function ($query) {
$query->where('draft', '=', true)->where('created_by', '=', $this->currentUser->id);
});
}
});
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->pageRestrictionQuery($query);
}
/**
* The base query for restricting pages.
* @param $query
* @return mixed
*/
private function pageRestrictionQuery($query)
{
return $query->where(function ($parentWhereQuery) {
$parentWhereQuery
// (Book & chapter & page) or (Book & page & NO CHAPTER) unrestricted
->where(function ($query) {
$query->where(function ($query) {
$query->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id')
->where('restricted', '=', false);
})->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->where('restricted', '=', false);
})->where('restricted', '=', false);
})->orWhere(function ($query) {
$query->where('restricted', '=', false)->where('chapter_id', '=', 0)
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->where('restricted', '=', false);
});
});
})
// Page unrestricted, Has no chapter & book has accepted restrictions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id');
}, 'and', true)
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
})
// Page unrestricted, Has an unrestricted chapter & book has accepted restrictions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id')->where('restricted', '=', false);
})
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=pages.book_id')
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
})
// Page unrestricted, Has a chapter with accepted permissions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('chapters')
->whereRaw('chapters.id=pages.chapter_id')
->where('restricted', '=', true)
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'chapters', 'Chapter');
});
});
})
// Page has accepted permissions
->orWhereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'pages', 'Page');
});
});
}
/**
* Add on permission restrictions to a chapter query.
* @param $query
* @param string $action
* @return mixed
*/
public function enforceChapterRestrictions($query, $action = 'view')
{
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->chapterRestrictionQuery($query);
}
/**
* The base query for restricting chapters.
* @param $query
* @return mixed
*/
private function chapterRestrictionQuery($query)
{
return $query->where(function ($parentWhereQuery) {
$parentWhereQuery
// Book & chapter unrestricted
->where(function ($query) {
$query->where('restricted', '=', false)->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=chapters.book_id')
->where('restricted', '=', false);
});
})
// Chapter unrestricted & book has accepted restrictions
->orWhere(function ($query) {
$query->where('restricted', '=', false)
->whereExists(function ($query) {
$query->select('*')->from('books')
->whereRaw('books.id=chapters.book_id')
->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
})
// Chapter has accepted permissions
->orWhereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'chapters', 'Chapter');
});
});
}
/**
* Add restrictions to a book query.
* @param $query
* @param string $action
* @return mixed
*/
public function enforceBookRestrictions($query, $action = 'view')
{
if ($this->isAdmin) return $query;
$this->currentAction = $action;
return $this->bookRestrictionQuery($query);
}
/**
* The base query for restricting books.
* @param $query
* @return mixed
*/
private function bookRestrictionQuery($query)
{
return $query->where(function ($parentWhereQuery) {
$parentWhereQuery
->where('restricted', '=', false)
->orWhere(function ($query) {
$query->where('restricted', '=', true)->whereExists(function ($query) {
$this->checkRestrictionsQuery($query, 'books', 'Book');
});
});
});
}
/**
* Filter items that have entities set a a polymorphic relation.
* @param $query
* @param string $tableName
* @param string $entityIdColumn
* @param string $entityTypeColumn
* @return mixed
*/
public function filterRestrictedEntityRelations($query, $tableName, $entityIdColumn, $entityTypeColumn)
{
if ($this->isAdmin) return $query;
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn, 'entityTypeColumn' => $entityTypeColumn];
return $query->where(function ($query) use ($tableDetails) {
$query->where(function ($query) use (&$tableDetails) {
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Page')
->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('pages')->whereRaw('pages.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->pageRestrictionQuery($query);
});
});
})->orWhere(function ($query) use (&$tableDetails) {
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Book')->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('books')->whereRaw('books.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->bookRestrictionQuery($query);
});
});
})->orWhere(function ($query) use (&$tableDetails) {
$query->where($tableDetails['entityTypeColumn'], '=', 'BookStack\Chapter')->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('chapters')->whereRaw('chapters.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->chapterRestrictionQuery($query);
});
});
});
});
}
/**
* Filters pages that are a direct relation to another item.
* @param $query
* @param $tableName
* @param $entityIdColumn
* @return mixed
*/
public function filterRelatedPages($query, $tableName, $entityIdColumn)
{
if ($this->isAdmin) return $query;
$this->currentAction = 'view';
$tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn];
return $query->where(function ($query) use (&$tableDetails) {
$query->where(function ($query) use (&$tableDetails) {
$query->whereExists(function ($query) use (&$tableDetails) {
$query->select('*')->from('pages')->whereRaw('pages.id=' . $tableDetails['tableName'] . '.' . $tableDetails['entityIdColumn'])
->where(function ($query) {
$this->pageRestrictionQuery($query);
});
})->orWhere($tableDetails['entityIdColumn'], '=', 0);
});
});
}
/**
* The query to check the restrictions on an entity.
* @param $query
* @param $tableName
* @param $modelName
*/
private function checkRestrictionsQuery($query, $tableName, $modelName)
{
$query->select('*')->from('restrictions')
->whereRaw('restrictions.restrictable_id=' . $tableName . '.id')
->where('restrictions.restrictable_type', '=', 'BookStack\\' . $modelName)
->where('restrictions.action', '=', $this->currentAction)
->whereIn('restrictions.role_id', $this->userRoles);
}
}

View File

@@ -44,28 +44,39 @@ class SettingService
/**
* Gets a setting value from the cache or database.
* Looks at the system defaults if not cached or in database.
* @param $key
* @param $default
* @return mixed
*/
protected function getValueFromStore($key, $default)
{
// Check for an overriding value
$overrideValue = $this->getOverrideValue($key);
if ($overrideValue !== null) return $overrideValue;
// Check the cache
$cacheKey = $this->cachePrefix . $key;
if ($this->cache->has($cacheKey)) {
return $this->cache->get($cacheKey);
}
// Check the database
$settingObject = $this->getSettingObjectByKey($key);
if ($settingObject !== null) {
$value = $settingObject->value;
$this->cache->forever($cacheKey, $value);
return $value;
}
// Check the defaults set in the app config.
$configPrefix = 'setting-defaults.' . $key;
if (config()->has($configPrefix)) {
$value = config($configPrefix);
$this->cache->forever($cacheKey, $value);
return $value;
}
return $default;
}

View File

@@ -135,7 +135,7 @@ class SocialAuthService
// Otherwise let the user know this social account is not used by anyone.
$message = 'This ' . $socialDriver . ' account is not linked to any users. Please attach it in your profile settings';
if (\Setting::get('registration-enabled')) {
if (setting('registration-enabled')) {
$message .= ' or, If you do not yet have an account, You can register an account using the ' . $socialDriver . ' option';
}
throw new SocialSignInException($message . '.', '/login');

View File

@@ -1,6 +1,5 @@
<?php namespace BookStack\Services;
use BookStack\Entity;
use BookStack\View;
@@ -9,15 +8,18 @@ class ViewService
protected $view;
protected $user;
protected $restrictionService;
/**
* ViewService constructor.
* @param $view
* @param View $view
* @param RestrictionService $restrictionService
*/
public function __construct(View $view)
public function __construct(View $view, RestrictionService $restrictionService)
{
$this->view = $view;
$this->user = auth()->user();
$this->restrictionService = $restrictionService;
}
/**
@@ -27,7 +29,7 @@ class ViewService
*/
public function add(Entity $entity)
{
if($this->user === null) return 0;
if ($this->user === null) return 0;
$view = $entity->views()->where('user_id', '=', $this->user->id)->first();
// Add view if model exists
if ($view) {
@@ -44,52 +46,47 @@ class ViewService
return 1;
}
/**
* Get the entities with the most views.
* @param int $count
* @param int $page
* @param int $count
* @param int $page
* @param bool|false $filterModel
*/
public function getPopular($count = 10, $page = 0, $filterModel = false)
{
$skipCount = $count * $page;
$query = $this->view->select('id', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
$query = $this->restrictionService->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type')
->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
->groupBy('viewable_id', 'viewable_type')
->orderBy('view_count', 'desc');
if($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
if ($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
$views = $query->with('viewable')->skip($skipCount)->take($count)->get();
$viewedEntities = $views->map(function ($item) {
return $item->viewable()->getResults();
});
return $viewedEntities;
return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
}
/**
* Get all recently viewed entities for the current user.
* @param int $count
* @param int $page
* @param int $count
* @param int $page
* @param Entity|bool $filterModel
* @return mixed
*/
public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false)
{
if($this->user === null) return collect();
$skipCount = $count * $page;
$query = $this->view->where('user_id', '=', auth()->user()->id);
if ($this->user === null) return collect();
if ($filterModel) $query->where('viewable_type', '=', get_class($filterModel));
$query = $this->restrictionService
->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
$views = $query->with('viewable')->orderBy('updated_at', 'desc')->skip($skipCount)->take($count)->get();
$viewedEntities = $views->map(function ($item) {
return $item->viewable()->getResults();
});
return $viewedEntities;
if ($filterModel) $query = $query->where('viewable_type', '=', get_class($filterModel));
$query = $query->where('user_id', '=', auth()->user()->id);
$viewables = $query->with('viewable')->orderBy('updated_at', 'desc')
->skip($count * $page)->take($count)->get()->pluck('viewable');
return $viewables;
}
/**
* Reset all view counts by deleting all views.
*/
@@ -98,5 +95,4 @@ class ViewService
$this->view->truncate();
}
}

View File

@@ -14,21 +14,18 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'email', 'image_id'];
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = ['password', 'remember_token'];
@@ -50,10 +47,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
]);
}
/**
* Permissions and roles
*/
/**
* The roles that belong to the user.
*/
@@ -62,21 +55,30 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
return $this->belongsToMany('BookStack\Role');
}
public function getRoleAttribute()
/**
* Check if the user has a role.
* @param $role
* @return mixed
*/
public function hasRole($role)
{
return $this->roles()->with('permissions')->first();
return $this->roles->pluck('name')->contains($role);
}
/**
* Loads the user's permissions from their role.
* Get all permissions belonging to a the current user.
* @param bool $cache
* @return \Illuminate\Database\Eloquent\Relations\HasManyThrough
*/
private function loadPermissions()
public function permissions($cache = true)
{
if (isset($this->permissions)) return;
if(isset($this->permissions) && $cache) return $this->permissions;
$this->load('roles.permissions');
$permissions = $this->roles[0]->permissions;
$permissionsArray = $permissions->pluck('name')->all();
$this->permissions = $permissionsArray;
$permissions = $this->roles->map(function($role) {
return $role->permissions;
})->flatten()->unique();
$this->permissions = $permissions;
return $permissions;
}
/**
@@ -86,11 +88,8 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function can($permissionName)
{
if ($this->email == 'guest') {
return false;
}
$this->loadPermissions();
return array_search($permissionName, $this->permissions) !== false;
if ($this->email === 'guest') return false;
return $this->permissions()->pluck('name')->contains($permissionName);
}
/**
@@ -108,12 +107,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function attachRoleId($id)
{
$this->roles()->sync([$id]);
$this->roles()->attach($id);
}
/**
* Get the social account associated with this user.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function socialAccounts()
@@ -138,8 +136,6 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
/**
* Returns the user's avatar,
* Uses Gravatar as the avatar service.
*
* @param int $size
* @return string
*/
@@ -164,6 +160,21 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
*/
public function getEditUrl()
{
return '/users/' . $this->id;
return '/settings/users/' . $this->id;
}
/**
* Get a shortened version of the user's name.
* @param int $chars
* @return string
*/
public function getShortName($chars = 8)
{
if (strlen($this->name) <= $chars) return $this->name;
$splitName = explode(' ', $this->name);
if (strlen($splitName[0]) <= $chars) return $splitName[0];
return '';
}
}

View File

@@ -1,10 +1,10 @@
<?php
if (! function_exists('versioned_asset')) {
if (!function_exists('versioned_asset')) {
/**
* Get the path to a versioned file.
*
* @param string $file
* @param string $file
* @return string
*
* @throws \InvalidArgumentException
@@ -27,4 +27,48 @@ if (! function_exists('versioned_asset')) {
throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
}
}
}
/**
* Check if the current user has a permission.
* If an ownable element is passed in the permissions are checked against
* that particular item.
* @param $permission
* @param \BookStack\Ownable $ownable
* @return mixed
*/
function userCan($permission, \BookStack\Ownable $ownable = null)
{
if (!auth()->check()) return false;
if ($ownable === null) {
return auth()->user() && auth()->user()->can($permission);
}
// Check permission on ownable item
$permissionBaseName = strtolower($permission) . '-';
$hasPermission = false;
if (auth()->user()->can($permissionBaseName . 'all')) $hasPermission = true;
if (auth()->user()->can($permissionBaseName . 'own') && $ownable->createdBy && $ownable->createdBy->id === auth()->user()->id) $hasPermission = true;
if (!$ownable instanceof \BookStack\Entity) return $hasPermission;
// Check restrictions on the entity
$restrictionService = app('BookStack\Services\RestrictionService');
$explodedPermission = explode('-', $permission);
$action = end($explodedPermission);
$hasAccess = $restrictionService->checkIfEntityRestricted($ownable, $action);
$restrictionsSet = $restrictionService->checkIfRestrictionsSet($ownable, $action);
return ($hasAccess && $restrictionsSet) || (!$restrictionsSet && $hasPermission);
}
/**
* Helper to access system settings.
* @param $key
* @param bool $default
* @return mixed
*/
function setting($key, $default = false)
{
$settingService = app('BookStack\Services\SettingService');
return $settingService->get($key, $default);
}

View File

@@ -12,7 +12,8 @@
"barryvdh/laravel-ide-helper": "^2.1",
"barryvdh/laravel-debugbar": "^2.0",
"league/flysystem-aws-s3-v3": "^1.0",
"barryvdh/laravel-dompdf": "0.6.*"
"barryvdh/laravel-dompdf": "0.6.*",
"predis/predis": "^1.0"
},
"require-dev": {
"fzaninotto/faker": "~1.4",

445
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,6 +5,8 @@ return [
'env' => env('APP_ENV', 'production'),
'editor' => env('APP_EDITOR', 'html'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode

View File

@@ -1,5 +1,17 @@
<?php
// MEMCACHED - Split out configuration into an array
if (env('CACHE_DRIVER') === 'memcached') {
$memcachedServerKeys = ['host', 'port', 'weight'];
$memcachedServers = explode(',', trim(env('MEMCACHED_SERVERS', '127.0.0.1:11211:100'), ','));
foreach ($memcachedServers as $index => $memcachedServer) {
$memcachedServerDetails = explode(':', $memcachedServer);
if (count($memcachedServerDetails) < 2) $memcachedServerDetails[] = '11211';
if (count($memcachedServerDetails) < 3) $memcachedServerDetails[] = '100';
$memcachedServers[$index] = array_combine($memcachedServerKeys, $memcachedServerDetails);
}
}
return [
/*
@@ -49,11 +61,7 @@ return [
'memcached' => [
'driver' => 'memcached',
'servers' => [
[
'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100,
],
],
'servers' => env('CACHE_DRIVER') === 'memcached' ? $memcachedServers : [],
],
'redis' => [
@@ -74,6 +82,6 @@ return [
|
*/
'prefix' => 'laravel',
'prefix' => env('CACHE_PREFIX', 'bookstack'),
];

View File

@@ -1,5 +1,21 @@
<?php
// REDIS - Split out configuration into an array
if (env('REDIS_SERVERS', false)) {
$redisServerKeys = ['host', 'port', 'database'];
$redisServers = explode(',', trim(env('REDIS_SERVERS', '127.0.0.1:6379:0'), ','));
$redisConfig = [
'cluster' => env('REDIS_CLUSTER', false)
];
foreach ($redisServers as $index => $redisServer) {
$redisServerName = ($index === 0) ? 'default' : 'redis-server-' . $index;
$redisServerDetails = explode(':', $redisServer);
if (count($redisServerDetails) < 2) $redisServerDetails[] = '6379';
if (count($redisServerDetails) < 3) $redisServerDetails[] = '0';
$redisConfig[$redisServerName] = array_combine($redisServerKeys, $redisServerDetails);
}
}
return [
/*
@@ -123,16 +139,6 @@ return [
|
*/
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
'redis' => env('REDIS_SERVERS', false) ? $redisConfig : [],
];

View File

@@ -0,0 +1,10 @@
<?php
/**
* The defaults for the system settings that are saved in the database.
*/
return [
'app-editor' => 'wysiwyg'
];

View File

@@ -17,6 +17,7 @@ $factory->define(BookStack\User::class, function ($faker) {
'email' => $faker->email,
'password' => str_random(10),
'remember_token' => str_random(10),
'email_confirmed' => 1
];
});
@@ -45,3 +46,10 @@ $factory->define(BookStack\Page::class, function ($faker) {
'text' => strip_tags($html)
];
});
$factory->define(BookStack\Role::class, function ($faker) {
return [
'display_name' => $faker->sentence(3),
'description' => $faker->sentence(10)
];
});

View File

@@ -18,7 +18,7 @@ class CreateUsersTable extends Migration
$table->string('email')->unique();
$table->string('password', 60);
$table->rememberToken();
$table->timestamps();
$table->nullableTimestamps();
});
\BookStack\User::forceCreate([

View File

@@ -17,7 +17,7 @@ class CreateBooksTable extends Migration
$table->string('name');
$table->string('slug')->indexed();
$table->text('description');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -21,7 +21,7 @@ class CreatePagesTable extends Migration
$table->longText('html');
$table->longText('text');
$table->integer('priority');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -16,7 +16,7 @@ class CreateImagesTable extends Migration
$table->increments('id');
$table->string('name');
$table->string('url');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -19,7 +19,7 @@ class CreateChaptersTable extends Migration
$table->text('name');
$table->text('description');
$table->integer('priority');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -19,7 +19,7 @@ class CreatePageRevisionsTable extends Migration
$table->longText('html');
$table->longText('text');
$table->integer('created_by');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -20,7 +20,7 @@ class CreateActivitiesTable extends Migration
$table->integer('user_id');
$table->integer('entity_id');
$table->string('entity_type');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -28,7 +28,7 @@ class AddRolesAndPermissions extends Migration
$table->string('name')->unique();
$table->string('display_name')->nullable();
$table->string('description')->nullable();
$table->timestamps();
$table->nullableTimestamps();
});
// Create table for associating roles to users (Many-to-Many)
@@ -50,7 +50,7 @@ class AddRolesAndPermissions extends Migration
$table->string('name')->unique();
$table->string('display_name')->nullable();
$table->string('description')->nullable();
$table->timestamps();
$table->nullableTimestamps();
});
// Create table for associating permissions to roles (Many-to-Many)

View File

@@ -15,7 +15,7 @@ class CreateSettingsTable extends Migration
Schema::create('settings', function (Blueprint $table) {
$table->string('setting_key')->primary()->indexed();
$table->text('value');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -18,7 +18,7 @@ class CreateSocialAccountsTable extends Migration
$table->string('driver')->index();
$table->string('driver_id');
$table->string('avatar');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -20,7 +20,7 @@ class AddEmailConfirmationTable extends Migration
$table->increments('id');
$table->integer('user_id')->index();
$table->string('token')->index();
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -18,7 +18,7 @@ class CreateViewsTable extends Migration
$table->integer('viewable_id');
$table->string('viewable_type');
$table->integer('views');
$table->timestamps();
$table->nullableTimestamps();
});
}

View File

@@ -28,4 +28,4 @@ class AddExternalAuthToUsers extends Migration
$table->dropColumn('external_auth_id');
});
}
}
}

View File

@@ -0,0 +1,35 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddSlugToRevisions extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('page_revisions', function (Blueprint $table) {
$table->string('slug');
$table->index('slug');
$table->string('book_slug');
$table->index('book_slug');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('page_revisions', function (Blueprint $table) {
$table->dropColumn('slug');
$table->dropColumn('book_slug');
});
}
}

View File

@@ -0,0 +1,99 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class UpdatePermissionsAndRoles extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// Get roles with permissions we need to change
$adminRole = \BookStack\Role::getRole('admin');
$editorRole = \BookStack\Role::getRole('editor');
// Delete old permissions
$permissions = \BookStack\Permission::all();
$permissions->each(function ($permission) {
$permission->delete();
});
// Create & attach new admin permissions
$permissionsToCreate = [
'settings-manage' => 'Manage Settings',
'users-manage' => 'Manage Users',
'user-roles-manage' => 'Manage Roles & Permissions',
'restrictions-manage-all' => 'Manage All Entity Restrictions',
'restrictions-manage-own' => 'Manage Entity Restrictions On Own Content'
];
foreach ($permissionsToCreate as $name => $displayName) {
$newPermission = new \BookStack\Permission();
$newPermission->name = $name;
$newPermission->display_name = $displayName;
$newPermission->save();
$adminRole->attachPermission($newPermission);
}
// Create & attach new entity permissions
$entities = ['Book', 'Page', 'Chapter', 'Image'];
$ops = ['Create All', 'Create Own', 'Update All', 'Update Own', 'Delete All', 'Delete Own'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower(str_replace(' ', '-', $op));
$newPermission->display_name = $op . ' ' . $entity . 's';
$newPermission->save();
$adminRole->attachPermission($newPermission);
if ($editorRole !== null) $editorRole->attachPermission($newPermission);
}
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Get roles with permissions we need to change
$adminRole = \BookStack\Role::getRole('admin');
// Delete old permissions
$permissions = \BookStack\Permission::all();
$permissions->each(function ($permission) {
$permission->delete();
});
// Create default CRUD permissions and allocate to admins and editors
$entities = ['Book', 'Page', 'Chapter', 'Image'];
$ops = ['Create', 'Update', 'Delete'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
$newPermission->display_name = $op . ' ' . $entity . 's';
$newPermission->save();
$adminRole->attachPermission($newPermission);
}
}
// Create admin permissions
$entities = ['Settings', 'User'];
$ops = ['Create', 'Update', 'Delete'];
foreach ($entities as $entity) {
foreach ($ops as $op) {
$newPermission = new \BookStack\Permission();
$newPermission->name = strtolower($entity) . '-' . strtolower($op);
$newPermission->display_name = $op . ' ' . $entity;
$newPermission->save();
$adminRole->attachPermission($newPermission);
}
}
}
}

View File

@@ -0,0 +1,73 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddEntityAccessControls extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('images', function (Blueprint $table) {
$table->integer('uploaded_to')->default(0);
$table->index('uploaded_to');
});
Schema::table('books', function (Blueprint $table) {
$table->boolean('restricted')->default(false);
$table->index('restricted');
});
Schema::table('chapters', function (Blueprint $table) {
$table->boolean('restricted')->default(false);
$table->index('restricted');
});
Schema::table('pages', function (Blueprint $table) {
$table->boolean('restricted')->default(false);
$table->index('restricted');
});
Schema::create('restrictions', function(Blueprint $table) {
$table->increments('id');
$table->integer('restrictable_id');
$table->string('restrictable_type');
$table->integer('role_id');
$table->string('action');
$table->index('role_id');
$table->index('action');
$table->index(['restrictable_id', 'restrictable_type']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('images', function (Blueprint $table) {
$table->dropColumn('uploaded_to');
});
Schema::table('books', function (Blueprint $table) {
$table->dropColumn('restricted');
});
Schema::table('chapters', function (Blueprint $table) {
$table->dropColumn('restricted');
});
Schema::table('pages', function (Blueprint $table) {
$table->dropColumn('restricted');
});
Schema::drop('restrictions');
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddPageRevisionTypes extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('page_revisions', function (Blueprint $table) {
$table->string('type')->default('version');
$table->index('type');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('page_revisions', function (Blueprint $table) {
$table->dropColumn('type');
});
}
}

View File

@@ -0,0 +1,32 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddPageDrafts extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('pages', function(Blueprint $table) {
$table->boolean('draft')->default(false);
$table->index('draft');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('pages', function (Blueprint $table) {
$table->dropColumn('draft');
});
}
}

View File

@@ -0,0 +1,39 @@
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddMarkdownSupport extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('pages', function (Blueprint $table) {
$table->longText('markdown')->default('');
});
Schema::table('page_revisions', function (Blueprint $table) {
$table->longText('markdown')->default('');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('pages', function (Blueprint $table) {
$table->dropColumn('markdown');
});
Schema::table('page_revisions', function (Blueprint $table) {
$table->dropColumn('markdown');
});
}
}

View File

@@ -12,7 +12,7 @@ class DummyContentSeeder extends Seeder
public function run()
{
$user = factory(BookStack\User::class, 1)->create();
$role = \BookStack\Role::getDefault();
$role = \BookStack\Role::getRole('editor');
$user->attachRole($role);

View File

@@ -12,6 +12,8 @@
"bootstrap-sass": "^3.0.0",
"dropzone": "^4.0.1",
"laravel-elixir": "^3.4.0",
"marked": "^0.3.5",
"moment": "^2.12.0",
"zeroclipboard": "^2.2.0"
}
}

View File

@@ -21,12 +21,18 @@
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="APP_DEBUG" value="false"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="mysql_testing"/>
<env name="MAIL_PRETEND" value="true"/>
<env name="MAIL_DRIVER" value="log"/>
<env name="AUTH_METHOD" value="standard"/>
<env name="DISABLE_EXTERNAL_SERVICES" value="false"/>
<env name="LDAP_VERSION" value="3"/>
<env name="GITHUB_APP_ID" value="aaaaaaaaaaaaaa"/>
<env name="GITHUB_APP_SECRET" value="aaaaaaaaaaaaaa"/>
<env name="GOOGLE_APP_ID" value="aaaaaaaaaaaaaa"/>
<env name="GOOGLE_APP_SECRET" value="aaaaaaaaaaaaaa"/>
</php>
</phpunit>

View File

@@ -1,5 +1,5 @@
{
"css/styles.css": "css/styles.css?version=8d91c6c",
"css/print-styles.css": "css/print-styles.css?version=8d91c6c",
"js/common.js": "js/common.js?version=8d91c6c"
"css/styles.css": "css/styles.css?version=83f4ada",
"css/print-styles.css": "css/print-styles.css?version=83f4ada",
"js/common.js": "js/common.js?version=83f4ada"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@@ -1,675 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="robotobold" horiz-adv-x="1175" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="510" />
<glyph unicode="&#xfb01;" horiz-adv-x="1246" d="M20 870v212h161v50q2 204 125.5 314.5t348.5 110.5q135 0 328 -59l-42 -239q-98 29 -152 37.5t-116 8.5q-202 0 -202 -179v-44h213v-212h-213v-870h-290v870h-161zM828 0v1082h290v-1082h-290z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1255" d="M29 870v212h161v84q2 188 118 289.5t328 101.5q151 0 490 -32v-1525h-290v1312q-86 10 -160 10q-196 0 -196 -167v-73h215v-212h-215v-870h-290v870h-161z" />
<glyph horiz-adv-x="0" />
<glyph horiz-adv-x="0" />
<glyph unicode="&#xd;" horiz-adv-x="510" />
<glyph horiz-adv-x="0" />
<glyph unicode=" " horiz-adv-x="510" />
<glyph unicode="&#x09;" horiz-adv-x="510" />
<glyph unicode="&#xa0;" horiz-adv-x="510" />
<glyph unicode="!" horiz-adv-x="557" d="M124 136q0 66 44.5 109.5t116.5 43.5q73 0 117.5 -43t44.5 -110q0 -66 -44.5 -109t-117.5 -43q-72 0 -116.5 43t-44.5 109zM131 1456h308l-34 -1009h-240z" />
<glyph unicode="&#x22;" horiz-adv-x="657" d="M64 987v549h202v-138l-40 -411h-162zM390 987v549h201v-138l-39 -411h-162z" />
<glyph unicode="#" horiz-adv-x="1220" d="M64 410v172h257l50 284h-232v174h263l73 416h182l-73 -416h194l73 416h183l-73 -416h219v-174h-250l-50 -284h224v-172h-254l-72 -410h-183l72 410h-193l-72 -410h-183l72 410h-227zM504 582h193l50 284h-194z" />
<glyph unicode="$" d="M92 457h289q0 -119 56.5 -182.5t162.5 -63.5q88 0 139 46.5t51 125.5q0 82 -45.5 130.5t-154.5 89.5t-188 81.5t-135.5 93t-88 123.5t-31.5 169q0 169 108 277t287 126v214h160v-217q177 -25 277 -147.5t100 -317.5h-289q0 120 -49.5 179.5t-132.5 59.5q-82 0 -127 -46.5 t-45 -128.5q0 -76 44 -122t163.5 -94t196.5 -90.5t130 -96t81 -122t28 -159.5q0 -170 -106 -276t-292 -125v-199h-159v198q-205 22 -317.5 145.5t-112.5 328.5z" />
<glyph unicode="%" horiz-adv-x="1512" d="M95 1105v71q0 134 87 217.5t228 83.5q143 0 230 -82.5t87 -223.5v-72q0 -135 -87 -217t-228 -82q-142 0 -229.5 82.5t-87.5 222.5zM287 1099q0 -60 34.5 -96.5t90.5 -36.5t89 37t33 99v74q0 60 -33 97t-91 37q-55 0 -89 -36.5t-34 -101.5v-73zM328 185l711 1138l141 -76 l-711 -1138zM791 283v74q0 135 88 217.5t228 82.5q142 0 229.5 -81.5t87.5 -224.5v-72q0 -134 -86 -216.5t-229 -82.5q-144 0 -231 83t-87 220zM983 279q0 -55 36 -94t90 -39q122 0 122 135v76q0 60 -34 96.5t-90 36.5t-90 -36.5t-34 -99.5v-75z" />
<glyph unicode="&#x26;" horiz-adv-x="1344" d="M71 392q0 101 56.5 187t207.5 191q-65 87 -102 163.5t-37 159.5q0 170 107.5 276.5t289.5 106.5q163 0 267.5 -97t104.5 -242q0 -174 -176 -307l-112 -81l251 -292q59 116 59 256h246q0 -284 -131 -460l218 -253h-328l-75 86q-161 -106 -370 -106q-216 0 -346 113.5 t-130 298.5zM361 408q0 -87 55.5 -141.5t144.5 -54.5q104 0 197 58l-287 332l-21 -15q-89 -76 -89 -179zM455 1097q0 -75 88 -189l77 51q59 38 81.5 74t22.5 86t-37 87t-95 37q-62 0 -99.5 -40t-37.5 -106z" />
<glyph unicode="'" horiz-adv-x="331" d="M63 985v551h212v-147l-29 -404h-183z" />
<glyph unicode="(" horiz-adv-x="719" d="M124 539v53q0 229 61 436t180 366.5t258 221.5l56 -156q-146 -108 -228 -334t-82 -528v-31q0 -303 81 -530t229 -339l-56 -153q-136 61 -253.5 215.5t-179.5 356.5t-66 422z" />
<glyph unicode=")" horiz-adv-x="722" d="M40 -302q142 107 224 330t85 513v53q0 299 -81.5 527t-227.5 342l56 153q136 -59 256.5 -214t187 -361t69.5 -427v-45q0 -226 -65 -435t-187 -369t-261 -220z" />
<glyph unicode="*" horiz-adv-x="928" d="M27 1051l59 181l311 -125l-20 349h196l-20 -356l303 123l59 -183l-320 -89l210 -266l-159 -113l-182 292l-180 -282l-159 108l216 272z" />
<glyph unicode="+" horiz-adv-x="1118" d="M57 554v261h362v391h275v-391h361v-261h-361v-408h-275v408h-362z" />
<glyph unicode="," horiz-adv-x="500" d="M35 -286l36 65q67 122 69 243v224h244l-1 -200q-1 -111 -56 -224t-141 -187z" />
<glyph unicode="-" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="." horiz-adv-x="595" d="M126 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode="/" horiz-adv-x="765" d="M-13 -125l536 1581h215l-536 -1581h-215z" />
<glyph unicode="0" d="M95 587v268q0 305 126.5 463t364.5 158t364 -156.5t129 -449.5v-268q0 -302 -125 -462t-366 -160q-238 0 -364 157t-129 450zM384 564q0 -178 48.5 -264.5t155.5 -86.5q106 0 153 83t49 254v346q0 181 -49.5 263.5t-154.5 82.5q-102 0 -150.5 -78.5t-51.5 -245.5v-354z " />
<glyph unicode="1" d="M167 1007v235l603 216h31v-1458h-289v1114z" />
<glyph unicode="2" d="M70 998q0 133 63.5 243t179.5 172.5t263 62.5q225 0 349.5 -108t124.5 -305q0 -108 -56 -220t-192 -261l-331 -349h626v-233h-998v198l471 502q97 106 143.5 185t46.5 150q0 97 -49 152.5t-140 55.5q-98 0 -154.5 -67.5t-56.5 -177.5h-290z" />
<glyph unicode="3" d="M64 399h289q0 -82 61.5 -134t151.5 -52q103 0 161.5 54.5t58.5 144.5q0 218 -240 218h-153v226h154q110 0 163 55t53 146q0 88 -52.5 137t-144.5 49q-83 0 -139 -45.5t-56 -118.5h-289q0 114 61.5 204.5t172 141.5t243.5 51q231 0 362 -110.5t131 -304.5q0 -100 -61 -184 t-160 -129q123 -44 183.5 -132t60.5 -208q0 -194 -141.5 -311t-374.5 -117q-218 0 -356.5 115t-138.5 304z" />
<glyph unicode="4" d="M55 497l607 959h292v-908h165v-233h-165v-315h-289v315h-597zM343 548h322v514l-19 -33z" />
<glyph unicode="5" d="M105 405h286q9 -91 63.5 -141.5t142.5 -50.5q98 0 151 70.5t53 199.5q0 124 -61 190t-173 66q-103 0 -167 -54l-28 -26l-230 57l84 740h816v-241h-579l-36 -313q103 55 219 55q208 0 326 -129t118 -361q0 -141 -59.5 -252.5t-170.5 -173t-262 -61.5q-132 0 -245 53.5 t-178.5 150.5t-69.5 221z" />
<glyph unicode="6" d="M100 567v104q0 237 89.5 418.5t257 281t388.5 100.5h48v-238h-28q-196 -3 -315.5 -102t-143.5 -275q116 118 293 118q190 0 302 -136t112 -358q0 -142 -61.5 -257t-174 -179t-254.5 -64q-230 0 -371.5 160t-141.5 427zM390 521q0 -145 57 -226.5t160 -81.5 q93 0 150.5 73.5t57.5 190.5q0 119 -58 192t-156 73q-70 0 -127 -36.5t-84 -96.5v-88z" />
<glyph unicode="7" d="M61 1222v234h1028v-162l-563 -1294h-305l564 1222h-724z" />
<glyph unicode="8" d="M95 399q0 121 62 211t167 140q-93 49 -145.5 131t-52.5 188q0 186 124 296.5t337 110.5q212 0 336.5 -109.5t124.5 -297.5q0 -106 -53 -188t-146 -131q106 -51 168 -140.5t62 -210.5q0 -194 -132 -306.5t-359 -112.5t-360 113t-133 306zM384 420q0 -93 54 -150t150 -57 q94 0 147.5 55t53.5 152q0 95 -55 152t-148 57q-92 0 -147 -56.5t-55 -152.5zM416 1055q0 -87 45 -140t127 -53t126.5 53t44.5 140q0 85 -45 136.5t-127 51.5q-81 0 -126 -50t-45 -138z" />
<glyph unicode="9" d="M86 961q0 143 62.5 262.5t174.5 186t252 66.5q144 0 256 -72t174 -207t63 -309v-107q0 -364 -181 -572t-513 -222l-71 -1v241l64 1q377 17 408 354q-113 -111 -264 -111q-193 0 -309 132.5t-116 357.5zM374 964q0 -119 54.5 -195.5t153.5 -76.5q70 0 120.5 36t76.5 87 v119q0 147 -56 228t-150 81q-87 0 -143 -79.5t-56 -199.5z" />
<glyph unicode=":" horiz-adv-x="578" d="M125 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM125 961q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode=";" horiz-adv-x="537" d="M57 -286l36 65q67 122 69 243v224h244l-1 -200q-1 -111 -56 -224t-141 -187zM108 961q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode="&#x3c;" horiz-adv-x="1042" d="M54 502v236l861 365v-280l-570 -205l570 -201v-280z" />
<glyph unicode="=" horiz-adv-x="1172" d="M136 313v236h894v-236h-894zM136 746v236h894v-236h-894z" />
<glyph unicode="&#x3e;" horiz-adv-x="1058" d="M120 136v279l581 206l-581 203v278l871 -365v-235z" />
<glyph unicode="?" horiz-adv-x="1019" d="M45 1069q2 191 123.5 299t331.5 108q212 0 329 -102.5t117 -289.5q0 -85 -38 -160.5t-133 -167.5l-81 -77q-76 -73 -87 -171l-4 -61h-256q0 140 34 223t124.5 163.5t120.5 131t30 106.5q0 169 -156 169q-74 0 -118.5 -45.5t-46.5 -125.5h-290zM318 140q0 67 45.5 110.5 t116.5 43.5t116.5 -43.5t45.5 -110.5q0 -66 -44.5 -109t-117.5 -43t-117.5 43t-44.5 109z" />
<glyph unicode="@" horiz-adv-x="1833" d="M87 463q12 276 126 495t310.5 338.5t443.5 119.5q251 0 432 -107.5t271 -307.5t79 -465q-11 -256 -126.5 -406.5t-310.5 -150.5q-86 0 -148.5 37t-94.5 106q-100 -140 -261 -140q-146 0 -226 123t-60 325q18 165 83.5 293.5t165.5 197.5t216 69q143 0 244 -66l63 -43 l-51 -578q-10 -79 17.5 -121t87.5 -42q92 0 154 107.5t68 281.5q17 349 -140.5 536.5t-466.5 187.5q-193 0 -344 -98t-238 -278.5t-98 -413.5q-16 -354 142 -547.5t473 -193.5q83 0 174 18.5t157 49.5l38 -154q-61 -40 -164.5 -64.5t-208.5 -24.5q-264 0 -450 106.5 t-277.5 314t-79.5 495.5zM744 430q-11 -132 23 -200.5t110 -68.5q49 0 93 43t73 124l42 473q-39 13 -80 13q-115 0 -178.5 -98t-82.5 -286z" />
<glyph unicode="A" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM507 543h364l-183 545z" />
<glyph unicode="B" horiz-adv-x="1307" d="M130 0v1456h510q265 0 402 -101.5t137 -297.5q0 -107 -55 -188.5t-153 -119.5q112 -28 176.5 -113t64.5 -208q0 -210 -134 -318t-382 -110h-566zM430 241h257q106 0 165.5 50.5t59.5 139.5q0 200 -207 203h-275v-393zM430 846h222q227 4 227 181q0 99 -57.5 142.5 t-181.5 43.5h-210v-367z" />
<glyph unicode="C" horiz-adv-x="1340" d="M86 686v89q0 210 74 370t211.5 245.5t319.5 85.5q252 0 406 -135t178 -379h-300q-11 141 -78.5 204.5t-205.5 63.5q-150 0 -224.5 -107.5t-76.5 -333.5v-110q0 -236 71.5 -345t225.5 -109q139 0 207.5 63.5t78.5 196.5h300q-17 -235 -173.5 -370t-412.5 -135 q-280 0 -440.5 188.5t-160.5 517.5z" />
<glyph unicode="D" horiz-adv-x="1331" d="M130 0v1456h448q192 0 343.5 -86.5t236.5 -246t85 -362.5v-67q0 -203 -83.5 -361t-235.5 -245t-343 -88h-451zM430 241h145q176 0 269 115t95 329v77q0 222 -92 336.5t-269 114.5h-148v-972z" />
<glyph unicode="E" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976z" />
<glyph unicode="F" horiz-adv-x="1122" d="M130 0v1456h948v-243h-648v-376h576v-242h-576v-595h-300z" />
<glyph unicode="G" horiz-adv-x="1395" d="M94 671v99q0 218 73.5 377.5t212 244t324.5 84.5q259 0 405 -123.5t173 -359.5h-292q-20 125 -88.5 183t-188.5 58q-153 0 -233 -115t-81 -342v-93q0 -229 87 -346t255 -117q169 0 241 72v251h-273v221h573v-581q-81 -97 -229 -150.5t-328 -53.5q-189 0 -331.5 82.5 t-220 239.5t-79.5 369z" />
<glyph unicode="H" horiz-adv-x="1447" d="M130 0v1456h300v-590h585v590h300v-1456h-300v624h-585v-624h-300z" />
<glyph unicode="I" horiz-adv-x="597" d="M149 0v1456h300v-1456h-300z" />
<glyph unicode="J" horiz-adv-x="1144" d="M40 430h302q0 -107 45 -158t142 -51q86 0 137 59t51 168v1008h300v-1008q0 -139 -61.5 -245.5t-173.5 -164.5t-253 -58q-231 0 -360 117.5t-129 332.5z" />
<glyph unicode="K" horiz-adv-x="1300" d="M130 0v1456h300v-660l132 181l371 479h369l-517 -647l532 -809h-357l-374 584l-156 -168v-416h-300z" />
<glyph unicode="L" horiz-adv-x="1109" d="M130 0v1456h300v-1215h637v-241h-937z" />
<glyph unicode="M" horiz-adv-x="1794" d="M130 0v1456h392l374 -1056l372 1056h394v-1456h-301v398l30 687l-393 -1085h-206l-392 1084l30 -686v-398h-300z" />
<glyph unicode="N" horiz-adv-x="1446" d="M130 0v1456h300l585 -960v960h299v-1456h-300l-584 958v-958h-300z" />
<glyph unicode="O" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119 q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="P" horiz-adv-x="1321" d="M130 0v1456h568q164 0 288.5 -60t191.5 -170.5t67 -251.5q0 -214 -146.5 -337.5t-405.5 -123.5h-263v-513h-300zM430 756h268q119 0 181.5 56t62.5 160q0 107 -63 173t-174 68h-275v-457z" />
<glyph unicode="Q" horiz-adv-x="1414" d="M84 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -204 -66 -354.5t-183 -241.5l242 -190l-191 -169l-310 249q-53 -9 -110 -9q-181 0 -323 87t-220 248.5t-79 371.5zM388 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5 v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="R" horiz-adv-x="1307" d="M130 0v1456h541q258 0 398 -115t140 -325q0 -149 -64.5 -248.5t-195.5 -158.5l315 -595v-14h-322l-273 533h-239v-533h-300zM430 776h242q113 0 175 57.5t62 158.5q0 103 -58.5 162t-179.5 59h-241v-437z" />
<glyph unicode="S" horiz-adv-x="1259" d="M69 458h301q0 -241 288 -241q107 0 167 43.5t60 121.5q0 85 -60 130.5t-216 96t-247 99.5q-248 134 -248 361q0 118 66.5 210.5t191 144.5t279.5 52q156 0 278 -56.5t189.5 -159.5t67.5 -234h-300q0 100 -63 155.5t-177 55.5q-110 0 -171 -46.5t-61 -122.5 q0 -71 71.5 -119t210.5 -90q256 -77 373 -191t117 -284q0 -189 -143 -296.5t-385 -107.5q-168 0 -306 61.5t-210.5 168.5t-72.5 248z" />
<glyph unicode="T" horiz-adv-x="1267" d="M40 1213v243h1186v-243h-446v-1213h-300v1213h-440z" />
<glyph unicode="U" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371z" />
<glyph unicode="V" horiz-adv-x="1339" d="M7 1456h333l328 -1095l330 1095h334l-507 -1456h-313z" />
<glyph unicode="W" horiz-adv-x="1791" d="M35 1456h299l197 -1034l240 1034h254l239 -1036l196 1036h299l-323 -1456h-302l-237 974l-237 -974h-302z" />
<glyph unicode="X" horiz-adv-x="1301" d="M22 0l435 734l-424 722h345l273 -502l273 502h345l-424 -722l435 -734h-349l-280 510l-280 -510h-349z" />
<glyph unicode="Y" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528z" />
<glyph unicode="Z" horiz-adv-x="1241" d="M73 0v176l720 1037h-719v243h1092v-172l-718 -1043h734v-241h-1109z" />
<glyph unicode="[" horiz-adv-x="569" d="M120 -339v2033h432v-223h-142v-1587h142v-223h-432z" />
<glyph unicode="\" horiz-adv-x="864" d="M0 1456h295l608 -1581h-296z" />
<glyph unicode="]" horiz-adv-x="569" d="M13 -116h143v1587h-143v223h432v-2033h-432v223z" />
<glyph unicode="^" horiz-adv-x="895" d="M44 729l299 727h210l299 -727h-229l-175 457l-174 -457h-230z" />
<glyph unicode="_" horiz-adv-x="914" d="M1 0h911v-226h-911v226z" />
<glyph unicode="`" horiz-adv-x="677" d="M52 1536h315l198 -310h-237z" />
<glyph unicode="a" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="b" horiz-adv-x="1153" d="M111 0v1536h289v-551q100 117 263 117q198 0 310.5 -145.5t112.5 -409.5v-16q0 -260 -111 -405.5t-310 -145.5q-176 0 -281 135l-13 -115h-260zM400 327q53 -114 192 -114q140 0 184 138q21 66 21 201q0 164 -52 239.5t-155 75.5q-138 0 -190 -113v-427z" />
<glyph unicode="c" horiz-adv-x="1068" d="M66 535v19q0 250 133 399t365 149q203 0 325.5 -115.5t124.5 -307.5h-271q-2 84 -52 136.5t-132 52.5q-101 0 -152.5 -73.5t-51.5 -238.5v-30q0 -167 51 -240t155 -73q80 0 130 44t52 117h271q-1 -110 -60 -201.5t-161.5 -142t-226.5 -50.5q-232 0 -366 147.5t-134 407.5 z" />
<glyph unicode="d" horiz-adv-x="1154" d="M66 549q0 253 113.5 403t310.5 150q158 0 261 -118v552h290v-1536h-261l-14 115q-108 -135 -278 -135q-191 0 -306.5 150.5t-115.5 418.5zM355 528q0 -152 53 -233t154 -81q134 0 189 113v427q-54 113 -187 113q-209 0 -209 -339z" />
<glyph unicode="e" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM368 644h402v23q-2 96 -52 148.5t-142 52.5 q-86 0 -139.5 -58t-68.5 -166z" />
<glyph unicode="f" horiz-adv-x="734" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h215v-212h-215v-870h-290v870h-161z" />
<glyph unicode="g" horiz-adv-x="1169" d="M69 537v12q0 249 118.5 401t319.5 152q178 0 277 -122l12 102h262v-1046q0 -142 -64.5 -247t-181.5 -160t-274 -55q-119 0 -232 47.5t-171 122.5l128 176q108 -121 262 -121q115 0 179 61.5t64 174.5v58q-100 -113 -263 -113q-195 0 -315.5 152.5t-120.5 404.5zM358 528 q0 -147 59 -230.5t162 -83.5q132 0 189 99v455q-58 99 -187 99q-104 0 -163.5 -85t-59.5 -254z" />
<glyph unicode="h" horiz-adv-x="1146" d="M104 0v1536h289v-572q115 138 289 138q352 0 357 -409v-693h-289v685q0 93 -40 137.5t-133 44.5q-127 0 -184 -98v-769h-289z" />
<glyph unicode="i" horiz-adv-x="543" d="M109 1362q0 65 43.5 107t118.5 42q74 0 118 -42t44 -107q0 -66 -44.5 -108t-117.5 -42t-117.5 42t-44.5 108zM126 0v1082h290v-1082h-290z" />
<glyph unicode="j" horiz-adv-x="532" d="M-95 -191q52 -9 91 -9q131 0 131 139v1143h290v-1141q0 -179 -95 -278.5t-274 -99.5q-75 0 -143 17v229zM104 1362q0 65 43.5 107t118.5 42t118.5 -42t43.5 -107q0 -66 -44.5 -108t-117.5 -42t-117.5 42t-44.5 108z" />
<glyph unicode="k" horiz-adv-x="1094" d="M111 0v1536h289v-851l56 72l277 325h347l-391 -451l425 -631h-332l-278 434l-104 -104v-330h-289z" />
<glyph unicode="l" horiz-adv-x="543" d="M126 0v1536h290v-1536h-290z" />
<glyph unicode="m" horiz-adv-x="1773" d="M111 0v1082h271l9 -121q115 141 311 141q209 0 287 -165q114 165 325 165q176 0 262 -102.5t86 -308.5v-691h-290v690q0 92 -36 134.5t-127 42.5q-130 0 -180 -124l1 -743h-289v689q0 94 -37 136t-126 42q-123 0 -178 -102v-765h-289z" />
<glyph unicode="n" horiz-adv-x="1147" d="M105 0v1082h272l9 -125q116 145 311 145q172 0 256 -101t86 -302v-699h-289v692q0 92 -40 133.5t-133 41.5q-122 0 -183 -104v-763h-289z" />
<glyph unicode="o" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="p" horiz-adv-x="1153" d="M111 -416v1498h268l10 -106q105 126 274 126q200 0 311 -148t111 -408v-15q0 -250 -113.5 -400.5t-306.5 -150.5q-164 0 -265 114v-510h-289zM400 320q53 -107 189 -107q207 0 207 339q0 151 -53.5 233t-155.5 82q-136 0 -187 -104v-443z" />
<glyph unicode="q" horiz-adv-x="1157" d="M66 551q0 255 113.5 403t311.5 148q174 0 277 -133l19 113h254v-1498h-290v509q-100 -113 -262 -113q-193 0 -308 150t-115 421zM355 530q0 -155 54.5 -236t153.5 -81q133 0 188 106v447q-54 102 -186 102q-100 0 -155 -81t-55 -257z" />
<glyph unicode="r" horiz-adv-x="747" d="M111 0v1082h273l8 -129q87 149 241 149q48 0 90 -13l-4 -278q-59 8 -104 8q-164 0 -215 -111v-708h-289z" />
<glyph unicode="s" horiz-adv-x="1053" d="M56 344h274q4 -77 57 -118t142 -41q83 0 125.5 31.5t42.5 82.5q0 53 -52.5 83.5t-168.5 54.5q-386 81 -386 328q0 144 119.5 240.5t312.5 96.5q206 0 329.5 -97t123.5 -252h-289q0 62 -40 102.5t-125 40.5q-73 0 -113 -33t-40 -84q0 -48 45.5 -77.5t153.5 -51t182 -48.5 q229 -84 229 -291q0 -148 -127 -239.5t-328 -91.5q-136 0 -241.5 48.5t-165.5 133t-60 182.5z" />
<glyph unicode="t" horiz-adv-x="692" d="M10 870v212h158v266h289v-266h185v-212h-185v-540q0 -60 23 -86t88 -26q48 0 85 7v-219q-85 -26 -175 -26q-304 0 -310 307v583h-158z" />
<glyph unicode="u" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293z" />
<glyph unicode="v" horiz-adv-x="1035" d="M13 1082h302l201 -729l201 729h302l-365 -1082h-276z" />
<glyph unicode="w" horiz-adv-x="1505" d="M28 1082h279l141 -688l198 688h209l197 -689l142 689h279l-276 -1082h-242l-205 681l-205 -681h-241z" />
<glyph unicode="x" horiz-adv-x="1042" d="M21 0l321 552l-307 530h310l178 -323l182 323h309l-308 -530l321 -552h-310l-193 340l-192 -340h-311z" />
<glyph unicode="y" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89z" />
<glyph unicode="z" horiz-adv-x="1042" d="M74 0v176l509 672h-494v234h867v-171l-513 -678h529v-233h-898z" />
<glyph unicode="{" horiz-adv-x="676" d="M48 515v207q174 0 178 199v212q0 185 90 299t270 165l56 -161q-76 -28 -115 -97.5t-41 -192.5v-210q0 -226 -179 -317q179 -92 179 -319v-212q5 -234 156 -286l-56 -162q-360 101 -360 465v199q0 211 -178 211z" />
<glyph unicode="|" horiz-adv-x="518" d="M173 -270v1726h175v-1726h-175z" />
<glyph unicode="}" horiz-adv-x="676" d="M34 -198q152 54 156 290v212q0 226 183 314q-183 88 -183 319v209q-4 233 -156 290l56 161q179 -50 269 -163.5t91 -297.5v-215q4 -199 178 -199v-207q-178 0 -178 -209v-217q-8 -350 -360 -449z" />
<glyph unicode="~" horiz-adv-x="1328" d="M106 415q0 186 90.5 299t240.5 113q78 0 142 -30t145.5 -107.5t148.5 -77.5q59 0 96.5 53t37.5 129l214 -1q0 -186 -93 -302t-240 -116q-74 0 -137.5 28.5t-146.5 108t-153 79.5q-58 0 -94 -50t-36 -128z" />
<glyph unicode="&#xa1;" horiz-adv-x="578" d="M128 948q0 67 44.5 110t117.5 43t117.5 -43t44.5 -110t-46 -110t-116 -43t-116 43t-46 110zM137 -369l33 1008h241l33 -1008h-307z" />
<glyph unicode="&#xa2;" horiz-adv-x="1178" d="M99 532v22q0 218 105 363t294 177v224h200v-225q163 -29 255.5 -140t94.5 -274h-272q-2 86 -52 137.5t-131 51.5q-102 0 -153 -74.5t-52 -234.5v-33q0 -168 51.5 -240.5t154.5 -72.5q80 0 130 44t52 117h272q-2 -145 -98.5 -250.5t-251.5 -134.5v-234h-200v233 q-187 30 -293 174t-106 370z" />
<glyph unicode="&#xa3;" horiz-adv-x="1217" d="M99 576v236h154l-7 227q0 202 123.5 319t330.5 117q212 0 333 -112.5t121 -304.5h-287q0 85 -43.5 130t-124.5 45q-66 0 -109.5 -49t-43.5 -145l9 -227h309v-236h-300l6 -139q0 -123 -62 -196h653v-241h-1059v241h92q72 18 72 179l-5 156h-162z" />
<glyph unicode="&#xa4;" horiz-adv-x="1418" d="M81 118l135 137q-100 156 -100 353q0 204 109 365l-144 147l141 144l142 -145q155 115 348 115q194 0 349 -117l144 148l142 -145l-148 -151q107 -159 107 -361q0 -193 -98 -349l139 -141l-142 -145l-132 134q-159 -127 -361 -127q-203 0 -361 126l-129 -132zM302 608 q0 -118 54 -219.5t149.5 -160t206.5 -58.5q110 0 205.5 58.5t149.5 160t54 219.5q0 119 -54 219.5t-149 158.5t-206 58q-112 0 -207 -58t-149 -158.5t-54 -219.5z" />
<glyph unicode="&#xa5;" horiz-adv-x="1254" d="M20 1456h330l276 -606l277 606h329l-375 -714h234v-175h-319v-115h319v-174h-319v-278h-300v278h-336v174h336v115h-336v175h260z" />
<glyph unicode="&#xa6;" horiz-adv-x="516" d="M128 -270v795h260v-795h-260zM128 698v758h260v-758h-260z" />
<glyph unicode="&#xa7;" horiz-adv-x="1287" d="M92 -35l289 1q0 -89 64 -136.5t191 -47.5q112 0 170 37.5t58 100.5q0 65 -64.5 106t-247 91.5t-275 105.5t-138 130t-45.5 181q0 180 162 273q-136 103 -136 288q0 171 140.5 276t379.5 105q247 0 383 -113t136 -314h-289q0 87 -61.5 140.5t-168.5 53.5q-110 0 -170 -39 t-60 -107q0 -73 55.5 -110t240.5 -86t282.5 -104t144.5 -131.5t47 -184.5q0 -182 -162 -271q135 -102 135 -288q0 -175 -137.5 -274.5t-379.5 -99.5q-257 0 -400.5 107t-143.5 310zM383 563q0 -69 41.5 -106.5t165.5 -77.5l222 -67q82 47 82 140q0 62 -45.5 101.5 t-163.5 79.5l-227 71q-75 -42 -75 -141z" />
<glyph unicode="&#xa8;" horiz-adv-x="956" d="M93 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM580 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xa9;" horiz-adv-x="1606" d="M86 729q0 202 93.5 375t259 272.5t357.5 99.5t357.5 -99.5t259 -272.5t93.5 -375q0 -204 -95 -377.5t-259.5 -272.5t-355.5 -99q-193 0 -357.5 100t-258.5 273t-94 376zM208 729q0 -170 77.5 -314t214 -227.5t296.5 -83.5t297.5 85t213.5 229t76 311q0 166 -75 308.5 t-212 228t-300 85.5q-159 0 -295.5 -82t-214.5 -226t-78 -314zM433 675v113q0 174 95.5 280.5t253.5 106.5q163 0 249.5 -82.5t86.5 -231.5h-156q0 96 -46 137.5t-134 41.5q-92 0 -142.5 -67.5t-51.5 -180.5v-123q0 -117 51 -184.5t143 -67.5q89 0 134 40.5t45 138.5h156 q0 -152 -87.5 -233t-247.5 -81t-254.5 106.5t-94.5 286.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="909" d="M137 919q0 110 84 170.5t257 60.5h102v51q0 127 -116 127q-65 0 -101.5 -25.5t-36.5 -73.5l-173 14q0 104 87.5 168.5t223.5 64.5q135 0 213 -72t78 -205v-316q0 -97 26 -178h-177q-10 27 -17 68q-77 -82 -201 -82q-118 0 -183.5 61.5t-65.5 166.5zM312 923 q0 -88 117 -88q40 0 82 18.5t69 43.5v136h-106q-76 -1 -119 -31t-43 -79z" />
<glyph unicode="&#xab;" horiz-adv-x="1023" d="M77 515v19l280 390h186l-240 -400l240 -399h-186zM462 515v19l280 390h186l-240 -400l240 -399h-186z" />
<glyph unicode="&#xac;" horiz-adv-x="1129" d="M126 634v171h835v-431h-200v260h-635z" />
<glyph unicode="&#xad;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#xae;" horiz-adv-x="1606" d="M86 729q0 202 93.5 375t259 272.5t357.5 99.5t357.5 -99.5t259 -272.5t93.5 -375q0 -204 -95 -377.5t-259.5 -272.5t-355.5 -99q-193 0 -357.5 100t-258.5 273t-94 376zM208 729q0 -170 77.5 -314t214 -227.5t296.5 -83.5t297.5 85t213.5 229t76 311q0 166 -75 308.5 t-212 228t-300 85.5q-159 0 -295.5 -82t-214.5 -226t-78 -314zM501 316v850h281q151 0 238 -68.5t87 -194.5q0 -112 -113 -174q61 -31 85.5 -86.5t24.5 -137.5t3.5 -116t13.5 -57v-16h-155q-13 34 -13 194q0 76 -33 109.5t-110 33.5h-158v-337h-151zM652 787h136 q74 0 121.5 32t47.5 84q0 70 -35.5 99.5t-128.5 30.5h-141v-246z" />
<glyph unicode="&#xaf;" horiz-adv-x="1026" d="M148 1290v167h730v-167h-730z" />
<glyph unicode="&#xb0;" horiz-adv-x="795" d="M126 1200q0 114 81 195t191 81q109 0 188.5 -80.5t79.5 -195.5t-79.5 -193.5t-188.5 -78.5q-108 0 -190 78.5t-82 193.5zM273 1200q0 -52 36.5 -88t88.5 -36q53 0 87.5 35.5t34.5 88.5q0 52 -34.5 90t-87.5 38t-89 -38t-36 -90z" />
<glyph unicode="&#xb1;" horiz-adv-x="1100" d="M89 701v241h335v343h253v-343h328v-241h-328v-364h-253v364h-335zM113 1v235h864v-235h-864z" />
<glyph unicode="&#xb2;" horiz-adv-x="763" d="M55 1193q0 116 85.5 195t220.5 79q148 0 228.5 -64.5t80.5 -183.5q0 -70 -36 -128t-144 -145l-148 -115h351v-164h-620v138l287 257q56 49 80.5 91t24.5 65q0 84 -95 84q-50 0 -79.5 -31t-29.5 -78h-206z" />
<glyph unicode="&#xb3;" horiz-adv-x="763" d="M48 902h206q0 -34 34 -58.5t86 -24.5q60 0 86.5 26.5t26.5 61.5q0 92 -122 93h-92v136h82q119 0 119 88q0 35 -28.5 56t-77.5 21q-42 0 -71.5 -15.5t-29.5 -44.5h-205q0 102 84.5 163.5t215.5 61.5q145 0 230.5 -59.5t85.5 -166.5q0 -119 -135 -169q150 -41 150 -184 q0 -105 -91.5 -168.5t-239.5 -63.5q-142 0 -228 66.5t-86 180.5z" />
<glyph unicode="&#xb4;" horiz-adv-x="679" d="M101 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xb5;" horiz-adv-x="1261" d="M139 -416v1498h289v-623q0 -126 40.5 -185.5t139.5 -59.5q149 0 205 105v763h289v-1082h-269l-6 68q-89 -89 -225 -89q-102 0 -174 45v-440h-289z" />
<glyph unicode="&#xb6;" horiz-adv-x="1003" d="M75 988q0 213 133 340.5t363 127.5h298v-1456h-219v520h-80q-230 0 -362.5 127t-132.5 341z" />
<glyph unicode="&#xb7;" horiz-adv-x="617" d="M140 697q0 69 46 112t117 43t117.5 -43t46.5 -112t-47 -111.5t-117 -42.5q-72 0 -117.5 43.5t-45.5 110.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="548" d="M98 -136l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
<glyph unicode="&#xb9;" horiz-adv-x="763" d="M135 1176v158l374 121h19v-786h-204v548z" />
<glyph unicode="&#xba;" horiz-adv-x="936" d="M118 1049v72q0 160 95.5 257.5t250.5 97.5t251 -97t96 -263v-72q0 -159 -94 -256.5t-251 -97.5q-158 0 -253 98t-95 261zM293 1044q0 -98 46.5 -153t126.5 -55q78 0 123.5 54t46.5 151v80q0 97 -46.5 152t-125.5 55q-78 0 -124.5 -54.5t-46.5 -156.5v-73z" />
<glyph unicode="&#xbb;" horiz-adv-x="1023" d="M85 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187zM478 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187z" />
<glyph unicode="&#xbc;" horiz-adv-x="1470" d="M101 1171v158l374 121h19v-786h-204v548zM317 193l711 1138l141 -76l-711 -1138zM739 294l357 495h206v-463h88v-167h-88v-159h-205v159h-346zM935 326h162v212l-14 -22z" />
<glyph unicode="&#xbd;" horiz-adv-x="1559" d="M84 1177v158l374 121h19v-786h-204v548zM275 193l711 1138l141 -76l-711 -1138zM839 526q0 116 85.5 195t220.5 79q148 0 228.5 -64.5t80.5 -183.5q0 -70 -36 -128t-144 -145l-148 -115h351v-164h-620v138l287 257q56 49 80.5 91t24.5 65q0 84 -95 84q-50 0 -79.5 -31 t-29.5 -78h-206z" />
<glyph unicode="&#xbe;" horiz-adv-x="1655" d="M94 903h206q0 -34 34 -58.5t86 -24.5q60 0 86.5 26.5t26.5 61.5q0 92 -122 93h-92v136h82q119 0 119 88q0 35 -28.5 56t-77.5 21q-42 0 -71.5 -15.5t-29.5 -44.5h-205q0 102 84.5 163.5t215.5 61.5q145 0 230.5 -59.5t85.5 -166.5q0 -119 -135 -169q150 -41 150 -184 q0 -105 -91.5 -168.5t-239.5 -63.5q-142 0 -228 66.5t-86 180.5zM478 193l711 1138l141 -76l-711 -1138zM897 294l357 495h206v-463h88v-167h-88v-159h-205v159h-346zM1093 326h162v212l-14 -22z" />
<glyph unicode="&#xbf;" horiz-adv-x="1019" d="M69 6q0 159 153 312l97 93q50 45 69.5 94t21.5 138h256q0 -133 -31 -215t-110.5 -156t-108 -110t-43 -73t-14.5 -81q0 -157 154 -157q77 0 122.5 45t47.5 126h289q-2 -192 -123 -299.5t-331 -107.5q-213 0 -331 101.5t-118 289.5zM378 949q0 67 44.5 110t117.5 43 t117.5 -43t44.5 -110t-46 -110t-116 -43t-116 43t-46 110z" />
<glyph unicode="&#xc0;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM323 1846h315l198 -310h-237zM507 543h364l-183 545z" />
<glyph unicode="&#xc1;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM507 543h364l-183 545zM553 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xc2;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM312 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM507 543h364l-183 545z" />
<glyph unicode="&#xc3;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM315 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5 q-35 0 -59.5 -25t-24.5 -71zM507 543h364l-183 545z" />
<glyph unicode="&#xc4;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM309 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM507 543h364l-183 545zM796 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5 q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xc5;" horiz-adv-x="1378" d="M7 0l542 1456h278l545 -1456h-319l-101 300h-526l-100 -300h-319zM470 1730q0 86 65 145.5t158 59.5q92 0 157.5 -58.5t65.5 -146.5q0 -85 -64 -143t-159 -58q-97 0 -160 59t-63 142zM507 543h364l-183 545zM585 1730q0 -44 29 -75.5t79 -31.5t79 31.5t29 75.5 q0 46 -29.5 77.5t-78.5 31.5t-78.5 -31.5t-29.5 -77.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1925" d="M2 0l786 1456h1016v-236h-598l15 -355h502v-236h-492l16 -394h618v-235h-897l-14 333h-446l-167 -333h-339zM633 580h311l-24 570z" />
<glyph unicode="&#xc7;" horiz-adv-x="1340" d="M86 686v89q0 210 74 370t211.5 245.5t319.5 85.5q252 0 406 -135t178 -379h-300q-11 141 -78.5 204.5t-205.5 63.5q-150 0 -224.5 -107.5t-76.5 -333.5v-110q0 -236 71.5 -345t225.5 -109q139 0 207.5 63.5t78.5 196.5h300q-17 -235 -173.5 -370t-412.5 -135 q-280 0 -440.5 188.5t-160.5 517.5zM550 -137l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
<glyph unicode="&#xc8;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM266 1849h315l198 -310h-237z" />
<glyph unicode="&#xc9;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM496 1539l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xca;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM255 1557v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#xcb;" horiz-adv-x="1152" d="M130 0v1456h974v-243h-674v-347h576v-235h-576v-390h676v-241h-976zM252 1678q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM739 1678q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5 t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xcc;" horiz-adv-x="597" d="M-70 1849h315l198 -310h-237zM149 0v1456h300v-1456h-300z" />
<glyph unicode="&#xcd;" horiz-adv-x="597" d="M149 0v1456h300v-1456h-300zM159 1539l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xce;" horiz-adv-x="597" d="M-81 1557v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM149 0v1456h300v-1456h-300z" />
<glyph unicode="&#xcf;" horiz-adv-x="597" d="M-84 1678q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM149 0v1456h300v-1456h-300zM403 1678q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xd0;" horiz-adv-x="1361" d="M-20 642v183h180v631h448q192 0 343.5 -86.5t236.5 -246t85 -362.5v-67q0 -203 -83.5 -361t-235.5 -245t-343 -88h-451v642h-180zM460 241h145q178 0 271 117.5t93 335.5v68q0 222 -92 336.5t-269 114.5h-148v-388h219v-183h-219v-401z" />
<glyph unicode="&#xd1;" horiz-adv-x="1446" d="M130 0v1456h300l585 -960v960h299v-1456h-300l-584 958v-958h-300zM349 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5 q-35 0 -59.5 -25t-24.5 -71z" />
<glyph unicode="&#xd2;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM337 1846h315l198 -310h-237zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71 q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="&#xd3;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119 q-151 0 -233 -117.5t-83 -344.5v-71zM567 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xd4;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM326 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM390 695q0 -223 82 -346 t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="&#xd5;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM329 1566q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5 t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71z" />
<glyph unicode="&#xd6;" horiz-adv-x="1414" d="M86 687v72q0 215 77.5 378.5t219 251t323.5 87.5t323.5 -87.5t219 -251t77.5 -377.5v-65q0 -215 -76 -377t-217.5 -250t-324.5 -88q-181 0 -323 87t-220 248.5t-79 371.5zM323 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5 t-39.5 90.5zM390 695q0 -223 82 -346t236 -123q151 0 232 118.5t82 345.5v71q0 229 -82 348t-234 119q-151 0 -233 -117.5t-83 -344.5v-71zM810 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xd7;" horiz-adv-x="1088" d="M65 373l307 313l-307 313l170 168l304 -311l305 311l170 -168l-307 -313l307 -313l-170 -168l-305 310l-304 -310z" />
<glyph unicode="&#xd8;" horiz-adv-x="1411" d="M93 702v57q0 215 77.5 378.5t219 251t323.5 87.5q175 0 314 -82l74 124h187l-134 -227q179 -198 179 -537v-59q0 -215 -76 -377t-217.5 -250t-324.5 -88q-164 0 -295 70l-85 -145h-188l143 242q-197 195 -197 555zM397 695q0 -172 49 -285l447 757q-73 61 -180 61 q-151 0 -233 -117.5t-83 -344.5v-71zM552 273q70 -47 163 -47q151 0 232.5 118.5t82.5 345.5v71q0 151 -38 256z" />
<glyph unicode="&#xd9;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM301 1846h315l198 -310h-237z" />
<glyph unicode="&#xda;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM531 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xdb;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM290 1554v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#xdc;" horiz-adv-x="1348" d="M116 486v970h300v-961q0 -143 68.5 -208.5t189.5 -65.5q253 0 257 266v969h301v-959q0 -239 -149.5 -378t-408.5 -139q-255 0 -405 135t-153 371zM287 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM774 1675 q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528zM496 1536l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xde;" horiz-adv-x="1246" d="M133 0v1456h289v-267h230q162 -1 281.5 -56.5t183.5 -158t64 -236.5q0 -202 -138.5 -324t-378.5 -127h-242v-287h-289zM422 520h223q117 0 182 59t65 157t-63.5 158t-175.5 62h-231v-436z" />
<glyph unicode="&#xdf;" horiz-adv-x="1292" d="M135 0v1101q0 220 124 339t350 119q191 0 306.5 -99.5t115.5 -270.5q0 -108 -53.5 -195t-53.5 -164q0 -37 30.5 -76.5t118.5 -117.5q151 -134 151 -282q0 -177 -115 -275.5t-330 -98.5q-81 0 -160 16t-119 40l54 229q98 -52 219 -52q79 0 121 36.5t42 99.5 q0 46 -34.5 89.5t-116.5 109.5q-150 120 -150 270q0 96 55 186.5t55 169.5q0 70 -44.5 111.5t-112.5 41.5q-159 0 -164 -213v-1114h-289z" />
<glyph unicode="&#xe0;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M182 1536h315l198 -310h-237zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="&#xe1;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM412 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xe2;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M171 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="&#xe3;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M174 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5 t80 76.5v186h-108q-217 0 -231 -150z" />
<glyph unicode="&#xe4;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M168 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM655 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5 q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="1098" d="M68 304q0 172 127.5 264t368.5 93h133v62q0 75 -38.5 120t-121.5 45q-73 0 -114.5 -35t-41.5 -96h-289q0 94 58 174t164 125.5t238 45.5q200 0 317.5 -100.5t117.5 -282.5v-469q1 -154 43 -233v-17h-292q-20 39 -29 97q-105 -117 -273 -117q-159 0 -263.5 92t-104.5 232z M329 1420q0 86 65 145.5t158 59.5q92 0 157.5 -58.5t65.5 -146.5q0 -85 -64 -143t-159 -58q-97 0 -160 59t-63 142zM357 325q0 -54 38 -89t104 -35q64 0 118 28.5t80 76.5v186h-108q-217 0 -231 -150zM444 1420q0 -44 29 -75.5t79 -31.5t79 31.5t29 75.5q0 46 -29.5 77.5 t-78.5 31.5t-78.5 -31.5t-29.5 -77.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M66 319q0 157 124 243t367 87h168v57q0 76 -40.5 119t-117.5 43q-82 0 -129.5 -35.5t-47.5 -87.5l-289 19q0 149 130.5 243.5t338.5 94.5q211 0 327 -110q126 112 326 110q212 0 333 -131.5t121 -363.5v-157h-668q11 -116 80.5 -177t186.5 -61q77 0 142.5 16t152.5 61 l77 -189q-73 -56 -180.5 -88t-221.5 -32q-247 0 -386 147q-64 -69 -166.5 -108t-227.5 -39q-186 0 -293 89t-107 250zM355 315q0 -56 40.5 -89.5t125.5 -33.5q49 0 107 22.5t97 57.5v189h-164q-95 -1 -150.5 -43t-55.5 -103zM1011 644h382v28q0 94 -43.5 145t-126.5 51 q-90 0 -144.5 -57.5t-67.5 -166.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="1068" d="M66 535v19q0 250 133 399t365 149q203 0 325.5 -115.5t124.5 -307.5h-271q-2 84 -52 136.5t-132 52.5q-101 0 -152.5 -73.5t-51.5 -238.5v-30q0 -167 51 -240t155 -73q80 0 130 44t52 117h271q-1 -110 -60 -201.5t-161.5 -142t-226.5 -50.5q-232 0 -366 147.5t-134 407.5 zM419 -137l31 143h216l-11 -58q150 -27 150 -173q0 -110 -91.5 -174t-257.5 -64l-7 167q112 0 112 81q0 42 -33.5 57.5t-108.5 20.5z" />
<glyph unicode="&#xe8;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM175 1536h315l198 -310h-237zM368 644h402v23 q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166z" />
<glyph unicode="&#xe9;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM368 644h402v23q-2 96 -52 148.5t-142 52.5 q-86 0 -139.5 -58t-68.5 -166zM405 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xea;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM164 1244v16l296 276h168l300 -280v-12h-230l-154 145 l-154 -145h-226zM368 644h402v23q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166z" />
<glyph unicode="&#xeb;" horiz-adv-x="1107" d="M72 515v28q0 163 63 291.5t178.5 198t263.5 69.5q222 0 349.5 -140t127.5 -397v-118h-689q14 -106 84.5 -170t178.5 -64q167 0 261 121l142 -159q-65 -92 -176 -143.5t-246 -51.5q-238 0 -387.5 146t-149.5 389zM161 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5 t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM368 644h402v23q-2 96 -52 148.5t-142 52.5q-86 0 -139.5 -58t-68.5 -166zM648 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xec;" horiz-adv-x="561" d="M-88 1521h315l198 -310h-237zM134 0v1082h289v-1082h-289z" />
<glyph unicode="&#xed;" horiz-adv-x="561" d="M134 0v1082h289v-1082h-289zM141 1211l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xee;" horiz-adv-x="561" d="M-99 1229v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM134 0v1082h289v-1082h-289z" />
<glyph unicode="&#xef;" horiz-adv-x="561" d="M-102 1350q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM134 0v1082h289v-1082h-289zM385 1350q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xf0;" horiz-adv-x="1178" d="M84 468q0 231 123 364.5t329 133.5q136 0 244 -76q-49 152 -166 265l-191 -122l-78 114l152 97q-116 72 -264 111l91 224q238 -48 416 -180l171 109l77 -114l-139 -89q255 -262 256 -654v-74q0 -172 -66.5 -309t-185.5 -212.5t-266 -75.5q-144 0 -259 63.5t-179.5 176 t-64.5 248.5zM373 468q0 -112 60 -183.5t158 -71.5q103 0 164 90.5t61 248.5v111q-68 83 -215 83q-113 0 -170.5 -74.5t-57.5 -203.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1147" d="M105 0v1082h272l9 -125q116 145 311 145q172 0 256 -101t86 -302v-699h-289v692q0 92 -40 133.5t-133 41.5q-122 0 -183 -104v-763h-289zM198 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5 t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71z" />
<glyph unicode="&#xf2;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM207 1536h315l198 -310h-237zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83 q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="&#xf3;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5zM437 1226 l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xf4;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM196 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5 t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM199 1257q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11 q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71zM355 530q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="1158" d="M66 538v13q0 161 62 287t178.5 195t270.5 69q219 0 357.5 -134t154.5 -364l2 -74q0 -249 -139 -399.5t-373 -150.5t-373.5 150t-139.5 408zM193 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM355 530 q0 -154 58 -235.5t166 -81.5q105 0 164 80.5t59 257.5q0 151 -59 234t-166 83q-106 0 -164 -82.5t-58 -255.5zM680 1365q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xf7;" horiz-adv-x="1168" d="M63 571v230h1028v-230h-1028zM415 277q0 68 45.5 110t117.5 42q71 0 117.5 -41.5t46.5 -110.5q0 -67 -45 -108.5t-119 -41.5q-75 0 -119 42t-44 108zM415 1089q0 68 45.5 110t117.5 42q71 0 117.5 -41.5t46.5 -110.5q0 -67 -45 -108.5t-119 -41.5q-75 0 -119 42t-44 108z " />
<glyph unicode="&#xf8;" horiz-adv-x="1156" d="M66 551q0 161 62 287t178.5 195t270.5 69q101 0 186 -29l70 143h161l-103 -211q200 -149 200 -475q0 -249 -139 -399.5t-373 -150.5q-95 0 -176 26l-72 -148h-161l103 212q-207 146 -207 481zM355 530q0 -130 41 -208l260 532q-36 14 -79 14q-106 0 -164 -82.5 t-58 -255.5zM509 223q30 -10 70 -10q105 0 164 80.5t59 257.5q0 114 -37 196z" />
<glyph unicode="&#xf9;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM203 1536h315l198 -310h-237z" />
<glyph unicode="&#xfa;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM433 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xfb;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM192 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#xfc;" horiz-adv-x="1146" d="M104 373v709h289v-699q0 -169 154 -169q147 0 202 102v766h290v-1082h-272l-8 110q-107 -130 -296 -130q-174 0 -265.5 100t-93.5 293zM189 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM676 1365 q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#xfd;" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89zM381 1226l197 310h315l-277 -310h-235z" />
<glyph unicode="&#xfe;" horiz-adv-x="1162" d="M113 -416v1952h290v-547q100 113 262 113q198 0 310 -147t112 -410v-14q0 -250 -113.5 -400.5t-306.5 -150.5q-164 0 -264 113v-509h-290zM403 318q54 -105 188 -105q207 0 207 339q0 151 -53.5 233t-155.5 82q-132 0 -186 -102v-447z" />
<glyph unicode="&#xff;" horiz-adv-x="1028" d="M3 1082h311l201 -673l200 673h310l-435 -1250l-24 -57q-97 -212 -320 -212q-63 0 -128 19v219l44 -1q82 0 122.5 25t63.5 83l34 89zM137 1365q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM624 1365q0 53 39.5 90 t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5t-100 37.5t-38 89.5z" />
<glyph unicode="&#x152;" horiz-adv-x="1983" d="M96 563v317q0 173 75.5 309.5t214 211.5t314.5 75q123 0 290 -20h884v-243h-673v-347h575v-235h-575v-390h675v-241h-886q-167 -20 -288 -20q-174 0 -312 73.5t-214.5 207t-79.5 302.5zM385 576q0 -176 83.5 -270t233.5 -94q94 0 198 13v1004q-112 14 -200 14 q-150 0 -232 -92.5t-83 -265.5v-309z" />
<glyph unicode="&#x153;" horiz-adv-x="1847" d="M83 538v13q0 161 61 286.5t177 195t270 69.5q231 0 371 -149q134 151 349 149q214 0 337 -129t123 -365v-158h-654q16 -113 81.5 -175.5t168.5 -62.5q85 0 152 16.5t149 61.5l79 -187q-73 -58 -182 -90.5t-228 -32.5q-233 0 -373 149q-138 -149 -371 -149t-371.5 149.5 t-138.5 408.5zM372 530q0 -155 56.5 -236.5t164.5 -81.5q106 0 163 80.5t57 258.5q0 153 -58 235t-164 82q-105 0 -162 -82t-57 -256zM1120 647h367v26q0 97 -46.5 146t-129.5 49q-77 0 -126 -57t-65 -164z" />
<glyph unicode="&#x178;" horiz-adv-x="1266" d="M2 1456h329l301 -656l303 656h328l-478 -928v-528h-305v528zM252 1675q0 54 38.5 90.5t99.5 36.5q62 0 100 -37.5t38 -89.5t-38 -89t-100 -37q-59 0 -98.5 35.5t-39.5 90.5zM739 1675q0 53 39.5 90t98.5 37q58 0 98.5 -36.5t40.5 -90.5q0 -52 -38.5 -89.5t-100.5 -37.5 t-100 37.5t-38 89.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="1015" d="M123 1244v16l296 276h168l300 -280v-12h-230l-154 145l-154 -145h-226z" />
<glyph unicode="&#x2dc;" horiz-adv-x="985" d="M117 1258q0 111 65.5 189t160.5 78q30 0 56.5 -7.5t86.5 -36.5t83 -35t48 -6q35 0 60.5 24.5t25.5 70.5l167 -11q0 -113 -66 -189.5t-161 -76.5q-38 0 -67.5 8.5t-81.5 36.5t-75 34.5t-50 6.5q-35 0 -59.5 -25t-24.5 -71z" />
<glyph unicode="&#x2000;" horiz-adv-x="967" />
<glyph unicode="&#x2001;" horiz-adv-x="1935" />
<glyph unicode="&#x2002;" horiz-adv-x="967" />
<glyph unicode="&#x2003;" horiz-adv-x="1935" />
<glyph unicode="&#x2004;" horiz-adv-x="645" />
<glyph unicode="&#x2005;" horiz-adv-x="483" />
<glyph unicode="&#x2006;" horiz-adv-x="322" />
<glyph unicode="&#x2007;" horiz-adv-x="322" />
<glyph unicode="&#x2008;" horiz-adv-x="241" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#x2011;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#x2012;" horiz-adv-x="794" d="M110 507v233h563v-233h-563z" />
<glyph unicode="&#x2013;" horiz-adv-x="1294" d="M147 596v236h1036v-236h-1036z" />
<glyph unicode="&#x2014;" horiz-adv-x="1563" d="M33 596v236h1381v-236h-1381z" />
<glyph unicode="&#x2018;" horiz-adv-x="479" d="M104 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229z" />
<glyph unicode="&#x2019;" horiz-adv-x="470" d="M58 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177z" />
<glyph unicode="&#x201a;" horiz-adv-x="508" d="M66 -226q78 126 81 274v181h238l-1 -166q-1 -89 -50.5 -192t-131.5 -176z" />
<glyph unicode="&#x201c;" horiz-adv-x="831" d="M112 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229zM455 1048v150q0 94 52.5 200.5t129.5 171.5l136 -79q-86 -136 -89 -276v-167h-229z" />
<glyph unicode="&#x201d;" horiz-adv-x="837" d="M72 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177zM419 1088q86 135 89 279v169h230v-155q0 -90 -50 -195t-133 -177z" />
<glyph unicode="&#x201e;" horiz-adv-x="825" d="M66 -246q78 134 81 293v216h238l-1 -199q-1 -97 -48 -206.5t-127 -182.5zM402 -246q86 148 89 294v215h238l-1 -203q-2 -96 -52.5 -205t-130.5 -180z" />
<glyph unicode="&#x2022;" horiz-adv-x="736" d="M135 731v35q0 104 66 167t170 63q108 0 172.5 -62t66.5 -163v-43q0 -103 -65.5 -165.5t-171.5 -62.5q-105 0 -171.5 62t-66.5 169z" />
<glyph unicode="&#x2026;" horiz-adv-x="1515" d="M133 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM606 142q0 69 46.5 112t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5zM1070 142q0 69 46.5 112 t116.5 43q71 0 117.5 -43t46.5 -112q0 -68 -46 -110.5t-118 -42.5q-71 0 -117 42.5t-46 110.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="638" d="M108 515v19l280 390h186l-240 -400l240 -399h-186z" />
<glyph unicode="&#x203a;" horiz-adv-x="618" d="M80 124l240 399l-240 400h187l280 -390v-19l-280 -390h-187z" />
<glyph unicode="&#x205f;" horiz-adv-x="483" />
<glyph unicode="&#x20ac;" d="M89 516v152h169v124h-169v152h171q17 252 175.5 391.5t420.5 139.5q105 0 236 -31l-36 -243q-94 32 -185 32q-283 0 -310 -289h333v-152h-335v-124h335v-152h-335q5 -147 78.5 -221t228.5 -74q105 0 190 31l36 -242q-124 -29 -256 -29q-263 0 -416.5 141.5t-161.5 393.5 h-169z" />
<glyph unicode="&#x2122;" horiz-adv-x="1293" d="M116 1348v108h407v-108h-129v-431h-142v431h-136zM594 914v542h158l117 -368l126 368h149v-542h-128v352l-111 -352h-72l-111 353v-353h-128z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1901" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h356v50q2 204 125.5 314.5t348.5 110.5q134 0 329 -59l-42 -239q-98 29 -152.5 37.5t-116.5 8.5q-202 0 -202 -179v-44h213v-212h-213v-870h-290v870h-356v-870 h-290v870h-161zM1483 0v1082h290v-1082h-290z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1901" d="M29 870v212h161v92q0 182 104.5 282.5t292.5 100.5q60 0 147 -20l-3 -224q-36 9 -88 9q-163 0 -163 -153v-87h356v81q1 191 118.5 292.5t328.5 101.5q144 0 490 -32v-1525h-290v1312q-86 10 -161 10q-196 0 -196 -167v-73h215v-212h-215v-870h-290v870h-356v-870h-290 v870h-161z" />
<hkern u1="&#x20;" u2="T" k="60" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-38" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="248" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="81" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="274" />
<hkern u1="F" u2="&#x201e;" k="274" />
<hkern u1="F" u2="&#x201a;" k="274" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="192" />
<hkern u1="F" u2="&#xc4;" k="192" />
<hkern u1="F" u2="&#xc3;" k="192" />
<hkern u1="F" u2="&#xc2;" k="192" />
<hkern u1="F" u2="&#xc1;" k="192" />
<hkern u1="F" u2="&#xc0;" k="192" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="208" />
<hkern u1="F" u2="A" k="192" />
<hkern u1="F" u2="&#x2e;" k="274" />
<hkern u1="F" u2="&#x2c;" k="274" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="52" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="297" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="33" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="50" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="84" />
<hkern u1="T" u2="&#xc6;" k="189" />
<hkern u1="T" u2="&#xbb;" k="146" />
<hkern u1="T" u2="&#xab;" k="148" />
<hkern u1="T" u2="w" k="47" />
<hkern u1="T" u2="r" k="65" />
<hkern u1="T" u2="&#x20;" k="60" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="e" u2="&#x2019;" k="64" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="h" u2="&#x2019;" k="104" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="m" u2="&#x2019;" k="120" />
<hkern u1="n" u2="&#x2019;" k="120" />
<hkern u1="o" u2="&#x2019;" k="112" />
<hkern u1="r" u2="&#x2019;" k="-16" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-50" />
<hkern u1="r" u2="f" k="-20" />
<hkern u1="t" u2="&#x2019;" k="-24" />
<hkern u1="t" u2="&#xf6;" k="30" />
<hkern u1="t" u2="&#xf5;" k="30" />
<hkern u1="t" u2="&#xf4;" k="30" />
<hkern u1="t" u2="&#xf3;" k="30" />
<hkern u1="t" u2="&#xf2;" k="30" />
<hkern u1="t" u2="o" k="30" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="81" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="81" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="81" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="81" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="81" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="81" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xe8;" u2="&#x2019;" k="64" />
<hkern u1="&#xe9;" u2="&#x2019;" k="64" />
<hkern u1="&#xea;" u2="&#x2019;" k="64" />
<hkern u1="&#xeb;" u2="&#x2019;" k="64" />
<hkern u1="&#xf1;" u2="&#x2019;" k="120" />
<hkern u1="&#xf2;" u2="&#x2019;" k="112" />
<hkern u1="&#xf3;" u2="&#x2019;" k="112" />
<hkern u1="&#xf4;" u2="&#x2019;" k="112" />
<hkern u1="&#xf5;" u2="&#x2019;" k="112" />
<hkern u1="&#xf6;" u2="&#x2019;" k="112" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="&#x153;" k="104" />
<hkern u1="&#x2019;" u2="&#xf6;" k="144" />
<hkern u1="&#x2019;" u2="&#xf5;" k="144" />
<hkern u1="&#x2019;" u2="&#xf4;" k="144" />
<hkern u1="&#x2019;" u2="&#xf3;" k="144" />
<hkern u1="&#x2019;" u2="&#xf2;" k="144" />
<hkern u1="&#x2019;" u2="&#xeb;" k="104" />
<hkern u1="&#x2019;" u2="&#xea;" k="104" />
<hkern u1="&#x2019;" u2="&#xe9;" k="104" />
<hkern u1="&#x2019;" u2="&#xe8;" k="104" />
<hkern u1="&#x2019;" u2="&#xe7;" k="104" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="s" k="232" />
<hkern u1="&#x2019;" u2="q" k="104" />
<hkern u1="&#x2019;" u2="o" k="144" />
<hkern u1="&#x2019;" u2="g" k="104" />
<hkern u1="&#x2019;" u2="e" k="104" />
<hkern u1="&#x2019;" u2="d" k="104" />
<hkern u1="&#x2019;" u2="c" k="104" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="85" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="122" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="208" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="82" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="m,n,p,ntilde" k="89" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="65" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="258" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="89" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="T" g2="s" k="76" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="272" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="168" />
<hkern g1="T" g2="J" k="216" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="164" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="123" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="64" />
<hkern g1="L" g2="V" k="206" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="24" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="279" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="288" />
<hkern g1="L" g2="T" k="205" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="14" />
<hkern g1="L" g2="W" k="93" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="178" />
<hkern g1="P" g2="X" k="51" />
<hkern g1="P" g2="Z" k="36" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="404" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="J" k="184" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="215" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="157" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="156" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="150" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="231" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="152" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="63" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="143" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="17" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="80" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="88" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="167" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="173" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="30" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="40" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="91" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="37" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="92" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

View File

@@ -1,675 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="robotobold_italic" horiz-adv-x="1150" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="505" />
<glyph unicode="&#xfb01;" horiz-adv-x="1219" d="M65 870l38 212h146l9 52q37 204 173 315.5t349 109.5q83 -2 162.5 -19.5t158.5 -39.5l-61 -241q-138 48 -255 50q-99 0 -163 -47.5t-83 -133.5l-9 -46h219l-38 -212h-206l-151 -870h-283l151 870h-157zM698 0l188 1082h283l-187 -1082h-284z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1227" d="M74 870l37 212l156 1l12 93q26 176 148 278.5t318 105.5h17l173 -7l311 -27l-257 -1526h-283l231 1314q-86 12 -147 12q-93 0 -152.5 -43t-74.5 -122l-13 -79h209l-37 -212h-208l-151 -870h-284l151 870h-156z" />
<glyph horiz-adv-x="10" />
<glyph horiz-adv-x="10" />
<glyph unicode="&#xd;" horiz-adv-x="505" />
<glyph horiz-adv-x="10" />
<glyph unicode=" " horiz-adv-x="505" />
<glyph unicode="&#x09;" horiz-adv-x="505" />
<glyph unicode="&#xa0;" horiz-adv-x="505" />
<glyph unicode="!" horiz-adv-x="550" d="M41 131q-2 66 42 111.5t112 47.5q64 2 111 -39.5t49 -108.5q2 -66 -42 -112t-113 -48q-70 0 -114.5 44t-44.5 105zM134 447l142 1009h301l-208 -1009h-235z" />
<glyph unicode="&#x22;" horiz-adv-x="647" d="M121 987l87 549h198l-25 -154l-99 -395h-161zM438 987l86 549h197l-24 -154l-99 -395h-160z" />
<glyph unicode="#" horiz-adv-x="1193" d="M28 410l30 172h247l97 284h-222l31 174h251l144 416h184l-143 -416h180l143 416h186l-143 -416h209l-30 -174h-239l-98 -284h214l-30 -172h-243l-141 -410h-186l142 410h-179l-142 -410h-186l142 410h-218zM490 582h179l98 284h-180z" />
<glyph unicode="$" d="M65 458l282 -1q-5 -121 39.5 -182t133.5 -63q85 -2 145 47.5t72 130.5q10 70 -23 121t-135.5 97t-169.5 91q-205 138 -190 363q11 172 129 281.5t309 129.5l41 214h157l-42 -220q152 -32 231.5 -152t74.5 -311l-283 1q12 236 -139 239q-79 2 -133 -48.5t-65 -132.5 q-9 -64 22.5 -113t121 -92t150.5 -80q239 -144 223 -386q-11 -174 -128.5 -281t-311.5 -127l-39 -199h-156l39 200q-176 26 -268.5 151.5t-86.5 321.5z" />
<glyph unicode="%" horiz-adv-x="1477" d="M184 1099l5 67q11 142 103.5 228t232.5 84q134 -4 211.5 -89t69.5 -213l-6 -77q-14 -137 -108 -220t-227 -79q-130 2 -208.5 85t-72.5 214zM247 196l878 1124l137 -83l-876 -1126zM373 1095q-5 -56 18.5 -92t74.5 -38t90.5 34.5t51.5 99.5l10 78q7 59 -17.5 95.5 t-74.5 38.5q-55 2 -94.5 -37t-48.5 -98zM718 279l5 78q12 136 106 219.5t230 81.5q133 -4 211 -88t70 -213l-5 -67q-11 -145 -105.5 -230t-230.5 -81q-128 2 -208.5 85.5t-72.5 214.5zM904 277q-5 -55 21 -92.5t74 -39.5q58 -2 95 34t48 100l10 80q7 59 -18 94.5t-74 37.5 q-54 2 -93.5 -34.5t-51.5 -99.5z" />
<glyph unicode="&#x26;" horiz-adv-x="1314" d="M41 385q10 183 217 325l98 63l-40 90q-52 126 -45 223q8 115 65 205.5t152 139t207 45.5q147 -4 241 -97.5t88 -233.5q-10 -189 -227 -332l-114 -75l188 -282q84 120 101 258h239q-19 -282 -193 -465l168 -249h-302l-55 84q-180 -107 -371 -103q-190 2 -309 114.5 t-108 289.5zM330 399q-11 -83 32 -133.5t118 -52.5q87 -3 209 59l-214 330l-24 -16q-106 -79 -121 -187zM517 1043q7 -53 49 -134l82 50q124 75 133 169q6 50 -22.5 83t-77.5 33q-62 2 -108 -43t-55 -111q-4 -24 -1 -47z" />
<glyph unicode="'" horiz-adv-x="331" d="M120 985l87 551h207l-25 -163l-88 -388h-181z" />
<glyph unicode="(" horiz-adv-x="707" d="M105 384q2 95 13 180l4 24q48 357 213.5 638.5t415.5 392.5l48 -161q-342 -261 -433 -839q-31 -196 -33 -352q-5 -411 188 -571l-63 -151q-216 120 -302 415q-57 198 -51 424z" />
<glyph unicode=")" horiz-adv-x="710" d="M-104 -300q343 265 433 848q29 187 31 345q5 411 -186 572l63 151q118 -64 202.5 -186.5t125 -295.5t38.5 -356q-6 -278 -96 -540.5t-235.5 -440.5t-327.5 -255z" />
<glyph unicode="*" horiz-adv-x="910" d="M100 1058l85 170l287 -128l43 356h192l-80 -347l307 118l26 -193l-328 -89l161 -272l-161 -104l-126 293l-222 -278l-149 119l257 263z" />
<glyph unicode="+" horiz-adv-x="1094" d="M46 554l46 261h351l68 391h269l-68 -391h350l-46 -261h-349l-71 -408h-269l71 408h-352z" />
<glyph unicode="," horiz-adv-x="495" d="M-118 -284l73 117q64 107 82 201l37 212h238l-29 -184q-41 -259 -252 -427z" />
<glyph unicode="-" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="." horiz-adv-x="587" d="M44 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode="/" horiz-adv-x="752" d="M-145 -125l794 1581h223l-795 -1581h-222z" />
<glyph unicode="0" d="M87 454q-1 74 8 148l41 273q49 298 193 452t369 149q189 -4 292.5 -127.5t106.5 -344.5q1 -75 -8 -149l-42 -271q-50 -300 -192.5 -454.5t-369.5 -149.5q-189 4 -292 128t-106 346zM361 422q-5 -203 139 -210q203 -13 258 317l53 356q13 87 13 153q0 199 -140 206 q-202 9 -257 -308l-50 -338q-16 -106 -16 -176z" />
<glyph unicode="1" d="M230 1001l44 247l608 210l37 1l-245 -1459h-282l192 1108z" />
<glyph unicode="2" d="M1 0l33 210l517 485q159 149 211 242t39 182q-21 124 -143 127q-96 2 -160.5 -67t-78.5 -181l-282 -1q8 136 81 247t194.5 172.5t262.5 60.5q203 -4 316 -114t100 -293q-16 -206 -243 -430l-144 -137l-298 -268l602 -2l-37 -233h-970z" />
<glyph unicode="3" d="M27 400h280q-2 -81 45.5 -132.5t132.5 -53.5q98 -2 168 55.5t82 150.5q13 100 -35.5 153t-147.5 56l-166 1l36 226l135 -1q103 0 172.5 57t80.5 153q10 81 -31 129.5t-123 50.5t-140.5 -44.5t-71.5 -120.5l-282 -2q9 176 151.5 288.5t346.5 110.5q206 -4 326 -115 t109 -294q-14 -208 -265 -326q98 -47 143.5 -133.5t39.5 -192.5q-7 -132 -81 -232t-198 -153.5t-268 -50.5q-195 2 -318 117t-121 303z" />
<glyph unicode="4" d="M17 315l20 197l743 944h295l-157 -908h160l-41 -233h-160l-55 -315h-282l55 315h-578zM330 550l306 -2l99 518l-26 -36z" />
<glyph unicode="5" d="M67 406h277q4 -89 49 -139.5t122 -52.5q100 -3 164.5 73t77.5 204q12 114 -34.5 180t-141.5 68q-106 2 -196 -78l-231 59l196 736h796l-38 -241h-559l-96 -315q89 56 210 56q187 0 289.5 -132.5t86.5 -349.5q-12 -144 -84.5 -259t-190.5 -177t-260 -59 q-123 1 -223.5 56.5t-156.5 153t-57 217.5z" />
<glyph unicode="6" d="M97 559l11 90q47 376 275.5 599.5t569.5 223.5h38l-22 -239l-55 -1q-343 -18 -495 -378q125 123 293 119q118 -2 199.5 -66t119.5 -175t27 -245q-12 -143 -85.5 -261.5t-192.5 -184t-257 -62.5q-143 4 -245.5 80.5t-149.5 209.5t-31 290zM372 422q2 -94 43 -151t116 -58 q74 -3 135 48t90 137t19 175q-9 78 -50.5 123.5t-108.5 46.5q-73 2 -131 -36t-96 -97l-13 -90q-5 -45 -4 -98z" />
<glyph unicode="7" d="M113 0l738 1222h-696l37 234h999l-27 -177l-740 -1279h-311z" />
<glyph unicode="8" d="M62 390q14 242 285 366q-147 117 -137 305q7 124 73 220t177.5 147t243.5 48q189 -4 300 -112.5t100 -286.5q-14 -213 -250 -333q85 -59 127 -146t35 -190q-11 -196 -159 -314t-366 -114q-199 2 -319.5 114t-109.5 296zM348 411q-11 -86 30.5 -141.5t125.5 -57.5 q92 -2 156.5 58t77.5 158q11 86 -31 143t-124 59q-91 2 -156.5 -59t-78.5 -160zM489 1047q-9 -81 24.5 -132.5t104.5 -53.5q78 -2 134 54.5t67 147.5q9 82 -26 130.5t-104 50.5q-79 2 -134 -52.5t-66 -144.5z" />
<glyph unicode="9" d="M143 954q14 161 102 291t229 192q93 41 204 39q180 -4 287 -126t121 -327q4 -71 -3 -141l-11 -86q-49 -381 -271.5 -596t-570.5 -215h-21l22 242h15q197 -3 324 85.5t193 270.5q-123 -114 -263 -112q-120 1 -204 64t-124.5 175.5t-28.5 243.5zM424 868q7 -80 47.5 -128 t106.5 -49q120 -4 212 123l17 121q5 42 5 95q-2 96 -40 154t-110 60q-72 1 -129.5 -51.5t-87 -143.5t-21.5 -181z" />
<glyph unicode=":" horiz-adv-x="571" d="M43 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM184 956q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode=";" horiz-adv-x="531" d="M-97 -284l73 117q64 107 82 201l37 212h238l-29 -184q-41 -259 -252 -427zM167 956q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode="&#x3c;" horiz-adv-x="1021" d="M36 509l41 236l901 365l-52 -293l-589 -205l519 -201l-46 -267z" />
<glyph unicode="=" horiz-adv-x="1147" d="M81 313l42 236h869l-42 -236h-869zM156 746l42 236h869l-42 -236h-869z" />
<glyph unicode="&#x3e;" horiz-adv-x="1036" d="M33 129l52 292l600 206l-530 203l47 265l783 -365l-41 -235z" />
<glyph unicode="?" horiz-adv-x="998" d="M132 1068q13 190 146.5 301.5t335.5 107.5q189 -4 295 -108t93 -277q-12 -170 -194 -323l-128 -106q-92 -85 -112 -216l-247 -1q9 130 53.5 219.5t138 165t125.5 110.5q86 95 75 202q-10 97 -113 100q-71 2 -120 -45t-65 -128zM228 134q-2 67 43 113t113 48 q64 2 111 -40.5t49 -109.5q2 -63 -42 -110t-114 -49q-67 0 -112.5 41t-47.5 107z" />
<glyph unicode="@" horiz-adv-x="1788" d="M54 111q-30 225 36.5 471t215 441t345 295.5t414.5 97.5q293 -5 462.5 -178.5t182.5 -472.5q6 -169 -40 -336t-136 -282q-136 -173 -340 -168q-172 5 -218 143q-126 -144 -268 -141q-120 2 -182.5 97.5t-54.5 251.5q6 155 83 318t194.5 254t259.5 89q73 -2 137.5 -25 t155.5 -83l-134 -582l-7 -53q-11 -105 74 -110q126 -5 204 148t95 377l3 51q5 161 -45 284t-158 187.5t-265 67.5q-164 3 -311.5 -69.5t-263.5 -213.5t-182.5 -323.5t-73.5 -369.5q-9 -211 74 -353q117 -198 397 -201q161 -2 338 68l28 -158q-129 -86 -365 -86 q-201 2 -338.5 76t-216.5 199t-100 289zM690 320q-11 -160 90 -163q54 -3 109 49t80 120l127 478q-31 11 -69 13q-126 5 -210 -108t-121 -331z" />
<glyph unicode="A" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542z" />
<glyph unicode="B" horiz-adv-x="1278" d="M21 0l253 1456l454 -1q253 -1 380 -103q116 -93 116 -256q0 -15 -1 -31q-14 -221 -255 -323q87 -30 135 -112q42 -72 42 -167q0 -14 -1 -28q-14 -206 -161.5 -320.5t-402.5 -114.5h-559zM356 241l231 -1q108 0 181 53.5t87 144.5q4 24 4 45q-1 57 -29 95q-38 50 -129 55 l-276 1zM461 846l199 -2q111 2 181.5 52t84.5 139q3 19 3 35q0 141 -188 142l-216 1z" />
<glyph unicode="C" horiz-adv-x="1310" d="M94 508q-1 22 -1 45q1 110 27 261q32 183 115.5 325t198.5 225q157 112 356 112h14q226 -4 358.5 -139.5t145.5 -376.5l-292 1q0 138 -55 202t-171 68h-13q-141 0 -233 -107q-96 -112 -130 -327q-28 -186 -28 -289v-24q5 -132 59 -194.5t151 -65.5h18q120 0 196 64 q80 68 107 196l291 2q-17 -151 -103 -267.5t-224 -178.5q-132 -60 -283 -60h-15q-144 3 -251 66.5t-168.5 184t-69.5 277.5z" />
<glyph unicode="D" horiz-adv-x="1301" d="M21 0l253 1456l418 -1q147 -3 264.5 -66.5t190.5 -182.5t88 -268q4 -39 3 -78q0 -49 -5 -100l-7 -53q-44 -320 -251.5 -513.5t-503.5 -193.5h-450zM356 241l122 -1q202 0 324.5 148t140.5 447l2 32v14q0 155 -63 239q-66 88 -197 92l-160 1z" />
<glyph unicode="E" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949z" />
<glyph unicode="F" horiz-adv-x="1098" d="M21 0l253 1456h922l-43 -243h-628l-66 -376h560l-43 -242h-558l-104 -595h-293z" />
<glyph unicode="G" horiz-adv-x="1363" d="M106 508q-2 29 -2 59q0 124 32 279q41 195 139.5 341.5t236.5 218.5q133 70 293 70h13q228 -4 357 -128.5t147 -356.5l-282 1q-11 122 -65 180t-161 62h-13q-176 0 -279 -162q-106 -169 -121 -489q-1 -24 -1 -46q0 -138 54 -219q62 -94 190 -96h15q139 0 239 71l49 251 h-266l39 221h556l-88 -581q-78 -99 -228 -152q-143 -51 -320 -51h-20q-149 1 -262 65.5t-178 185.5t-74 276z" />
<glyph unicode="H" horiz-adv-x="1414" d="M21 0l253 1456h293l-103 -590h566l102 590h293l-252 -1456h-293l108 624h-565l-109 -624h-293z" />
<glyph unicode="I" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293z" />
<glyph unicode="J" horiz-adv-x="1120" d="M7 431l295 -1q-1 -18 -1 -34q0 -172 146 -175h8q82 0 140 58q61 61 79 169l172 1008h293l-171 -1008q-18 -138 -92 -247t-190 -167q-110 -55 -241 -55h-14q-206 4 -318 122q-106 112 -106 309v21z" />
<glyph unicode="K" horiz-adv-x="1271" d="M21 0l253 1456h293l-112 -642l149 168l438 474h382l-629 -662l375 -794h-334l-260 581l-192 -178l-70 -403h-293z" />
<glyph unicode="L" horiz-adv-x="1086" d="M21 0l253 1456h293l-211 -1215h618l-42 -241h-911z" />
<glyph unicode="M" horiz-adv-x="1750" d="M21 0l253 1456h376l179 -1053l543 1053h390l-253 -1456h-294l72 415l142 648l-558 -1063h-201l-195 1100l-94 -717l-67 -383h-293z" />
<glyph unicode="N" horiz-adv-x="1413" d="M21 0l253 1456h283l406 -973l169 973h292l-252 -1456h-284l-405 971l-169 -971h-293z" />
<glyph unicode="O" horiz-adv-x="1382" d="M101 521q-2 32 -2 64q0 136 37 286q46 186 148 327t240 211q132 67 284 67h13q147 -3 257 -69.5t173 -191t72 -282.5q2 -30 2 -61q0 -147 -40 -301q-48 -186 -149 -322q-100 -136 -236 -204q-130 -65 -281 -65h-13q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597 q-1 -26 -1 -51q0 -140 48 -222q57 -96 177 -99h16q146 1 244 123q103 130 135 366l7 54l8 95q1 26 1 51q0 141 -48 219q-58 92 -175 96h-13q-174 0 -278 -162q-108 -168 -121 -470z" />
<glyph unicode="P" horiz-adv-x="1291" d="M21 0l253 1456l510 -1q236 0 371 -131q120 -116 120 -296q0 -23 -2 -46q-16 -214 -178.5 -342t-414.5 -128l-276 1l-90 -513h-293zM445 756l244 -2q118 0 196 61t93 165q4 25 4 47q0 72 -38 119q-48 62 -143 66l-276 1z" />
<glyph unicode="Q" horiz-adv-x="1382" d="M98 522q-2 31 -2 63q0 98 20 211q27 152 90 279t154.5 218t208.5 139q110 44 232 44h16q146 -3 256 -69t174 -190t73 -284q2 -29 2 -58q0 -58 -7 -116l-17 -115q-67 -372 -340 -549l202 -198l-200 -157l-255 248q-47 -7 -88 -7h-18q-218 2 -352 148t-149 393zM391 597 q-1 -26 -1 -51q0 -140 48 -222q57 -95 177 -99h16q146 0 244 123q103 129 135 366q13 96 16 149q1 20 1 39q0 156 -51 234q-58 89 -173 93h-13q-174 0 -278 -162q-107 -168 -121 -470z" />
<glyph unicode="R" horiz-adv-x="1278" d="M21 0l253 1456l482 -1q242 0 372 -114q117 -102 117 -276q0 -20 -1 -41q-21 -300 -320 -417l205 -591v-16h-312l-172 533h-238l-93 -533h-293zM449 776l218 -2q116 2 191.5 62.5t90.5 164.5q3 23 3 44q0 66 -34 108q-45 55 -143 59l-250 1z" />
<glyph unicode="S" horiz-adv-x="1231" d="M38 459l293 -1q-1 -13 0 -25q0 -212 233 -216q107 0 176 47t82 125q3 16 3 30q0 97 -120 152l-193 77q-320 143 -320 388q0 12 1 25q7 122 80 216q73 93 205 147q127 52 274 52h11q211 -4 341 -126q128 -120 128 -319v-6h-292v18q0 86 -44 136q-48 55 -150 57h-8 q-95 0 -166 -46q-74 -48 -88 -130q-2 -11 -2 -22q0 -94 148 -151l132 -50l76 -35q277 -137 277 -378q0 -16 -1 -32q-9 -129 -82.5 -222.5t-199.5 -143.5q-119 -47 -262 -47h-17q-155 3 -276 65t-184 175q-55 98 -55 223v17z" />
<glyph unicode="T" horiz-adv-x="1239" d="M144 1213l43 243h1152l-43 -243h-432l-210 -1213h-293l210 1213h-427z" />
<glyph unicode="U" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-4 -30 -4 -58q0 -24 3 -47q20 -162 193 -168h13q115 0 190 68q79 72 102 206l164 961h294l-164 -960q-34 -241 -200 -381q-161 -136 -398 -136h-14q-154 3 -267 67q-114 64 -168 182q-41 89 -41 197q0 34 4 70z" />
<glyph unicode="V" horiz-adv-x="1309" d="M145 1456h315l146 -1092l490 1092h336l-719 -1456h-306z" />
<glyph unicode="W" horiz-adv-x="1747" d="M170 1456h286l29 -1028l392 1028h249l69 -1033l351 1033h299l-541 -1456h-295l-77 970l-381 -970h-295z" />
<glyph unicode="X" horiz-adv-x="1272" d="M-81 0l547 748l-293 708h320l186 -500l343 500h352l-535 -736l302 -720h-324l-191 508l-351 -508h-356z" />
<glyph unicode="Y" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545z" />
<glyph unicode="Z" horiz-adv-x="1214" d="M-34 0l33 191l871 1020l-693 2l43 243h1061l-33 -187l-870 -1026l708 -2l-42 -241h-1078z" />
<glyph unicode="[" horiz-adv-x="562" d="M-31 -339l318 2033h421l-35 -223h-138l-248 -1587h138l-35 -223h-421z" />
<glyph unicode="\" horiz-adv-x="848" d="M154 1456h275l316 -1581h-276z" />
<glyph unicode="]" horiz-adv-x="562" d="M-135 -339l35 223h139l248 1587h-139l35 223h421l-318 -2033h-421z" />
<glyph unicode="^" horiz-adv-x="878" d="M57 729l417 727h205l164 -727h-211l-89 454l-247 -454h-239z" />
<glyph unicode="_" horiz-adv-x="897" d="M-143 -226l40 226h885l-39 -226h-886z" />
<glyph unicode="`" horiz-adv-x="667" d="M204 1534l291 2l143 -310l-211 1z" />
<glyph unicode="a" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5h-7q-61 -1 -105 -33q-46 -34 -59 -99l-283 -1q6 156 142 252q133 95 327 94h8q184 -4 288 -110q89 -91 89 -226q0 -22 -2 -45l-83 -518l-5 -64v-13q0 -62 17 -107l-1 -19h-277 q-11 36 -11 83v15q-118 -118 -266 -118h-10q-142 2 -236 92q-88 85 -87 208v16zM306 317q-2 -11 -1 -21q-1 -38 23 -64q30 -32 84 -33h9q117 0 204 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
<glyph unicode="b" horiz-adv-x="1128" d="M3 0l266 1536h283l-109 -553q110 119 255 119h9q157 -2 246.5 -112.5t95.5 -305.5q0 -12 1 -26q0 -53 -7 -120q-30 -256 -156 -410q-122 -149 -313 -149h-13q-171 4 -260 138l-41 -117h-257zM340 325q38 -108 162 -112h8q201 0 247 302l6 44q7 64 7 106q0 14 -1 26 q-11 174 -144 177h-8q-119 0 -199 -113z" />
<glyph unicode="c" horiz-adv-x="1046" d="M47 469l3 55l1 11q27 265 178 419q145 149 357 148h16q182 -4 290 -120q106 -113 106 -297v-7h-263q0 87 -38 137t-114 54h-8q-195 0 -237 -295q-12 -86 -12 -151q0 -17 1 -33q10 -175 150 -178h7q74 0 123 42q52 44 68 119l265 1q-7 -114 -71.5 -205t-172.5 -142 q-102 -48 -213 -48h-13q-197 3 -312 136q-111 129 -111 339v15z" />
<glyph unicode="d" horiz-adv-x="1129" d="M49 399q-1 21 -1 42q0 41 4 80l6 45q24 166 92 292t168 187q95 58 211 58h11q151 -4 244 -121l106 554h283l-266 -1536h-252l16 116q-118 -137 -273 -137h-9q-101 1 -177 53t-117.5 149.5t-45.5 217.5zM330 393q10 -176 142 -179h10q113 0 197 112l77 430 q-39 107 -156 112h-7q-99 0 -165 -80q-68 -82 -93 -267q-6 -55 -6 -98q0 -16 1 -30z" />
<glyph unicode="e" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290q77 131 198 203q115 68 252 68h16q209 -4 317 -154q87 -120 86 -292q0 -42 -5 -86l-16 -123h-663v-14q0 -95 51 -154q55 -63 150 -65h10q148 0 260 119l129 -160q-61 -91 -176 -143q-111 -50 -237 -50h-10q-142 1 -251.5 69.5t-163.5 188.5 q-44 98 -44 211q0 26 2 52zM360 643h388l6 26q3 22 3 42q0 17 -2 34q-10 58 -49 90.5t-99 33.5h-6q-75 0 -133 -49q-60 -51 -108 -177z" />
<glyph unicode="f" horiz-adv-x="722" d="M74 870l37 212l156 1l14 108q26 173 141 271q113 97 286 97h7q61 -2 153 -21l-25 -225q-48 12 -83 12h-4q-72 0 -124 -38q-54 -39 -67 -117l-15 -88h209l-37 -212h-208l-151 -870h-284l151 870h-156z" />
<glyph unicode="g" horiz-adv-x="1144" d="M-16 -251l140 172q94 -119 236 -123h13q102 0 175 58q78 61 106 173l16 65q-114 -114 -255 -114h-10q-158 2 -251 117.5t-102 300.5q-1 17 -1 35q0 49 6 109q30 251 163 408q131 153 329 153h8q173 -4 258 -125l37 105l259 -1l-177 -1045q-29 -216 -184 -342 q-150 -122 -370 -122h-14q-112 2 -214 48.5t-168 127.5zM334 424q0 -94 39.5 -150.5t114.5 -59.5h9q109 0 195 98l84 458q-43 94 -159 98h-7q-103 0 -176 -87q-75 -90 -94 -239q-6 -64 -6 -106v-12z" />
<glyph unicode="h" horiz-adv-x="1122" d="M-4 0l266 1536h283l-112 -574q125 140 288 140h5q160 -4 236 -116q60 -89 61 -230q0 -36 -4 -74l-114 -682h-282l115 685q3 24 3 46q0 13 -1 26q-10 108 -126 111h-9q-109 0 -191 -98l-136 -770h-282z" />
<glyph unicode="i" horiz-adv-x="537" d="M17 0l188 1082h284l-188 -1082h-284zM238 1357v6q0 63 44 105q46 44 111 44h6q60 0 105 -39q47 -41 49 -106v-5q1 -59 -41 -103q-44 -46 -114 -48h-6q-58 0 -104 38q-48 40 -50 108z" />
<glyph unicode="j" horiz-adv-x="526" d="M-262 -421l23 230q50 -11 87 -13h4q129 0 158 144l196 1142h284l-194 -1141q-23 -181 -130 -282q-106 -99 -271 -99h-7q-68 2 -150 19zM233 1357v6q0 62 42 103q44 44 113 46q69 0 113.5 -41t46.5 -104v-6q0 -63 -42 -105q-44 -43 -113 -45h-6q-59 0 -105 38 q-47 40 -49 108z" />
<glyph unicode="k" horiz-adv-x="1071" d="M3 0l266 1536h283l-146 -834l55 59l321 321h362l-473 -465l301 -617h-309l-192 431l-131 -114l-55 -317h-282z" />
<glyph unicode="l" horiz-adv-x="537" d="M17 0l267 1536h283l-266 -1536h-284z" />
<glyph unicode="m" horiz-adv-x="1730" d="M3 0l187 1082l263 1l-23 -123q128 142 307 142h10q100 -2 166 -46t89 -119q140 165 327 165h9q148 -3 224 -102q65 -85 65 -236q0 -24 -1 -50l-2 -25l-115 -689h-283l115 691q3 30 3 56v13q-7 105 -120 108q-116 0 -199 -124l-3 -23l-126 -721h-282l115 689q3 30 3 56v13 q-7 106 -119 109h-6q-103 0 -187 -101l-135 -766h-282z" />
<glyph unicode="n" horiz-adv-x="1123" d="M-3 0l188 1082l264 1l-24 -128q127 147 305 147h10q153 -3 226 -112q57 -86 57 -223q0 -38 -4 -79l-114 -688h-282l116 691q3 24 3 46q0 13 -1 25q-13 102 -128 105h-8q-106 0 -191 -103l-135 -764h-282z" />
<glyph unicode="o" horiz-adv-x="1133" d="M58 524q26 268 182 426q150 152 366 152h16q143 -2 246 -74q104 -70 152 -196q38 -97 38 -212q0 -33 -3 -67q-23 -257 -179 -417q-153 -156 -376 -156h-11q-141 2 -244 72.5t-152 195.5q-38 97 -38 210q0 32 3 66zM337 421q2 -96 45 -151.5t121 -57.5h8q124 0 196 120 q69 116 69 299v25q-4 96 -46.5 153.5t-121.5 59.5h-8q-120 -1 -194 -119q-70 -113 -69 -299v-30z" />
<glyph unicode="p" horiz-adv-x="1128" d="M-69 -416l259 1498l260 1l-19 -109q114 128 267 128h9q159 -4 247 -115.5t94 -302.5v-26q0 -53 -6 -120q-21 -170 -89 -302t-169 -196q-96 -61 -213 -61h-11q-157 4 -248 117l-99 -512h-282zM339 318q37 -101 159 -105h7q97 0 163 79q68 82 94 267l6 96v10q0 90 -36 144 q-37 57 -109 59h-9q-117 0 -194 -104z" />
<glyph unicode="q" horiz-adv-x="1132" d="M49 400q-1 21 -1 42q0 41 4 81l6 44q24 168 92.5 294t167.5 185q95 57 210 57h12q168 -4 257 -136l46 116l252 -1l-260 -1498h-284l101 511q-109 -115 -253 -115h-10q-101 1 -177 53t-117.5 150.5t-45.5 216.5zM331 394q10 -178 142 -181h8q114 0 196 105l82 450 q-39 97 -157 101h-7q-101 0 -168 -83q-69 -87 -89 -242q-8 -79 -8 -125q0 -14 1 -25z" />
<glyph unicode="r" horiz-adv-x="735" d="M3 0l188 1082l265 1l-26 -132q102 153 252 153q42 0 98 -14l-36 -279q-58 10 -95 10h-10q-144 0 -229 -113l-125 -708h-282z" />
<glyph unicode="s" horiz-adv-x="1031" d="M9 346l266 -2q4 -155 166 -157q78 0 128.5 32t60.5 86q2 9 2 17q0 67 -113 99l-91 23q-314 87 -314 302v12q6 154 136 250q128 95 307 94h7q183 -2 296 -97t115 -253l-280 1q2 139 -138 141q-66 0 -114.5 -33t-59.5 -89q-1 -8 -1 -15q0 -68 122 -98l40 -9 q138 -33 211 -75.5t113 -105.5q37 -59 36 -139v-12q-3 -103 -66.5 -180t-173.5 -119q-103 -39 -217 -39h-16q-180 2 -300 103.5t-122 262.5z" />
<glyph unicode="t" horiz-adv-x="681" d="M56 870l37 212h153l46 266h283l-47 -266h180l-37 -212h-180l-92 -542q-2 -15 -2 -28q0 -31 10 -50q14 -27 68 -29h6q20 0 80 5l-20 -221q-69 -23 -149 -23h-13q-139 2 -207 87q-58 72 -58 188q0 20 2 42l93 571h-153z" />
<glyph unicode="u" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103h10q125 0 207 101l135 767h284l-188 -1082h-263l21 112q-117 -132 -290 -132h-8q-156 2 -236 112q-65 90 -65 226q0 31 3 64z" />
<glyph unicode="v" horiz-adv-x="1014" d="M92 1082h286l80 -725l308 725h304l-523 -1082h-270z" />
<glyph unicode="w" horiz-adv-x="1470" d="M115 1082h264l17 -681l309 681h204l71 -688l257 688h281l-455 -1082h-236l-80 677l-316 -677h-236z" />
<glyph unicode="x" horiz-adv-x="1021" d="M-82 0l408 566l-209 516h286l121 -321l227 321h317l-392 -544l219 -538h-286l-133 338l-239 -338h-319z" />
<glyph unicode="y" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2h10q130 0 192 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21z" />
<glyph unicode="z" horiz-adv-x="1021" d="M-33 0l33 191l603 655l-475 2l41 234h843l-32 -185l-609 -662l510 -2l-41 -233h-873z" />
<glyph unicode="{" horiz-adv-x="666" d="M39 513l19 207q185 8 215 222l32 230q59 325 404 429l47 -166q-168 -65 -201 -304l-32 -229q-34 -193 -223 -289q69 -51 101 -128.5t23 -175.5l-31 -236l-4 -57q-7 -162 110 -215l-61 -161q-158 53 -235 173q-77 121 -59 293l28 205q5 42 2 78q-10 113 -135 124z" />
<glyph unicode="|" horiz-adv-x="512" d="M31 -270l270 1726h172l-270 -1726h-172z" />
<glyph unicode="}" horiz-adv-x="666" d="M-94 -197q168 65 201 304l32 230q34 193 226 287q-72 49 -104 128t-23 177l31 236l4 57q7 161 -109 215l64 158q161 -54 234.5 -174.5t55.5 -288.5l-28 -204q-5 -43 -2 -78q10 -115 135 -126l-19 -207q-186 -10 -215 -221l-27 -199q-51 -353 -409 -461z" />
<glyph unicode="~" horiz-adv-x="1298" d="M80 415q12 186 109.5 301t248.5 112q77 -2 138.5 -35.5t133.5 -108t131 -74.5q62 0 104.5 50t55.5 134l202 1q-6 -118 -52 -216.5t-124 -152.5t-179 -52q-77 2 -137.5 35t-117.5 92t-86 75t-64 17q-59 0 -99.5 -47.5t-54.5 -132.5z" />
<glyph unicode="&#xa1;" horiz-adv-x="571" d="M-37 -369l208 1008h235l-143 -1008h-300zM184 943q-2 65 42 111t113 48q64 2 111 -39.5t49 -109.5q2 -69 -44 -114t-111 -45q-63 -2 -110.5 40t-49.5 109z" />
<glyph unicode="&#xa2;" horiz-adv-x="1153" d="M96 523q25 246 150 392.5t326 178.5l47 224h196l-47 -228q133 -32 207.5 -139.5t72.5 -272.5h-264l-1 34q-13 151 -147 157q-101 5 -167.5 -74t-87.5 -243q-12 -110 -9 -161q5 -176 146 -179q78 -2 131 42.5t68 118.5l266 2q-11 -151 -117.5 -254.5t-273.5 -131.5 l-49 -234h-196l50 236q-164 38 -243 182t-58 350z" />
<glyph unicode="&#xa3;" horiz-adv-x="1190" d="M-6 0l43 240l75 -2q48 19 75 59.5t41 123.5l21 155h-158l41 236h150l27 221q26 208 162 327t336 115q191 -4 296.5 -116t101.5 -302l-280 1q5 174 -136 177q-70 2 -120.5 -51t-65.5 -144l-27 -228h300l-41 -236h-291l-17 -147q-16 -109 -101 -192l640 4l-43 -241h-1029z " />
<glyph unicode="&#xa4;" horiz-adv-x="1385" d="M-3 132l154 125q-57 185 -37 345q26 215 171 375l-115 157l148 130l109 -143q177 116 354 112q185 -2 321 -116l170 148l123 -159l-169 -139q62 -186 42 -352q-24 -203 -157 -360l111 -151l-149 -131l-101 132q-182 -129 -369 -125q-200 4 -331 126l-153 -132zM295 599 q-15 -110 19 -209.5t110 -158.5t181 -63q114 -4 219 56t175.5 166t88.5 227q15 110 -19 209t-110 157t-180 62q-115 4 -221.5 -56.5t-175.5 -164.5t-87 -225z" />
<glyph unicode="&#xa5;" horiz-adv-x="1226" d="M75 278l31 174h325l21 115h-327l31 175h261l-245 713l310 1l161 -604l373 604h337l-492 -712l225 -2l-33 -175h-308l-21 -115h310l-31 -174h-308l-49 -278h-293l49 278h-327z" />
<glyph unicode="&#xa6;" horiz-adv-x="511" d="M-28 -270l139 795h254l-138 -795h-255zM140 698l132 758h254l-132 -758h-254z" />
<glyph unicode="&#xa7;" horiz-adv-x="1258" d="M-24 -34h281q-4 -91 51 -137t160 -46q109 0 175 38t80 106q20 98 -136 155l-97 31q-228 70 -322 167.5t-85 245.5q10 177 205 286q-96 113 -86 275q12 166 143 269t341 118l67 2q218 -4 339.5 -116.5t117.5 -311.5h-280q3 91 -46 141.5t-141 52.5q-103 3 -172.5 -38.5 t-84.5 -113.5q-22 -117 153 -165.5t267.5 -95t143.5 -104.5q85 -96 76 -236q-7 -102 -62.5 -170t-142.5 -114q95 -111 84 -275q-8 -117 -75.5 -203t-191.5 -134t-280 -45q-230 2 -358 112t-124 306zM372 555q-24 -121 144 -176l79 -25l130 -43q95 56 115 149 q21 110 -140 170l-221 75q-90 -55 -107 -150z" />
<glyph unicode="&#xa8;" horiz-adv-x="937" d="M210 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM683 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xa9;" horiz-adv-x="1568" d="M114 722q17 152 86 292.5t180.5 247.5t245 162t276.5 52q183 -4 325 -102.5t214.5 -272t51.5 -366.5q-21 -189 -120.5 -356t-254.5 -272q-194 -131 -413 -127q-185 4 -326.5 103.5t-213.5 273.5t-51 365zM235 722q-22 -159 29.5 -302.5t165 -228.5t262.5 -87 q161 -4 306.5 78.5t246.5 230.5t126 323q22 159 -29.5 301.5t-163.5 226t-264 87.5q-162 4 -311.5 -81t-247.5 -234.5t-120 -313.5zM444 669l11 110q19 184 122.5 291.5t258.5 105.5q145 -4 225 -87t78 -230l-152 2q13 177 -146 181q-93 2 -155.5 -69.5t-77 -196t-15 -145 t1.5 -47.5q3 -73 40 -118.5t102 -48.5q169 -7 200 179l152 1q-10 -150 -101 -234.5t-244 -80.5q-148 4 -230.5 113.5t-69.5 273.5z" />
<glyph unicode="&#xaa;" horiz-adv-x="892" d="M187 911q2 115 94.5 177.5t260.5 62.5l106 -2l12 55l4 46q-3 75 -81 78q-120 4 -147 -99l-173 13q7 110 94.5 173.5t219.5 61.5q121 -2 193 -77t62 -200l-53 -347l-4 -59q-1 -44 8 -92h-164l-3 72q-89 -83 -201 -83q-105 0 -166.5 60t-61.5 160zM362 915q-7 -38 15.5 -60 t70.5 -22q69 0 161 63l28 137h-80q-84 -3 -135 -34.5t-60 -83.5z" />
<glyph unicode="&#xab;" horiz-adv-x="1002" d="M60 513l1 21l330 390h203l-316 -416l162 -382l-167 -1zM433 513l1 21l330 390h203l-316 -416l162 -382l-167 -1z" />
<glyph unicode="&#xac;" horiz-adv-x="1105" d="M127 634l30 171h812l-75 -431h-196l46 260h-617z" />
<glyph unicode="&#xad;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#xae;" horiz-adv-x="1568" d="M114 722q17 152 86 292.5t180.5 247.5t245 162t276.5 52q183 -4 325 -102.5t214.5 -272t51.5 -366.5q-21 -189 -120.5 -356t-254.5 -272q-194 -131 -413 -127q-185 4 -326.5 103.5t-213.5 273.5t-51 365zM235 722q-22 -160 30 -304t164 -227t263 -87q157 -4 304.5 78 t248.5 230.5t126 323.5q22 159 -29.5 301.5t-163.5 226t-264 87.5q-162 4 -311.5 -81t-247.5 -234.5t-120 -313.5zM452 316l133 850l256 -1q142 -5 218.5 -73t71.5 -182q-3 -58 -36 -103t-101 -84q68 -49 74 -149q1 -29 -5.5 -89.5t-4.5 -88.5l4 -63l-1 -19l-148 1 q-6 37 -4 73q1 43 12 128q7 63 -14 97t-87 38l-167 2l-53 -337h-148zM674 787l116 -1q82 3 134 35.5t63 87.5q11 58 -17 89t-117 34l-141 1z" />
<glyph unicode="&#xaf;" horiz-adv-x="1005" d="M250 1290l27 167h710l-27 -167h-710z" />
<glyph unicode="&#xb0;" horiz-adv-x="781" d="M228 1191q2 117 86.5 202.5t195.5 83.5q104 -2 173.5 -82t67.5 -186q-2 -116 -84.5 -200t-193.5 -82q-105 2 -176 79.5t-69 184.5zM371 1193q-6 -45 20 -81t74 -36q51 0 93 37t51 94q6 49 -19 85.5t-72 36.5q-51 0 -94.5 -40t-52.5 -96z" />
<glyph unicode="&#xb1;" horiz-adv-x="1077" d="M15 1l37 235h840l-37 -235h-840zM101 701l38 241h325l54 343h247l-54 -343h319l-38 -241h-318l-57 -364h-248l57 364h-325z" />
<glyph unicode="&#xb2;" horiz-adv-x="750" d="M81 667l26 150l335 270q95 79 107 141q8 36 -10 57t-54 21q-97 0 -121 -112l-204 -2q8 126 96.5 202.5t216.5 74.5q131 -2 207.5 -66.5t74.5 -175.5q-5 -138 -169 -255l-78 -55l-130 -84l336 -2l-30 -164h-603z" />
<glyph unicode="&#xb3;" horiz-adv-x="750" d="M96 904l195 -1q7 -82 102 -82q52 0 89 25t46 68q16 80 -94 85h-94l10 137h81q54 2 90.5 26.5t45.5 68.5q5 34 -18 52.5t-59 18.5q-80 0 -108 -60l-208 -1q7 106 89.5 167t212.5 59q136 -3 214.5 -61.5t75.5 -157.5q-3 -118 -158 -183q58 -20 87 -65.5t28 -105.5 q-2 -111 -97.5 -176.5t-239.5 -62.5q-129 2 -208.5 69t-81.5 180z" />
<glyph unicode="&#xb4;" horiz-adv-x="669" d="M186 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xb5;" horiz-adv-x="1233" d="M-42 -416l260 1498h282l-103 -622l-6 -83q-7 -160 125 -163q133 -4 221 104l135 764h282l-188 -1082h-248l8 69q-106 -93 -230 -91q-93 0 -169 48l-87 -442h-282z" />
<glyph unicode="&#xb6;" horiz-adv-x="983" d="M149 980q19 214 168 345.5t372 131.5l313 -1l-253 -1456h-214l90 520l-52 1q-211 3 -326.5 130t-97.5 329z" />
<glyph unicode="&#xb7;" horiz-adv-x="608" d="M154 692q-2 67 43 113t113 48q65 2 112.5 -41t49.5 -110q2 -65 -43.5 -112.5t-114.5 -47.5q-64 -2 -111 39.5t-49 110.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="542" d="M-45 -465l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
<glyph unicode="&#xb9;" horiz-adv-x="750" d="M229 1172l30 168l369 115l25 1l-128 -787h-200l95 543z" />
<glyph unicode="&#xba;" horiz-adv-x="918" d="M200 1044l5 63q13 167 117.5 270.5t258.5 99.5q148 -4 229 -105.5t71 -250.5l-6 -66q-16 -171 -120.5 -270.5t-253.5 -95.5q-144 4 -228 103.5t-73 251.5zM372 969q5 -61 38.5 -97.5t89.5 -37.5q76 -3 131 53.5t70 156.5l11 101l-1 49q-15 132 -128 135q-77 3 -132 -52.5 t-70 -155.5l-9 -80q-3 -36 0 -72z" />
<glyph unicode="&#xbb;" horiz-adv-x="1002" d="M-10 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203zM371 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203z" />
<glyph unicode="&#xbc;" horiz-adv-x="1436" d="M194 1167l30 168l369 115l25 1l-128 -787h-200l95 543zM235 204l878 1124l137 -83l-876 -1126zM652 159l14 150l419 479l203 2l-80 -466l96 1l-31 -166h-85l-29 -159h-200l28 159h-335zM866 328l152 -3l44 216l-18 -25z" />
<glyph unicode="&#xbd;" horiz-adv-x="1522" d="M178 1173l30 168l369 115l25 1l-128 -787h-200l95 543zM194 204l878 1124l137 -83l-876 -1126zM726 0l26 150l335 270q95 79 107 141q8 36 -10 57t-54 21q-97 0 -121 -112l-204 -2q8 126 96.5 202.5t216.5 74.5q131 -2 207.5 -66.5t74.5 -175.5q-5 -138 -169 -255 l-78 -55l-130 -84l336 -2l-30 -164h-603z" />
<glyph unicode="&#xbe;" horiz-adv-x="1615" d="M141 905l195 -1q7 -82 102 -82q52 0 89 25t46 68q16 80 -94 85h-94l10 137h81q54 2 90.5 26.5t45.5 68.5q5 34 -18 52.5t-59 18.5q-80 0 -108 -60l-208 -1q7 106 89.5 167t212.5 59q136 -3 214.5 -61.5t75.5 -157.5q-3 -118 -158 -183q58 -20 87 -65.5t28 -105.5 q-2 -111 -97.5 -176.5t-239.5 -62.5q-129 2 -208.5 69t-81.5 180zM391 204l878 1124l137 -83l-876 -1126zM806 159l14 150l419 479l203 2l-80 -466l96 1l-31 -166h-85l-29 -159h-200l28 159h-335zM1020 328l152 -3l44 216l-18 -25z" />
<glyph unicode="&#xbf;" horiz-adv-x="998" d="M-31 -2q11 161 179 311l145 121q86 79 109 213l246 1q-8 -122 -50 -211t-128 -162l-68 -57q-127 -106 -144 -216q-9 -64 17 -106t95 -44q71 -2 120.5 42t68.5 131l282 2q-13 -191 -145.5 -301.5t-335.5 -106.5q-186 2 -294 104t-97 279zM432 944q-2 69 44 114t111 45 q64 2 111 -39.5t49 -109.5q2 -69 -44 -114t-111 -45q-64 -2 -111 39.5t-49 109.5z" />
<glyph unicode="&#xc0;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM532 1844l291 2l143 -310l-211 1z" />
<glyph unicode="&#xc1;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM690 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xc2;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM471 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM489 543h351l-82 542z" />
<glyph unicode="&#xc3;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM477 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z M489 543h351l-82 542z" />
<glyph unicode="&#xc4;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM485 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM489 543h351l-82 542zM958 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33 t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xc5;" horiz-adv-x="1347" d="M-104 0l778 1456h271l277 -1456h-299l-46 300h-508l-150 -300h-323zM489 543h351l-82 542zM651 1723q0 90 66 151.5t157 61.5q87 0 148.5 -58.5t61.5 -140.5q2 -86 -63.5 -147.5t-159.5 -61.5q-86 0 -147 56t-63 139zM764 1723q-7 -40 15 -70t65 -30q47 0 83 32.5 t45 81.5q6 43 -17 72.5t-63 29.5q-47 0 -84.5 -34t-43.5 -82z" />
<glyph unicode="&#xc6;" horiz-adv-x="1877" d="M-111 0l1015 1456h996l-42 -236h-580l-47 -355h488l-42 -236h-477l-53 -394h600l-41 -235h-871l44 333h-423l-220 -333h-347zM615 582l298 -2l73 552z" />
<glyph unicode="&#xc7;" horiz-adv-x="1310" d="M94 508q-7 123 25.5 306t116 325t198.5 225q162 116 370 112q226 -4 358.5 -139.5t145.5 -376.5l-292 1q0 138 -55 202t-171 68q-150 5 -246.5 -107t-129.5 -327q-32 -209 -28 -313q5 -132 59 -194.5t151 -65.5q134 -5 214.5 63.5t106.5 196.5l291 2 q-17 -151 -103 -267.5t-224 -179t-298 -59.5q-144 3 -251 66.5t-168.5 184t-69.5 277.5zM393 -466l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
<glyph unicode="&#xc8;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM477 1847l291 2l143 -310l-211 1z" />
<glyph unicode="&#xc9;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM635 1539l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xca;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM416 1554v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xcb;" horiz-adv-x="1127" d="M21 0l253 1456h947l-43 -243h-653l-61 -347h560l-42 -235h-558l-68 -390h656l-42 -241h-949zM430 1675q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM903 1675q-2 54 36 91.5t94 39.5q53 2 95.5 -33 t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xcc;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM151 1847l291 2l143 -310l-211 1z" />
<glyph unicode="&#xcd;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM308 1539l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xce;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM90 1554v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xcf;" horiz-adv-x="589" d="M40 0l252 1456h293l-252 -1456h-293zM104 1675q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM577 1675q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z " />
<glyph unicode="&#xd0;" horiz-adv-x="1331" d="M-13 642l33 183h174l110 631l416 -1q147 -2 265.5 -66t191.5 -183t88 -268q8 -87 -2 -178l-7 -53q-44 -320 -251.5 -513.5t-503.5 -193.5h-450l111 642h-175zM386 241l122 -1q202 0 324.5 148t140.5 447l2 32q3 165 -63 253t-197 92l-160 1l-68 -388h213l-33 -183h-212z " />
<glyph unicode="&#xd1;" horiz-adv-x="1413" d="M21 0l253 1456h283l406 -973l169 973h292l-252 -1456h-284l-405 971l-169 -971h-293zM510 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8 q-76 -3 -101 -98z" />
<glyph unicode="&#xd2;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM546 1844l291 2l143 -310l-211 1z" />
<glyph unicode="&#xd3;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM704 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xd4;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM485 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xd5;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM491 1566q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
<glyph unicode="&#xd6;" horiz-adv-x="1382" d="M101 521q-11 164 35 350t148 327t239.5 211t297.5 67q147 -3 257 -69.5t173 -191t72 -282.5q10 -176 -38 -362t-149 -322t-236.5 -204t-293.5 -65q-145 3 -255.5 68.5t-175 189t-74.5 283.5zM395 597q-10 -177 47 -272.5t177 -99.5q157 -7 260 122.5t135 366.5l7 54l8 95 q10 178 -47.5 270t-174.5 96q-183 6 -290.5 -162t-121.5 -470zM499 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM972 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5 t-97 34.5t-41 90.5z" />
<glyph unicode="&#xd7;" horiz-adv-x="1065" d="M25 386l353 313l-244 313l180 155l242 -310l348 311l148 -182l-353 -314l244 -312l-179 -156l-243 310l-348 -309z" />
<glyph unicode="&#xd8;" horiz-adv-x="1379" d="M12 -94l194 244q-138 232 -99 545l8 58q30 214 129.5 382t249 256t330.5 86q169 -4 294 -84l99 125l202 -1l-183 -229q120 -232 84 -529l-5 -40q-42 -333 -234.5 -538t-474.5 -202q-155 2 -279 72l-112 -146zM387 552q-5 -72 3 -144l575 764q-51 54 -152 59 q-158 5 -262.5 -122t-139.5 -360q-19 -128 -24 -197zM479 268q51 -40 139 -45q147 -5 249 108t143 329.5t34 359.5z" />
<glyph unicode="&#xd9;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM511 1844l291 2l143 -310l-211 1z" />
<glyph unicode="&#xda;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM669 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xdb;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM450 1551v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xdc;" horiz-adv-x="1318" d="M101 495l163 961h293l-163 -962q-7 -56 -1 -105q20 -162 193 -168q124 -4 203 68t102 206l164 961h294l-164 -960q-34 -241 -200 -381t-412 -136q-154 3 -267.5 67.5t-167.5 182t-37 266.5zM464 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5 t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM937 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xdd;" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545zM635 1536l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xde;" horiz-adv-x="1219" d="M24 0l253 1456h282l-47 -267l177 -1q234 -1 365 -122t116 -320q-11 -141 -88 -245t-206 -159.5t-286 -55.5l-233 1l-51 -287h-282zM397 520l198 -1q113 0 194.5 59.5t98.5 165.5q14 95 -36 151t-147 60l-232 1z" />
<glyph unicode="&#xdf;" horiz-adv-x="1263" d="M26 0l188 1101q29 218 168 341t352 117q174 -4 275 -104.5t90 -257.5q-3 -46 -19 -86.5t-61 -115.5t-58 -106t-20 -68q-8 -46 12.5 -94.5t80.5 -123t86.5 -131t24.5 -109.5q-9 -179 -139.5 -282.5t-335.5 -101.5q-166 2 -279 59l76 227q89 -55 205 -53q72 0 127 38 t68 107q8 48 -13.5 96t-87.5 123.5t-92 135.5q-20 46 -17 96q3 45 19 84.5t58.5 110t57.5 106.5t20 75q8 62 -22.5 103t-93.5 44q-82 3 -133 -56t-68 -177l-187 -1098h-282z" />
<glyph unicode="&#xe0;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM342 1534l291 2l143 -310l-211 1z" />
<glyph unicode="&#xe1;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM500 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xe2;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM281 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
<glyph unicode="&#xe3;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM287 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98zM306 317 q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81z" />
<glyph unicode="&#xe4;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM295 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95 q-25 -33 -31 -81zM768 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xe5;" horiz-adv-x="1075" d="M19 296q7 177 148.5 271.5t379.5 94.5l132 -2l14 65q6 33 3 63q-5 47 -35.5 73.5t-80.5 27.5q-66 2 -112 -32.5t-59 -99.5l-283 -1q7 155 142.5 251.5t334.5 94.5q184 -4 288 -109.5t87 -271.5l-83 -518l-5 -64q-2 -71 17 -120l-1 -19h-277q-13 41 -11 98 q-122 -122 -276 -118q-142 2 -235.5 92.5t-87.5 223.5zM306 317q-8 -54 22.5 -85.5t83.5 -32.5q122 -4 213 106l35 187l-98 1q-156 -4 -225 -95q-25 -33 -31 -81zM461 1413q0 90 66 151.5t157 61.5q87 0 148.5 -58.5t61.5 -140.5q2 -86 -63.5 -147.5t-159.5 -61.5 q-86 0 -147 56t-63 139zM574 1413q-7 -40 15 -70t65 -30q47 0 83 32.5t45 81.5q6 43 -17 72.5t-63 29.5q-47 0 -84.5 -34t-43.5 -82z" />
<glyph unicode="&#xe6;" horiz-adv-x="1687" d="M15 311q7 164 144.5 251.5t377.5 87.5l167 -2l13 60q5 33 2 62q-14 96 -115 99q-70 2 -123 -30.5t-66 -93.5l-281 18q8 160 148 252t338 88q204 -5 302 -110q151 112 331 108q192 -4 295.5 -139.5t79.5 -349.5l-25 -162h-642q-10 -108 42 -171t156 -65q81 -2 154 20 t145 56l61 -193q-135 -117 -396 -117q-243 5 -352 146q-170 -150 -404 -146q-106 1 -189.5 42.5t-125.5 115t-37 173.5zM299 307q-10 -53 25 -84.5t102 -31.5q96 0 216 80l38 190l-139 1q-99 -3 -165 -45t-77 -110zM981 643h369l7 31q6 36 4 71q-7 118 -124 124 q-171 6 -256 -226z" />
<glyph unicode="&#xe7;" horiz-adv-x="1046" d="M47 469l3 55l1 11q27 264 178 418.5t373 148.5q183 -4 290.5 -119.5t105.5 -304.5h-263q0 87 -38 137t-114 54q-202 6 -245 -295q-15 -109 -11 -184q10 -175 150 -178q78 -2 130 42.5t68 118.5l265 1q-7 -114 -71.5 -205t-172 -142t-226.5 -48q-197 3 -312 136t-111 354z M277 -466l8 170q111 5 128 88q12 61 -86 68l-35 3l43 142l209 3l-20 -64q62 -13 93.5 -56.5t31.5 -105.5q0 -115 -96 -179t-276 -69z" />
<glyph unicode="&#xe8;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM323 1534l291 2l143 -310l-211 1zM360 643 h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177z" />
<glyph unicode="&#xe9;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM360 643h388l6 26q6 40 1 76 q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177zM481 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xea;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM262 1241v23l321 272l161 1l261 -277v-21 l-216 5l-123 144l-175 -143zM360 643h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177z" />
<glyph unicode="&#xeb;" horiz-adv-x="1084" d="M60 501l3 40q15 158 92 290t198 203.5t268 67.5q209 -4 316.5 -153.5t81.5 -378.5l-16 -123h-663q-4 -105 51 -168t150 -65q154 -4 270 119l129 -160q-61 -92 -176 -143.5t-247 -49.5q-142 1 -251.5 69.5t-163.5 188t-42 263.5zM276 1362q-2 54 36 91.5t95 39.5 q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM360 643h388l6 26q6 40 1 76q-10 58 -49 90.5t-99 33.5q-78 2 -138.5 -49t-108.5 -177zM749 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5 t-41 90.5z" />
<glyph unicode="&#xec;" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM77 1519l291 2l143 -310l-211 1z" />
<glyph unicode="&#xed;" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM234 1211l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xee;" horiz-adv-x="554" d="M16 1226v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM25 0l188 1082h282l-188 -1082h-282z" />
<glyph unicode="&#xef;" horiz-adv-x="554" d="M25 0l188 1082h282l-188 -1082h-282zM30 1347q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM503 1347q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xf0;" horiz-adv-x="1153" d="M64 460q13 148 80 266t175.5 180.5t245.5 60.5q129 -4 237 -78q-6 140 -92 265l-211 -123l-62 128l161 89q-81 67 -235 109l108 222q223 -53 371 -180l192 112l60 -129l-146 -80q87 -155 121 -313t13 -336l-6 -52q-34 -281 -197.5 -454t-390.5 -168q-129 3 -230.5 65.5 t-153.5 174t-40 241.5zM346 460q-12 -109 31.5 -177.5t128.5 -71.5q101 -3 173.5 78.5t103.5 236.5l23 126l3 13q-27 41 -77 62t-111 21q-112 2 -186.5 -78.5t-88.5 -209.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1123" d="M-3 0l188 1082l264 1l-24 -128q130 151 315 147q153 -3 226 -112t53 -302l-114 -688h-282l116 691q5 39 2 71q-13 102 -128 105q-111 4 -199 -103l-135 -764h-282zM310 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10 q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
<glyph unicode="&#xf2;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5 q-126 4 -201.5 -118.5t-69.5 -329.5zM354 1534l291 2l143 -310l-211 1z" />
<glyph unicode="&#xf3;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5 q-126 4 -201.5 -118.5t-69.5 -329.5zM512 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xf4;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM293 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143zM337 421q2 -96 45 -151.5t121 -57.5 q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5z" />
<glyph unicode="&#xf5;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM299 1257q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10 q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5z" />
<glyph unicode="&#xf6;" horiz-adv-x="1133" d="M58 524q26 268 182 426t382 152q143 -2 246.5 -73.5t152 -197t34.5 -278.5q-23 -258 -179.5 -417.5t-386.5 -155.5q-141 2 -244 72.5t-152 195.5t-35 276zM307 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5 t-43.5 90.5zM337 421q2 -96 45 -151.5t121 -57.5q130 -4 204 119.5t69 324.5q-4 96 -46.5 153.5t-121.5 59.5q-126 4 -201.5 -118.5t-69.5 -329.5zM780 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xf7;" horiz-adv-x="1143" d="M55 571l40 230h1000l-41 -230h-999zM346 272q-2 66 43 112t114 46q67 2 113 -40t48 -108t-43.5 -111t-112.5 -45q-68 -2 -114 39.5t-48 106.5zM487 1084q-2 66 43 112t114 46q67 2 113 -40t48 -108t-43.5 -111t-112.5 -45q-68 -2 -114 39.5t-48 106.5z" />
<glyph unicode="&#xf8;" horiz-adv-x="1131" d="M27 -141l150 215q-119 131 -127 328q-3 57 5 143q20 162 98 292.5t200.5 199.5t273.5 67q91 -1 180 -32l100 144l174 -1l-150 -214q114 -134 123 -328q2 -58 -6 -141q-20 -162 -97 -289t-201 -197t-275 -68q-87 1 -171 29l-103 -149zM320 423q-4 -52 6 -103l356 540 q-32 12 -66 12q-127 2 -204 -111t-92 -338zM425 218q30 -8 59 -9q108 -2 182 80.5t102 242.5q11 76 14 119q3 48 -4 98z" />
<glyph unicode="&#xf9;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM362 1534l291 2l143 -310l-211 1z" />
<glyph unicode="&#xfa;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM520 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xfb;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM301 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#xfc;" horiz-adv-x="1122" d="M77 382l117 700h282l-119 -703q-4 -33 -1 -62q10 -100 111 -103q131 -4 217 101l135 767h284l-188 -1082h-263l21 112q-120 -135 -298 -132q-156 2 -236 112t-62 290zM315 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5 q-53 -2 -94.5 33.5t-43.5 90.5zM788 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#xfd;" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2q138 -4 202 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21zM470 1226l240 310h327l-318 -310h-249z" />
<glyph unicode="&#xfe;" horiz-adv-x="1137" d="M-67 -416l338 1952h284l-108 -549q113 119 262 115q156 -2 245.5 -112.5t95.5 -305.5q2 -62 -6 -146q-21 -173 -89.5 -304t-169 -194.5t-223.5 -60.5q-154 4 -248 116l-98 -511h-283zM341 316q37 -101 159 -103q98 -3 165.5 74.5t92.5 229.5l6 42l6 96q2 97 -35.5 154 t-109.5 59q-120 4 -202 -102z" />
<glyph unicode="&#xff;" horiz-adv-x="1007" d="M-55 -419l21 220l39 -2q138 -4 202 101l62 115l-177 1067h292l78 -670l309 670h314l-633 -1245q-68 -143 -159.5 -210t-211.5 -67q-47 0 -136 21zM265 1362q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5z M738 1362q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#x152;" horiz-adv-x="1934" d="M96 576l46 299q43 276 227.5 439t445.5 163l73 -2l208 -19h877l-43 -243h-652l-61 -347h558l-41 -235h-557l-68 -390h655l-42 -241h-842l-196 -17l-87 -1q-162 4 -284 81.5t-180 214.5t-37 298zM375 445q8 -106 68 -166.5t163 -64.5q78 -3 199 9l187 1008q-90 14 -183 16 q-153 0 -254 -97.5t-129 -273.5l-48 -301q-9 -67 -3 -130z" />
<glyph unicode="&#x153;" horiz-adv-x="1802" d="M74 523l3 22q26 227 158 378q161 184 409 180q107 -2 196 -41t142 -108q162 152 360 148q132 -4 224 -66.5t133 -173.5t24 -249l-25 -163h-628q-7 -105 40.5 -168t140.5 -67q137 -7 305 76l64 -190q-68 -60 -174.5 -91t-230.5 -29q-106 0 -195.5 38.5t-143.5 108.5 q-166 -152 -382 -148q-141 2 -241.5 72t-147.5 195t-31 276zM351 422q0 -98 41 -154t118 -58q108 -3 180 83t91 239l2 21l5 67q7 241 -161 249q-103 3 -173 -77t-93 -235l-5 -34zM1091 646h355q13 66 10 102q-5 57 -39 89t-92 33q-128 3 -206 -159z" />
<glyph unicode="&#x178;" horiz-adv-x="1238" d="M154 1455l309 1l177 -654l407 654h336l-636 -944l-88 -512h-298l95 545zM430 1672q-2 54 36 91.5t95 39.5q56 2 97 -34.5t41 -90.5q2 -53 -36.5 -90.5t-94.5 -39.5q-53 -2 -94.5 33.5t-43.5 90.5zM903 1672q-2 54 36 91.5t94 39.5q53 2 95.5 -33t44.5 -92 q0 -54 -38 -91.5t-94 -39.5t-97 34.5t-41 90.5z" />
<glyph unicode="&#x2c6;" horiz-adv-x="995" d="M234 1241v23l321 272l161 1l261 -277v-21l-216 5l-123 144l-175 -143z" />
<glyph unicode="&#x2dc;" horiz-adv-x="965" d="M220 1258q7 116 73.5 194t162.5 76q26 0 49.5 -7.5t79 -37.5t80 -38t52.5 -7q77 3 101 98l161 -10q-7 -118 -70.5 -194.5t-160.5 -76.5q-28 0 -53.5 8.5t-76.5 37t-76.5 37.5t-54.5 8q-76 -3 -101 -98z" />
<glyph unicode="&#x2000;" horiz-adv-x="968" />
<glyph unicode="&#x2001;" horiz-adv-x="1936" />
<glyph unicode="&#x2002;" horiz-adv-x="968" />
<glyph unicode="&#x2003;" horiz-adv-x="1936" />
<glyph unicode="&#x2004;" horiz-adv-x="645" />
<glyph unicode="&#x2005;" horiz-adv-x="484" />
<glyph unicode="&#x2006;" horiz-adv-x="322" />
<glyph unicode="&#x2007;" horiz-adv-x="322" />
<glyph unicode="&#x2008;" horiz-adv-x="242" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#x2011;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#x2012;" horiz-adv-x="780" d="M90 507l40 233h549l-41 -233h-548z" />
<glyph unicode="&#x2013;" horiz-adv-x="1265" d="M146 596l49 236h1008l-50 -236h-1007z" />
<glyph unicode="&#x2014;" horiz-adv-x="1526" d="M104 596l65 236h1344l-67 -236h-1342z" />
<glyph unicode="&#x2018;" horiz-adv-x="475" d="M178 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224z" />
<glyph unicode="&#x2019;" horiz-adv-x="466" d="M142 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381z" />
<glyph unicode="&#x201a;" horiz-adv-x="503" d="M-77 -223q96 144 121 261l34 191h232l-22 -143q-36 -232 -231 -391z" />
<glyph unicode="&#x201c;" horiz-adv-x="816" d="M186 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224zM518 1048l20 132q36 232 230 390l134 -82q-46 -68 -82 -137.5t-52 -151.5l-26 -151h-224z" />
<glyph unicode="&#x201d;" horiz-adv-x="822" d="M156 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381zM492 1091q103 148 129 260l33 185h225l-23 -148q-34 -221 -221 -381z" />
<glyph unicode="&#x201e;" horiz-adv-x="810" d="M-80 -244q96 148 124 282l40 225h232l-31 -191q-39 -238 -225 -397zM245 -244q105 161 132 279l40 228h232l-27 -177q-38 -244 -236 -411z" />
<glyph unicode="&#x2022;" horiz-adv-x="724" d="M156 720l1 34q3 108 69 175.5t173 67.5q99 -2 158.5 -64t59.5 -164l-1 -40q-6 -105 -73.5 -169t-168.5 -62q-99 2 -158.5 65t-59.5 157z" />
<glyph unicode="&#x2026;" horiz-adv-x="1480" d="M51 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM510 137q-2 67 43 113t113 48q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109zM960 137q-2 67 43 113t113 48 q67 2 114.5 -41.5t47.5 -109.5q2 -66 -44 -112.5t-113 -46.5q-67 -2 -113 40t-48 109z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="629" d="M90 513l1 21l330 390h203l-316 -416l162 -382l-167 -1z" />
<glyph unicode="&#x203a;" horiz-adv-x="609" d="M-15 124l315 415l-161 383l167 1l213 -387l-1 -22l-330 -390h-203z" />
<glyph unicode="&#x205f;" horiz-adv-x="484" />
<glyph unicode="&#x20ac;" d="M70 516l27 152h164l22 124h-164l27 152l154 -1q73 263 243.5 399t418.5 134q100 -2 238 -32l-59 -243q-87 33 -173 35q-276 4 -373 -293l333 1l-27 -152h-324l-22 -124h326l-27 -152h-319q-9 -66 -1 -119q12 -83 71 -128t156 -46q84 -2 193 30l12 -245q-132 -29 -243 -25 q-155 1 -273.5 71t-172.5 191.5t-32 272.5z" />
<glyph unicode="&#x2122;" horiz-adv-x="1264" d="M241 1348l19 108h397l-19 -108h-125l-75 -431h-140l75 431h-132zM629 914l95 542h150l48 -364l185 364h153l-95 -542h-126l58 328l-155 -327l-71 -2l-51 365l-64 -364h-127z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1854" d="M74 870l37 212l156 1l11 85q24 189 140.5 291.5t296.5 100.5q55 -1 153 -22l-25 -225q-48 12 -83 12q-74 1 -126.5 -37t-67.5 -112l-16 -94h334l6 36q36 211 169 325t347 115h10q84 -1 164 -19.5t161 -41.5l-65 -238q-142 47 -256 49q-92 0 -158 -44t-87 -137l-9 -46 l218 1l-37 -212h-207l-151 -870h-283l151 870h-343l-151 -870h-284l151 870h-156zM1334 0l187 1082h284l-188 -1082h-283z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1854" d="M74 870l37 212l156 1l14 107q26 173 141.5 272t293.5 97q59 -2 152 -21l-25 -225q-48 12 -83 12q-77 0 -129.5 -40t-65.5 -114l-15 -89l343 1l10 78q28 212 179 315q125 85 307 83l153 -5l331 -28l-256 -1526h-283l233 1314q-84 11 -150 11q-94 0 -154 -43.5t-74 -120.5 l-12 -79h209l-37 -212h-209l-151 -870h-283l151 870h-343l-151 -870h-284l151 870h-156z" />
<hkern u1="&#x20;" u2="T" k="60" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-38" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="248" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="81" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="274" />
<hkern u1="F" u2="&#x201e;" k="274" />
<hkern u1="F" u2="&#x201a;" k="274" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="192" />
<hkern u1="F" u2="&#xc4;" k="192" />
<hkern u1="F" u2="&#xc3;" k="192" />
<hkern u1="F" u2="&#xc2;" k="192" />
<hkern u1="F" u2="&#xc1;" k="192" />
<hkern u1="F" u2="&#xc0;" k="192" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="208" />
<hkern u1="F" u2="A" k="192" />
<hkern u1="F" u2="&#x2e;" k="274" />
<hkern u1="F" u2="&#x2c;" k="274" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="52" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="297" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="33" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="50" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="84" />
<hkern u1="T" u2="&#xc6;" k="189" />
<hkern u1="T" u2="&#xbb;" k="146" />
<hkern u1="T" u2="&#xab;" k="148" />
<hkern u1="T" u2="w" k="47" />
<hkern u1="T" u2="r" k="65" />
<hkern u1="T" u2="&#x20;" k="60" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="e" u2="&#x2019;" k="64" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="h" u2="&#x2019;" k="104" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="m" u2="&#x2019;" k="120" />
<hkern u1="n" u2="&#x2019;" k="120" />
<hkern u1="o" u2="&#x2019;" k="112" />
<hkern u1="r" u2="&#x2019;" k="-16" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-50" />
<hkern u1="r" u2="f" k="-20" />
<hkern u1="t" u2="&#x2019;" k="-24" />
<hkern u1="t" u2="&#xf6;" k="30" />
<hkern u1="t" u2="&#xf5;" k="30" />
<hkern u1="t" u2="&#xf4;" k="30" />
<hkern u1="t" u2="&#xf3;" k="30" />
<hkern u1="t" u2="&#xf2;" k="30" />
<hkern u1="t" u2="o" k="30" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="81" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="81" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="81" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="81" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="81" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="81" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xe8;" u2="&#x2019;" k="64" />
<hkern u1="&#xe9;" u2="&#x2019;" k="64" />
<hkern u1="&#xea;" u2="&#x2019;" k="64" />
<hkern u1="&#xeb;" u2="&#x2019;" k="64" />
<hkern u1="&#xf1;" u2="&#x2019;" k="120" />
<hkern u1="&#xf2;" u2="&#x2019;" k="112" />
<hkern u1="&#xf3;" u2="&#x2019;" k="112" />
<hkern u1="&#xf4;" u2="&#x2019;" k="112" />
<hkern u1="&#xf5;" u2="&#x2019;" k="112" />
<hkern u1="&#xf6;" u2="&#x2019;" k="112" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="&#x153;" k="104" />
<hkern u1="&#x2019;" u2="&#xf6;" k="144" />
<hkern u1="&#x2019;" u2="&#xf5;" k="144" />
<hkern u1="&#x2019;" u2="&#xf4;" k="144" />
<hkern u1="&#x2019;" u2="&#xf3;" k="144" />
<hkern u1="&#x2019;" u2="&#xf2;" k="144" />
<hkern u1="&#x2019;" u2="&#xeb;" k="104" />
<hkern u1="&#x2019;" u2="&#xea;" k="104" />
<hkern u1="&#x2019;" u2="&#xe9;" k="104" />
<hkern u1="&#x2019;" u2="&#xe8;" k="104" />
<hkern u1="&#x2019;" u2="&#xe7;" k="104" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="s" k="232" />
<hkern u1="&#x2019;" u2="q" k="104" />
<hkern u1="&#x2019;" u2="o" k="144" />
<hkern u1="&#x2019;" u2="g" k="104" />
<hkern u1="&#x2019;" u2="e" k="104" />
<hkern u1="&#x2019;" u2="d" k="104" />
<hkern u1="&#x2019;" u2="c" k="104" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="85" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="122" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="208" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="82" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="m,n,p,ntilde" k="89" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="65" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="258" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="89" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="T" g2="s" k="76" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="272" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="168" />
<hkern g1="T" g2="J" k="216" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="164" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="123" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="64" />
<hkern g1="L" g2="V" k="206" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="24" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="279" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="288" />
<hkern g1="L" g2="T" k="205" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="14" />
<hkern g1="L" g2="W" k="93" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="178" />
<hkern g1="P" g2="X" k="51" />
<hkern g1="P" g2="Z" k="36" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="404" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="J" k="184" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="215" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="157" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="156" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="150" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="231" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="152" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="63" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="143" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="17" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="80" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="88" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="167" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="36" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="173" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="30" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="40" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="91" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="37" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="92" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="285" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 80 KiB

View File

@@ -1,666 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="robotoitalic" horiz-adv-x="1126" >
<font-face units-per-em="2048" ascent="1536" descent="-512" />
<missing-glyph horiz-adv-x="502" />
<glyph unicode="&#xfb01;" horiz-adv-x="1110" d="M88 939l25 143l166 1l14 100q27 183 147 283q115 95 290 93q71 -2 137.5 -19.5t136.5 -41.5l-44 -158q-113 51 -224 53q-229 4 -263 -224l-13 -87h215l-25 -143h-214l-163 -939h-182l163 939h-166zM659 0l188 1082h182l-188 -1082h-182z" />
<glyph unicode="&#xfb02;" horiz-adv-x="1138" d="M116 939l25 143h166l18 127q26 167 134 260t274 91q109 -2 293 -44l96 -20l-254 -1496h-181l240 1381q-129 22 -188 22q-99 0 -159 -55.5t-75 -150.5l-18 -115h225l-25 -143h-224l-163 -939h-181l164 939h-167z" />
<glyph horiz-adv-x="10" />
<glyph horiz-adv-x="10" />
<glyph unicode="&#xd;" horiz-adv-x="502" />
<glyph horiz-adv-x="10" />
<glyph unicode=" " horiz-adv-x="502" />
<glyph unicode="&#x09;" horiz-adv-x="502" />
<glyph unicode="&#xa0;" horiz-adv-x="502" />
<glyph unicode="!" horiz-adv-x="521" d="M67 90q1 47 30 77.5t77 32.5q46 2 76 -28t30 -76q0 -47 -30 -76.5t-77 -31.5t-76.5 27t-29.5 75zM141 411l169 1045h190l-195 -1045h-164z" />
<glyph unicode="&#x22;" horiz-adv-x="645" d="M200 1041l80 503l136 -9l-23 -145l-83 -348zM462 1042l80 502l136 -9l-23 -145l-83 -348h-110z" />
<glyph unicode="#" horiz-adv-x="1233" d="M82 410l24 137h255l128 354h-248l24 139h274l152 416h145l-153 -416h251l152 416h146l-153 -416h196l-24 -139h-222l-128 -354h216l-24 -137h-241l-149 -410h-146l150 410h-250l-150 -410h-144l149 410h-230zM505 547h250l129 354h-250z" />
<glyph unicode="$" d="M85 429h181q-11 -131 47.5 -209t176.5 -80q127 -2 212.5 64.5t98.5 177.5q10 86 -43 150t-179.5 112.5t-201.5 109.5q-148 121 -134 317q11 164 118.5 271.5t284.5 130.5l39 219h146l-40 -222q148 -29 220.5 -149.5t57.5 -312.5h-179q8 147 -43.5 225.5t-151.5 81.5 q-113 2 -186.5 -63.5t-85.5 -176.5q-9 -86 37.5 -148t183.5 -116.5t208 -114t103.5 -136.5t25.5 -176q-13 -171 -127.5 -276t-303.5 -125l-34 -191h-145l35 193q-164 24 -248 141t-73 303z" />
<glyph unicode="%" horiz-adv-x="1465" d="M195 1099l6 64q13 144 104.5 230.5t219.5 84.5q121 -4 192.5 -88.5t63.5 -213.5l-6 -77q-15 -134 -105.5 -219t-215.5 -81q-121 2 -194 88t-65 212zM261 184l881 1128l99 -71l-881 -1129zM330 1097q-5 -81 29.5 -128.5t98.5 -49.5q68 -2 118.5 48.5t61.5 131.5l9 78 q7 76 -26 127t-100 53q-69 2 -120 -49t-62 -132zM741 279l6 68q13 139 102 226t221 85q124 -4 195 -89.5t63 -211.5l-6 -67q-13 -141 -103.5 -228.5t-218.5 -83.5q-120 2 -193.5 87t-65.5 214zM876 277q-5 -80 28.5 -128.5t99.5 -50.5q70 -2 119.5 49t60.5 132l9 79 q7 75 -26 126t-100 53q-71 2 -121 -49t-61 -131z" />
<glyph unicode="&#x26;" horiz-adv-x="1245" d="M71 384q15 186 222 332l114 76l-43 77q-72 132 -64 245q12 165 120 265.5t272 96.5q135 -2 223 -87.5t80 -212.5q-9 -172 -213 -315l-147 -98l249 -381q91 135 114 290h161q-27 -255 -181 -427l157 -245h-202l-73 113q-174 -136 -383 -132q-189 2 -304 114.5t-102 288.5z M255 383q-15 -108 48 -179t180 -73q134 -3 284 113l-271 424l-43 -30q-179 -124 -198 -255zM478 1121q-8 -84 49 -185l27 -47l153 103q107 80 118 185q6 64 -35 106t-109 42q-83 0 -139 -60.5t-64 -143.5z" />
<glyph unicode="'" horiz-adv-x="356" d="M170 1057l77 479h146l-19 -118l-76 -361h-128z" />
<glyph unicode="(" horiz-adv-x="689" d="M117 393q2 96 14 183l2 11q33 231 122.5 450t219.5 373.5t290 233.5l27 -124q-157 -117 -269.5 -305.5t-173.5 -448t-59 -511.5q0 -207 53.5 -364.5t154.5 -248.5l-45 -112q-167 116 -255.5 343t-80.5 520z" />
<glyph unicode=")" horiz-adv-x="701" d="M-113 -356q343 258 458 829q46 230 44 443q-5 429 -208 615l47 112q112 -78 189.5 -207.5t114 -301t32.5 -355.5q-3 -97 -15 -183l-2 -11q-35 -244 -127 -461.5t-220.5 -367t-284.5 -227.5z" />
<glyph unicode="*" horiz-adv-x="866" d="M107 1077l68 144l278 -113l51 348h150l-70 -344l303 108l19 -159l-315 -91l147 -275l-128 -88l-131 290l-222 -280l-114 98l241 272z" />
<glyph unicode="+" horiz-adv-x="1136" d="M76 606l31 175h393l74 425h182l-74 -425h394l-31 -175h-393l-80 -460h-182l80 460h-394z" />
<glyph unicode="," horiz-adv-x="400" d="M-113 -216q116 143 144 284l26 151h177l-21 -135q-36 -228 -222 -375z" />
<glyph unicode="-" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="." horiz-adv-x="533" d="M53 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
<glyph unicode="/" horiz-adv-x="829" d="M-113 -125l864 1581h163l-863 -1581h-164z" />
<glyph unicode="0" d="M112 475q2 74 11 146l36 243q48 311 183 464t356 148q186 -4 277.5 -127.5t84.5 -358.5q-3 -75 -12 -147l-35 -235q-53 -329 -187 -481t-354 -147q-184 4 -276 130.5t-84 364.5zM286 402q5 -265 196 -272q133 -6 219.5 98t123.5 330l48 318q14 121 13 188 q-5 254 -197 261q-140 5 -226.5 -103.5t-120.5 -340.5l-43 -290q-14 -116 -13 -189z" />
<glyph unicode="1" d="M249 1092l31 176l540 195h32l-248 -1463h-182l214 1228z" />
<glyph unicode="2" d="M23 0l22 141l537 522l98 97q169 169 187 312q13 110 -43 179.5t-158 73.5q-131 4 -219 -76.5t-107 -220.5l-179 -1q13 134 82.5 237.5t183 159t246.5 52.5q181 -4 287.5 -109.5t91.5 -273.5q-17 -192 -221 -404l-92 -93l-468 -445h703l-24 -151h-927z" />
<glyph unicode="3" d="M60 385l181 -1q-6 -112 54 -180.5t174 -72.5q128 -4 213 73t97 206q11 119 -54 185.5t-194 70.5l-139 1l24 151l120 -1q132 0 222.5 69.5t103.5 188.5q13 116 -43 182.5t-163 68.5q-114 2 -193.5 -66.5t-97.5 -184.5l-179 -1q17 180 153.5 292.5t325.5 110.5 q183 -4 287.5 -114.5t90.5 -291.5q-9 -103 -79 -188t-194 -141q99 -40 148 -126.5t41 -202.5q-16 -197 -156.5 -317t-341.5 -116q-187 4 -298 116t-103 289z" />
<glyph unicode="4" d="M5 338l21 119l800 999h198l-167 -967h196l-27 -151h-195l-59 -338h-182l59 338h-644zM243 489h432l130 716l-29 -42z" />
<glyph unicode="5" d="M114 384h169q7 -120 68 -186t165 -68q128 -4 215.5 91t103.5 249q14 135 -47 222.5t-179 91.5q-73 2 -129.5 -22t-112.5 -69l-148 40l185 723h726l-27 -171h-570l-112 -398q110 65 238 63q181 -2 278 -136.5t79 -342.5q-19 -224 -159 -360t-349 -132q-174 2 -281 112 t-113 293z" />
<glyph unicode="6" d="M120 407q-8 105 25 284q69 373 272.5 570t517.5 197h20l-16 -157h-35q-200 -4 -342 -124t-220 -354q136 136 318 132q115 -2 197 -63.5t120.5 -170t26.5 -239.5q-20 -221 -158.5 -364.5t-340.5 -137.5q-162 4 -266 119t-119 308zM299 450q0 -82 25 -159t74 -117t115 -41 q121 -5 207.5 90t103.5 250q10 90 -11 165t-69.5 118.5t-122.5 45.5q-97 2 -182 -56t-131 -148l-7 -67z" />
<glyph unicode="7" d="M157 0l787 1304h-760l24 152h956l-18 -114l-791 -1342h-198z" />
<glyph unicode="8" d="M80 385q11 125 88 218.5t210 151.5q-78 54 -115.5 136t-29.5 176q14 185 145 299t322 110q174 -4 276 -113t88 -278q-9 -109 -77.5 -196.5t-186.5 -144.5q94 -54 139.5 -144.5t37.5 -197.5q-15 -193 -158 -309.5t-345 -112.5q-189 4 -299 117t-95 288zM262 388 q-12 -116 48.5 -186t171.5 -72q126 -4 214 73.5t102 202.5q12 113 -48 188.5t-174 79.5q-124 2 -212 -78.5t-102 -207.5zM412 1064q-11 -104 42.5 -171t150.5 -69q109 -2 186.5 70.5t90.5 187.5q11 101 -41.5 170t-149.5 73q-112 2 -189 -71.5t-90 -189.5z" />
<glyph unicode="9" d="M160 965q13 144 81 264t177.5 185.5t241.5 61.5q174 -4 273 -126t107 -327q3 -107 -25 -266q-66 -374 -260.5 -563.5t-499.5 -195.5h-45l16 156h37q215 4 352.5 120.5t207.5 365.5q-74 -78 -157 -116.5t-165 -36.5q-115 2 -196.5 65t-119 173t-25.5 240zM339 975 q-7 -61 2 -124t36 -111q54 -97 162 -100q91 -4 175 51.5t138 149.5l8 73l3 81q-4 155 -57.5 239t-153.5 88q-124 5 -211.5 -95.5t-101.5 -251.5z" />
<glyph unicode=":" horiz-adv-x="491" d="M43 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM196 977q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
<glyph unicode=";" horiz-adv-x="430" d="M-101 -216q116 143 144 284l26 151h177l-21 -135q-36 -228 -222 -375zM173 977q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5z" />
<glyph unicode="&#x3c;" horiz-adv-x="1020" d="M65 579l26 146l861 378l-36 -205l-653 -258l565 -253l-33 -187z" />
<glyph unicode="=" horiz-adv-x="1100" d="M112 399l28 160h811l-29 -160h-810zM184 814l28 161h811l-29 -161h-810z" />
<glyph unicode="&#x3e;" horiz-adv-x="1048" d="M58 191l36 201l687 262l-598 259l33 182l764 -379l-26 -145z" />
<glyph unicode="?" horiz-adv-x="948" d="M165 1115q19 165 141.5 264.5t299.5 97.5q168 -4 260.5 -106t78.5 -267q-17 -182 -204 -350l-122 -104q-98 -89 -121 -240l-177 -1q13 115 61 203t156 184l81 71q125 111 141 233q12 94 -31 153t-134 63q-102 2 -167.5 -54.5t-82.5 -145.5zM250 90q1 47 30 77.5t77 32.5 q46 1 76.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -31q-47 -2 -76.5 27t-29.5 75z" />
<glyph unicode="@" horiz-adv-x="1794" d="M70 246q-2 217 77.5 442.5t221 397t322 260t380.5 85.5q194 -3 333.5 -87t213 -245t73.5 -365q0 -225 -65.5 -401t-176 -266.5t-250.5 -86.5q-89 2 -143.5 46.5t-67.5 121.5q-136 -172 -279 -169q-116 2 -172 93t-44 247q10 161 86 328.5t186 256t240 86.5 q139 -3 272 -105l-133 -558q-10 -66 -10 -93q-5 -135 92 -138q147 -6 238 165t102 441q7 180 -46 317t-168.5 207t-284.5 73q-221 4 -410 -123t-311.5 -370t-134.5 -522q-8 -181 47 -323t167 -214.5t274 -73.5q169 -4 339 78l27 -117q-139 -87 -368 -87q-191 1 -332 84.5 t-218 244t-77 370.5zM649 294q-5 -171 112 -174q107 -5 200 144l32 53l1 11l133 506q-52 28 -107 29q-139 5 -235.5 -135t-130.5 -377z" />
<glyph unicode="A" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679z" />
<glyph unicode="B" horiz-adv-x="1247" d="M59 0l253 1456l427 -1q223 0 334 -100q99 -89 99 -240q0 -19 -2 -39q-18 -209 -263 -315q99 -38 147 -130q41 -78 41 -169q0 -17 -2 -34q-15 -197 -158 -312.5t-370 -115.5h-506zM274 157l297 -1q136 0 228 73t107 197q3 24 3 46q0 86 -44 138q-55 66 -173 70l-327 1z M392 835l271 -1q127 0 214.5 65t102.5 179q3 20 3 39q-1 77 -45 121q-54 54 -180 59l-286 1z" />
<glyph unicode="C" horiz-adv-x="1303" d="M120 494q-1 22 -1 43q0 59 8 117l17 120q46 328 230 518q179 185 434 184h13q205 -4 325 -132.5t127 -356.5h-187q-13 306 -240 330l-33 2h-12q-181 -1 -303 -141q-126 -146 -164 -397l-22 -151l-6 -88v-28q0 -164 66 -264q72 -108 212 -113h18q140 0 234 73 q100 78 151 251l182 3q-43 -226 -205 -358q-155 -126 -369 -126h-20q-135 3 -236 66.5t-157 183t-62 264.5z" />
<glyph unicode="D" horiz-adv-x="1313" d="M59 0l253 1456l378 -1q178 0 306 -89q129 -90 185 -246q40 -111 40 -240q0 -53 -7 -110l-10 -73q-44 -318 -247 -507.5t-510 -189.5h-388zM274 157l185 -1q212 0 359.5 132t191.5 362q27 140 27 248q0 34 -3 65q-15 155 -103 242.5t-236 91.5l-223 1z" />
<glyph unicode="E" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899z" />
<glyph unicode="F" horiz-adv-x="1108" d="M59 0l253 1456h876l-28 -158h-688l-86 -498h593l-28 -157h-592l-112 -643h-188z" />
<glyph unicode="G" horiz-adv-x="1363" d="M128 502q-1 19 -1 40q0 112 31 282q36 203 127 351t227 226q132 75 300 75h13q203 -4 323.5 -120.5t137.5 -327.5h-186q-11 138 -83 212t-199 78h-18q-176 0 -296 -135q-127 -142 -167 -415l-19 -140l-3 -76q0 -197 81 -304.5t227 -109.5h18q198 0 317 104l60 327h-328 l28 156h512l-83 -533q-73 -103 -213 -158q-134 -54 -306 -54h-12q-143 3 -250 67t-168 183.5t-70 271.5z" />
<glyph unicode="H" horiz-adv-x="1426" d="M59 0l253 1456h188l-109 -626h710l109 626h189l-253 -1456h-188l117 673h-711l-117 -673h-188z" />
<glyph unicode="I" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187z" />
<glyph unicode="J" horiz-adv-x="1106" d="M22 402h187q-2 -20 -2 -38q0 -94 47 -154q56 -71 168 -73h11q116 0 197 77q85 81 104 210l176 1032h188l-175 -1031q-29 -206 -167 -329q-134 -118 -331 -118h-13q-192 4 -297 116q-94 101 -94 269q0 19 1 39z" />
<glyph unicode="K" horiz-adv-x="1255" d="M59 0l253 1456h188l-124 -709l742 709h242l-677 -652l453 -804h-209l-383 675l-213 -191l-84 -484h-188z" />
<glyph unicode="L" horiz-adv-x="1079" d="M59 0l253 1456h189l-226 -1299h670l-28 -157h-858z" />
<glyph unicode="M" horiz-adv-x="1744" d="M59 0l253 1456h237l255 -1186l668 1186h247l-253 -1456h-187l100 576l119 586l-660 -1162h-144l-260 1185l-90 -628l-97 -557h-188z" />
<glyph unicode="N" horiz-adv-x="1426" d="M59 0l253 1456h182l521 -1135l197 1135h187l-253 -1456h-182l-520 1130l-196 -1130h-189z" />
<glyph unicode="O" horiz-adv-x="1376" d="M125 515q-1 19 -1 39q0 110 28 260q33 178 114 321t197 229q152 112 345 112h13q213 -4 336 -147.5t132 -388.5q1 -14 0 -30q1 -97 -21 -237q-26 -162 -91.5 -301t-166.5 -233q-171 -159 -403 -159h-14q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q0 -14 -1 -28 q0 -176 71 -279q76 -111 221 -115h13q181 0 301 136q124 142 165 398q20 126 23 218v29q0 177 -69 277q-75 108 -223 112h-13q-127 0 -227 -72q-106 -76 -173 -227.5t-85 -383.5z" />
<glyph unicode="P" horiz-adv-x="1263" d="M59 0l253 1456l486 -1q225 1 347 -119q107 -105 107 -271q0 -23 -2 -47q-18 -209 -166.5 -329t-391.5 -120l-346 1l-99 -570h-188zM373 727l324 -1q153 0 251 77t115 214q3 24 3 46q0 91 -54 153q-67 76 -195 81l-345 1z" />
<glyph unicode="Q" horiz-adv-x="1376" d="M117 516q-1 20 -1 40q0 113 28 260q32 175 111 315.5t191 226.5q155 118 353 118h13q141 -3 245 -68t161 -188.5t63 -279.5q1 -19 1 -39q0 -64 -8 -128l-12 -85q-62 -431 -355 -612l217 -209l-139 -113l-254 243q-74 -16 -148 -16q-137 1 -241 66.5t-161.5 189 t-63.5 279.5zM303 564v-26q0 -100 27 -189q31 -100 98.5 -152t165.5 -55h17q173 0 293 133q125 140 167 395q21 127 24 224q1 17 1 33q0 176 -70 274q-76 107 -222 111h-13q-126 0 -227 -72q-105 -76 -172.5 -227.5t-85.5 -383.5z" />
<glyph unicode="R" horiz-adv-x="1233" d="M58 0l253 1456l438 -1q229 -1 349 -116q104 -99 104 -260q0 -26 -3 -53q-11 -137 -99.5 -241t-235.5 -157l226 -615l-1 -13h-200l-204 589h-336l-102 -589h-189zM376 746l276 -1q144 0 243 76.5t116 204.5q3 23 3 45q0 93 -53 151q-65 71 -198 75l-291 1z" />
<glyph unicode="S" horiz-adv-x="1189" d="M46 423l188 -1q-1 -13 -1 -26q-1 -112 71 -180q80 -76 225 -79h9q139 0 230 63q94 65 109 175q2 17 2 33q0 135 -168 201l-173 63l-58 25q-274 125 -274 345q0 14 1 29q10 121 83 214q74 93 194 143q114 48 241 48h15q132 -3 236 -59q103 -57 157 -157q49 -90 48 -201 v-25l-189 1q1 17 1 33q0 110 -61 174q-70 74 -200 76h-8q-132 0 -221 -64q-92 -66 -106 -180q-2 -13 -2 -26q0 -130 185 -200l149 -53l75 -32q262 -121 262 -351q0 -17 -1 -35q-11 -123 -83 -212.5t-196 -138.5q-116 -46 -249 -46h-16q-137 1 -250.5 58.5t-172.5 157.5 q-53 89 -53 200q0 14 1 27z" />
<glyph unicode="T" horiz-adv-x="1195" d="M168 1298l28 158h1093l-28 -158h-453l-225 -1298h-187l225 1298h-453z" />
<glyph unicode="U" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-3 -30 -3 -58q0 -113 55 -183q69 -88 209 -91h19q140 1 238 83q104 88 131 248l168 988h189l-168 -985q-34 -227 -196 -361q-157 -131 -378 -131h-13q-143 3 -249 65q-105 60 -155 172q-37 83 -37 184q0 34 4 70z" />
<glyph unicode="V" horiz-adv-x="1274" d="M164 1456h197l213 -1199l591 1199h212l-752 -1456h-166z" />
<glyph unicode="W" horiz-adv-x="1772" d="M195 1456h183l68 -1007l-4 -176l68 172l435 1011h159l115 -1024l10 -166l63 201l372 989h193l-570 -1456h-171l-126 1069l-4 100l-42 -116l-464 -1053h-171z" />
<glyph unicode="X" horiz-adv-x="1255" d="M-44 0l579 743l-330 713h208l253 -557l425 557h232l-567 -731l339 -725h-211l-258 567l-438 -567h-232z" />
<glyph unicode="Y" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554z" />
<glyph unicode="Z" horiz-adv-x="1199" d="M-21 0l27 154l966 1144h-756l28 158h986l-26 -151l-970 -1148h802l-28 -157h-1029z" />
<glyph unicode="[" horiz-adv-x="537" d="M-1 -312l308 1976h368l-25 -152h-185l-261 -1672h186l-24 -152h-367z" />
<glyph unicode="\" horiz-adv-x="825" d="M191 1456h164l315 -1581h-163z" />
<glyph unicode="]" horiz-adv-x="537" d="M-134 -312l24 152h187l261 1672h-188l25 152h368l-309 -1976h-368z" />
<glyph unicode="^" horiz-adv-x="840" d="M79 729l417 727h124l163 -727h-158l-101 480l-268 -480h-177z" />
<glyph unicode="_" horiz-adv-x="906" d="M-127 -151l27 151h890l-27 -151h-890z" />
<glyph unicode="`" horiz-adv-x="624" d="M207 1534h205l143 -294h-143z" />
<glyph unicode="a" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q2 17 2 33q0 75 -40 121q-48 56 -142 58h-7q-87 0 -157 -46q-72 -48 -88 -125l-182 -1q9 95 74 168.5t167 113.5q97 39 201 39h10q169 -5 263 -103q81 -85 81 -217q0 -21 -2 -44l-88 -536l-5 -77v-14q0 -48 12 -95 l-2 -17h-184q-7 29 -7 57l3 57q-145 -134 -307 -134h-9q-143 2 -233 90q-82 81 -82 200q0 11 1 22zM244 319q-2 -13 -2 -25q0 -60 38 -102q44 -50 129 -52h8q83 0 157 42q78 44 133 120l39 223l-137 1q-171 0 -262 -54t-103 -153z" />
<glyph unicode="b" horiz-adv-x="1125" d="M31 0l267 1536h181l-109 -574q126 140 306 140h10q156 -4 243 -115t92 -306v-16q0 -56 -6 -108l-2 -21q-20 -166 -91 -299t-172 -197q-96 -61 -213 -61h-11q-196 4 -291 147l-37 -126h-167zM266 305q60 -165 225 -169h12q99 0 173 63q80 67 121 187.5t44 254.5v16 q0 135 -49 207q-52 78 -159 82h-8q-164 0 -278 -170z" />
<glyph unicode="c" horiz-adv-x="1050" d="M84 517l5 50q19 156 91 279q72 124 188 192q110 65 241 64h15q170 -4 272 -114t102 -279l-169 1q-2 106 -59 171.5t-154 69.5h-8q-136 0 -226 -105q-94 -108 -117 -302l-3 -26q-4 -38 -3 -78q0 -27 1 -54q7 -117 66 -185t162 -71h6q93 0 169 56q78 58 102 154l171 1 q-15 -102 -81.5 -186t-167.5 -131q-95 -44 -194 -44h-13q-135 2 -228 70q-94 70 -138 192q-33 93 -33 203q0 35 3 72z" />
<glyph unicode="d" horiz-adv-x="1130" d="M78 402q-1 16 -1 34q0 47 6 107q20 165 91 298t175 199q99 63 218 63h11q181 -4 278 -132l104 565h181l-266 -1536h-165l19 116q-124 -136 -306 -136h-10q-150 4 -239 117.5t-96 304.5zM257 439v-15q0 -132 51 -207q54 -79 158 -81h13q149 0 266 158l86 500 q-60 148 -218 152h-9q-102 0 -180 -64q-82 -68 -124 -189.5t-43 -253.5z" />
<glyph unicode="e" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 201q108 65 233 64h11q167 -4 262 -111t104 -290q1 -20 1 -39q0 -46 -5 -91l-11 -83h-707q-4 -31 -3 -61q0 -108 52 -189q66 -103 198 -107h8q155 0 288 144l104 -88q-68 -97 -176 -153q-104 -54 -230 -54h-9q-202 4 -316 149 q-98 125 -98 311q0 29 2 60zM286 640l526 -1l4 16q4 28 4 54q0 91 -44 155q-56 84 -162 87h-8q-108 0 -188 -76q-84 -79 -132 -235z" />
<glyph unicode="f" horiz-adv-x="700" d="M116 939l25 143h166l18 128q26 163 126 255q103 94 261 94h7q51 0 129 -17l-22 -151q-48 10 -97 12q-94 0 -152.5 -58.5t-72.5 -155.5l-16 -107h224l-25 -143h-224l-163 -939h-181l164 939h-167z" />
<glyph unicode="g" horiz-adv-x="1125" d="M4 -238l103 111q98 -145 259 -149h13q120 0 205 72q90 76 119 216l20 96q-128 -128 -299 -128h-10q-101 3 -175.5 54.5t-115.5 149t-45 217.5v25q0 51 6 117q24 177 95.5 307.5t174.5 193.5q97 59 213 59h11q188 -4 284 -142l36 121h166l-180 -1059q-29 -207 -168 -331 q-133 -119 -324 -119h-19q-110 2 -210.5 52t-158.5 137zM259 440v-15q0 -132 49 -207q53 -78 159 -82h8q157 0 271 159l85 497q-60 148 -217 154h-9q-141 0 -233 -120q-94 -124 -111 -335z" />
<glyph unicode="h" horiz-adv-x="1104" d="M31 0l267 1536h181l-110 -586q138 151 318 151h9q152 -3 226 -105q58 -81 58 -214q0 -35 -4 -73l-118 -709h-181l119 712q3 27 3 51q0 21 -2 40q-17 140 -165 143h-7q-161 0 -279 -174l-134 -772h-181z" />
<glyph unicode="i" horiz-adv-x="492" d="M47 0l188 1082h180l-188 -1082h-180zM300 1444q29 31 76 33h6q42 1 70 -27q30 -30 31 -78q-1 -47 -30.5 -77t-76.5 -32h-6q-43 0 -71 27q-29 28 -29 73q0 49 30 81z" />
<glyph unicode="j" horiz-adv-x="484" d="M-236 -420l16 148q37 -9 83 -11q129 0 155 154l207 1211h181l-205 -1211q-20 -153 -103 -233q-80 -78 -209 -78h-6q-53 2 -119 20zM256 1366q1 47 29.5 78t76.5 33h6q42 0 70 -29q31 -30 31 -76q-1 -47 -31 -77t-77 -32h-6q-41 0 -69 28q-30 30 -30 75z" />
<glyph unicode="k" horiz-adv-x="1017" d="M32 0l267 1536h181l-160 -918l111 112l384 352h235l-497 -461l342 -621h-198l-278 499l-142 -127l-64 -372h-181z" />
<glyph unicode="l" horiz-adv-x="492" d="M47 0l266 1536h181l-267 -1536h-180z" />
<glyph unicode="m" horiz-adv-x="1751" d="M30 0l188 1082l170 1l-23 -121q132 140 319 140h10q103 -2 174.5 -47t98.5 -127q149 174 350 174h9q162 -4 239 -109q61 -83 61 -212q0 -33 -4 -70l-119 -711h-180l118 713q3 26 3 49.5t-3 45.5q-19 136 -178 139h-6q-95 1 -173 -61q-80 -64 -104 -167l-123 -719h-182 l120 712q3 24 3 46q0 78 -36 125q-46 60 -145 62h-8q-163 0 -261 -154l-137 -791h-181z" />
<glyph unicode="n" horiz-adv-x="1106" d="M31 0l188 1082l171 1l-26 -137q142 156 323 156h9q153 -4 226 -106q58 -81 58 -214q0 -35 -4 -73l-118 -709h-181l119 712q3 27 3 51q0 21 -2 40q-17 140 -165 143h-5q-160 0 -281 -174l-134 -772h-181z" />
<glyph unicode="o" horiz-adv-x="1143" d="M82 523q15 168 91 302q75 133 195 207q113 70 249 70h15q136 -2 233 -74t143 -198q35 -96 36 -205q0 -35 -4 -72l-2 -22q-19 -158 -94 -285.5t-194 -198.5q-113 -67 -246 -67h-15q-135 2 -232.5 74t-142.5 196q-35 96 -35 207q0 33 3 66zM264 391q10 -118 70.5 -188 t161.5 -73h11q84 0 155 44q76 48 128 144t67 213q5 57 5 102q0 29 -2 53q-12 121 -73 191t-162 74h-7q-135 0 -231 -110q-98 -113 -121 -296l-2 -23q-4 -32 -4 -64.5t4 -66.5z" />
<glyph unicode="p" horiz-adv-x="1125" d="M-41 -416l260 1498l164 1l-20 -121q130 140 311 140h10q156 -4 243 -115t92 -306v-18q0 -55 -5 -106l-3 -21q-20 -165 -89 -297t-171 -197q-98 -63 -215 -63h-11q-188 4 -288 127l-97 -522h-181zM260 278q61 -144 219 -148h7q131 0 222 106q95 108 125 321l5 84 q0 146 -55.5 223.5t-160.5 81.5h-8q-152 0 -263 -149z" />
<glyph unicode="q" horiz-adv-x="1139" d="M79 400q-1 18 -1 37q0 107 30 225q35 137 104.5 239.5t164.5 153.5q90 48 195 48h13q183 -4 279 -131l33 110h167l-260 -1498h-180l98 516q-126 -120 -291 -120h-11q-152 2 -243 115t-98 305zM260 438v-15q0 -134 52 -211q56 -80 160 -82h8q148 0 263 146l94 532 q-66 139 -216 143h-7q-133 0 -224 -105q-94 -108 -125 -324z" />
<glyph unicode="r" horiz-adv-x="682" d="M31 0l188 1082l175 1l-27 -126q112 147 263 147h8q33 0 86 -15l-20 -172l-85 9q-174 0 -274 -157l-133 -769h-181z" />
<glyph unicode="s" horiz-adv-x="1034" d="M50 334l181 -1q0 -91 58 -146t159 -55h9q94 0 162 42q72 44 82 119q1 11 1 21q0 95 -124 137l-188 55q-230 79 -230 260v12q6 142 130 234q121 90 284 90h7q165 -2 267 -96q99 -90 98 -232v-11l-180 1v6q0 77 -51 126q-53 51 -141 53h-7q-89 0 -155 -46q-63 -45 -73 -118 q-1 -9 -1 -17q0 -81 116 -120l91 -25q186 -48 264 -125q72 -72 72 -175v-16q-6 -101 -66 -176t-160 -115q-93 -37 -197 -36h-16q-172 2 -284 100q-108 95 -108 243v11z" />
<glyph unicode="t" horiz-adv-x="659" d="M67 939l25 143h191l46 262h180l-46 -262h197l-25 -143h-196l-113 -673q-3 -26 -1 -48q7 -78 85 -78q33 0 88 10l-14 -151q-65 -18 -132 -18q-108 1 -162 79q-44 63 -44 163q0 22 2 46l110 670h-191z" />
<glyph unicode="u" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-3 -28 -3 -54q0 -16 1 -32q5 -72 43 -113t106 -44h14q184 0 286 157l136 788h181l-188 -1082h-171l23 107q-123 -127 -311 -127h-12q-155 4 -229 111q-59 85 -60 220q0 34 4 72z" />
<glyph unicode="v" horiz-adv-x="972" d="M110 1082h178l136 -829l390 829h191l-545 -1082h-138z" />
<glyph unicode="w" horiz-adv-x="1503" d="M128 1082h173l66 -806l384 806h146l105 -826l345 826h187l-493 -1082h-147l-112 818l-390 -818h-147z" />
<glyph unicode="x" horiz-adv-x="995" d="M-60 0l447 556l-256 526h198l167 -394l294 394h222l-434 -544l264 -538h-197l-179 404l-305 -404h-221z" />
<glyph unicode="y" horiz-adv-x="950" d="M-91 -422l16 150l47 -5h15q76 0 133 39q63 42 111 137l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-132 -260 -339 -260h-5q-37 1 -109 18z" />
<glyph unicode="z" horiz-adv-x="995" d="M-19 0l25 145l709 784h-565l28 153h796l-24 -140l-716 -791h608l-27 -151h-834z" />
<glyph unicode="{" horiz-adv-x="682" d="M56 541l16 145q217 10 249 245l31 228q59 339 410 440l27 -117q-212 -70 -257 -337l-34 -240q-33 -200 -211 -294q103 -77 113 -219q3 -44 -1 -87l-31 -243l-2 -71l2 -31q17 -159 151 -212l-41 -113q-158 53 -232 172.5t-55 291.5l28 207q6 49 1 91q-17 136 -164 144z " />
<glyph unicode="|" horiz-adv-x="494" d="M33 -270l270 1726h146l-270 -1726h-146z" />
<glyph unicode="}" horiz-adv-x="682" d="M-116 -251q217 71 260 344l31 226q31 208 226 301q-113 69 -126 216q-4 42 1 87l31 246l2 71q-3 184 -152 242l45 113q156 -53 228 -172.5t53 -290.5l-27 -208q-6 -50 -1 -91q16 -135 163 -143l-15 -145q-218 -10 -250 -248l-28 -207q-51 -354 -413 -458z" />
<glyph unicode="~" horiz-adv-x="1361" d="M105 436q16 162 113.5 266.5t238.5 100.5q119 -3 227 -96l89 -83q68 -61 131 -61q75 0 127.5 55t70.5 157l143 3q-14 -163 -111.5 -271.5t-237.5 -106.5q-126 3 -249 115l-60 58q-72 67 -138 67q-136 3 -180 -164l-8 -37z" />
<glyph unicode="&#xa1;" horiz-adv-x="494" d="M-15 -360l194 1044h165l-169 -1044h-190zM203 993q1 48 30.5 77.5t76.5 31.5q46 1 76.5 -28t29.5 -75q0 -47 -29 -78t-77 -33t-77.5 29t-29.5 76z" />
<glyph unicode="&#xa2;" horiz-adv-x="1096" d="M94 350q-12 111 10 244.5t82.5 238.5t153.5 171.5t212 87.5l45 226h181l-45 -225q131 -32 204.5 -133.5t73.5 -250.5h-170q0 106 -56 172t-153 70q-152 6 -251 -122t-113 -356l-1 -42q-3 -142 55 -220.5t167 -80.5q97 -2 175.5 55.5t105.5 154.5l172 1 q-21 -134 -125.5 -228.5t-264.5 -124.5l-46 -233h-181l47 236q-119 30 -191.5 124t-86.5 235z" />
<glyph unicode="&#xa3;" horiz-adv-x="1164" d="M-13 0l29 156l67 -2q113 41 142 262l27 206h-160l27 157h156l31 253q25 204 164 327t331 117q168 -4 264 -108.5t88 -281.5l-187 1q7 106 -42 167t-150 65q-110 4 -187 -78t-93 -211l-32 -251h310l-27 -157h-305l-28 -212q-20 -153 -108 -256l715 3l-29 -157h-1003z" />
<glyph unicode="&#xa4;" horiz-adv-x="1426" d="M18 118l159 134q-30 85 -40 172q-19 150 25.5 294.5t148.5 261.5l-117 157l141 127l114 -148q179 122 361 118q188 -2 325 -121l175 152l111 -146l-173 -147q32 -87 44 -176q18 -144 -22.5 -285t-139.5 -261l115 -150l-143 -127l-106 137q-187 -134 -377 -130 q-199 4 -335 130l-157 -136zM304 599q-15 -114 22 -218t116.5 -165.5t187.5 -65.5q117 -4 224.5 59t180 174t88.5 234q14 115 -22.5 218t-115.5 163.5t-187 64.5q-118 4 -226 -59t-180 -173t-88 -232z" />
<glyph unicode="&#xa5;" horiz-adv-x="1213" d="M83 322l22 124h366l29 165h-367l22 125h310l-281 720h203l235 -673l469 673h225l-530 -720h297l-22 -125h-372l-29 -165h373l-22 -124h-372l-57 -322h-188l56 322h-367z" />
<glyph unicode="&#xa6;" horiz-adv-x="486" d="M-9 -270l138 791h182l-138 -791h-182zM159 698l132 758h182l-132 -758h-182z" />
<glyph unicode="&#xa7;" horiz-adv-x="1228" d="M-24 -63l181 1q-6 -85 25.5 -148t96.5 -97.5t153 -35.5q83 -2 157 25t120 76.5t55 118.5q12 77 -41.5 132.5t-192 100t-218.5 82.5q-242 115 -222 351q14 184 224 287q-99 106 -86 272q8 108 75 194.5t186 133.5q123 48 264 46q207 -4 319.5 -118.5t100.5 -312.5h-180 q8 126 -58 201t-190 79q-135 2 -226.5 -56.5t-106.5 -163.5q-11 -81 37 -135.5t183.5 -96.5t206.5 -73q269 -116 248 -361q-18 -191 -229 -287q103 -103 90 -272q-14 -174 -158 -276t-366 -100q-217 4 -338 119t-110 314zM273 545q-14 -100 61 -161q50 -41 179 -81.5 t194 -65.5q174 52 196 199q11 73 -36.5 129t-166.5 98l-84 28l-154 52q-167 -47 -189 -198z" />
<glyph unicode="&#xa8;" horiz-adv-x="840" d="M219 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM636 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xa9;" horiz-adv-x="1571" d="M119 722q22 199 136 377t289 279.5t369 97.5q178 -2 320 -100t213 -271.5t50 -369.5q-23 -203 -137 -380t-286 -277t-360 -99h-10q-183 4 -323 102t-211 271.5t-50 369.5zM230 570q22 -207 152 -338.5t320 -133.5q187 -4 353.5 107.5t258 302t71.5 380.5 q-22 205 -150 334t-321 134q-189 4 -355.5 -108t-257.5 -300t-71 -378zM453 670l10 98q20 189 123.5 298.5t260.5 107.5q142 -4 219.5 -85.5t71.5 -229.5l-143 1q6 85 -28.5 134t-124.5 51q-95 2 -158.5 -70.5t-78 -200t-13.5 -157.5l2 -35q7 -77 46.5 -122t107.5 -48 q170 -7 205 184l140 1q-14 -151 -107 -234.5t-242 -79.5q-145 4 -225 112t-66 275z" />
<glyph unicode="&#xaa;" horiz-adv-x="898" d="M199 911q5 115 98 177t260 62l111 -1l9 54q3 27 1 51q-7 79 -92 82q-56 1 -99.5 -23.5t-58.5 -80.5l-156 11q11 109 99 172.5t219 61.5q123 -4 189.5 -78.5t56.5 -198.5l-54 -347l-4 -58q-1 -45 7 -91l-155 -1l-4 74q-92 -86 -206 -86q-105 0 -165 61.5t-56 158.5z M361 915q-5 -43 22 -66t77 -23q75 0 166 68l28 143h-93q-88 -3 -140 -35t-60 -87z" />
<glyph unicode="&#xab;" horiz-adv-x="942" d="M89 538l2 20l347 389h152l-329 -409l178 -387h-125zM409 538l2 20l347 389h152l-329 -409l178 -387h-125z" />
<glyph unicode="&#xac;" horiz-adv-x="1110" d="M129 639l29 161h807l-74 -425h-182l47 264h-627z" />
<glyph unicode="&#xad;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#xae;" horiz-adv-x="1572" d="M118 722q22 199 136 377t289 279.5t369 97.5q175 -2 316.5 -97.5t215 -269t51.5 -374.5q-23 -204 -138 -381.5t-288.5 -278.5t-365.5 -97q-179 4 -319 99.5t-213.5 270.5t-52.5 374zM229 569q12 -131 76.5 -241t167 -169t228.5 -62q187 -4 352 106t258 300t74 385 q-14 133 -78.5 241t-166 166t-227.5 61q-185 4 -350 -103t-259.5 -297.5t-74.5 -386.5zM463 316l133 849l257 -1q139 -5 213.5 -69.5t67.5 -178.5q-3 -58 -37 -106t-115 -94q77 -44 86 -141l-1 -61q-11 -87 -9 -118l3 -64l-2 -17h-138q-6 37 -4 73l7 72l6 54q7 66 -17 100.5 t-92 38.5l-167 1l-53 -338h-138zM673 782l143 -1q72 2 122.5 36.5t59.5 92.5q10 63 -22.5 94t-121.5 34h-140z" />
<glyph unicode="&#xaf;" horiz-adv-x="920" d="M227 1313l23 143h694l-23 -143h-694z" />
<glyph unicode="&#xb0;" horiz-adv-x="752" d="M236 1207q4 111 84.5 191.5t183.5 78.5q97 -2 160.5 -76.5t61.5 -175.5q-4 -112 -83.5 -190t-181.5 -76q-98 2 -163.5 74.5t-61.5 173.5zM357 1209q-6 -49 24.5 -85.5t79.5 -36.5q54 0 96.5 40t48.5 96q6 48 -22 87.5t-80 39.5q-54 0 -97.5 -42.5t-49.5 -98.5z" />
<glyph unicode="&#xb1;" horiz-adv-x="1071" d="M37 0l24 152h811l-24 -152h-811zM109 703l25 151h373l65 413h163l-65 -413h353l-24 -151h-352l-65 -414h-164l65 414h-374z" />
<glyph unicode="&#xb2;" horiz-adv-x="738" d="M92 667l20 116l355 298q99 84 111 158q7 48 -19.5 75t-74.5 28q-66 1 -106 -36.5t-54 -99.5l-154 -1q11 117 98 191.5t215 72.5q120 -2 189.5 -65t64.5 -165q-8 -123 -159 -248l-64 -51l-196 -145h379l-23 -128h-582z" />
<glyph unicode="&#xb3;" horiz-adv-x="738" d="M110 889h151q0 -50 33 -77.5t91 -27.5q64 0 109.5 32t52.5 85q13 102 -128 107l-87 1l11 116l78 -1q66 2 112.5 32.5t53.5 84.5q6 49 -25 73.5t-81 24.5q-112 0 -141 -93h-156q11 101 90.5 161.5t204.5 60.5q126 -3 197 -62t66 -156q-7 -119 -159 -185q118 -43 114 -172 q-5 -111 -95.5 -175.5t-223.5 -62.5q-119 2 -193.5 64t-74.5 170z" />
<glyph unicode="&#xb4;" horiz-adv-x="633" d="M213 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xb5;" horiz-adv-x="1135" d="M-27 -416l260 1498h181l-103 -624q-10 -84 -7 -142q10 -183 156 -186q183 -6 280 151l139 801h182l-188 -1082h-162l19 115q-111 -138 -273 -136q-135 0 -215 75l-89 -470h-180z" />
<glyph unicode="&#xb6;" horiz-adv-x="981" d="M143 980q14 142 88 251t194 167.5t264 58.5l277 -1l-252 -1456h-182l91 520l-64 1q-211 3 -323.5 130.5t-92.5 328.5z" />
<glyph unicode="&#xb7;" horiz-adv-x="528" d="M165 726q1 49 31.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -33 -80.5t-81 -33.5q-45 -2 -77.5 27.5t-32.5 80.5z" />
<glyph unicode="&#xb8;" horiz-adv-x="502" d="M-56 -437l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
<glyph unicode="&#xb9;" horiz-adv-x="738" d="M223 1215l24 135l356 113h21l-131 -789h-154l104 597z" />
<glyph unicode="&#xba;" horiz-adv-x="913" d="M205 1043l7 70q17 168 122.5 268t254.5 96q141 -4 221.5 -102.5t67.5 -251.5l-7 -71q-17 -166 -121.5 -266.5t-254.5 -96.5q-142 4 -222.5 104t-67.5 250zM365 1041q-10 -96 26 -153.5t113 -59.5q79 -3 135 54t71 161l9 81q8 102 -29 156.5t-109 56.5q-82 2 -138 -56 t-70 -158z" />
<glyph unicode="&#xbb;" horiz-adv-x="941" d="M15 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152zM353 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152z" />
<glyph unicode="&#xbc;" horiz-adv-x="1465" d="M185 1205l24 135l356 113h21l-131 -789h-154l104 597zM256 192l881 1128l98 -72l-881 -1128zM688 169l13 112l447 508h164l-85 -490h104l-23 -130h-103l-30 -169h-154l30 169h-363zM865 299h208l58 291l-22 -30z" />
<glyph unicode="&#xbd;" horiz-adv-x="1551" d="M180 1205l24 135l356 113h21l-131 -789h-154l104 597zM213 192l881 1128l98 -72l-881 -1128zM751 0l20 116l355 298q99 84 111 158q7 48 -19.5 75t-74.5 28q-66 1 -106 -36.5t-54 -99.5l-154 -1q11 117 98 191.5t215 72.5q120 -2 189.5 -65t64.5 -165q-8 -123 -159 -248 l-64 -51l-196 -145h379l-23 -128h-582z" />
<glyph unicode="&#xbe;" horiz-adv-x="1555" d="M158 890h151q0 -50 33 -77.5t91 -27.5q64 0 109.5 32t52.5 85q13 102 -128 107l-87 1l11 116l78 -1q66 2 112.5 32.5t53.5 84.5q6 49 -25 73.5t-81 24.5q-112 0 -141 -93h-156q11 101 90.5 161.5t204.5 60.5q126 -3 197 -62t66 -156q-7 -119 -159 -185q118 -43 114 -172 q-5 -111 -95.5 -175.5t-223.5 -62.5q-119 2 -193.5 64t-74.5 170zM379 192l881 1128l98 -72l-881 -1128zM777 169l13 112l447 508h164l-85 -490h104l-23 -130h-103l-30 -169h-154l30 169h-363zM954 299h208l58 291l-22 -30z" />
<glyph unicode="&#xbf;" horiz-adv-x="950" d="M-30 -14q15 183 206 358l116 102q91 85 116 234l176 1q-12 -109 -53.5 -189.5t-146.5 -180.5l-97 -91q-119 -115 -132 -230q-13 -98 34 -156t140 -60q98 -2 164.5 54.5t84.5 150.5l180 1q-19 -167 -141 -268.5t-299 -97.5q-173 4 -268 105t-80 267zM441 994q1 47 31 76.5 t76 31.5q46 1 76.5 -27.5t29.5 -74.5q0 -47 -29.5 -78t-76.5 -33q-48 -2 -77.5 29t-29.5 76z" />
<glyph unicode="&#xc0;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM568 1844h205l143 -294h-143z" />
<glyph unicode="&#xc1;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM712 1550l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xc2;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM528 1560v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xc3;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM478 1563q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34 t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#xc4;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM526 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM943 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xc5;" horiz-adv-x="1306" d="M-81 0l791 1456h165l288 -1456h-185l-69 380h-590l-199 -380h-201zM402 538h479l-121 679zM641 1721q2 91 66.5 154t153.5 63q82 0 139.5 -58t57.5 -143q-2 -89 -66.5 -151t-153.5 -62q-84 0 -141.5 57t-55.5 140zM737 1723q-4 -46 23 -77.5t70 -31.5q46 0 85.5 35.5 t45.5 85.5q6 46 -22 79t-70 33q-46 0 -86 -36.5t-46 -87.5z" />
<glyph unicode="&#xc6;" horiz-adv-x="1867" d="M-124 0l1106 1456h930l-27 -152h-670l-63 -471h574l-27 -151h-567l-71 -531h685l-27 -151h-857l47 353h-540l-261 -353h-232zM496 527h436l96 722z" />
<glyph unicode="&#xc7;" horiz-adv-x="1303" d="M120 494q-4 82 7 160l17 120q47 328 230.5 517.5t446.5 184.5q205 -4 325 -132.5t127 -356.5h-187q-13 306 -240 330l-33 2q-189 5 -315.5 -140.5t-163.5 -397.5l-22 -151l-6 -88q-6 -184 65.5 -292.5t212.5 -112.5q152 -5 251.5 73t151.5 251l182 3 q-42 -226 -204.5 -358t-389.5 -126q-135 3 -236 66.5t-157 183t-62 264.5zM394 -446l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
<glyph unicode="&#xc8;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM518 1856h205l143 -294h-143z" />
<glyph unicode="&#xc9;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM662 1562l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xca;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM478 1572v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xcb;" horiz-adv-x="1139" d="M59 0l253 1456h889l-28 -158h-701l-81 -468h612l-27 -157h-612l-90 -516h712l-28 -157h-899zM476 1691q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM893 1689q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xcc;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM189 1856h205l143 -294h-143z" />
<glyph unicode="&#xcd;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM332 1562l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xce;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM149 1572v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xcf;" horiz-adv-x="550" d="M73 0l253 1456h187l-253 -1456h-187zM147 1691q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM564 1689q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xd0;" horiz-adv-x="1343" d="M47 666l27 151h157l111 639l378 -1q178 0 306.5 -89t184.5 -245.5t33 -350.5l-10 -73q-44 -318 -247 -507.5t-510 -189.5h-388l115 666h-157zM304 157l185 -1q212 0 359.5 132t191.5 362q35 184 24 313q-15 155 -103 242.5t-236 91.5l-223 1l-84 -481h274l-27 -151h-273z " />
<glyph unicode="&#xd1;" horiz-adv-x="1426" d="M59 0l253 1456h182l521 -1135l197 1135h187l-253 -1456h-182l-520 1130l-196 -1130h-189zM530 1563q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
<glyph unicode="&#xd2;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM601 1846h205l143 -294h-143z" />
<glyph unicode="&#xd3;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM745 1552l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xd4;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM561 1562v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xd5;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM511 1565q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
<glyph unicode="&#xd6;" horiz-adv-x="1376" d="M125 515q-6 121 27 299t114 321t197 229q157 116 358 112q213 -4 336 -147.5t132 -388.5q4 -105 -21.5 -267t-91 -301t-166.5 -233q-176 -164 -417 -159q-139 3 -241.5 67t-161.5 188.5t-65 279.5zM311 564q-6 -196 70 -307t221 -115q189 -5 313.5 136.5t165.5 397.5 q20 126 23 218q6 197 -69 305.5t-223 112.5q-134 4 -239.5 -72t-173 -227.5t-85.5 -383.5zM559 1681q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM976 1679q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5 q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xd7;" horiz-adv-x="1069" d="M40 338l379 335l-261 336l128 114l262 -334l377 334l101 -131l-376 -336l262 -336l-128 -114l-263 336l-379 -336z" />
<glyph unicode="&#xd8;" horiz-adv-x="1376" d="M32 -92l189 232q-106 171 -101 401q1 97 25.5 247t84 279.5t148.5 222t202 141t240 45.5q206 -4 335 -126l131 165h150l-208 -256q49 -116 59 -238q14 -169 -29 -391t-156 -381.5t-272 -225.5q-112 -47 -240 -44q-166 4 -283 84l-124 -155h-151zM302 487q2 -108 33 -191 l710 908q-77 104 -233 109q-182 5 -308 -133t-170 -382q-34 -192 -32 -311zM411 203q74 -58 188 -62q191 -5 317.5 142t166.5 417q22 147 26 233q4 78 -7 156z" />
<glyph unicode="&#xd9;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM563 1844h205l143 -294h-143z" />
<glyph unicode="&#xda;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM707 1550l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xdb;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM523 1560v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z " />
<glyph unicode="&#xdc;" horiz-adv-x="1298" d="M120 470l168 986h185l-167 -987q-17 -153 52 -240.5t209 -91.5q152 -6 256.5 82.5t131.5 248.5l168 988h189l-168 -985q-34 -227 -196 -361.5t-391 -130.5q-143 3 -248.5 64.5t-155.5 173t-33 253.5zM521 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5 q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM938 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xdd;" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554zM658 1550l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xde;" horiz-adv-x="1184" d="M56 0l253 1456h182l-51 -293l238 -1q208 -1 326 -114.5t103 -301.5q-11 -130 -81.5 -228.5t-189.5 -152t-264 -53.5l-279 1l-55 -313h-182zM319 465l257 -1q139 0 236 76.5t114 203.5q14 120 -50.5 191t-182.5 75l-279 1z" />
<glyph unicode="&#xdf;" horiz-adv-x="1191" d="M30 0l190 1111q18 134 77 237t152 156t214 51q159 -4 246 -93t74 -237q-9 -95 -90 -217t-93 -198q-9 -55 18 -109t100 -128t102 -130.5t26 -116.5q-10 -164 -126 -257.5t-289 -89.5q-178 2 -292 75l59 153q106 -75 219 -77q101 0 170.5 49.5t80.5 135.5q7 57 -20.5 110.5 t-101 128.5t-104 134.5t-24.5 122.5q5 59 33 107.5t60.5 94t61 93t36.5 105.5q10 82 -28 136t-119 58q-105 3 -173 -72.5t-89 -220.5l-189 -1112h-181z" />
<glyph unicode="&#xe0;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM426 1534h205l143 -294h-143z" />
<glyph unicode="&#xe1;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM570 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xe2;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM386 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xe3;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM336 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113 l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#xe4;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM384 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32 q-47 -1 -76.5 28t-29.5 76zM801 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xe5;" horiz-adv-x="1091" d="M59 292q10 172 150.5 268.5t369.5 96.5l189 -1l12 86q10 97 -37.5 153.5t-142.5 58.5q-93 2 -164.5 -45.5t-87.5 -125.5l-182 -1q9 95 74 168.5t167 114t211 38.5q169 -4 263 -102.5t79 -261.5l-88 -536l-5 -77q-2 -55 12 -109l-2 -17h-184q-7 29 -7 57l3 57 q-149 -138 -316 -134q-143 2 -232.5 90.5t-81.5 221.5zM244 319q-9 -76 35.5 -126.5t129.5 -52.5q87 -2 164.5 41.5t133.5 120.5l39 223l-137 1q-171 0 -262 -54t-103 -153zM499 1411q2 91 66.5 154t153.5 63q82 0 139.5 -58t57.5 -143q-2 -89 -66.5 -151t-153.5 -62 q-84 0 -141.5 57t-55.5 140zM595 1413q-4 -46 23 -77.5t70 -31.5q46 0 85.5 35.5t45.5 85.5q6 46 -22 79t-70 33q-46 0 -86 -36.5t-46 -87.5z" />
<glyph unicode="&#xe6;" horiz-adv-x="1687" d="M29 296q10 160 137 250t344 90l226 -1l12 86q12 104 -31 164.5t-133 64.5q-104 2 -176 -51.5t-87 -139.5l-179 19q16 151 142 239t312 86q109 -2 190.5 -45.5t115.5 -120.5q162 169 356 165q127 -2 214 -65t124 -173.5t20 -248.5l-18 -118h-702q-9 -68 0 -132 q13 -107 77.5 -169.5t168.5 -63.5q90 -2 168.5 28t152.5 77l53 -137q-138 -120 -380 -120q-121 2 -213.5 48.5t-143.5 131.5q-169 -184 -445 -180q-146 2 -230.5 88.5t-74.5 227.5zM212 292q-9 -74 36 -117.5t127 -45.5q70 -2 149.5 34.5t145.5 93.5l43 238l-203 1 q-120 0 -203 -56.5t-95 -147.5zM915 640h522l6 32q9 55 2 105q-11 80 -62 126t-135 49q-110 3 -195 -75.5t-138 -236.5z" />
<glyph unicode="&#xe7;" horiz-adv-x="1050" d="M84 517l5 50q19 156 91 279t188 191.5t256 64.5q170 -4 272 -114t102 -279l-169 1q-2 106 -59 171.5t-154 69.5q-141 3 -234.5 -105t-116.5 -302l-3 -26q-6 -64 -2 -132q7 -117 66 -185t162 -71q97 -2 175 56.5t102 153.5l171 1q-15 -102 -81.5 -186t-167.5 -131 t-207 -44q-135 2 -228.5 70.5t-137.5 191t-30 275.5zM262 -446l4 108q166 6 182 107q12 71 -92 83l-46 6l46 133h129l-21 -55q129 -29 125 -163q-3 -102 -90 -159t-237 -60z" />
<glyph unicode="&#xe8;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM399 1534h205l143 -294h-143z" />
<glyph unicode="&#xe9;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM543 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xea;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM359 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xeb;" horiz-adv-x="1062" d="M87 500l5 43q17 161 95.5 294t191.5 200.5t244 64.5q167 -4 262 -111t104 -290q3 -65 -4 -130l-11 -83h-707q-18 -147 48.5 -250t198.5 -107q160 -4 296 144l104 -88q-68 -98 -175.5 -153.5t-239.5 -53.5q-202 4 -316 149t-96 371zM286 640l526 -1l4 16 q16 126 -40.5 209.5t-161.5 86.5q-112 3 -195.5 -76t-132.5 -235zM357 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM774 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xec;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM107 1533h205l143 -294h-143z" />
<glyph unicode="&#xed;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM250 1239l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xee;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM67 1249v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xef;" horiz-adv-x="501" d="M46 0l188 1082h181l-188 -1082h-181zM65 1368q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM482 1366q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xf0;" horiz-adv-x="1174" d="M111 459q14 144 83 265.5t180 189.5t243 64q154 -4 265 -115q-4 182 -110 335l-239 -148l-59 108l207 126q-102 86 -280 138l70 157q220 -56 370 -192l209 130l58 -109l-182 -109q177 -295 127 -666l-13 -91q-24 -167 -102.5 -300t-191 -199.5t-242.5 -63.5 q-188 4 -300 141.5t-93 338.5zM292 458q-15 -139 49 -232.5t176 -96.5q127 -5 218 104.5t122 301.5l20 160q-56 126 -226 131q-144 4 -242 -97.5t-117 -270.5z" />
<glyph unicode="&#xf1;" horiz-adv-x="1106" d="M31 0l188 1082l171 1l-26 -137q146 160 332 156q153 -4 226 -106t54 -287l-118 -709h-181l119 712q6 49 1 91q-17 140 -165 143q-163 3 -286 -174l-134 -772h-181zM327 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10 q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#xf2;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM408 1534h205l143 -294h-143z" />
<glyph unicode="&#xf3;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM552 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xf4;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM368 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xf5;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM318 1253q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14 q-85 -3 -116 -112z" />
<glyph unicode="&#xf6;" horiz-adv-x="1143" d="M82 523q15 168 91 302t195.5 207.5t263.5 69.5q136 -2 233 -74t143.5 -198.5t31.5 -276.5l-2 -22q-19 -158 -94 -285.5t-194 -198.5t-261 -67q-135 2 -232.5 74t-142.5 196t-32 273zM264 391q10 -118 70.5 -188t161.5 -73q90 -3 166 44.5t128 143.5t67 213q8 92 3 155 q-12 121 -73 191t-162 74q-140 3 -238 -110t-121 -296l-2 -23q-7 -63 0 -131zM366 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM783 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xf7;" horiz-adv-x="1144" d="M68 600l33 184h969l-32 -184h-970zM392 278q1 49 31.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -33 -80t-81 -33t-79.5 28.5t-30.5 78.5zM534 1095q0 49 30.5 81.5t80.5 34.5q48 2 80 -29t32 -81q-1 -49 -32.5 -80t-80.5 -33t-80 28t-30 79z" />
<glyph unicode="&#xf8;" horiz-adv-x="1135" d="M57 -133l141 205q-118 124 -125 329q-2 61 4 121l2 16q36 263 191 416.5t368 149.5q103 -2 194 -45l102 149l132 -1l-144 -207q110 -130 117 -328q2 -55 -6 -141q-19 -156 -98.5 -287.5t-199.5 -199.5t-262 -66q-89 2 -182 37l-102 -149zM249 447q-10 -132 41 -223 l459 698q-55 29 -119 31q-157 4 -261.5 -133.5t-119.5 -372.5zM373 152q50 -23 107 -25q140 -3 240.5 107t131.5 297q13 95 11 170q-3 74 -34 143z" />
<glyph unicode="&#xf9;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM412 1534h205l143 -294h-143z" />
<glyph unicode="&#xfa;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM556 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xfb;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM372 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#xfc;" horiz-adv-x="1105" d="M110 383l116 699h181l-117 -702q-5 -44 -2 -86q5 -72 43 -113t106 -44q194 -6 300 157l136 788h181l-188 -1082h-171l23 107q-127 -131 -323 -127q-155 4 -229.5 111t-55.5 292zM370 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32 q-47 -1 -76.5 28t-29.5 76zM787 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#xfd;" horiz-adv-x="950" d="M-91 -422l16 150l47 -5q86 -4 148.5 38.5t110.5 137.5l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-134 -263 -344 -260q-37 1 -109 18zM499 1240l234 294h230l-306 -294h-158z" />
<glyph unicode="&#xfe;" horiz-adv-x="1155" d="M-32 -416l339 1952h180l-106 -567q131 137 312 133q158 -4 244.5 -118t89.5 -303q1 -61 -7 -145q-20 -166 -90 -299t-171.5 -197.5t-225.5 -61.5q-186 4 -287 128l-97 -522h-181zM269 278q61 -143 218 -148q137 -3 231.5 106.5t123.5 321.5l5 84q0 145 -56 223t-160 80 q-160 4 -272 -148z" />
<glyph unicode="&#xff;" horiz-adv-x="950" d="M-91 -422l16 150l47 -5q86 -4 148.5 38.5t110.5 137.5l65 124l-187 1059h189l121 -809l385 809h200l-642 -1262q-134 -263 -344 -260q-37 1 -109 18zM313 1369q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76z M730 1367q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#x152;" horiz-adv-x="1904" d="M105 576l47 299q43 274 215.5 439t415.5 163l74 -2l211 -19h825l-28 -158h-701l-81 -468h612l-28 -157h-611l-90 -516h712l-28 -157h-812l-217 -18l-69 -1q-152 4 -261.5 83t-158 216t-27.5 296zM284 419q10 -131 81 -206.5t193 -79.5q76 -3 214 10l209 1168 q-108 17 -203 17q-175 2 -293 -119.5t-151 -333.5l-47 -300q-10 -78 -3 -156z" />
<glyph unicode="&#x153;" horiz-adv-x="1814" d="M87 522l2 16q36 261 186.5 415t362.5 149q121 -2 216 -60t138 -157q178 221 395 218q125 -2 213 -65t125 -173t20 -246l-19 -122h-692q-8 -61 -2 -125q10 -108 68.5 -172.5t154.5 -67.5q172 -6 316 105l61 -127q-68 -65 -168 -98t-215 -31q-124 2 -218.5 58.5 t-138.5 151.5q-171 -217 -415 -211q-133 2 -227 73t-136.5 195.5t-26.5 273.5zM266 392q5 -117 62.5 -188.5t158.5 -74.5q136 -5 233.5 105t123.5 297l2 22l5 87q0 143 -57.5 225t-166.5 86q-140 5 -236.5 -110.5t-119.5 -296.5l-2 -22q-7 -62 -3 -130zM1056 649l510 -1 l5 28q8 53 1 102q-13 79 -64.5 124.5t-130.5 48.5q-101 3 -183.5 -74t-137.5 -228z" />
<glyph unicode="&#x178;" horiz-adv-x="1203" d="M168 1456h204l239 -730l495 730h224l-653 -923l-93 -533h-187l96 554zM472 1679q1 46 30 76.5t76 32.5q47 1 77.5 -28.5t29.5 -76.5q0 -46 -30 -76t-77 -32q-47 -1 -76.5 28t-29.5 76zM889 1677q1 46 30 77t76 33q48 1 78 -28.5t29 -77.5q0 -47 -30 -76.5t-77 -31.5 q-46 -1 -76.5 28t-29.5 76z" />
<glyph unicode="&#x2c6;" horiz-adv-x="945" d="M279 1250v16l278 270h106l205 -272v-14l-147 2l-113 169l-176 -168z" />
<glyph unicode="&#x2dc;" horiz-adv-x="947" d="M221 1249q12 110 74.5 180t155.5 68q27 0 50.5 -8.5t76.5 -41t77.5 -41.5t51.5 -8q86 0 118 113l117 -10q-12 -111 -73 -178t-154 -67q-37 0 -67.5 15.5t-60.5 34.5t-61 34t-67 14q-85 -3 -116 -112z" />
<glyph unicode="&#x2000;" horiz-adv-x="969" />
<glyph unicode="&#x2001;" horiz-adv-x="1938" />
<glyph unicode="&#x2002;" horiz-adv-x="969" />
<glyph unicode="&#x2003;" horiz-adv-x="1938" />
<glyph unicode="&#x2004;" horiz-adv-x="646" />
<glyph unicode="&#x2005;" horiz-adv-x="484" />
<glyph unicode="&#x2006;" horiz-adv-x="323" />
<glyph unicode="&#x2007;" horiz-adv-x="323" />
<glyph unicode="&#x2008;" horiz-adv-x="242" />
<glyph unicode="&#x2009;" horiz-adv-x="387" />
<glyph unicode="&#x200a;" horiz-adv-x="107" />
<glyph unicode="&#x2010;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#x2011;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#x2012;" horiz-adv-x="558" d="M25 543l27 151h475l-27 -151h-475z" />
<glyph unicode="&#x2013;" horiz-adv-x="1314" d="M159 651l33 151h973l-33 -151h-973z" />
<glyph unicode="&#x2014;" horiz-adv-x="1561" d="M82 651l43 151h1297l-43 -151h-1297z" />
<glyph unicode="&#x2018;" horiz-adv-x="407" d="M174 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180z" />
<glyph unicode="&#x2019;" horiz-adv-x="407" d="M137 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369z" />
<glyph unicode="&#x201a;" horiz-adv-x="405" d="M-104 -208q115 144 139 283l18 106h181l-15 -96q-35 -220 -224 -368z" />
<glyph unicode="&#x201c;" horiz-adv-x="712" d="M182 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180zM487 1073l18 112q36 222 225 370l100 -74q-112 -140 -139 -274l-24 -134h-180z" />
<glyph unicode="&#x201d;" horiz-adv-x="719" d="M149 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369zM446 1120q118 147 142 285l23 131h178l-19 -121q-36 -225 -224 -369z" />
<glyph unicode="&#x201e;" horiz-adv-x="694" d="M-108 -227q116 151 143 302l30 171h180l-25 -156q-39 -241 -224 -392zM180 -227q116 154 142 302l30 171h181l-25 -156q-39 -240 -225 -392z" />
<glyph unicode="&#x2022;" horiz-adv-x="679" d="M160 724l1 41q6 94 64.5 150.5t144.5 56.5q81 0 133.5 -54.5t52.5 -142.5l-2 -42q-6 -90 -62.5 -145t-146.5 -55q-82 0 -133.5 53t-51.5 138z" />
<glyph unicode="&#x2026;" horiz-adv-x="1339" d="M57 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM481 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5t-31 78.5zM883 94q0 49 31 81.5t80 34.5q49 1 81 -30t31 -80t-33 -79.5t-80 -32.5t-79 27.5 t-31 78.5z" />
<glyph unicode="&#x202f;" horiz-adv-x="387" />
<glyph unicode="&#x2039;" horiz-adv-x="606" d="M95 540l2 20l347 389h152l-329 -409l178 -387h-125z" />
<glyph unicode="&#x203a;" horiz-adv-x="606" d="M2 152l328 408l-177 389h125l225 -387l-2 -21l-347 -389h-152z" />
<glyph unicode="&#x205f;" horiz-adv-x="484" />
<glyph unicode="&#x20ac;" d="M81 541l22 124h172l25 137h-173l22 125h165q62 269 219.5 410.5t389.5 139.5q89 0 237 -30l-34 -164q-106 36 -205 38q-161 2 -266.5 -99t-151.5 -295h378l-22 -125h-372l-24 -137h373l-22 -124h-370q-9 -74 -2 -145q12 -120 79 -187t181 -70q95 -3 219 31l5 -161 q-114 -29 -233 -27q-226 4 -345 159t-87 401z" />
<glyph unicode="&#x2122;" horiz-adv-x="1253" d="M234 1375l14 81h376l-15 -81h-142l-80 -456h-89l79 456h-143zM605 919l94 537h106l69 -397l210 397h113l-94 -537h-88l67 379l-195 -378l-52 -2l-70 401l-71 -400h-89z" />
<glyph unicode="&#x25fc;" horiz-adv-x="1080" d="M0 0v1080h1080v-1080h-1080z" />
<glyph unicode="&#xfb03;" horiz-adv-x="1706" d="M116 939l25 143h166l17 121q23 168 129 264t266 94q54 -2 129 -18l-22 -152q-48 10 -97 12q-89 0 -147.5 -53t-75.5 -147l-19 -121h387l14 101q26 177 141.5 277.5t296.5 98.5q72 -2 140.5 -21t136.5 -43l-47 -155q-115 51 -226 53q-228 2 -262 -224l-13 -87h216 l-25 -143h-215l-163 -939h-181l163 939h-387l-163 -939h-181l164 939h-167zM1254 0l188 1082h181l-188 -1082h-181z" />
<glyph unicode="&#xfb04;" horiz-adv-x="1706" d="M116 939l25 143h166l18 127q29 182 151 276q102 78 244 76q53 -2 128 -18l-22 -152q-58 12 -98 12q-91 0 -149.5 -55t-74.5 -158l-17 -108h388l15 107q25 180 132 276.5t277 94.5q86 -2 199 -24l191 -40l-254 -1496h-181l243 1380q-129 22 -189 22q-205 2 -239 -225 l-14 -95h225l-26 -143h-223l-163 -939h-181l163 939h-387l-163 -939h-181l163 939h-166z" />
<hkern u1="&#x20;" u2="T" k="40" />
<hkern u1="&#x22;" u2="w" k="-11" />
<hkern u1="&#x27;" u2="w" k="-11" />
<hkern u1="&#x28;" u2="&#x178;" k="-22" />
<hkern u1="&#x28;" u2="&#xdd;" k="-22" />
<hkern u1="&#x28;" u2="Y" k="-22" />
<hkern u1="&#x28;" u2="W" k="-18" />
<hkern u1="&#x28;" u2="V" k="-20" />
<hkern u1="&#x2f;" u2="&#x2f;" k="224" />
<hkern u1="A" u2="w" k="33" />
<hkern u1="A" u2="t" k="17" />
<hkern u1="A" u2="&#x3f;" k="61" />
<hkern u1="C" u2="&#x7d;" k="17" />
<hkern u1="C" u2="]" k="12" />
<hkern u1="C" u2="&#x29;" k="26" />
<hkern u1="D" u2="&#xc6;" k="33" />
<hkern u1="E" u2="w" k="22" />
<hkern u1="E" u2="f" k="18" />
<hkern u1="F" u2="&#x2026;" k="234" />
<hkern u1="F" u2="&#x201e;" k="234" />
<hkern u1="F" u2="&#x201a;" k="234" />
<hkern u1="F" u2="&#x153;" k="21" />
<hkern u1="F" u2="&#xff;" k="24" />
<hkern u1="F" u2="&#xfd;" k="24" />
<hkern u1="F" u2="&#xfc;" k="22" />
<hkern u1="F" u2="&#xfb;" k="22" />
<hkern u1="F" u2="&#xfa;" k="22" />
<hkern u1="F" u2="&#xf9;" k="22" />
<hkern u1="F" u2="&#xf6;" k="21" />
<hkern u1="F" u2="&#xf5;" k="21" />
<hkern u1="F" u2="&#xf4;" k="21" />
<hkern u1="F" u2="&#xf3;" k="21" />
<hkern u1="F" u2="&#xf2;" k="21" />
<hkern u1="F" u2="&#xeb;" k="21" />
<hkern u1="F" u2="&#xea;" k="21" />
<hkern u1="F" u2="&#xe9;" k="21" />
<hkern u1="F" u2="&#xe8;" k="21" />
<hkern u1="F" u2="&#xe7;" k="21" />
<hkern u1="F" u2="&#xe5;" k="34" />
<hkern u1="F" u2="&#xe4;" k="34" />
<hkern u1="F" u2="&#xe3;" k="34" />
<hkern u1="F" u2="&#xe2;" k="34" />
<hkern u1="F" u2="&#xe1;" k="34" />
<hkern u1="F" u2="&#xe0;" k="34" />
<hkern u1="F" u2="&#xc5;" k="170" />
<hkern u1="F" u2="&#xc4;" k="170" />
<hkern u1="F" u2="&#xc3;" k="170" />
<hkern u1="F" u2="&#xc2;" k="170" />
<hkern u1="F" u2="&#xc1;" k="170" />
<hkern u1="F" u2="&#xc0;" k="170" />
<hkern u1="F" u2="y" k="24" />
<hkern u1="F" u2="v" k="24" />
<hkern u1="F" u2="u" k="22" />
<hkern u1="F" u2="r" k="26" />
<hkern u1="F" u2="q" k="21" />
<hkern u1="F" u2="o" k="21" />
<hkern u1="F" u2="g" k="21" />
<hkern u1="F" u2="e" k="21" />
<hkern u1="F" u2="d" k="21" />
<hkern u1="F" u2="c" k="21" />
<hkern u1="F" u2="a" k="34" />
<hkern u1="F" u2="T" k="-20" />
<hkern u1="F" u2="J" k="264" />
<hkern u1="F" u2="A" k="170" />
<hkern u1="F" u2="&#x2e;" k="234" />
<hkern u1="F" u2="&#x2c;" k="234" />
<hkern u1="K" u2="w" k="63" />
<hkern u1="L" u2="w" k="92" />
<hkern u1="O" u2="&#xc6;" k="33" />
<hkern u1="P" u2="&#xc6;" k="97" />
<hkern u1="P" u2="t" k="-14" />
<hkern u1="Q" u2="&#x178;" k="35" />
<hkern u1="Q" u2="&#xdd;" k="35" />
<hkern u1="Q" u2="Y" k="35" />
<hkern u1="Q" u2="W" k="20" />
<hkern u1="Q" u2="V" k="28" />
<hkern u1="Q" u2="T" k="43" />
<hkern u1="R" u2="&#x178;" k="48" />
<hkern u1="R" u2="&#xdd;" k="48" />
<hkern u1="R" u2="Y" k="48" />
<hkern u1="R" u2="V" k="19" />
<hkern u1="R" u2="T" k="80" />
<hkern u1="T" u2="&#xf8;" k="95" />
<hkern u1="T" u2="&#xe6;" k="114" />
<hkern u1="T" u2="&#xc6;" k="179" />
<hkern u1="T" u2="&#xbb;" k="216" />
<hkern u1="T" u2="&#xab;" k="328" />
<hkern u1="T" u2="w" k="57" />
<hkern u1="T" u2="r" k="75" />
<hkern u1="T" u2="&#x20;" k="40" />
<hkern u1="V" u2="&#x7d;" k="-19" />
<hkern u1="V" u2="r" k="30" />
<hkern u1="V" u2="]" k="-17" />
<hkern u1="V" u2="&#x29;" k="-20" />
<hkern u1="W" u2="&#x7d;" k="-14" />
<hkern u1="W" u2="r" k="21" />
<hkern u1="W" u2="]" k="-12" />
<hkern u1="W" u2="&#x29;" k="-15" />
<hkern u1="Y" u2="&#x2022;" k="45" />
<hkern u1="Y" u2="&#xf8;" k="64" />
<hkern u1="Y" u2="&#xe6;" k="63" />
<hkern u1="Y" u2="&#xc6;" k="96" />
<hkern u1="Y" u2="&#xbb;" k="51" />
<hkern u1="Y" u2="&#xab;" k="82" />
<hkern u1="Y" u2="&#x7d;" k="-19" />
<hkern u1="Y" u2="t" k="22" />
<hkern u1="Y" u2="r" k="40" />
<hkern u1="Y" u2="f" k="22" />
<hkern u1="Y" u2="]" k="-18" />
<hkern u1="Y" u2="&#x2a;" k="49" />
<hkern u1="Y" u2="&#x29;" k="-20" />
<hkern u1="Y" u2="&#x26;" k="30" />
<hkern u1="Z" u2="w" k="27" />
<hkern u1="[" u2="&#xdc;" k="18" />
<hkern u1="[" u2="&#xdb;" k="18" />
<hkern u1="[" u2="&#xda;" k="18" />
<hkern u1="[" u2="&#xd9;" k="18" />
<hkern u1="[" u2="U" k="18" />
<hkern u1="[" u2="J" k="18" />
<hkern u1="e" u2="&#x2019;" k="80" />
<hkern u1="f" u2="&#x201d;" k="-16" />
<hkern u1="f" u2="&#x201c;" k="-16" />
<hkern u1="f" u2="&#x2019;" k="-16" />
<hkern u1="f" u2="&#x2018;" k="-16" />
<hkern u1="f" u2="&#x153;" k="24" />
<hkern u1="f" u2="&#xeb;" k="24" />
<hkern u1="f" u2="&#xea;" k="24" />
<hkern u1="f" u2="&#xe9;" k="24" />
<hkern u1="f" u2="&#xe8;" k="24" />
<hkern u1="f" u2="&#xe7;" k="24" />
<hkern u1="f" u2="&#x7d;" k="-19" />
<hkern u1="f" u2="q" k="24" />
<hkern u1="f" u2="g" k="24" />
<hkern u1="f" u2="e" k="24" />
<hkern u1="f" u2="d" k="24" />
<hkern u1="f" u2="c" k="24" />
<hkern u1="f" u2="]" k="-18" />
<hkern u1="f" u2="&#x29;" k="-20" />
<hkern u1="f" u2="&#x27;" k="-16" />
<hkern u1="f" u2="&#x22;" k="-16" />
<hkern u1="h" u2="&#x2019;" k="80" />
<hkern u1="k" u2="&#x153;" k="20" />
<hkern u1="k" u2="&#xeb;" k="20" />
<hkern u1="k" u2="&#xea;" k="20" />
<hkern u1="k" u2="&#xe9;" k="20" />
<hkern u1="k" u2="&#xe8;" k="20" />
<hkern u1="k" u2="&#xe7;" k="20" />
<hkern u1="k" u2="q" k="20" />
<hkern u1="k" u2="g" k="20" />
<hkern u1="k" u2="e" k="20" />
<hkern u1="k" u2="d" k="20" />
<hkern u1="k" u2="c" k="20" />
<hkern u1="m" u2="&#x2019;" k="80" />
<hkern u1="n" u2="&#x2019;" k="80" />
<hkern u1="o" u2="&#x2019;" k="80" />
<hkern u1="r" u2="w" k="-17" />
<hkern u1="r" u2="t" k="-50" />
<hkern u1="r" u2="f" k="-15" />
<hkern u1="t" u2="&#xf6;" k="20" />
<hkern u1="t" u2="&#xf5;" k="20" />
<hkern u1="t" u2="&#xf4;" k="20" />
<hkern u1="t" u2="&#xf3;" k="20" />
<hkern u1="t" u2="&#xf2;" k="20" />
<hkern u1="t" u2="o" k="20" />
<hkern u1="v" u2="f" k="-13" />
<hkern u1="w" u2="&#x2026;" k="124" />
<hkern u1="w" u2="&#x201e;" k="124" />
<hkern u1="w" u2="&#x201a;" k="124" />
<hkern u1="w" u2="&#x2e;" k="124" />
<hkern u1="w" u2="&#x2c;" k="124" />
<hkern u1="y" u2="f" k="-13" />
<hkern u1="&#x7b;" u2="&#xdc;" k="20" />
<hkern u1="&#x7b;" u2="&#xdb;" k="20" />
<hkern u1="&#x7b;" u2="&#xda;" k="20" />
<hkern u1="&#x7b;" u2="&#xd9;" k="20" />
<hkern u1="&#x7b;" u2="U" k="20" />
<hkern u1="&#x7b;" u2="J" k="20" />
<hkern u1="&#xc0;" u2="w" k="33" />
<hkern u1="&#xc0;" u2="t" k="17" />
<hkern u1="&#xc0;" u2="&#x3f;" k="61" />
<hkern u1="&#xc1;" u2="w" k="33" />
<hkern u1="&#xc1;" u2="t" k="17" />
<hkern u1="&#xc1;" u2="&#x3f;" k="61" />
<hkern u1="&#xc2;" u2="w" k="33" />
<hkern u1="&#xc2;" u2="t" k="17" />
<hkern u1="&#xc2;" u2="&#x3f;" k="61" />
<hkern u1="&#xc3;" u2="w" k="33" />
<hkern u1="&#xc3;" u2="t" k="17" />
<hkern u1="&#xc3;" u2="&#x3f;" k="61" />
<hkern u1="&#xc4;" u2="w" k="33" />
<hkern u1="&#xc4;" u2="t" k="17" />
<hkern u1="&#xc4;" u2="&#x3f;" k="61" />
<hkern u1="&#xc5;" u2="w" k="33" />
<hkern u1="&#xc5;" u2="t" k="17" />
<hkern u1="&#xc5;" u2="&#x3f;" k="61" />
<hkern u1="&#xc7;" u2="&#x7d;" k="17" />
<hkern u1="&#xc7;" u2="]" k="12" />
<hkern u1="&#xc7;" u2="&#x29;" k="26" />
<hkern u1="&#xc8;" u2="w" k="22" />
<hkern u1="&#xc8;" u2="f" k="18" />
<hkern u1="&#xc9;" u2="w" k="22" />
<hkern u1="&#xc9;" u2="f" k="18" />
<hkern u1="&#xca;" u2="w" k="22" />
<hkern u1="&#xca;" u2="f" k="18" />
<hkern u1="&#xcb;" u2="w" k="22" />
<hkern u1="&#xcb;" u2="f" k="18" />
<hkern u1="&#xd0;" u2="&#xc6;" k="33" />
<hkern u1="&#xd2;" u2="&#xc6;" k="33" />
<hkern u1="&#xd3;" u2="&#xc6;" k="33" />
<hkern u1="&#xd4;" u2="&#xc6;" k="33" />
<hkern u1="&#xd5;" u2="&#xc6;" k="33" />
<hkern u1="&#xd6;" u2="&#xc6;" k="33" />
<hkern u1="&#xdd;" u2="&#x2022;" k="45" />
<hkern u1="&#xdd;" u2="&#xf8;" k="64" />
<hkern u1="&#xdd;" u2="&#xe6;" k="63" />
<hkern u1="&#xdd;" u2="&#xc6;" k="96" />
<hkern u1="&#xdd;" u2="&#xbb;" k="51" />
<hkern u1="&#xdd;" u2="&#xab;" k="82" />
<hkern u1="&#xdd;" u2="&#x7d;" k="-19" />
<hkern u1="&#xdd;" u2="t" k="22" />
<hkern u1="&#xdd;" u2="r" k="40" />
<hkern u1="&#xdd;" u2="f" k="22" />
<hkern u1="&#xdd;" u2="]" k="-18" />
<hkern u1="&#xdd;" u2="&#x2a;" k="49" />
<hkern u1="&#xdd;" u2="&#x29;" k="-20" />
<hkern u1="&#xdd;" u2="&#x26;" k="30" />
<hkern u1="&#xe8;" u2="&#x2019;" k="80" />
<hkern u1="&#xe9;" u2="&#x2019;" k="80" />
<hkern u1="&#xea;" u2="&#x2019;" k="80" />
<hkern u1="&#xeb;" u2="&#x2019;" k="80" />
<hkern u1="&#xf1;" u2="&#x2019;" k="80" />
<hkern u1="&#xf2;" u2="&#x2019;" k="80" />
<hkern u1="&#xf3;" u2="&#x2019;" k="80" />
<hkern u1="&#xf4;" u2="&#x2019;" k="80" />
<hkern u1="&#xf5;" u2="&#x2019;" k="80" />
<hkern u1="&#xf6;" u2="&#x2019;" k="80" />
<hkern u1="&#xfd;" u2="f" k="-13" />
<hkern u1="&#xff;" u2="f" k="-13" />
<hkern u1="&#x178;" u2="&#x2022;" k="45" />
<hkern u1="&#x178;" u2="&#xf8;" k="64" />
<hkern u1="&#x178;" u2="&#xe6;" k="63" />
<hkern u1="&#x178;" u2="&#xc6;" k="96" />
<hkern u1="&#x178;" u2="&#xbb;" k="51" />
<hkern u1="&#x178;" u2="&#xab;" k="82" />
<hkern u1="&#x178;" u2="&#x7d;" k="-19" />
<hkern u1="&#x178;" u2="t" k="22" />
<hkern u1="&#x178;" u2="r" k="40" />
<hkern u1="&#x178;" u2="f" k="22" />
<hkern u1="&#x178;" u2="]" k="-18" />
<hkern u1="&#x178;" u2="&#x2a;" k="49" />
<hkern u1="&#x178;" u2="&#x29;" k="-20" />
<hkern u1="&#x178;" u2="&#x26;" k="30" />
<hkern u1="&#x2018;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="&#xf6;" k="128" />
<hkern u1="&#x2019;" u2="&#xf5;" k="128" />
<hkern u1="&#x2019;" u2="&#xf4;" k="128" />
<hkern u1="&#x2019;" u2="&#xf3;" k="128" />
<hkern u1="&#x2019;" u2="&#xf2;" k="128" />
<hkern u1="&#x2019;" u2="w" k="-11" />
<hkern u1="&#x2019;" u2="s" k="112" />
<hkern u1="&#x2019;" u2="o" k="128" />
<hkern u1="&#x2019;" u2="l" k="-32" />
<hkern u1="&#x2019;" u2="k" k="-32" />
<hkern u1="&#x2019;" u2="h" k="-32" />
<hkern u1="&#x201c;" u2="w" k="-11" />
<hkern u1="&#x201d;" u2="w" k="-11" />
<hkern g1="B" g2="T" k="27" />
<hkern g1="B" g2="V" k="24" />
<hkern g1="B" g2="Y,Yacute,Ydieresis" k="55" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="T" k="29" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="Y,Yacute,Ydieresis" k="28" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-18" />
<hkern g1="H,I,M,N,Igrave,Iacute,Icircumflex,Idieresis,Ntilde" g2="X" k="-17" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="T" k="27" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="V" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Y,Yacute,Ydieresis" k="43" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="21" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="X" k="22" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="102" />
<hkern g1="D,O,Eth,Ograve,Oacute,Ocircumflex,Otilde,Odieresis" g2="Z" k="23" />
<hkern g1="C,Ccedilla" g2="T" k="29" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="v,y,yacute,ydieresis" k="26" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="19" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="T" k="-20" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="17" />
<hkern g1="E,Egrave,Eacute,Ecircumflex,Edieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="T" g2="v,y,yacute,ydieresis" k="72" />
<hkern g1="T" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="28" />
<hkern g1="T" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="99" />
<hkern g1="T" g2="W" k="-15" />
<hkern g1="T" g2="T" k="-16" />
<hkern g1="T" g2="u,ugrave,uacute,ucircumflex,udieresis" k="95" />
<hkern g1="T" g2="z" k="60" />
<hkern g1="T" g2="V" k="-16" />
<hkern g1="T" g2="Y,Yacute,Ydieresis" k="-16" />
<hkern g1="T" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="79" />
<hkern g1="T" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="218" />
<hkern g1="T" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="99" />
<hkern g1="T" g2="x" k="77" />
<hkern g1="T" g2="hyphen,uni00AD,endash,emdash" k="232" />
<hkern g1="T" g2="m,n,p,ntilde" k="109" />
<hkern g1="T" g2="S" k="16" />
<hkern g1="T" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="113" />
<hkern g1="T" g2="s" k="116" />
<hkern g1="T" g2="J" k="240" />
<hkern g1="K" g2="v,y,yacute,ydieresis" k="40" />
<hkern g1="K" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="31" />
<hkern g1="K" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="27" />
<hkern g1="K" g2="u,ugrave,uacute,ucircumflex,udieresis" k="23" />
<hkern g1="K" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="K" g2="hyphen,uni00AD,endash,emdash" k="64" />
<hkern g1="K" g2="m,n,p,ntilde" k="23" />
<hkern g1="L" g2="v,y,yacute,ydieresis" k="133" />
<hkern g1="L" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="65" />
<hkern g1="L" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="54" />
<hkern g1="L" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="336" />
<hkern g1="L" g2="W" k="143" />
<hkern g1="L" g2="T" k="275" />
<hkern g1="L" g2="u,ugrave,uacute,ucircumflex,udieresis" k="44" />
<hkern g1="L" g2="V" k="175" />
<hkern g1="L" g2="Y,Yacute,Ydieresis" k="239" />
<hkern g1="L" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-19" />
<hkern g1="P" g2="v,y,yacute,ydieresis" k="-15" />
<hkern g1="P" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="13" />
<hkern g1="P" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="138" />
<hkern g1="P" g2="X" k="31" />
<hkern g1="P" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="324" />
<hkern g1="P" g2="Z" k="26" />
<hkern g1="P" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="P" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="11" />
<hkern g1="P" g2="J" k="200" />
<hkern g1="J,U,Ugrave,Uacute,Ucircumflex,Udieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="22" />
<hkern g1="V" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="V" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="13" />
<hkern g1="V" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="46" />
<hkern g1="V" g2="u,ugrave,uacute,ucircumflex,udieresis" k="28" />
<hkern g1="V" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="75" />
<hkern g1="V" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="225" />
<hkern g1="V" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="44" />
<hkern g1="V" g2="hyphen,uni00AD,endash,emdash" k="37" />
<hkern g1="V" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="46" />
<hkern g1="X" g2="v,y,yacute,ydieresis" k="31" />
<hkern g1="X" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="25" />
<hkern g1="X" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="X" g2="u,ugrave,uacute,ucircumflex,udieresis" k="21" />
<hkern g1="X" g2="V" k="-14" />
<hkern g1="X" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="26" />
<hkern g1="X" g2="hyphen,uni00AD,endash,emdash" k="46" />
<hkern g1="Y,Yacute,Ydieresis" g2="v,y,yacute,ydieresis" k="20" />
<hkern g1="Y,Yacute,Ydieresis" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="29" />
<hkern g1="Y,Yacute,Ydieresis" g2="U,Ugrave,Uacute,Ucircumflex,Udieresis" k="96" />
<hkern g1="Y,Yacute,Ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="W" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="T" k="-17" />
<hkern g1="Y,Yacute,Ydieresis" g2="u,ugrave,uacute,ucircumflex,udieresis" k="39" />
<hkern g1="Y,Yacute,Ydieresis" g2="z" k="30" />
<hkern g1="Y,Yacute,Ydieresis" g2="V" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="Y,Yacute,Ydieresis" k="-18" />
<hkern g1="Y,Yacute,Ydieresis" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="94" />
<hkern g1="Y,Yacute,Ydieresis" g2="X" k="-13" />
<hkern g1="Y,Yacute,Ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="211" />
<hkern g1="Y,Yacute,Ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="65" />
<hkern g1="Y,Yacute,Ydieresis" g2="x" k="23" />
<hkern g1="Y,Yacute,Ydieresis" g2="hyphen,uni00AD,endash,emdash" k="52" />
<hkern g1="Y,Yacute,Ydieresis" g2="m,n,p,ntilde" k="40" />
<hkern g1="Y,Yacute,Ydieresis" g2="S" k="16" />
<hkern g1="Y,Yacute,Ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="73" />
<hkern g1="Y,Yacute,Ydieresis" g2="s" k="58" />
<hkern g1="Y,Yacute,Ydieresis" g2="J" k="96" />
<hkern g1="W" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="31" />
<hkern g1="W" g2="T" k="-14" />
<hkern g1="W" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="W" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="43" />
<hkern g1="W" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
<hkern g1="W" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="31" />
<hkern g1="W" g2="hyphen,uni00AD,endash,emdash" k="60" />
<hkern g1="W" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="33" />
<hkern g1="Z" g2="v,y,yacute,ydieresis" k="27" />
<hkern g1="Z" g2="C,G,O,Q,Ccedilla,Ograve,Oacute,Ocircumflex,Otilde,Odieresis,Oslash,OE" k="26" />
<hkern g1="Z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="21" />
<hkern g1="Z" g2="u,ugrave,uacute,ucircumflex,udieresis" k="19" />
<hkern g1="Z" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="-13" />
<hkern g1="Z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="21" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="a,agrave,aacute,acircumflex,atilde,adieresis,aring" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="67" />
<hkern g1="c,ccedilla" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="11" />
<hkern g1="b,p,thorn" g2="v,y,yacute,ydieresis" k="11" />
<hkern g1="b,p,thorn" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="29" />
<hkern g1="b,p,thorn" g2="z" k="15" />
<hkern g1="b,p,thorn" g2="x" k="15" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="v,y,yacute,ydieresis" k="13" />
<hkern g1="e,egrave,eacute,ecircumflex,edieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="14" />
<hkern g1="h,m,n,ntilde" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="104" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="v,y,yacute,ydieresis" k="15" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="136" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="z" k="16" />
<hkern g1="o,ograve,oacute,ocircumflex,otilde,odieresis" g2="x" k="21" />
<hkern g1="v,y,yacute,ydieresis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-15" />
<hkern g1="v,y,yacute,ydieresis" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="15" />
<hkern g1="v,y,yacute,ydieresis" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="107" />
<hkern g1="v,y,yacute,ydieresis" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="13" />
<hkern g1="v,y,yacute,ydieresis" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="15" />
<hkern g1="r" g2="v,y,yacute,ydieresis" k="-18" />
<hkern g1="r" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="-16" />
<hkern g1="r" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
<hkern g1="r" g2="comma,period,quotesinglbase,quotedblbase,ellipsis" k="123" />
<hkern g1="r" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="19" />
<hkern g1="r" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="40" />
<hkern g1="x" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="20" />
<hkern g1="x" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="20" />
<hkern g1="z" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="16" />
<hkern g1="z" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="16" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="107" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="o,ograve,oacute,ocircumflex,otilde,odieresis" k="61" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="A,Agrave,Aacute,Acircumflex,Atilde,Adieresis,Aring" k="120" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="c,d,e,g,q,ccedilla,egrave,eacute,ecircumflex,edieresis,oe" k="59" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="m,n,p,ntilde" k="20" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="a,agrave,aacute,acircumflex,atilde,adieresis,aring" k="50" />
<hkern g1="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" g2="s" k="80" />
<hkern g1="comma,period,quotesinglbase,quotedblbase,ellipsis" g2="quotedbl,quotesingle,quoteleft,quoteright,quotedblleft,quotedblright" k="170" />
</font>
</defs></svg>

Before

Width:  |  Height:  |  Size: 81 KiB

Some files were not shown because too many files have changed in this diff Show More