Merge master

This commit is contained in:
An Phan 2016-10-18 18:41:31 +08:00
commit ac3da3f793
No known key found for this signature in database
GPG key ID: 05536BB4BCDC02A2
166 changed files with 10037 additions and 2774 deletions

View file

@ -1,13 +1,3 @@
APP_ENV=production
APP_DEBUG=true
APP_URL=http://localhost
# If you want to use Amazon S3 with Koel, fill the info here and follow the
# installation guide at https://github.com/phanan/koel-aws.
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=
# Database connection name, which corresponds to the database driver.
# Possible values are:
# mysql (MySQL/MariaDB - default)
@ -19,13 +9,6 @@ DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
# A random 32-char string
APP_KEY=
# Another random 32-char string
JWT_SECRET=
# Username and password for the initial admin account
# This info will be populated into the database during `php artisan db:seed`
# After that, it can (and should) be removed from this .env file
@ -33,6 +16,21 @@ ADMIN_EMAIL=
ADMIN_NAME=
ADMIN_PASSWORD=
# A random 32-char string. You can leave this empty if use php artisan koel:init.
APP_KEY=
# Another random 32-char string. You can leave this empty if use php artisan koel:init.
JWT_SECRET=
# By default, Koel ignores dot files and folders. This greatly improves performance if your media
# root have folders like .git or .cache. If by any chance your media files are under a dot folder,
# set the following setting to false.
IGNORE_DOT_FILES=true
APP_ENV=production
APP_DEBUG=true
APP_URL=http://localhost
# The maximum scan time, in seconds. Increase this if you have a huge library.
# Note: This setting doesn't have effect when scanning via koel:sync.
@ -51,6 +49,17 @@ LASTFM_API_KEY=
LASTFM_API_SECRET=
# If you want to use Amazon S3 with Koel, fill the info here and follow the
# installation guide at https://github.com/phanan/koel-aws.
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_REGION=
# If you want Koel to integrate with YouTube, set the API key here.
YOUTUBE_API_KEY=
# You can also configure Koel to use a CDN to serve the media files.
# This url must be mapped to the home URL of your Koel's installation.
# No trailing slash, please.
@ -76,7 +85,8 @@ ALLOW_DOWNLOAD=true
# The variables below are Laravel-specific.
# You can change them if you know what you're doing. Otherwise, just leave them as-is.
APP_LOG_LEVEL=debug
BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
@ -87,3 +97,7 @@ MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
PUSHER_APP_ID=
PUSHER_KEY=
PUSHER_SECRET=

1
.gitignore vendored
View file

@ -3,7 +3,6 @@ node_modules
Homestead.yaml
Homestead.json
.env
/public
/.idea
/_ide_helper.php
/config.testing

110
.htaccess
View file

@ -1,41 +1,95 @@
<IfModule mod_headers.c>
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE"
Header always set Access-Control-Allow-Headers "Authorization,X-Accept-Charset,X-Accept,Content-Type"
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, PUT, OPTIONS, PATCH, DELETE"
Header always set Access-Control-Allow-Headers "Authorization,X-Accept-Charset,X-Accept,Content-Type"
</IfModule>
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteBase /
RewriteEngine On
RewriteBase /
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Redirect Trailing Slashes...
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Whitelist only index.php, robots.txt, and those start with public/ or api/
RewriteRule ^(?!($|index\.php|robots\.txt|(public|api)/)) - [R=404,L]
# Whitelist only index.php, robots.txt, and those start with public/ or api/
RewriteRule ^(?!($|index\.php|robots\.txt|(public|api)/)) - [R=404,L]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php [L]
# https://github.com/tymondesigns/jwt-auth/wiki/Authentication
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
</IfModule>
<IfModule mod_deflate.c>
# Disable deflation for media files.
SetEnvIfNoCase Request_URI "^/api/play/" no-gzip dont-vary
# https://github.com/tymondesigns/jwt-auth/wiki/Authentication
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
</IfModule>
<IfModule mod_expires.c>
# Cache the audio files for 1 year.
# It's up to the browser to respect this.
ExpiresActive On
ExpiresByType audio/(mpe?g3?|ogg|aac) "access plus 1 year"
# Cache the audio files for 1 year.
# It's up to the browser to respect this.
ExpiresActive On
ExpiresByType audio/(mpe?g3?|ogg|aac) "access plus 1 year"
</IfModule>
<IfModule mod_deflate.c>
# Disable deflation for media files.
SetEnvIfNoCase Request_URI "^/api/play/" no-gzip dont-vary
# ----------------------------------------------------------------------
# Gzip compression.
# Stolen from https://github.com/h5bp/server-configs-apache/
# ----------------------------------------------------------------------
# Force compression for mangled `Accept-Encoding` request headers
# https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
# Compress all output labeled with one of the following MIME-types
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/vnd.geo+json" \
"application/vnd.ms-fontobject" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/opentype" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"image/x-icon" \
"text/cache-manifest" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml"
</IfModule>
</IfModule>

557
.phpstorm.meta.php Normal file
View file

@ -0,0 +1,557 @@
<?php
namespace PHPSTORM_META {
/**
* PhpStorm Meta file, to provide autocomplete information for PhpStorm
* Generated on 2016-08-02.
*
* @author Barry vd. Heuvel <barryvdh@gmail.com>
* @see https://github.com/barryvdh/laravel-ide-helper
*/
$STATIC_METHOD_TYPES = [
new \Illuminate\Contracts\Container\Container => [
'' == '@',
'events' instanceof \Illuminate\Events\Dispatcher,
'router' instanceof \Illuminate\Routing\Router,
'url' instanceof \Illuminate\Routing\UrlGenerator,
'redirect' instanceof \Illuminate\Routing\Redirector,
'Illuminate\Contracts\Routing\ResponseFactory' instanceof \Illuminate\Routing\ResponseFactory,
'Illuminate\Contracts\Http\Kernel' instanceof \App\Http\Kernel,
'Illuminate\Contracts\Console\Kernel' instanceof \App\Console\Kernel,
'Illuminate\Contracts\Debug\ExceptionHandler' instanceof \App\Exceptions\Handler,
'auth' instanceof \Illuminate\Auth\AuthManager,
'auth.driver' instanceof \Illuminate\Auth\SessionGuard,
'Illuminate\Contracts\Auth\Access\Gate' instanceof \Illuminate\Auth\Access\Gate,
'cookie' instanceof \Illuminate\Cookie\CookieJar,
'Illuminate\Contracts\Queue\EntityResolver' instanceof \Illuminate\Database\Eloquent\QueueEntityResolver,
'db.factory' instanceof \Illuminate\Database\Connectors\ConnectionFactory,
'db' instanceof \Illuminate\Database\DatabaseManager,
'db.connection' instanceof \Illuminate\Database\MySqlConnection,
'encrypter' instanceof \Illuminate\Encryption\Encrypter,
'files' instanceof \Illuminate\Filesystem\Filesystem,
'filesystem' instanceof \Illuminate\Filesystem\FilesystemManager,
'filesystem.disk' instanceof \Illuminate\Filesystem\FilesystemAdapter,
'session' instanceof \Illuminate\Session\SessionManager,
'session.store' instanceof \Illuminate\Session\EncryptedStore,
'Illuminate\Session\Middleware\StartSession' instanceof \Illuminate\Session\Middleware\StartSession,
'view.engine.resolver' instanceof \Illuminate\View\Engines\EngineResolver,
'view.finder' instanceof \Illuminate\View\FileViewFinder,
'view' instanceof \Illuminate\View\Factory,
'tymon.jwt.provider.user' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'tymon.jwt.provider.jwt' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'tymon.jwt.provider.auth' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'tymon.jwt.provider.storage' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'tymon.jwt.blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'tymon.jwt.claim.factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'tymon.jwt.manager' instanceof \Tymon\JWTAuth\JWTManager,
'tymon.jwt.auth' instanceof \Tymon\JWTAuth\JWTAuth,
'tymon.jwt.validators.payload' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'tymon.jwt.payload.factory' instanceof \Tymon\JWTAuth\PayloadFactory,
'tymon.jwt.generate' instanceof \Tymon\JWTAuth\Commands\JWTGenerateCommand,
'Media' instanceof \App\Services\Media,
'Util' instanceof \App\Services\Util,
'Lastfm' instanceof \App\Services\Lastfm,
'YouTube' instanceof \App\Services\YouTube,
'Download' instanceof \App\Services\Download,
'Tymon\JWTAuth\JWTAuth' instanceof \Tymon\JWTAuth\JWTAuth,
'Tymon\JWTAuth\Providers\User\UserInterface' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'Tymon\JWTAuth\Providers\JWT\JWTInterface' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'Tymon\JWTAuth\Providers\Auth\AuthInterface' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'Tymon\JWTAuth\Providers\Storage\StorageInterface' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'Tymon\JWTAuth\JWTManager' instanceof \Tymon\JWTAuth\JWTManager,
'Tymon\JWTAuth\Blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'Tymon\JWTAuth\PayloadFactory' instanceof \Tymon\JWTAuth\PayloadFactory,
'Tymon\JWTAuth\Claims\Factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'Tymon\JWTAuth\Validators\PayloadValidator' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'validation.presence' instanceof \Illuminate\Validation\DatabasePresenceVerifier,
'translation.loader' instanceof \Illuminate\Translation\FileLoader,
'translator' instanceof \Illuminate\Translation\Translator,
'Illuminate\Broadcasting\BroadcastManager' instanceof \Illuminate\Broadcasting\BroadcastManager,
'Illuminate\Bus\Dispatcher' instanceof \Illuminate\Bus\Dispatcher,
'cache' instanceof \Illuminate\Cache\CacheManager,
'cache.store' instanceof \Illuminate\Cache\Repository,
'memcached.connector' instanceof \Illuminate\Cache\MemcachedConnector,
'command.cache.clear' instanceof \Illuminate\Cache\Console\ClearCommand,
'command.clear-compiled' instanceof \Illuminate\Foundation\Console\ClearCompiledCommand,
'command.auth.resets.clear' instanceof \Illuminate\Auth\Console\ClearResetsCommand,
'command.config.cache' instanceof \Illuminate\Foundation\Console\ConfigCacheCommand,
'command.config.clear' instanceof \Illuminate\Foundation\Console\ConfigClearCommand,
'command.down' instanceof \Illuminate\Foundation\Console\DownCommand,
'command.environment' instanceof \Illuminate\Foundation\Console\EnvironmentCommand,
'command.key.generate' instanceof \Illuminate\Foundation\Console\KeyGenerateCommand,
'command.optimize' instanceof \Illuminate\Foundation\Console\OptimizeCommand,
'command.route.cache' instanceof \Illuminate\Foundation\Console\RouteCacheCommand,
'command.route.clear' instanceof \Illuminate\Foundation\Console\RouteClearCommand,
'command.route.list' instanceof \Illuminate\Foundation\Console\RouteListCommand,
'command.tinker' instanceof \Illuminate\Foundation\Console\TinkerCommand,
'command.up' instanceof \Illuminate\Foundation\Console\UpCommand,
'command.view.clear' instanceof \Illuminate\Foundation\Console\ViewClearCommand,
'command.app.name' instanceof \Illuminate\Foundation\Console\AppNameCommand,
'command.auth.make' instanceof \Illuminate\Auth\Console\MakeAuthCommand,
'command.cache.table' instanceof \Illuminate\Cache\Console\CacheTableCommand,
'command.console.make' instanceof \Illuminate\Foundation\Console\ConsoleMakeCommand,
'command.controller.make' instanceof \Illuminate\Routing\Console\ControllerMakeCommand,
'command.event.generate' instanceof \Illuminate\Foundation\Console\EventGenerateCommand,
'command.event.make' instanceof \Illuminate\Foundation\Console\EventMakeCommand,
'command.job.make' instanceof \Illuminate\Foundation\Console\JobMakeCommand,
'command.listener.make' instanceof \Illuminate\Foundation\Console\ListenerMakeCommand,
'command.middleware.make' instanceof \Illuminate\Routing\Console\MiddlewareMakeCommand,
'command.model.make' instanceof \Illuminate\Foundation\Console\ModelMakeCommand,
'command.policy.make' instanceof \Illuminate\Foundation\Console\PolicyMakeCommand,
'command.provider.make' instanceof \Illuminate\Foundation\Console\ProviderMakeCommand,
'command.queue.failed-table' instanceof \Illuminate\Queue\Console\FailedTableCommand,
'command.queue.table' instanceof \Illuminate\Queue\Console\TableCommand,
'command.request.make' instanceof \Illuminate\Foundation\Console\RequestMakeCommand,
'command.seeder.make' instanceof \Illuminate\Database\Console\Seeds\SeederMakeCommand,
'command.session.table' instanceof \Illuminate\Session\Console\SessionTableCommand,
'command.serve' instanceof \Illuminate\Foundation\Console\ServeCommand,
'command.test.make' instanceof \Illuminate\Foundation\Console\TestMakeCommand,
'command.vendor.publish' instanceof \Illuminate\Foundation\Console\VendorPublishCommand,
'migration.repository' instanceof \Illuminate\Database\Migrations\DatabaseMigrationRepository,
'migrator' instanceof \Illuminate\Database\Migrations\Migrator,
'migration.creator' instanceof \Illuminate\Database\Migrations\MigrationCreator,
'command.migrate' instanceof \Illuminate\Database\Console\Migrations\MigrateCommand,
'command.migrate.rollback' instanceof \Illuminate\Database\Console\Migrations\RollbackCommand,
'command.migrate.reset' instanceof \Illuminate\Database\Console\Migrations\ResetCommand,
'command.migrate.refresh' instanceof \Illuminate\Database\Console\Migrations\RefreshCommand,
'command.migrate.install' instanceof \Illuminate\Database\Console\Migrations\InstallCommand,
'command.migrate.make' instanceof \Illuminate\Database\Console\Migrations\MigrateMakeCommand,
'command.migrate.status' instanceof \Illuminate\Database\Console\Migrations\StatusCommand,
'command.seed' instanceof \Illuminate\Database\Console\Seeds\SeedCommand,
'composer' instanceof \Illuminate\Support\Composer,
'command.queue.failed' instanceof \Illuminate\Queue\Console\ListFailedCommand,
'command.queue.retry' instanceof \Illuminate\Queue\Console\RetryCommand,
'command.queue.forget' instanceof \Illuminate\Queue\Console\ForgetFailedCommand,
'command.queue.flush' instanceof \Illuminate\Queue\Console\FlushFailedCommand,
'hash' instanceof \Illuminate\Hashing\BcryptHasher,
'swift.transport' instanceof \Illuminate\Mail\TransportManager,
'swift.mailer' instanceof \Swift_Mailer,
'mailer' instanceof \Illuminate\Mail\Mailer,
'Illuminate\Contracts\Pipeline\Hub' instanceof \Illuminate\Pipeline\Hub,
'queue' instanceof \Illuminate\Queue\QueueManager,
'queue.connection' instanceof \Illuminate\Queue\SyncQueue,
'command.queue.work' instanceof \Illuminate\Queue\Console\WorkCommand,
'command.queue.restart' instanceof \Illuminate\Queue\Console\RestartCommand,
'queue.worker' instanceof \Illuminate\Queue\Worker,
'command.queue.listen' instanceof \Illuminate\Queue\Console\ListenCommand,
'queue.listener' instanceof \Illuminate\Queue\Listener,
'queue.failer' instanceof \Illuminate\Queue\Failed\DatabaseFailedJobProvider,
'IlluminateQueueClosure' instanceof \IlluminateQueueClosure,
'auth.password' instanceof \Illuminate\Auth\Passwords\PasswordBrokerManager,
'auth.password.broker' instanceof \Illuminate\Auth\Passwords\PasswordBroker,
'command.ide-helper.generate' instanceof \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand,
'command.ide-helper.models' instanceof \Barryvdh\LaravelIdeHelper\Console\ModelsCommand,
'command.ide-helper.meta' instanceof \Barryvdh\LaravelIdeHelper\Console\MetaCommand,
'blade.compiler' instanceof \Illuminate\View\Compilers\BladeCompiler,
'aws' instanceof \Aws\Sdk,
],
\Illuminate\Contracts\Container\Container::make('') => [
'' == '@',
'events' instanceof \Illuminate\Events\Dispatcher,
'router' instanceof \Illuminate\Routing\Router,
'url' instanceof \Illuminate\Routing\UrlGenerator,
'redirect' instanceof \Illuminate\Routing\Redirector,
'Illuminate\Contracts\Routing\ResponseFactory' instanceof \Illuminate\Routing\ResponseFactory,
'Illuminate\Contracts\Http\Kernel' instanceof \App\Http\Kernel,
'Illuminate\Contracts\Console\Kernel' instanceof \App\Console\Kernel,
'Illuminate\Contracts\Debug\ExceptionHandler' instanceof \App\Exceptions\Handler,
'auth' instanceof \Illuminate\Auth\AuthManager,
'auth.driver' instanceof \Illuminate\Auth\SessionGuard,
'Illuminate\Contracts\Auth\Access\Gate' instanceof \Illuminate\Auth\Access\Gate,
'cookie' instanceof \Illuminate\Cookie\CookieJar,
'Illuminate\Contracts\Queue\EntityResolver' instanceof \Illuminate\Database\Eloquent\QueueEntityResolver,
'db.factory' instanceof \Illuminate\Database\Connectors\ConnectionFactory,
'db' instanceof \Illuminate\Database\DatabaseManager,
'db.connection' instanceof \Illuminate\Database\MySqlConnection,
'encrypter' instanceof \Illuminate\Encryption\Encrypter,
'files' instanceof \Illuminate\Filesystem\Filesystem,
'filesystem' instanceof \Illuminate\Filesystem\FilesystemManager,
'filesystem.disk' instanceof \Illuminate\Filesystem\FilesystemAdapter,
'session' instanceof \Illuminate\Session\SessionManager,
'session.store' instanceof \Illuminate\Session\EncryptedStore,
'Illuminate\Session\Middleware\StartSession' instanceof \Illuminate\Session\Middleware\StartSession,
'view.engine.resolver' instanceof \Illuminate\View\Engines\EngineResolver,
'view.finder' instanceof \Illuminate\View\FileViewFinder,
'view' instanceof \Illuminate\View\Factory,
'tymon.jwt.provider.user' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'tymon.jwt.provider.jwt' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'tymon.jwt.provider.auth' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'tymon.jwt.provider.storage' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'tymon.jwt.blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'tymon.jwt.claim.factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'tymon.jwt.manager' instanceof \Tymon\JWTAuth\JWTManager,
'tymon.jwt.auth' instanceof \Tymon\JWTAuth\JWTAuth,
'tymon.jwt.validators.payload' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'tymon.jwt.payload.factory' instanceof \Tymon\JWTAuth\PayloadFactory,
'tymon.jwt.generate' instanceof \Tymon\JWTAuth\Commands\JWTGenerateCommand,
'Media' instanceof \App\Services\Media,
'Util' instanceof \App\Services\Util,
'Lastfm' instanceof \App\Services\Lastfm,
'YouTube' instanceof \App\Services\YouTube,
'Download' instanceof \App\Services\Download,
'Tymon\JWTAuth\JWTAuth' instanceof \Tymon\JWTAuth\JWTAuth,
'Tymon\JWTAuth\Providers\User\UserInterface' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'Tymon\JWTAuth\Providers\JWT\JWTInterface' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'Tymon\JWTAuth\Providers\Auth\AuthInterface' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'Tymon\JWTAuth\Providers\Storage\StorageInterface' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'Tymon\JWTAuth\JWTManager' instanceof \Tymon\JWTAuth\JWTManager,
'Tymon\JWTAuth\Blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'Tymon\JWTAuth\PayloadFactory' instanceof \Tymon\JWTAuth\PayloadFactory,
'Tymon\JWTAuth\Claims\Factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'Tymon\JWTAuth\Validators\PayloadValidator' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'validation.presence' instanceof \Illuminate\Validation\DatabasePresenceVerifier,
'translation.loader' instanceof \Illuminate\Translation\FileLoader,
'translator' instanceof \Illuminate\Translation\Translator,
'Illuminate\Broadcasting\BroadcastManager' instanceof \Illuminate\Broadcasting\BroadcastManager,
'Illuminate\Bus\Dispatcher' instanceof \Illuminate\Bus\Dispatcher,
'cache' instanceof \Illuminate\Cache\CacheManager,
'cache.store' instanceof \Illuminate\Cache\Repository,
'memcached.connector' instanceof \Illuminate\Cache\MemcachedConnector,
'command.cache.clear' instanceof \Illuminate\Cache\Console\ClearCommand,
'command.clear-compiled' instanceof \Illuminate\Foundation\Console\ClearCompiledCommand,
'command.auth.resets.clear' instanceof \Illuminate\Auth\Console\ClearResetsCommand,
'command.config.cache' instanceof \Illuminate\Foundation\Console\ConfigCacheCommand,
'command.config.clear' instanceof \Illuminate\Foundation\Console\ConfigClearCommand,
'command.down' instanceof \Illuminate\Foundation\Console\DownCommand,
'command.environment' instanceof \Illuminate\Foundation\Console\EnvironmentCommand,
'command.key.generate' instanceof \Illuminate\Foundation\Console\KeyGenerateCommand,
'command.optimize' instanceof \Illuminate\Foundation\Console\OptimizeCommand,
'command.route.cache' instanceof \Illuminate\Foundation\Console\RouteCacheCommand,
'command.route.clear' instanceof \Illuminate\Foundation\Console\RouteClearCommand,
'command.route.list' instanceof \Illuminate\Foundation\Console\RouteListCommand,
'command.tinker' instanceof \Illuminate\Foundation\Console\TinkerCommand,
'command.up' instanceof \Illuminate\Foundation\Console\UpCommand,
'command.view.clear' instanceof \Illuminate\Foundation\Console\ViewClearCommand,
'command.app.name' instanceof \Illuminate\Foundation\Console\AppNameCommand,
'command.auth.make' instanceof \Illuminate\Auth\Console\MakeAuthCommand,
'command.cache.table' instanceof \Illuminate\Cache\Console\CacheTableCommand,
'command.console.make' instanceof \Illuminate\Foundation\Console\ConsoleMakeCommand,
'command.controller.make' instanceof \Illuminate\Routing\Console\ControllerMakeCommand,
'command.event.generate' instanceof \Illuminate\Foundation\Console\EventGenerateCommand,
'command.event.make' instanceof \Illuminate\Foundation\Console\EventMakeCommand,
'command.job.make' instanceof \Illuminate\Foundation\Console\JobMakeCommand,
'command.listener.make' instanceof \Illuminate\Foundation\Console\ListenerMakeCommand,
'command.middleware.make' instanceof \Illuminate\Routing\Console\MiddlewareMakeCommand,
'command.model.make' instanceof \Illuminate\Foundation\Console\ModelMakeCommand,
'command.policy.make' instanceof \Illuminate\Foundation\Console\PolicyMakeCommand,
'command.provider.make' instanceof \Illuminate\Foundation\Console\ProviderMakeCommand,
'command.queue.failed-table' instanceof \Illuminate\Queue\Console\FailedTableCommand,
'command.queue.table' instanceof \Illuminate\Queue\Console\TableCommand,
'command.request.make' instanceof \Illuminate\Foundation\Console\RequestMakeCommand,
'command.seeder.make' instanceof \Illuminate\Database\Console\Seeds\SeederMakeCommand,
'command.session.table' instanceof \Illuminate\Session\Console\SessionTableCommand,
'command.serve' instanceof \Illuminate\Foundation\Console\ServeCommand,
'command.test.make' instanceof \Illuminate\Foundation\Console\TestMakeCommand,
'command.vendor.publish' instanceof \Illuminate\Foundation\Console\VendorPublishCommand,
'migration.repository' instanceof \Illuminate\Database\Migrations\DatabaseMigrationRepository,
'migrator' instanceof \Illuminate\Database\Migrations\Migrator,
'migration.creator' instanceof \Illuminate\Database\Migrations\MigrationCreator,
'command.migrate' instanceof \Illuminate\Database\Console\Migrations\MigrateCommand,
'command.migrate.rollback' instanceof \Illuminate\Database\Console\Migrations\RollbackCommand,
'command.migrate.reset' instanceof \Illuminate\Database\Console\Migrations\ResetCommand,
'command.migrate.refresh' instanceof \Illuminate\Database\Console\Migrations\RefreshCommand,
'command.migrate.install' instanceof \Illuminate\Database\Console\Migrations\InstallCommand,
'command.migrate.make' instanceof \Illuminate\Database\Console\Migrations\MigrateMakeCommand,
'command.migrate.status' instanceof \Illuminate\Database\Console\Migrations\StatusCommand,
'command.seed' instanceof \Illuminate\Database\Console\Seeds\SeedCommand,
'composer' instanceof \Illuminate\Support\Composer,
'command.queue.failed' instanceof \Illuminate\Queue\Console\ListFailedCommand,
'command.queue.retry' instanceof \Illuminate\Queue\Console\RetryCommand,
'command.queue.forget' instanceof \Illuminate\Queue\Console\ForgetFailedCommand,
'command.queue.flush' instanceof \Illuminate\Queue\Console\FlushFailedCommand,
'hash' instanceof \Illuminate\Hashing\BcryptHasher,
'swift.transport' instanceof \Illuminate\Mail\TransportManager,
'swift.mailer' instanceof \Swift_Mailer,
'mailer' instanceof \Illuminate\Mail\Mailer,
'Illuminate\Contracts\Pipeline\Hub' instanceof \Illuminate\Pipeline\Hub,
'queue' instanceof \Illuminate\Queue\QueueManager,
'queue.connection' instanceof \Illuminate\Queue\SyncQueue,
'command.queue.work' instanceof \Illuminate\Queue\Console\WorkCommand,
'command.queue.restart' instanceof \Illuminate\Queue\Console\RestartCommand,
'queue.worker' instanceof \Illuminate\Queue\Worker,
'command.queue.listen' instanceof \Illuminate\Queue\Console\ListenCommand,
'queue.listener' instanceof \Illuminate\Queue\Listener,
'queue.failer' instanceof \Illuminate\Queue\Failed\DatabaseFailedJobProvider,
'IlluminateQueueClosure' instanceof \IlluminateQueueClosure,
'auth.password' instanceof \Illuminate\Auth\Passwords\PasswordBrokerManager,
'auth.password.broker' instanceof \Illuminate\Auth\Passwords\PasswordBroker,
'command.ide-helper.generate' instanceof \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand,
'command.ide-helper.models' instanceof \Barryvdh\LaravelIdeHelper\Console\ModelsCommand,
'command.ide-helper.meta' instanceof \Barryvdh\LaravelIdeHelper\Console\MetaCommand,
'blade.compiler' instanceof \Illuminate\View\Compilers\BladeCompiler,
'aws' instanceof \Aws\Sdk,
],
\App::make('') => [
'' == '@',
'events' instanceof \Illuminate\Events\Dispatcher,
'router' instanceof \Illuminate\Routing\Router,
'url' instanceof \Illuminate\Routing\UrlGenerator,
'redirect' instanceof \Illuminate\Routing\Redirector,
'Illuminate\Contracts\Routing\ResponseFactory' instanceof \Illuminate\Routing\ResponseFactory,
'Illuminate\Contracts\Http\Kernel' instanceof \App\Http\Kernel,
'Illuminate\Contracts\Console\Kernel' instanceof \App\Console\Kernel,
'Illuminate\Contracts\Debug\ExceptionHandler' instanceof \App\Exceptions\Handler,
'auth' instanceof \Illuminate\Auth\AuthManager,
'auth.driver' instanceof \Illuminate\Auth\SessionGuard,
'Illuminate\Contracts\Auth\Access\Gate' instanceof \Illuminate\Auth\Access\Gate,
'cookie' instanceof \Illuminate\Cookie\CookieJar,
'Illuminate\Contracts\Queue\EntityResolver' instanceof \Illuminate\Database\Eloquent\QueueEntityResolver,
'db.factory' instanceof \Illuminate\Database\Connectors\ConnectionFactory,
'db' instanceof \Illuminate\Database\DatabaseManager,
'db.connection' instanceof \Illuminate\Database\MySqlConnection,
'encrypter' instanceof \Illuminate\Encryption\Encrypter,
'files' instanceof \Illuminate\Filesystem\Filesystem,
'filesystem' instanceof \Illuminate\Filesystem\FilesystemManager,
'filesystem.disk' instanceof \Illuminate\Filesystem\FilesystemAdapter,
'session' instanceof \Illuminate\Session\SessionManager,
'session.store' instanceof \Illuminate\Session\EncryptedStore,
'Illuminate\Session\Middleware\StartSession' instanceof \Illuminate\Session\Middleware\StartSession,
'view.engine.resolver' instanceof \Illuminate\View\Engines\EngineResolver,
'view.finder' instanceof \Illuminate\View\FileViewFinder,
'view' instanceof \Illuminate\View\Factory,
'tymon.jwt.provider.user' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'tymon.jwt.provider.jwt' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'tymon.jwt.provider.auth' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'tymon.jwt.provider.storage' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'tymon.jwt.blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'tymon.jwt.claim.factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'tymon.jwt.manager' instanceof \Tymon\JWTAuth\JWTManager,
'tymon.jwt.auth' instanceof \Tymon\JWTAuth\JWTAuth,
'tymon.jwt.validators.payload' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'tymon.jwt.payload.factory' instanceof \Tymon\JWTAuth\PayloadFactory,
'tymon.jwt.generate' instanceof \Tymon\JWTAuth\Commands\JWTGenerateCommand,
'Media' instanceof \App\Services\Media,
'Util' instanceof \App\Services\Util,
'Lastfm' instanceof \App\Services\Lastfm,
'YouTube' instanceof \App\Services\YouTube,
'Download' instanceof \App\Services\Download,
'Tymon\JWTAuth\JWTAuth' instanceof \Tymon\JWTAuth\JWTAuth,
'Tymon\JWTAuth\Providers\User\UserInterface' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'Tymon\JWTAuth\Providers\JWT\JWTInterface' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'Tymon\JWTAuth\Providers\Auth\AuthInterface' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'Tymon\JWTAuth\Providers\Storage\StorageInterface' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'Tymon\JWTAuth\JWTManager' instanceof \Tymon\JWTAuth\JWTManager,
'Tymon\JWTAuth\Blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'Tymon\JWTAuth\PayloadFactory' instanceof \Tymon\JWTAuth\PayloadFactory,
'Tymon\JWTAuth\Claims\Factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'Tymon\JWTAuth\Validators\PayloadValidator' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'validation.presence' instanceof \Illuminate\Validation\DatabasePresenceVerifier,
'translation.loader' instanceof \Illuminate\Translation\FileLoader,
'translator' instanceof \Illuminate\Translation\Translator,
'Illuminate\Broadcasting\BroadcastManager' instanceof \Illuminate\Broadcasting\BroadcastManager,
'Illuminate\Bus\Dispatcher' instanceof \Illuminate\Bus\Dispatcher,
'cache' instanceof \Illuminate\Cache\CacheManager,
'cache.store' instanceof \Illuminate\Cache\Repository,
'memcached.connector' instanceof \Illuminate\Cache\MemcachedConnector,
'command.cache.clear' instanceof \Illuminate\Cache\Console\ClearCommand,
'command.clear-compiled' instanceof \Illuminate\Foundation\Console\ClearCompiledCommand,
'command.auth.resets.clear' instanceof \Illuminate\Auth\Console\ClearResetsCommand,
'command.config.cache' instanceof \Illuminate\Foundation\Console\ConfigCacheCommand,
'command.config.clear' instanceof \Illuminate\Foundation\Console\ConfigClearCommand,
'command.down' instanceof \Illuminate\Foundation\Console\DownCommand,
'command.environment' instanceof \Illuminate\Foundation\Console\EnvironmentCommand,
'command.key.generate' instanceof \Illuminate\Foundation\Console\KeyGenerateCommand,
'command.optimize' instanceof \Illuminate\Foundation\Console\OptimizeCommand,
'command.route.cache' instanceof \Illuminate\Foundation\Console\RouteCacheCommand,
'command.route.clear' instanceof \Illuminate\Foundation\Console\RouteClearCommand,
'command.route.list' instanceof \Illuminate\Foundation\Console\RouteListCommand,
'command.tinker' instanceof \Illuminate\Foundation\Console\TinkerCommand,
'command.up' instanceof \Illuminate\Foundation\Console\UpCommand,
'command.view.clear' instanceof \Illuminate\Foundation\Console\ViewClearCommand,
'command.app.name' instanceof \Illuminate\Foundation\Console\AppNameCommand,
'command.auth.make' instanceof \Illuminate\Auth\Console\MakeAuthCommand,
'command.cache.table' instanceof \Illuminate\Cache\Console\CacheTableCommand,
'command.console.make' instanceof \Illuminate\Foundation\Console\ConsoleMakeCommand,
'command.controller.make' instanceof \Illuminate\Routing\Console\ControllerMakeCommand,
'command.event.generate' instanceof \Illuminate\Foundation\Console\EventGenerateCommand,
'command.event.make' instanceof \Illuminate\Foundation\Console\EventMakeCommand,
'command.job.make' instanceof \Illuminate\Foundation\Console\JobMakeCommand,
'command.listener.make' instanceof \Illuminate\Foundation\Console\ListenerMakeCommand,
'command.middleware.make' instanceof \Illuminate\Routing\Console\MiddlewareMakeCommand,
'command.model.make' instanceof \Illuminate\Foundation\Console\ModelMakeCommand,
'command.policy.make' instanceof \Illuminate\Foundation\Console\PolicyMakeCommand,
'command.provider.make' instanceof \Illuminate\Foundation\Console\ProviderMakeCommand,
'command.queue.failed-table' instanceof \Illuminate\Queue\Console\FailedTableCommand,
'command.queue.table' instanceof \Illuminate\Queue\Console\TableCommand,
'command.request.make' instanceof \Illuminate\Foundation\Console\RequestMakeCommand,
'command.seeder.make' instanceof \Illuminate\Database\Console\Seeds\SeederMakeCommand,
'command.session.table' instanceof \Illuminate\Session\Console\SessionTableCommand,
'command.serve' instanceof \Illuminate\Foundation\Console\ServeCommand,
'command.test.make' instanceof \Illuminate\Foundation\Console\TestMakeCommand,
'command.vendor.publish' instanceof \Illuminate\Foundation\Console\VendorPublishCommand,
'migration.repository' instanceof \Illuminate\Database\Migrations\DatabaseMigrationRepository,
'migrator' instanceof \Illuminate\Database\Migrations\Migrator,
'migration.creator' instanceof \Illuminate\Database\Migrations\MigrationCreator,
'command.migrate' instanceof \Illuminate\Database\Console\Migrations\MigrateCommand,
'command.migrate.rollback' instanceof \Illuminate\Database\Console\Migrations\RollbackCommand,
'command.migrate.reset' instanceof \Illuminate\Database\Console\Migrations\ResetCommand,
'command.migrate.refresh' instanceof \Illuminate\Database\Console\Migrations\RefreshCommand,
'command.migrate.install' instanceof \Illuminate\Database\Console\Migrations\InstallCommand,
'command.migrate.make' instanceof \Illuminate\Database\Console\Migrations\MigrateMakeCommand,
'command.migrate.status' instanceof \Illuminate\Database\Console\Migrations\StatusCommand,
'command.seed' instanceof \Illuminate\Database\Console\Seeds\SeedCommand,
'composer' instanceof \Illuminate\Support\Composer,
'command.queue.failed' instanceof \Illuminate\Queue\Console\ListFailedCommand,
'command.queue.retry' instanceof \Illuminate\Queue\Console\RetryCommand,
'command.queue.forget' instanceof \Illuminate\Queue\Console\ForgetFailedCommand,
'command.queue.flush' instanceof \Illuminate\Queue\Console\FlushFailedCommand,
'hash' instanceof \Illuminate\Hashing\BcryptHasher,
'swift.transport' instanceof \Illuminate\Mail\TransportManager,
'swift.mailer' instanceof \Swift_Mailer,
'mailer' instanceof \Illuminate\Mail\Mailer,
'Illuminate\Contracts\Pipeline\Hub' instanceof \Illuminate\Pipeline\Hub,
'queue' instanceof \Illuminate\Queue\QueueManager,
'queue.connection' instanceof \Illuminate\Queue\SyncQueue,
'command.queue.work' instanceof \Illuminate\Queue\Console\WorkCommand,
'command.queue.restart' instanceof \Illuminate\Queue\Console\RestartCommand,
'queue.worker' instanceof \Illuminate\Queue\Worker,
'command.queue.listen' instanceof \Illuminate\Queue\Console\ListenCommand,
'queue.listener' instanceof \Illuminate\Queue\Listener,
'queue.failer' instanceof \Illuminate\Queue\Failed\DatabaseFailedJobProvider,
'IlluminateQueueClosure' instanceof \IlluminateQueueClosure,
'auth.password' instanceof \Illuminate\Auth\Passwords\PasswordBrokerManager,
'auth.password.broker' instanceof \Illuminate\Auth\Passwords\PasswordBroker,
'command.ide-helper.generate' instanceof \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand,
'command.ide-helper.models' instanceof \Barryvdh\LaravelIdeHelper\Console\ModelsCommand,
'command.ide-helper.meta' instanceof \Barryvdh\LaravelIdeHelper\Console\MetaCommand,
'blade.compiler' instanceof \Illuminate\View\Compilers\BladeCompiler,
'aws' instanceof \Aws\Sdk,
],
app('') => [
'' == '@',
'events' instanceof \Illuminate\Events\Dispatcher,
'router' instanceof \Illuminate\Routing\Router,
'url' instanceof \Illuminate\Routing\UrlGenerator,
'redirect' instanceof \Illuminate\Routing\Redirector,
'Illuminate\Contracts\Routing\ResponseFactory' instanceof \Illuminate\Routing\ResponseFactory,
'Illuminate\Contracts\Http\Kernel' instanceof \App\Http\Kernel,
'Illuminate\Contracts\Console\Kernel' instanceof \App\Console\Kernel,
'Illuminate\Contracts\Debug\ExceptionHandler' instanceof \App\Exceptions\Handler,
'auth' instanceof \Illuminate\Auth\AuthManager,
'auth.driver' instanceof \Illuminate\Auth\SessionGuard,
'Illuminate\Contracts\Auth\Access\Gate' instanceof \Illuminate\Auth\Access\Gate,
'cookie' instanceof \Illuminate\Cookie\CookieJar,
'Illuminate\Contracts\Queue\EntityResolver' instanceof \Illuminate\Database\Eloquent\QueueEntityResolver,
'db.factory' instanceof \Illuminate\Database\Connectors\ConnectionFactory,
'db' instanceof \Illuminate\Database\DatabaseManager,
'db.connection' instanceof \Illuminate\Database\MySqlConnection,
'encrypter' instanceof \Illuminate\Encryption\Encrypter,
'files' instanceof \Illuminate\Filesystem\Filesystem,
'filesystem' instanceof \Illuminate\Filesystem\FilesystemManager,
'filesystem.disk' instanceof \Illuminate\Filesystem\FilesystemAdapter,
'session' instanceof \Illuminate\Session\SessionManager,
'session.store' instanceof \Illuminate\Session\EncryptedStore,
'Illuminate\Session\Middleware\StartSession' instanceof \Illuminate\Session\Middleware\StartSession,
'view.engine.resolver' instanceof \Illuminate\View\Engines\EngineResolver,
'view.finder' instanceof \Illuminate\View\FileViewFinder,
'view' instanceof \Illuminate\View\Factory,
'tymon.jwt.provider.user' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'tymon.jwt.provider.jwt' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'tymon.jwt.provider.auth' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'tymon.jwt.provider.storage' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'tymon.jwt.blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'tymon.jwt.claim.factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'tymon.jwt.manager' instanceof \Tymon\JWTAuth\JWTManager,
'tymon.jwt.auth' instanceof \Tymon\JWTAuth\JWTAuth,
'tymon.jwt.validators.payload' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'tymon.jwt.payload.factory' instanceof \Tymon\JWTAuth\PayloadFactory,
'tymon.jwt.generate' instanceof \Tymon\JWTAuth\Commands\JWTGenerateCommand,
'Media' instanceof \App\Services\Media,
'Util' instanceof \App\Services\Util,
'Lastfm' instanceof \App\Services\Lastfm,
'YouTube' instanceof \App\Services\YouTube,
'Download' instanceof \App\Services\Download,
'Tymon\JWTAuth\JWTAuth' instanceof \Tymon\JWTAuth\JWTAuth,
'Tymon\JWTAuth\Providers\User\UserInterface' instanceof \Tymon\JWTAuth\Providers\User\EloquentUserAdapter,
'Tymon\JWTAuth\Providers\JWT\JWTInterface' instanceof \Tymon\JWTAuth\Providers\JWT\NamshiAdapter,
'Tymon\JWTAuth\Providers\Auth\AuthInterface' instanceof \Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter,
'Tymon\JWTAuth\Providers\Storage\StorageInterface' instanceof \Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter,
'Tymon\JWTAuth\JWTManager' instanceof \Tymon\JWTAuth\JWTManager,
'Tymon\JWTAuth\Blacklist' instanceof \Tymon\JWTAuth\Blacklist,
'Tymon\JWTAuth\PayloadFactory' instanceof \Tymon\JWTAuth\PayloadFactory,
'Tymon\JWTAuth\Claims\Factory' instanceof \Tymon\JWTAuth\Claims\Factory,
'Tymon\JWTAuth\Validators\PayloadValidator' instanceof \Tymon\JWTAuth\Validators\PayloadValidator,
'validation.presence' instanceof \Illuminate\Validation\DatabasePresenceVerifier,
'translation.loader' instanceof \Illuminate\Translation\FileLoader,
'translator' instanceof \Illuminate\Translation\Translator,
'Illuminate\Broadcasting\BroadcastManager' instanceof \Illuminate\Broadcasting\BroadcastManager,
'Illuminate\Bus\Dispatcher' instanceof \Illuminate\Bus\Dispatcher,
'cache' instanceof \Illuminate\Cache\CacheManager,
'cache.store' instanceof \Illuminate\Cache\Repository,
'memcached.connector' instanceof \Illuminate\Cache\MemcachedConnector,
'command.cache.clear' instanceof \Illuminate\Cache\Console\ClearCommand,
'command.clear-compiled' instanceof \Illuminate\Foundation\Console\ClearCompiledCommand,
'command.auth.resets.clear' instanceof \Illuminate\Auth\Console\ClearResetsCommand,
'command.config.cache' instanceof \Illuminate\Foundation\Console\ConfigCacheCommand,
'command.config.clear' instanceof \Illuminate\Foundation\Console\ConfigClearCommand,
'command.down' instanceof \Illuminate\Foundation\Console\DownCommand,
'command.environment' instanceof \Illuminate\Foundation\Console\EnvironmentCommand,
'command.key.generate' instanceof \Illuminate\Foundation\Console\KeyGenerateCommand,
'command.optimize' instanceof \Illuminate\Foundation\Console\OptimizeCommand,
'command.route.cache' instanceof \Illuminate\Foundation\Console\RouteCacheCommand,
'command.route.clear' instanceof \Illuminate\Foundation\Console\RouteClearCommand,
'command.route.list' instanceof \Illuminate\Foundation\Console\RouteListCommand,
'command.tinker' instanceof \Illuminate\Foundation\Console\TinkerCommand,
'command.up' instanceof \Illuminate\Foundation\Console\UpCommand,
'command.view.clear' instanceof \Illuminate\Foundation\Console\ViewClearCommand,
'command.app.name' instanceof \Illuminate\Foundation\Console\AppNameCommand,
'command.auth.make' instanceof \Illuminate\Auth\Console\MakeAuthCommand,
'command.cache.table' instanceof \Illuminate\Cache\Console\CacheTableCommand,
'command.console.make' instanceof \Illuminate\Foundation\Console\ConsoleMakeCommand,
'command.controller.make' instanceof \Illuminate\Routing\Console\ControllerMakeCommand,
'command.event.generate' instanceof \Illuminate\Foundation\Console\EventGenerateCommand,
'command.event.make' instanceof \Illuminate\Foundation\Console\EventMakeCommand,
'command.job.make' instanceof \Illuminate\Foundation\Console\JobMakeCommand,
'command.listener.make' instanceof \Illuminate\Foundation\Console\ListenerMakeCommand,
'command.middleware.make' instanceof \Illuminate\Routing\Console\MiddlewareMakeCommand,
'command.model.make' instanceof \Illuminate\Foundation\Console\ModelMakeCommand,
'command.policy.make' instanceof \Illuminate\Foundation\Console\PolicyMakeCommand,
'command.provider.make' instanceof \Illuminate\Foundation\Console\ProviderMakeCommand,
'command.queue.failed-table' instanceof \Illuminate\Queue\Console\FailedTableCommand,
'command.queue.table' instanceof \Illuminate\Queue\Console\TableCommand,
'command.request.make' instanceof \Illuminate\Foundation\Console\RequestMakeCommand,
'command.seeder.make' instanceof \Illuminate\Database\Console\Seeds\SeederMakeCommand,
'command.session.table' instanceof \Illuminate\Session\Console\SessionTableCommand,
'command.serve' instanceof \Illuminate\Foundation\Console\ServeCommand,
'command.test.make' instanceof \Illuminate\Foundation\Console\TestMakeCommand,
'command.vendor.publish' instanceof \Illuminate\Foundation\Console\VendorPublishCommand,
'migration.repository' instanceof \Illuminate\Database\Migrations\DatabaseMigrationRepository,
'migrator' instanceof \Illuminate\Database\Migrations\Migrator,
'migration.creator' instanceof \Illuminate\Database\Migrations\MigrationCreator,
'command.migrate' instanceof \Illuminate\Database\Console\Migrations\MigrateCommand,
'command.migrate.rollback' instanceof \Illuminate\Database\Console\Migrations\RollbackCommand,
'command.migrate.reset' instanceof \Illuminate\Database\Console\Migrations\ResetCommand,
'command.migrate.refresh' instanceof \Illuminate\Database\Console\Migrations\RefreshCommand,
'command.migrate.install' instanceof \Illuminate\Database\Console\Migrations\InstallCommand,
'command.migrate.make' instanceof \Illuminate\Database\Console\Migrations\MigrateMakeCommand,
'command.migrate.status' instanceof \Illuminate\Database\Console\Migrations\StatusCommand,
'command.seed' instanceof \Illuminate\Database\Console\Seeds\SeedCommand,
'composer' instanceof \Illuminate\Support\Composer,
'command.queue.failed' instanceof \Illuminate\Queue\Console\ListFailedCommand,
'command.queue.retry' instanceof \Illuminate\Queue\Console\RetryCommand,
'command.queue.forget' instanceof \Illuminate\Queue\Console\ForgetFailedCommand,
'command.queue.flush' instanceof \Illuminate\Queue\Console\FlushFailedCommand,
'hash' instanceof \Illuminate\Hashing\BcryptHasher,
'swift.transport' instanceof \Illuminate\Mail\TransportManager,
'swift.mailer' instanceof \Swift_Mailer,
'mailer' instanceof \Illuminate\Mail\Mailer,
'Illuminate\Contracts\Pipeline\Hub' instanceof \Illuminate\Pipeline\Hub,
'queue' instanceof \Illuminate\Queue\QueueManager,
'queue.connection' instanceof \Illuminate\Queue\SyncQueue,
'command.queue.work' instanceof \Illuminate\Queue\Console\WorkCommand,
'command.queue.restart' instanceof \Illuminate\Queue\Console\RestartCommand,
'queue.worker' instanceof \Illuminate\Queue\Worker,
'command.queue.listen' instanceof \Illuminate\Queue\Console\ListenCommand,
'queue.listener' instanceof \Illuminate\Queue\Listener,
'queue.failer' instanceof \Illuminate\Queue\Failed\DatabaseFailedJobProvider,
'IlluminateQueueClosure' instanceof \IlluminateQueueClosure,
'auth.password' instanceof \Illuminate\Auth\Passwords\PasswordBrokerManager,
'auth.password.broker' instanceof \Illuminate\Auth\Passwords\PasswordBroker,
'command.ide-helper.generate' instanceof \Barryvdh\LaravelIdeHelper\Console\GeneratorCommand,
'command.ide-helper.models' instanceof \Barryvdh\LaravelIdeHelper\Console\ModelsCommand,
'command.ide-helper.meta' instanceof \Barryvdh\LaravelIdeHelper\Console\MetaCommand,
'blade.compiler' instanceof \Illuminate\View\Compilers\BladeCompiler,
'aws' instanceof \Aws\Sdk,
],
];
}

View file

@ -3,7 +3,6 @@ language: php
php:
- 5.6
- 7.0
- hhvm
env:
APP_ENV: testing
@ -12,14 +11,16 @@ env:
QUEUE_DRIVER: sync
DB_CONNECTION: sqlite
APP_KEY: 16efa6c23c2e8c705826b0e66778fbe7
JWT_SECRET: ki8jSvMf5wFrlSRBAWcGbmAzBUJfc8p8
ADMIN_EMAIL: koel@example.com
ADMIN_NAME: Koel
ADMIN_PASSWORD: SoSecureK0el
LASTFM_API_KEY: foo
LASTFM_API_SECRET: bar
BROADCAST_DRIVER: log
branches:
- master
- master
install:
- . $HOME/.nvm/nvm.sh

View file

@ -4,7 +4,7 @@
## Intro
**Koel** (also styled as **koel**, with a lowercase k) is a simple web-based personal audio streaming service written in [Vue](http://vuejs.org/) at the client side and [Laravel](http://laravel.com/) on server side. Targeting web developers, Koel embraces some of the more modern web technologies flexbox, audio, and drag-and-drop API to name a few to do its job.
**Koel** (also stylized as **koel**, with a lowercase k) is a simple web-based personal audio streaming service written in [Vue](http://vuejs.org/) on the client side and [Laravel](http://laravel.com/) on the server side. Targeting web developers, Koel embraces some of the more modern web technologies flexbox, audio, and drag-and-drop API to name a few to do its job.
## Install and Upgrade Guide

View file

@ -19,7 +19,7 @@ class Application extends IlluminateApplication
*
* @link https://github.com/phanan/koel/releases
*/
const VERSION = 'v2.3.0';
const VERSION = 'v3.3.1';
/**
* We have merged public path and base path.
@ -38,6 +38,8 @@ class Application extends IlluminateApplication
* @param string $file
* @param string $manifestFile
*
* @throws \InvalidArgumentException
*
* @return string
*/
public function rev($file, $manifestFile = null)
@ -46,7 +48,7 @@ class Application extends IlluminateApplication
$manifestFile = $manifestFile ?: $this->publicPath().'/public/build/rev-manifest.json';
if (is_null($manifest)) {
if ($manifest === null) {
$manifest = json_decode(file_get_contents($manifestFile), true);
}
@ -68,13 +70,13 @@ class Application extends IlluminateApplication
*/
public function staticUrl($name = null)
{
$cdnUrl = trim(env('CDN_URL'), '/ ');
$cdnUrl = trim(config('koel.cdn.url'), '/ ');
return $cdnUrl ? $cdnUrl.'/'.trim(ltrim($name, '/')) : trim(asset($name));
}
/**
* Get the latest version number of Koel from Github.
* Get the latest version number of Koel from GitHub.
*
* @param Client $client
*
@ -82,16 +84,16 @@ class Application extends IlluminateApplication
*/
public function getLatestVersion(Client $client = null)
{
$client = $client ?: new Client();
if ($v = Cache::get('latestKoelVersion')) {
return $v;
}
$client = $client ?: new Client();
try {
$v = json_decode($client->get('https://api.github.com/repos/phanan/koel/tags')->getBody())[0]->name;
// Cache for a week
Cache::put('latestKoelVersion', $v, 7 * 24 * 60);
// Cache for one day
Cache::put('latestKoelVersion', $v, 1 * 24 * 60);
return $v;
} catch (Exception $e) {

View file

@ -23,6 +23,8 @@ class GenerateJWTSecret extends Command
/**
* Execute the console command.
*
* @throws \RuntimeException
*/
public function fire()
{

View file

@ -42,16 +42,16 @@ class Init extends Command
$this->comment('Attempting to install or upgrade Koel.');
$this->comment('Remember, you can always install/upgrade manually following the guide here:');
$this->info("📙 https://github.com/phanan/koel/wiki\n");
$this->info('📙 https://github.com/phanan/koel/wiki'.PHP_EOL);
if (!env('APP_KEY')) {
if (!config('app.key')) {
$this->info('Generating app key');
Artisan::call('key:generate');
} else {
$this->comment('App key exists -- skipping');
}
if (!env('JWT_SECRET')) {
if (!config('jwt.secret')) {
$this->info('Generating JWT secret');
Artisan::call('koel:generate-jwt-secret');
} else {
@ -71,7 +71,7 @@ class Init extends Command
$this->info('Executing npm install, gulp and whatnot');
system('npm install');
$this->comment("\n🎆 Success! You can now run Koel from localhost with `php artisan serve`.");
$this->comment(PHP_EOL.'🎆 Success! You can now run Koel from localhost with `php artisan serve`.');
$this->comment('Again, for more configuration guidance, refer to');
$this->info('📙 https://github.com/phanan/koel/wiki.');
$this->comment('WIKI ROCKS WIKI RULES.');

View file

@ -23,6 +23,13 @@ class SyncMedia extends Command
protected $invalid = 0;
protected $synced = 0;
/**
* The progress bar.
*
* @var \Symfony\Component\Console\Helper\ProgressBar
*/
protected $bar;
/**
* The console command description.
*
@ -30,14 +37,6 @@ class SyncMedia extends Command
*/
protected $description = 'Sync songs found in configured directory against the database.';
/**
* Create a new command instance.
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
@ -65,7 +64,7 @@ class SyncMedia extends Command
*/
protected function syncAll()
{
$this->info('Koel syncing started. All we need now is just a little patience…');
$this->info('Koel syncing started.'.PHP_EOL);
// Get the tags to sync.
// Notice that this is only meaningful for existing records.
@ -74,9 +73,12 @@ class SyncMedia extends Command
Media::sync(null, $tags, $this->option('force'), $this);
$this->output->writeln("<info>Completed! {$this->synced} new or updated song(s)</info>, "
$this->output->writeln(
PHP_EOL.PHP_EOL
."<info>Completed! {$this->synced} new or updated song(s)</info>, "
."{$this->ignored} unchanged song(s), "
."and <comment>{$this->invalid} invalid file(s)</comment>.");
."and <comment>{$this->invalid} invalid file(s)</comment>."
);
}
/**
@ -98,8 +100,12 @@ class SyncMedia extends Command
/**
* Log a song's sync status to console.
*
* @param string $path
* @param mixed $result
* @param string $reason
*/
public function logToConsole($path, $result)
public function logToConsole($path, $result, $reason = '')
{
$name = basename($path);
@ -111,7 +117,7 @@ class SyncMedia extends Command
++$this->ignored;
} elseif ($result === false) {
if ($this->option('verbose')) {
$this->error("$name is not a valid media file");
$this->error("$name is not a valid media file because: ".$reason);
}
++$this->invalid;
@ -123,4 +129,22 @@ class SyncMedia extends Command
++$this->synced;
}
}
/**
* Create a progress bar.
*
* @param int $max Max steps
*/
public function createProgressBar($max)
{
$this->bar = $this->getOutput()->createProgressBar($max);
}
/**
* Update the progress bar (advance by 1 step).
*/
public function updateProgressBar()
{
$this->bar->advance();
}
}

View file

@ -4,10 +4,12 @@ namespace App\Exceptions;
use Exception;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Foundation\Validation\ValidationException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class Handler extends ExceptionHandler
{
@ -51,4 +53,21 @@ class Handler extends ExceptionHandler
return parent::render($request, $e);
}
/**
* Convert an authentication exception into an unauthenticated response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Auth\AuthenticationException $exception
*
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest('login');
}
}

13
app/Facades/YouTube.php Normal file
View file

@ -0,0 +1,13 @@
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class YouTube extends Facade
{
protected static function getFacadeAccessor()
{
return 'YouTube';
}
}

View file

@ -9,6 +9,7 @@ use App\Models\Playlist;
use App\Models\Setting;
use App\Models\User;
use Lastfm;
use YouTube;
class DataController extends Controller
{
@ -28,13 +29,14 @@ class DataController extends Controller
return response()->json([
'artists' => Artist::orderBy('name')->with('albums', with('albums.songs'))->get(),
'settings' => Setting::lists('value', 'key')->all(),
'settings' => auth()->user()->is_admin ? Setting::pluck('value', 'key')->all() : [],
'playlists' => $playlists,
'interactions' => Interaction::byCurrentUser()->get(),
'users' => auth()->user()->is_admin ? User::all() : [],
'currentUser' => auth()->user(),
'useLastfm' => Lastfm::used(),
'allowDownload' => env('ALLOW_DOWNLOAD', true),
'useYouTube' => YouTube::enabled(),
'allowDownload' => config('koel.download.allow'),
'cdnUrl' => app()->staticUrl(),
'currentVersion' => Application::VERSION,
'latestVersion' => auth()->user()->is_admin ? app()->getLatestVersion() : Application::VERSION,

View file

@ -2,7 +2,6 @@
namespace App\Http\Controllers\API\Download;
use App\Http\Requests\API\Download\Request;
use App\Models\Album;
use Download;
@ -11,12 +10,13 @@ class AlbumController extends Controller
/**
* Download all songs in an album.
*
* @param Request $request
* @param Album $album
* @param Album $album
*
* @throws \Exception
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function download(Request $request, Album $album)
public function download(Album $album)
{
return response()->download(Download::from($album));
}

View file

@ -2,7 +2,6 @@
namespace App\Http\Controllers\API\Download;
use App\Http\Requests\API\Download\Request;
use App\Models\Artist;
use Download;
@ -13,12 +12,13 @@ class ArtistController extends Controller
* Don't see why one would need this, really.
* Let's pray to God the user doesn't trigger this on Elvis.
*
* @param Request $request
* @param Artist $artist
* @param Artist $artist
*
* @throws \Exception
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function download(Request $request, Artist $artist)
public function download(Artist $artist)
{
return response()->download(Download::from($artist));
}

View file

@ -13,6 +13,8 @@ class FavoritesController extends Controller
*
* @param Request $request
*
* @throws \Exception
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function download(Request $request)

View file

@ -2,7 +2,6 @@
namespace App\Http\Controllers\API\Download;
use App\Http\Requests\API\Download\Request;
use App\Models\Playlist;
use Download;
@ -11,12 +10,14 @@ class PlaylistController extends Controller
/**
* Download all songs in a playlist.
*
* @param Request $request
* @param Playlist $playlist
*
* @throws \Illuminate\Auth\Access\AuthorizationException
* @throws \Exception
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function download(Request $request, Playlist $playlist)
public function download(Playlist $playlist)
{
$this->authorize('owner', $playlist);

View file

@ -13,6 +13,8 @@ class SongController extends Controller
*
* @param SongRequest $request
*
* @throws \Exception
*
* @return \Symfony\Component\HttpFoundation\BinaryFileResponse
*/
public function download(SongRequest $request)

View file

@ -39,7 +39,7 @@ class SongController extends Controller
'contributing_artist_id' => $compilation ? $artist->id : null,
'title' => trim(array_get($tags, 'title', '')),
'length' => array_get($tags, 'duration', 0),
'track' => intval(array_get($tags, 'track')),
'track' => (int) array_get($tags, 'track'),
'lyrics' => array_get($tags, 'lyrics', ''),
'mtime' => time(),
]);
@ -52,6 +52,8 @@ class SongController extends Controller
*
* @param RemoveSongRequest $request
*
* @throws \Exception
*
* @return \Illuminate\Http\JsonResponse
*/
public function remove(RemoveSongRequest $request)

View file

@ -28,7 +28,7 @@ class PlaylistController extends Controller
public function store(PlaylistStoreRequest $request)
{
$playlist = auth()->user()->playlists()->create($request->only('name'));
$playlist->songs()->sync($request->input('songs'));
$playlist->songs()->sync($request->input('songs', []));
$playlist->songs = $playlist->songs->pluck('id');
@ -41,6 +41,8 @@ class PlaylistController extends Controller
* @param \Illuminate\Http\Request $request
* @param Playlist $playlist
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*
* @return \Illuminate\Http\JsonResponse
*/
public function update(Request $request, Playlist $playlist)
@ -59,13 +61,15 @@ class PlaylistController extends Controller
* @param \Illuminate\Http\Request $request
* @param Playlist $playlist
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*
* @return \Illuminate\Http\JsonResponse
*/
public function sync(Request $request, Playlist $playlist)
{
$this->authorize('owner', $playlist);
$playlist->songs()->sync($request->input('songs'));
$playlist->songs()->sync($request->songs);
return response()->json();
}
@ -75,6 +79,9 @@ class PlaylistController extends Controller
*
* @param Playlist $playlist
*
* @throws \Exception
* @throws \Illuminate\Auth\Access\AuthorizationException
*
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(Playlist $playlist)

View file

@ -13,6 +13,8 @@ class ProfileController extends Controller
*
* @param ProfileUpdateRequest $request
*
* @throws \RuntimeException
*
* @return \Illuminate\Http\JsonResponse
*/
public function update(ProfileUpdateRequest $request)

View file

@ -9,45 +9,57 @@ use App\Http\Streamers\TranscodingStreamer;
use App\Http\Streamers\XAccelRedirectStreamer;
use App\Http\Streamers\XSendFileStreamer;
use App\Models\Song;
use YouTube;
class SongController extends Controller
{
/**
* Play a song.
* Play/stream a song.
*
* @link https://github.com/phanan/koel/wiki#streaming-music
*
* @param Song $song
* @param Song $song The song to stream.
* @param null|bool $transcode Whether to force transcoding the song.
* If this is omitted, by default Koel will transcode FLAC.
* @param null|int $bitRate The target bit rate to transcode, defaults to OUTPUT_BIT_RATE.
* Only taken into account if $transcode is truthy.
*
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function play(Song $song, $transcode = null, $bitrate = null)
public function play(Song $song, $transcode = null, $bitRate = null)
{
if (is_null($bitrate)) {
$bitrate = env('OUTPUT_BIT_RATE', 128);
}
if ($song->s3_params) {
return (new S3Streamer($song))->stream();
}
// If transcode parameter isn't passed, the default is to only transcode flac
if (is_null($transcode) && ends_with(mime_content_type($song->path), 'flac')) {
// If `transcode` parameter isn't passed, the default is to only transcode FLAC.
if ($transcode === null && ends_with(mime_content_type($song->path), 'flac')) {
$transcode = true;
} else {
$transcode = (bool) $transcode;
}
$streamer = null;
if ($transcode) {
return (new TranscodingStreamer($song, $bitrate, request()->input('time', 0)))->stream();
$streamer = new TranscodingStreamer(
$song,
$bitRate ?: config('koel.streaming.bitrate'),
request()->input('time', 0)
);
} else {
switch (config('koel.streaming.method')) {
case 'x-sendfile':
$streamer = new XSendFileStreamer($song);
break;
case 'x-accel-redirect':
$streamer = new XAccelRedirectStreamer($song);
break;
default:
$streamer = new PHPStreamer($song);
break;
}
}
switch (env('STREAMING_METHOD')) {
case 'x-sendfile':
return (new XSendFileStreamer($song))->stream();
case 'x-accel-redirect':
return (new XAccelRedirectStreamer($song))->stream();
default:
return (new PHPStreamer($song))->stream();
}
$streamer->stream();
}
/**
@ -63,6 +75,7 @@ class SongController extends Controller
'lyrics' => $song->lyrics,
'album_info' => $song->album->getInfo(),
'artist_info' => $song->artist->getInfo(),
'youtube' => $song->getRelatedYouTubeVideos(),
]);
}

View file

@ -14,14 +14,16 @@ class UserController extends Controller
*
* @param UserStoreRequest $request
*
* @throws \RuntimeException
*
* @return \Illuminate\Http\JsonResponse
*/
public function store(UserStoreRequest $request)
{
return response()->json(User::create([
'name' => $request->input('name'),
'email' => $request->input('email'),
'password' => Hash::make($request->input('password')),
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
]));
}
@ -31,14 +33,16 @@ class UserController extends Controller
* @param UserUpdateRequest $request
* @param User $user
*
* @throws \RuntimeException
*
* @return \Illuminate\Http\JsonResponse
*/
public function update(UserUpdateRequest $request, User $user)
{
$data = $request->only('name', 'email');
if ($password = $request->input('password')) {
$data['password'] = Hash::make($password);
if ($request->password) {
$data['password'] = Hash::make($request->password);
}
return response()->json($user->update($data));
@ -49,11 +53,14 @@ class UserController extends Controller
*
* @param User $user
*
* @throws \Exception
* @throws \Illuminate\Auth\Access\AuthorizationException
*
* @return \Illuminate\Http\JsonResponse
*/
public function destroy(User $user)
{
$this->authorize($user);
$this->authorize('destroy', $user);
return response()->json($user->delete());
}

View file

@ -0,0 +1,23 @@
<?php
namespace App\Http\Controllers\API;
use App\Models\Song;
use Illuminate\Http\Request;
use YouTube;
class YouTubeController extends Controller
{
/**
* Search for YouTube videos related to a song (using its title and artist name).
*
* @param Request $request
* @param Song $song
*
* @return \Illuminate\Http\JsonResponse
*/
public function searchVideosRelatedToSong(Request $request, Song $song)
{
return response()->json($song->getRelatedYouTubeVideos($request->pageToken));
}
}

View file

@ -5,8 +5,11 @@ namespace App\Http;
use App\Http\Middleware\Authenticate;
use App\Http\Middleware\GetUserFromToken;
use App\Http\Middleware\ObjectStorageAuthenticate;
use Illuminate\Auth\Middleware\Authorize;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Routing\Middleware\ThrottleRequests;
class Kernel extends HttpKernel
{
@ -19,6 +22,21 @@ class Kernel extends HttpKernel
CheckForMaintenanceMode::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
// Koel doesn't use any default Laravel middleware for web.
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
@ -28,5 +46,8 @@ class Kernel extends HttpKernel
'auth' => Authenticate::class,
'jwt.auth' => GetUserFromToken::class,
'os.auth' => ObjectStorageAuthenticate::class,
'bindings' => SubstituteBindings::class,
'can' => Authorize::class,
'throttle' => ThrottleRequests::class,
];
}

View file

@ -35,7 +35,7 @@ class Authenticate
public function handle($request, Closure $next)
{
if ($this->auth->guest()) {
if ($request->ajax() || $request->route()->getName() == 'play') {
if ($request->ajax() || $request->route()->getName() === 'play') {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');

View file

@ -3,6 +3,7 @@
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
/**
* Authenticate requests from Object Storage services (like S3).
@ -18,7 +19,7 @@ class ObjectStorageAuthenticate
*
* @return mixed
*/
public function handle($request, Closure $next)
public function handle(Request $request, Closure $next)
{
if ($request->appKey !== config('app.key')) {
return response('Unauthorized.', 401);

View file

@ -13,7 +13,7 @@ class Request extends BaseRequest
*/
public function authorize()
{
return env('ALLOW_DOWNLOAD', true);
return config('koel.download.allow');
}
public function rules()

View file

@ -2,6 +2,9 @@
namespace App\Http\Requests\API\Download;
/**
* @property array songs
*/
class SongRequest extends Request
{
/**

View file

@ -4,6 +4,10 @@ namespace App\Http\Requests\API\ObjectStorage\S3;
use App\Http\Requests\API\ObjectStorage\S3\Request as BaseRequest;
/**
* @property string bucket
* @property array tags
*/
class PutSongRequest extends BaseRequest
{
public function rules()

View file

@ -2,6 +2,10 @@
namespace App\Http\Requests\API;
/**
* @property array songs
* @property array data
*/
class SongUpdateRequest extends Request
{
/**

View file

@ -2,6 +2,11 @@
namespace App\Http\Requests\API;
/**
* @property string password
* @property string name
* @property string email
*/
class UserStoreRequest extends Request
{
/**

View file

@ -2,6 +2,9 @@
namespace App\Http\Requests\API;
/**
* @property string password
*/
class UserUpdateRequest extends Request
{
/**

View file

@ -2,15 +2,8 @@
namespace App\Http\Streamers;
use App\Models\Song;
class PHPStreamer extends Streamer implements StreamerInterface
{
public function __construct(Song $song)
{
parent::__construct($song);
}
/**
* Stream the current song using the most basic PHP method: readfile()
* Credits: DaveRandom @ http://stackoverflow.com/a/4451376/794641.
@ -18,7 +11,7 @@ class PHPStreamer extends Streamer implements StreamerInterface
public function stream()
{
// Get the 'Range' header if one was sent
if (isset($_SERVER['HTTP_RANGE'])) {
if (array_key_exists('HTTP_RANGE', $_SERVER)) {
// IIS/Some Apache versions
$range = $_SERVER['HTTP_RANGE'];
} elseif (function_exists('apache_request_headers') && $apache = apache_request_headers()) {
@ -29,7 +22,7 @@ class PHPStreamer extends Streamer implements StreamerInterface
$headers[strtolower($header)] = $val;
}
$range = isset($headers['range']) ? $headers['range'] : false;
$range = array_key_exists('range', $headers) ? $headers['range'] : false;
} else {
// We can't get the header/there isn't one set
$range = false;
@ -54,17 +47,17 @@ class PHPStreamer extends Streamer implements StreamerInterface
if ($range[0] === '') {
// First number missing, return last $range[1] bytes
$end = $fileSize - 1;
$start = $end - intval($range[0]);
$start = $end - (int) $range[0];
} elseif ($range[1] === '') {
// Second number missing, return from byte $range[0] to end
$start = intval($range[0]);
$start = (int) $range[0];
$end = $fileSize - 1;
} else {
// Both numbers present, return specific range
$start = intval($range[0]);
$end = intval($range[1]);
$start = (int) $range[0];
$end = (int) $range[1];
if ($end >= $fileSize || (!$start && (!$end || $end == ($fileSize - 1)))) {
if ($end >= $fileSize || (!$start && (!$end || $end === ($fileSize - 1)))) {
// Invalid range/whole file specified, return whole file
$partial = false;
}

View file

@ -2,39 +2,15 @@
namespace App\Http\Streamers;
use App\Models\Song;
use AWS;
use Aws\AwsClient;
class S3Streamer extends Streamer implements StreamerInterface
{
public function __construct(Song $song)
{
parent::__construct($song);
}
/**
* Stream the current song through S3.
* Actually, we only redirect to the S3 object's location.
*
* @param AwsClient $s3
*
* @return string
*/
public function stream(AwsClient $s3 = null)
public function stream()
{
if (!$s3) {
$s3 = AWS::createClient('s3');
}
$cmd = $s3->getCommand('GetObject', [
'Bucket' => $this->song->s3_params['bucket'],
'Key' => $this->song->s3_params['key'],
]);
$request = $s3->createPresignedRequest($cmd, '+1 hour');
// Get and redirect to the actual presigned-url
return redirect((string) $request->getUri());
return redirect($this->song->getObjectStoragePublicUrl());
}
}

View file

@ -7,11 +7,11 @@ use App\Models\Song;
class TranscodingStreamer extends Streamer implements StreamerInterface
{
/**
* Bitrate the stream should be transcoded at.
* Bit rate the stream should be transcoded at.
*
* @var int
*/
private $bitrate;
private $bitRate;
/**
* Time point to start transcoding from.
@ -20,10 +20,10 @@ class TranscodingStreamer extends Streamer implements StreamerInterface
*/
private $startTime;
public function __construct(Song $song, $bitrate, $startTime = 0)
public function __construct(Song $song, $bitRate, $startTime = 0)
{
parent::__construct($song);
$this->bitrate = $bitrate;
$this->bitRate = $bitRate;
$this->startTime = $startTime;
}
@ -32,10 +32,10 @@ class TranscodingStreamer extends Streamer implements StreamerInterface
*/
public function stream()
{
$ffmpeg = env('FFMPEG_PATH', '/usr/local/bin/ffmpeg');
$ffmpeg = config('koel.streaming.transcoding');
abort_unless(is_executable($ffmpeg), 500, 'Transcoding requires valid ffmpeg settings.');
$bitRate = filter_var($this->bitrate, FILTER_SANITIZE_NUMBER_INT);
$bitRate = filter_var($this->bitRate, FILTER_SANITIZE_NUMBER_INT);
// Since we can't really know the content length of a file while it's still being transcoded,
// "calculating" it (like below) will be much likely to result in net::ERR_CONTENT_LENGTH_MISMATCH errors.

View file

@ -3,15 +3,9 @@
namespace App\Http\Streamers;
use App\Models\Setting;
use App\Models\Song;
class XAccelRedirectStreamer extends Streamer implements StreamerInterface
{
public function __construct(Song $song)
{
parent::__construct($song);
}
/**
* Stream the current song using nginx's X-Accel-Redirect.
*/

View file

@ -2,15 +2,8 @@
namespace App\Http\Streamers;
use App\Models\Song;
class XSendFileStreamer extends Streamer implements StreamerInterface
{
public function __construct(Song $song)
{
parent::__construct($song);
}
/**
* Stream the current song using Apache's x_sendfile module.
*/

View file

@ -74,7 +74,7 @@ class WatchRecord
*/
protected function eventExists($event)
{
return in_array($event, $this->events);
return in_array($event, $this->events, true);
}
public function __toString()

View file

@ -3,6 +3,8 @@
namespace App\Models;
use App\Facades\Lastfm;
use App\Traits\SupportsDeleteWhereIDsNotIn;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
/**
@ -13,15 +15,18 @@ use Illuminate\Database\Eloquent\Model;
* @property bool is_compilation If the album is a compilation from multiple artists
* @property Artist artist The album's artist
* @property int artist_id
* @property Collection songs
*/
class Album extends Model
{
use SupportsDeleteWhereIDsNotIn;
const UNKNOWN_ID = 1;
const UNKNOWN_NAME = 'Unknown Album';
const UNKNOWN_COVER = 'unknown-album.png';
protected $guarded = ['id'];
protected $hidden = ['created_at', 'updated_at'];
protected $hidden = ['updated_at'];
protected $casts = ['artist_id' => 'integer'];
public function artist()
@ -121,12 +126,36 @@ class Album extends Model
public function writeCoverFile($binaryData, $extension)
{
$extension = trim(strtolower($extension), '. ');
$fileName = uniqid().".$extension";
$coverPath = app()->publicPath().'/public/img/covers/'.$fileName;
$destPath = $this->generateRandomCoverPath($extension);
file_put_contents($destPath, $binaryData);
file_put_contents($coverPath, $binaryData);
$this->update(['cover' => basename($destPath)]);
}
$this->update(['cover' => $fileName]);
/**
* Copy a cover file from an existing image on the system.
*
* @param string $srcPath The original image's full path.
*/
public function copyCoverFile($srcPath)
{
$extension = pathinfo($srcPath, PATHINFO_EXTENSION);
$destPath = $this->generateRandomCoverPath($extension);
copy($srcPath, $destPath);
$this->update(['cover' => basename($destPath)]);
}
/**
* Generate a random path for the cover image.
*
* @param string $extension The extension of the cover (without dot)
*
* @return string
*/
private function generateRandomCoverPath($extension)
{
return app()->publicPath().'/public/img/covers/'.uniqid('', true).".$extension";
}
public function setCoverAttribute($value)

View file

@ -4,6 +4,7 @@ namespace App\Models;
use App\Facades\Lastfm;
use App\Facades\Util;
use App\Traits\SupportsDeleteWhereIDsNotIn;
use Exception;
use Illuminate\Database\Eloquent\Model;
use Log;
@ -15,6 +16,8 @@ use Log;
*/
class Artist extends Model
{
use SupportsDeleteWhereIDsNotIn;
const UNKNOWN_ID = 1;
const UNKNOWN_NAME = 'Unknown Artist';
const VARIOUS_ID = 2;

View file

@ -2,12 +2,14 @@
namespace App\Models;
use Cache;
use Exception;
use getID3;
use getid3_lib;
use Illuminate\Support\Facades\Log;
use Media;
use SplFileInfo;
use Symfony\Component\Finder\Finder;
class File
{
@ -54,6 +56,13 @@ class File
*/
protected $song;
/**
* The last parsing error text, if any.
*
* @var string
*/
protected $syncError;
/**
* Construct our File object.
* Upon construction, we'll set the path, hash, and associated Song object (if any).
@ -65,10 +74,21 @@ class File
{
$this->splFileInfo = $path instanceof SplFileInfo ? $path : new SplFileInfo($path);
$this->setGetID3($getID3);
$this->mtime = $this->splFileInfo->getMTime();
// Workaround for #344, where getMTime() fails for certain files with Unicode names
// on Windows.
// Yes, beloved Windows.
try {
$this->mtime = $this->splFileInfo->getMTime();
} catch (Exception $e) {
// Not worth logging the error. Just use current stamp for mtime.
$this->mtime = time();
}
$this->path = $this->splFileInfo->getPathname();
$this->hash = self::getHash($this->path);
$this->song = Song::find($this->hash);
$this->syncError = '';
}
/**
@ -81,6 +101,8 @@ class File
$info = $this->getID3->analyze($this->path);
if (isset($info['error']) || !isset($info['playtime_seconds'])) {
$this->syncError = isset($info['error']) ? $info['error'][0] : 'No playtime found';
return;
}
@ -99,7 +121,7 @@ class File
'comments.track_number',
];
for ($i = 0; $i < count($trackIndices) && $track === 0; $i++) {
for ($i = 0; $i < count($trackIndices) && $track === 0; ++$i) {
$track = array_get($info, $trackIndices[$i], [0])[0];
}
@ -198,7 +220,7 @@ class File
// But if 'album' isn't specified, we don't want to update normal albums.
// This variable is to keep track of this state.
$changeCompilationAlbumOnly = false;
if (in_array('compilation', $tags) && !in_array('album', $tags)) {
if (in_array('compilation', $tags, true) && !in_array('album', $tags, true)) {
$tags[] = 'album';
$changeCompilationAlbumOnly = true;
}
@ -227,11 +249,18 @@ class File
$album = Album::get($artist, $info['album'], $isCompilation);
}
if (!empty($info['cover']) && !$album->has_cover) {
try {
$album->generateCover($info['cover']);
} catch (Exception $e) {
Log::error($e);
if (!$album->has_cover) {
// If the album has no cover, we try to get the cover image from existing tag data
if (!empty($info['cover'])) {
try {
$album->generateCover($info['cover']);
} catch (Exception $e) {
Log::error($e);
}
}
// or, if there's a cover image under the same directory, use it.
elseif ($cover = $this->getCoverFileUnderSameDirectory()) {
$album->copyCoverFile($cover);
}
}
@ -287,6 +316,16 @@ class File
return $this->getID3;
}
/**
* Get the last parsing error's text.
*
* @return syncError
*/
public function getSyncError()
{
return $this->syncError;
}
/**
* @param getID3 $getID3
*/
@ -303,6 +342,45 @@ class File
return $this->path;
}
/**
* Issue #380.
* Some albums have its own cover image under the same directory as cover|folder.jpg/png.
* We'll check if such a cover file is found, and use it if positive.
*
* @throws \InvalidArgumentException
*
* @return string|false The cover file's full path, or false if none found
*/
private function getCoverFileUnderSameDirectory()
{
// As directory scanning can be expensive, we cache and reuse the result.
$cacheKey = md5($this->path.'_cover');
if (!is_null($cover = Cache::get($cacheKey))) {
return $cover;
}
$matches = array_keys(iterator_to_array(
Finder::create()
->depth(0)
->ignoreUnreadableDirs()
->files()
->followLinks()
->name('/(cov|fold)er\.(jpe?g|png)$/i')
->in(dirname($this->path))
));
$cover = $matches ? $matches[0] : false;
// Even if a file is found, make sure it's a real image.
if ($cover && exif_imagetype($cover) === false) {
$cover = false;
}
Cache::put($cacheKey, $cover, 24 * 60);
return $cover;
}
/**
* Get a unique hash from a file path.
*

View file

@ -7,8 +7,10 @@ use App\Traits\CanFilterByUser;
use Illuminate\Database\Eloquent\Model;
/**
* @property bool liked
* @property int play_count
* @property bool liked
* @property int play_count
* @property Song song
* @property User user
*/
class Interaction extends Model
{

View file

@ -3,8 +3,13 @@
namespace App\Models;
use App\Traits\CanFilterByUser;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
/**
* @property int user_id
* @property Collection songs
*/
class Playlist extends Model
{
use CanFilterByUser;

View file

@ -3,8 +3,13 @@
namespace App\Models;
use App\Events\LibraryChanged;
use App\Traits\SupportsDeleteWhereIDsNotIn;
use AWS;
use Aws\AwsClient;
use Cache;
use Illuminate\Database\Eloquent\Model;
use Lastfm;
use YouTube;
/**
* @property string path
@ -13,9 +18,17 @@ use Lastfm;
* @property int contributing_artist_id
* @property Artist contributingArtist
* @property Artist artist
* @property string s3_params
* @property float length
* @property string lyrics
* @property int track
* @property int album_id
* @property int id
*/
class Song extends Model
{
use SupportsDeleteWhereIDsNotIn;
protected $guarded = [];
/**
@ -25,7 +38,7 @@ class Song extends Model
*
* @var array
*/
protected $hidden = ['lyrics', 'created_at', 'updated_at', 'path', 'mtime'];
protected $hidden = ['lyrics', 'updated_at', 'path', 'mtime'];
/**
* @var array
@ -136,8 +149,8 @@ class Song extends Model
trim($data['albumName'] ?: $song->album->name),
trim($data['artistName']) ?: $song->artist->name,
$single ? trim($data['lyrics']) : $song->lyrics,
$single ? intval($data['track']) : $song->track,
intval($data['compilationState'])
$single ? (int) $data['track'] : $song->track,
(int) $data['compilationState']
);
}
@ -239,6 +252,51 @@ class Song extends Model
return $toArray ? $songs->toArray() : $songs;
}
/**
* Get the song's Object Storage url for streaming or downloading.
*
* @param AwsClient $s3
*
* @return string
*/
public function getObjectStoragePublicUrl(AwsClient $s3 = null)
{
// If we have a cached version, just return it.
if ($cached = Cache::get("OSUrl/{$this->id}")) {
return $cached;
}
// Otherwise, we query S3 for the presigned request.
if (!$s3) {
$s3 = AWS::createClient('s3');
}
$cmd = $s3->getCommand('GetObject', [
'Bucket' => $this->s3_params['bucket'],
'Key' => $this->s3_params['key'],
]);
// Here we specify that the request is valid for 1 hour.
// We'll also cache the public URL for future reuse.
$request = $s3->createPresignedRequest($cmd, '+1 hour');
$url = (string) $request->getUri();
Cache::put("OSUrl/{$this->id}", $url, 60);
return $url;
}
/**
* Get the YouTube videos related to this song.
*
* @param string $youTubePageToken The YouTube page token, for pagination purpose.
*
* @return @return object|false
*/
public function getRelatedYouTubeVideos($youTubePageToken = '')
{
return YouTube::searchVideosRelatedToSong($this, $youTubePageToken);
}
/**
* Sometimes the tags extracted from getID3 are HTML entity encoded.
* This makes sure they are always sane.

View file

@ -3,6 +3,7 @@
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
/**
* @property array preferences
@ -12,6 +13,8 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
*/
class User extends Authenticatable
{
use Notifiable;
/**
* The database table used by the model.
*
@ -153,7 +156,7 @@ class User extends Authenticatable
// Hide the user's secrets away!
foreach ($this->hiddenPreferences as $key) {
if (isset($preferences[$key])) {
if (array_key_exists($key, $preferences)) {
$preferences[$key] = 'hidden';
}
}

View file

@ -4,12 +4,9 @@ namespace App\Policies;
use App\Models\Playlist;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class PlaylistPolicy
{
use HandlesAuthorization;
public function owner(User $user, Playlist $playlist)
{
return $user->id === $playlist->user_id;

View file

@ -3,12 +3,9 @@
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy
{
use HandlesAuthorization;
public function destroy(User $currentUser, User $userToDestroy)
{
return $currentUser->is_admin && $currentUser->id !== $userToDestroy->id;

View file

@ -6,7 +6,6 @@ use App\Models\Playlist;
use App\Models\User;
use App\Policies\PlaylistPolicy;
use App\Policies\UserPolicy;
use Illuminate\Contracts\Auth\Access\Gate as GateContract;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
@ -23,14 +22,10 @@ class AuthServiceProvider extends ServiceProvider
/**
* Register any application authentication / authorization services.
*
* @param \Illuminate\Contracts\Auth\Access\Gate $gate
*
* @return void
*/
public function boot(GateContract $gate)
public function boot()
{
$this->registerPolicies($gate);
$this->registerPolicies();
//
}

View file

@ -0,0 +1,26 @@
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
/*
* Authenticate the user's personal channel...
*/
Broadcast::channel('App.User.*', function ($user, $userId) {
return (int) $user->id === (int) $userId;
});
}
}

View file

@ -5,7 +5,6 @@ namespace App\Providers;
use App\Models\Album;
use App\Models\File;
use App\Models\Song;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
@ -31,12 +30,10 @@ class EventServiceProvider extends ServiceProvider
/**
* Register any other events for your application.
*
* @param \Illuminate\Contracts\Events\Dispatcher $events
*/
public function boot(DispatcherContract $events)
public function boot()
{
parent::boot($events);
parent::boot();
// Generate a unique hash for a song from its path to be the ID
Song::creating(function ($song) {

View file

@ -3,7 +3,7 @@
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Routing\Router;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
@ -19,29 +19,57 @@ class RouteServiceProvider extends ServiceProvider
/**
* Define your route model bindings, pattern filters, etc.
*
* @param \Illuminate\Routing\Router $router
*
* @return void
*/
public function boot(Router $router)
public function boot()
{
parent::boot($router);
$router->model('playlist', 'App\Models\Playlist');
$router->model('user', 'App\Models\User');
parent::boot();
}
/**
* Define the routes for the application.
*
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//
}
/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
public function map(Router $router)
protected function mapWebRoutes()
{
$router->group(['namespace' => $this->namespace], function ($router) {
require app_path('Http/routes.php');
Route::group([
'middleware' => 'web',
'namespace' => $this->namespace,
], function ($router) {
require base_path('routes/web.php');
});
}
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::group([
'middleware' => 'api',
'namespace' => $this->namespace,
'prefix' => 'api',
], function ($router) {
require base_path('routes/api.php');
});
}
}

View file

@ -0,0 +1,31 @@
<?php
namespace App\Providers;
use App\Services\YouTube;
use Illuminate\Support\ServiceProvider;
class YouTubeServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
app()->singleton('YouTube', function () {
return new YouTube();
});
}
}

View file

@ -18,6 +18,8 @@ class Download
*
* @param Song|Collection<Song>|Album|Artist|Playlist $mixed
*
* @throws Exception
*
* @return string Full path to the generated archive
*/
public function from($mixed)
@ -37,23 +39,62 @@ class Download
}
}
/**
* Generate the downloadable path for a song.
*
* @param Song $song
*
* @return string
*/
protected function fromSong(Song $song)
{
abort_unless(file_exists($song->path), 404);
if ($s3Params = $song->s3_params) {
// The song is hosted on Amazon S3.
// We download it back to our local server first.
$localPath = rtrim(sys_get_temp_dir(), '/').'/'.basename($s3Params['key']);
$url = $song->getObjectStoragePublicUrl();
if (ctype_print($song->path)) {
return $song->path;
abort_unless($url, 404);
// The following function require allow_url_fopen to be ON.
// We're just assuming that to be the case here.
copy($url, $localPath);
} else {
// The song is hosted locally. Make sure the file exists.
abort_unless(file_exists($song->path), 404);
$localPath = $song->path;
}
// The BinaryFileResponse factory only accept ASCII-only file names.
if (ctype_print($localPath)) {
return $localPath;
}
// For those with high-byte characters in names, we copy it into a safe name
// as a workaround.
$filename = rtrim(sys_get_temp_dir(), '/').'/'.utf8_decode(basename($song->path));
copy($song->path, $filename);
$newPath = rtrim(sys_get_temp_dir(), '/').'/'.utf8_decode(basename($song->path));
return $filename;
if ($s3Params) {
// If the file is downloaded from S3, we rename it directly.
// This will save us some disk space.
rename($localPath, $newPath);
} else {
// Else we copy it to another file to not mess up the original one.
copy($localPath, $newPath);
}
return $newPath;
}
/**
* Generate a downloadable path of multiple songs in zip format.
*
* @param Collection $songs
*
* @throws Exception
*
* @return string
*/
protected function fromMultipleSongs(Collection $songs)
{
if ($songs->count() === 1) {
@ -67,7 +108,7 @@ class Download
// Start gathering the songs into a zip file.
$zip = new ZipArchive();
// We use system's temp dir instead storage_path() here, so that the generated files
// We use system's temp dir instead of storage_path() here, so that the generated files
// can be cleaned up automatically after server reboot.
$filename = rtrim(sys_get_temp_dir(), '/').'/koel-download-'.uniqid().'.zip';
if ($zip->open($filename, ZipArchive::CREATE) !== true) {
@ -81,10 +122,12 @@ class Download
$songs->each(function ($s) use ($zip, &$localNames) {
try {
$path = $this->fromSong($s);
// We add all files into the zip archive as a flat structure.
// As a result, there can be duplicate file names.
// The following several lines are to make sure each file name is unique.
$name = basename($s->path);
$name = basename($path);
if (array_key_exists($name, $localNames)) {
++$localNames[$name];
$parts = explode('.', $name);
@ -95,7 +138,7 @@ class Download
$localNames[$name] = 1;
}
$zip->addFile($s->path, $name);
$zip->addFile($path, $name);
} catch (Exception $e) {
Log::error($e);
}

View file

@ -33,8 +33,8 @@ class Lastfm extends RESTfulService
public function __construct($key = null, $secret = null, Client $client = null)
{
parent::__construct(
$key ?: env('LASTFM_API_KEY'),
$secret ?: env('LASTFM_API_SECRET'),
$key ?: config('koel.lastfm.key'),
$secret ?: config('koel.lastfm.secret'),
'https://ws.audioscrobbler.com/2.0',
$client ?: new Client()
);
@ -47,7 +47,7 @@ class Lastfm extends RESTfulService
*/
public function used()
{
return env('LASTFM_API_KEY') && env('LASTFM_API_SECRET');
return config('koel.lastfm.key') && config('koel.lastfm.secret');
}
/**
@ -65,7 +65,7 @@ class Lastfm extends RESTfulService
*
* @param $name string Name of the artist
*
* @return object|false
* @return array|false
*/
public function getArtistInfo($name)
{

View file

@ -58,7 +58,7 @@ class Media
public function sync($path = null, $tags = [], $force = false, SyncMedia $syncCommand = null)
{
if (!app()->runningInConsole()) {
set_time_limit(env('APP_MAX_SCAN_TIME', 600));
set_time_limit(config('koel.sync.timeout'));
}
$path = $path ?: Setting::get('media_path');
@ -72,7 +72,13 @@ class Media
$getID3 = new getID3();
foreach ($this->gatherFiles($path) as $file) {
$files = $this->gatherFiles($path);
if ($syncCommand) {
$syncCommand->createProgressBar(count($files));
}
foreach ($files as $file) {
$file = new File($file, $getID3);
$song = $file->sync($this->tags, $force);
@ -86,7 +92,8 @@ class Media
}
if ($syncCommand) {
$syncCommand->logToConsole($file->getPath(), $song);
$syncCommand->updateProgressBar();
$syncCommand->logToConsole($file->getPath(), $song, $file->getSyncError());
}
}
@ -95,7 +102,7 @@ class Media
return self::getHash($f->getPath());
}, array_merge($results['ugly'], $results['good']));
Song::whereNotIn('id', $hashes)->delete();
Song::deleteWhereIDsNotIn($hashes);
// Trigger LibraryChanged, so that TidyLibrary handler is fired to, erm, tidy our library.
event(new LibraryChanged());
@ -112,7 +119,9 @@ class Media
{
return Finder::create()
->ignoreUnreadableDirs()
->ignoreDotFiles((bool) config('koel.ignore_dot_files')) // https://github.com/phanan/koel/issues/450
->files()
->followLinks()
->name('/\.(mp3|ogg|m4a|flac)$/i')
->in($path);
}
@ -177,7 +186,7 @@ class Media
/**
* Construct an array of tags to be synced into the database from an input array of tags.
* If the input array is empty or contains only invalid items, we use all tags.
* Otherwise, we only use the valid items it it.
* Otherwise, we only use the valid items in it.
*
* @param array $tags
*/
@ -186,7 +195,7 @@ class Media
$this->tags = array_intersect((array) $tags, $this->allTags) ?: $this->allTags;
// We always keep track of mtime.
if (!in_array('mtime', $this->tags)) {
if (!in_array('mtime', $this->tags, true)) {
$this->tags[] = 'mtime';
}
}
@ -208,23 +217,23 @@ class Media
*/
public function tidy()
{
$inUseAlbums = Song::select('album_id')->groupBy('album_id')->get()->lists('album_id')->toArray();
$inUseAlbums = Song::select('album_id')->groupBy('album_id')->get()->pluck('album_id')->toArray();
$inUseAlbums[] = Album::UNKNOWN_ID;
Album::whereNotIn('id', $inUseAlbums)->delete();
Album::deleteWhereIDsNotIn($inUseAlbums);
$inUseArtists = Album::select('artist_id')->groupBy('artist_id')->get()->lists('artist_id')->toArray();
$inUseArtists = Album::select('artist_id')->groupBy('artist_id')->get()->pluck('artist_id')->toArray();
$contributingArtists = Song::distinct()
->select('contributing_artist_id')
->groupBy('contributing_artist_id')
->get()
->lists('contributing_artist_id')
->pluck('contributing_artist_id')
->toArray();
$inUseArtists = array_merge($inUseArtists, $contributingArtists);
$inUseArtists[] = Artist::UNKNOWN_ID;
$inUseArtists[] = Artist::VARIOUS_ID;
Artist::whereNotIn('id', array_filter($inUseArtists))->delete();
Artist::deleteWhereIDsNotIn(array_filter($inUseArtists));
}
}

View file

@ -25,7 +25,7 @@ class RESTfulService
*
* @var string
*/
protected $endpoint = null;
protected $endpoint;
/**
* The GuzzleHttp client to talk to the API.
@ -75,9 +75,9 @@ class RESTfulService
* an "API signature" of the request. Appending an API key will break the request.
* @param array $params An array of parameters
*
* @return object
* @return object|string
*/
public function request($verb, $uri, $appendKey = true, $params = [])
public function request($verb, $uri, $appendKey = true, array $params = [])
{
try {
$body = (string) $this->getClient()
@ -104,6 +104,8 @@ class RESTfulService
* @param string $method The HTTP method
* @param array $args An array of parameters
*
* @throws \InvalidArgumentException
*
* @return object
*/
public function __call($method, $args)
@ -130,7 +132,7 @@ class RESTfulService
public function buildUrl($uri, $appendKey = true)
{
if (!starts_with($uri, ['http://', 'https://'])) {
if ($uri[0] != '/') {
if ($uri[0] !== '/') {
$uri = "/$uri";
}

90
app/Services/YouTube.php Normal file
View file

@ -0,0 +1,90 @@
<?php
namespace App\Services;
use App\Models\Song;
use Cache;
use GuzzleHttp\Client;
class YouTube extends RESTfulService
{
/**
* Construct an instance of YouTube service.
*
* @param string $key The YouTube API key
* @param Client|null $client The Guzzle HTTP client
*/
public function __construct($key = null, Client $client = null)
{
parent::__construct(
$key ?: config('koel.youtube.key'),
null,
'https://www.googleapis.com/youtube/v3',
$client ?: new Client()
);
}
/**
* Determine if our application is using YouTube.
*
* @return bool
*/
public function enabled()
{
return (bool) config('koel.youtube.key');
}
/**
* Search for YouTube videos related to a song.
*
* @param Song $song
* @param string $pageToken
*
* @return object|false
*/
public function searchVideosRelatedToSong(Song $song, $pageToken = '')
{
$q = $song->title;
// If the artist is worth noticing, include them into the search.
if (!$song->artist->isUnknown() && !$song->artist->isVarious()) {
$q .= ' '.$song->artist->name;
}
return $this->search($q, $pageToken);
}
/**
* Search for YouTube videos by a query string.
*
* @param string $q The query string
* @param string $pageToken YouTube page token (e.g. for next/previous page)
* @param int $perPage Number of results per page
*
* @return object|false
*/
public function search($q, $pageToken = '', $perPage = 10)
{
if (!$this->enabled()) {
return false;
}
$uri = sprintf('search?part=snippet&type=video&maxResults=%s&pageToken=%s&q=%s',
$perPage,
urlencode($pageToken),
urlencode($q)
);
$cacheKey = md5("youtube_$uri");
if ($response = Cache::get($cacheKey)) {
return $response;
}
if ($response = $this->get($uri)) {
// Cache the result for 7 days
Cache::put($cacheKey, $response, 60 * 24 * 7);
}
return $response;
}
}

View file

@ -0,0 +1,62 @@
<?php
namespace App\Traits;
use DB;
use Exception;
/**
* With reference to GitHub issue #463.
* MySQL and PostgreSQL seem to have a limit of 2^16-1 (65535) elements in an IN statement.
* This trait provides a method as a workaround to this limitation.
*/
trait SupportsDeleteWhereIDsNotIn
{
/**
* Deletes all records whose IDs are not in an array.
*
* @param array $ids The array of IDs.
* @param string $key Name of the primary key.
*
* @return mixed
*/
public static function deleteWhereIDsNotIn(array $ids, $key = 'id')
{
// If the number of entries is lower than, or equals to 65535, just go ahead.
if (count($ids) <= 65535) {
return static::whereNotIn($key, $ids)->delete();
}
// Otherwise, we get the actual IDs that should be deleted…
$allIDs = static::select($key)->get()->pluck($key)->all();
$whereInIDs = array_diff($allIDs, $ids);
// …and see if we can delete them instead.
if (count($whereInIDs) < 65535) {
return static::whereIn($key, $whereInIDs)->delete();
}
// If that's not possible (i.e. this array has more than 65535 elements, too)
// then we'll delete chunk by chunk.
return static::deleteByChunk($ids, $key);
}
/**
* Delete records chunk by chunk.
*
* @param array $ids The array of record IDs to delete
* @param string $key Name of the primary key
* @param int $chunkSize Size of each chunk. Defaults to 2^16-1 (65535)
*/
public static function deleteByChunk(array $ids, $key = 'id', $chunkSize = 65535)
{
DB::beginTransaction();
try {
foreach (array_chunk($ids, 65535) as $chunk) {
static::whereIn($key, $chunk)->delete();
}
DB::commit();
} catch (Exception $e) {
DB::rollBack();
}
}
}

View file

@ -5,10 +5,9 @@
"license": "MIT",
"type": "project",
"require": {
"php": ">=5.5.9",
"laravel/framework": "5.2.*",
"php": ">=5.6.4",
"laravel/framework": "5.3.*",
"james-heinrich/getid3": "^1.9",
"phanan/cascading-config": "~2.0",
"barryvdh/laravel-ide-helper": "^2.1",
"guzzlehttp/guzzle": "^6.1",
"tymon/jwt-auth": "^0.5.6",

1015
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -128,6 +128,7 @@ return [
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
@ -138,7 +139,6 @@ return [
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
PhanAn\CascadingConfig\CascadingConfigServiceProvider::class,
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
Aws\Laravel\AwsServiceProvider::class,
@ -153,7 +153,10 @@ return [
App\Providers\MediaServiceProvider::class,
App\Providers\UtilServiceProvider::class,
App\Providers\LastfmServiceProvider::class,
App\Providers\YouTubeServiceProvider::class,
App\Providers\DownloadServiceProvider::class,
App\Providers\BroadcastServiceProvider::class,
],
@ -187,6 +190,7 @@ return [
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
'Notification' => Illuminate\Support\Facades\Notification::class,
'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class,
@ -204,6 +208,7 @@ return [
'Media' => App\Facades\Media::class,
'Util' => App\Facades\Util::class,
'Lastfm' => App\Facades\Lastfm::class,
'YouTube' => App\Facades\YouTube::class,
'Download' => App\Facades\Download::class,
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,

View file

@ -146,9 +146,7 @@ return [
|
*/
'auth' => function ($app) {
return new Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter($app['auth']);
},
'auth' => 'Tymon\JWTAuth\Providers\Auth\IlluminateAuthAdapter',
/*
|--------------------------------------------------------------------------
@ -159,9 +157,7 @@ return [
|
*/
'storage' => function ($app) {
return new Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter($app['cache']);
},
'storage' => 'Tymon\JWTAuth\Providers\Storage\IlluminateCacheAdapter',
],

113
config/koel.php Normal file
View file

@ -0,0 +1,113 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Admin Credentials
|--------------------------------------------------------------------------
|
| When running `php artisan koel:init` the admin is set using the .env
|
*/
'admin' => [
'name' => env('ADMIN_NAME'),
'email' => env('ADMIN_EMAIL'),
'password' => env('ADMIN_PASSWORD'),
],
/*
|--------------------------------------------------------------------------
| Sync Options
|--------------------------------------------------------------------------
|
| A timeout is set when using the browser to scan the folder path
|
*/
'sync' => [
'timeout' => env('APP_MAX_SCAN_TIME', 600),
],
/*
|--------------------------------------------------------------------------
| Streaming Configurations
|--------------------------------------------------------------------------
|
| Many streaming options can be set, including, 'bitrate' with 128 set
| as the default, 'method' with php as the default and 'transcoding'
| to configure the path for FFMPEG to transcode FLAC audio files
|
*/
'streaming' => [
'bitrate' => env('OUTPUT_BIT_RATE', 128),
'method' => env('STREAMING_METHOD'),
'transcoding' => env('FFMPEG_PATH', '/usr/local/bin/ffmpeg'),
],
/*
|--------------------------------------------------------------------------
| Youtube Integration
|--------------------------------------------------------------------------
|
| Youtube integration requires an youtube API key, see wiki for more
|
*/
'youtube' => [
'key' => env('YOUTUBE_API_KEY'),
],
/*
|--------------------------------------------------------------------------
| Last.FM Integration
|--------------------------------------------------------------------------
|
| See wiki on how to integrate with Last.FM
|
*/
'lastfm' => [
'key' => env('LASTFM_API_KEY'),
'secret' => env('LASTFM_API_SECRET'),
],
/*
|--------------------------------------------------------------------------
| CDN
|--------------------------------------------------------------------------
|
|
|
*/
'cdn' => [
'url' => env('CDN_URL'),
],
/*
|--------------------------------------------------------------------------
| Downloading Music
|--------------------------------------------------------------------------
|
| Koel provides the ability to prohibit or allow [default] downloading music
|
*/
'download' => [
'allow' => env('ALLOW_DOWNLOAD', true),
],
/*
|--------------------------------------------------------------------------
| Ignore Dot Files
|--------------------------------------------------------------------------
|
| Ignore dot files and folders when scanning for media files.
|
*/
'ignore_dot_files' => env('IGNORE_DOT_FILES', true),
];

View file

@ -0,0 +1,35 @@
<?php
use App\Models\Artist;
use Illuminate\Database\Migrations\Migration;
class FixArtistAutoindexValue extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// This is to fix the auto increment bug caused by 2016_04_16_082627_create_various_artists
// Return if the database driver is not MySQL.
if (DB::getDriverName() !== 'mysql') {
return;
}
$latestArtist = Artist::orderBy('id', 'DESC')->first();
DB::statement('ALTER TABLE artists AUTO_INCREMENT='.($latestArtist->id + 1));
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
//
}
}

View file

@ -10,20 +10,29 @@ class UserTableSeeder extends Seeder
*/
public function run()
{
if (!env('ADMIN_NAME') || !env('ADMIN_EMAIL') || !env('ADMIN_PASSWORD')) {
$this->command->error('Please fill in initial admin details in .env file first.');
abort(422);
}
User::create([
'name' => env('ADMIN_NAME'),
'email' => env('ADMIN_EMAIL'),
'password' => Hash::make(env('ADMIN_PASSWORD')),
User::create($this->getUserDetails() + [
'is_admin' => true,
]);
if (app()->environment() !== 'testing') {
if (!app()->runningUnitTests()) {
$this->command->info('Admin user created. You can (and should) remove the auth details from .env now.');
}
}
protected function getUserDetails()
{
$details = array_filter(array_only(config('koel.admin', []), [
'name', 'email', 'password',
]));
if (count($details) !== 3) {
$this->command->error('Please fill in initial admin details in .env file first.');
abort(422);
}
$details['password'] = Hash::make($details['password']);
return $details;
}
}

View file

@ -24,8 +24,7 @@ elixir(function (mix) {
mix.sass('app.scss');
mix.copy('resources/assets/img', 'public/img')
.copy('node_modules/font-awesome/fonts', 'public/build/fonts')
.copy('resources/assets/fonts', 'public/build/fonts');
.copy('node_modules/font-awesome/fonts', 'public/build/fonts');
mix.scripts([
'node_modules/babel-polyfill/dist/polyfill.min.js',
@ -36,7 +35,8 @@ elixir(function (mix) {
.styles([
'resources/assets/css/**/*.css',
'node_modules/font-awesome/css/font-awesome.min.css',
'node_modules/rangeslider.js/dist/rangeslider.css'
'node_modules/rangeslider.js/dist/rangeslider.css',
'node_modules/sweetalert/dist/sweetalert.css'
], 'public/css/vendors.css', './');
mix.version(['css/vendors.css', 'css/app.css', 'js/vendors.js', 'js/main.js']);

View file

@ -1,8 +1,12 @@
server {
listen *:80;
server_name koel.dev;
root /var/www/koel;
index index.php;
listen *:80;
server_name koel.dev;
root /var/www/koel;
index index.php;
gzip on;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript application/json;
gzip_comp_level 9;
# Whitelist only index.php, robots.txt, and those start with public/ or api/
if ($request_uri !~ ^/$|index\.php|robots\.txt|api/|public/) {

View file

@ -37,11 +37,14 @@
"postcss-cssnext": "^2.6.0",
"rangeslider.js": "^2.1.1",
"rangetouch": "0.0.9",
"vue": "^2.0.0-alpha.8",
"select": "^1.0.6",
"sinon": "^1.17.2",
"sweetalert": "^1.1.3",
"vue": "^2.0.1",
"vue-hot-reload-api": "^1.3.2",
"vue-resource": "^0.7.0",
"vueify": "^9.1.0",
"vueify-insert-css": "^1.0.0"
"vueify-insert-css": "^1.0.0",
"youtube-player": "^3.0.4"
},
"devDependencies": {
"body-parser": "^1.15.2",

View file

@ -20,11 +20,18 @@
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="APP_KEY" value="16efa6c23c2e8c705826b0e66778fbe7"/>
<env name="JWT_SECRET" value="ki8jSvMf5wFrlSRBAWcGbmAzBUJfc8p8"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="LASTFM_API_KEY" value="foo"/>
<env name="LASTFM_API_SECRET" value="bar"/>
<env name="YOUTUBE_API_KEY" value="foo"/>
<env name="ADMIN_EMAIL" value="koel@example.com"/>
<env name="ADMIN_NAME" value="Koel"/>
<env name="ADMIN_PASSWORD" value="SoSecureK0el"/>
<env name="BROADCAST_DRIVER" value="log"/>
</php>
</phpunit>

4
public/.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
*
!.gitignore
!manifest.json
!browserconfig.xml

Binary file not shown.

View file

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -1,313 +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">
<defs >
<font id="Roboto" horiz-adv-x="1117" ><font-face
font-family="Roboto Thin"
units-per-em="2048"
panose-1="2 0 0 0 0 0 0 0 0 0"
ascent="1900"
descent="-500"
alphabetic="0" />
<glyph unicode=" " horiz-adv-x="490" />
<glyph unicode="!" horiz-adv-x="397" d="M221 401H167V1456H221V401ZM147 49Q147 72 163 88T202 105T241 89T258 49T242 10T202 -6T163 10T147 49Z" />
<glyph unicode="&quot;" horiz-adv-x="521" d="M210 1393L200 1122H150Q155 1390 155 1536H210V1393ZM411 1393L401 1122H351L357 1390V1536H411V1393Z" />
<glyph unicode="#" horiz-adv-x="1121" d="M742 410H378L304 0H248L322 410H51V462H332L427 986H127V1040H437L512 1456H568L492 1040H857L933 1456H989L913 1040H1167V986H903L807 462H1092V410H798L723 0H667L742 410ZM388 462H751L847 986H482L388 462Z" />
<glyph unicode="$" horiz-adv-x="1121" d="M947 344Q947 435 913 494T796 604T554 709T317 817T205 940T168 1110Q168 1273 275 1371T554 1476V1663H609V1476Q793 1466 893 1354T993 1047H939Q939 1217 843 1320T579 1424Q417 1424 320 1337T222 1112Q222 1014
254 957T362 854T575 760T785 677T906 592T977 485T1001 346Q1001 187 898 89T620 -20V-208H565V-21Q353 -13 237 99T121 409H175Q175 232 285 132T586 32Q743 32 845 122T947 344Z" />
<glyph unicode="%" horiz-adv-x="1527" d="M114 1176Q114 1305 192 1391T386 1477Q503 1477 580 1391T657 1171V1099Q657 972 581 886T388 800Q271 800 193 885T114 1105V1176ZM169 1099Q169 995 228 925T388 855Q484 855 543 924T602 1104V1176Q602 1284 543
1353T386 1422Q291 1422 230 1353T169 1169V1099ZM870 357Q870 486 947 571T1141 657Q1258 657 1335 572T1413 350V279Q1413 150 1336 65T1143 -21Q1027 -21 949 64T870 284V357ZM925 279Q925 172 984 103T1143 34Q1241 34 1299 103T1358 284V357Q1358 470 1300
536T1141 602Q1042 602 984 535T925 353V279ZM422 131L377 162L1088 1300L1133 1269L422 131Z" />
<glyph unicode="&amp;" horiz-adv-x="1247" d="M422 802Q334 910 296 996T257 1167Q257 1308 341 1392T562 1477Q687 1477 762 1404T838 1213Q838 1077 650 921L494 797L969 258Q1084 418 1084 632H1139Q1139 395 1006 216L1196 0H1129L972 176Q776 -20 549 -20Q348
-20 232 80T115 352Q115 450 171 545T371 762L422 802ZM549 34Q660 34 760 81T937 217L454 764L402 723Q284 621 227 532T169 352Q169 210 272 122T549 34ZM312 1169Q312 1011 462 834L637 973Q782 1094 782 1213Q782 1305 721 1364T562 1423Q449 1423 381 1353T312
1169Z" />
<glyph unicode="&apos;" horiz-adv-x="340" d="M200 1367L186 1122H136L145 1365V1536H200V1367Z" />
<glyph unicode="(" horiz-adv-x="607" d="M148 586Q148 802 201 1011T351 1386T562 1623L581 1580Q483 1515 396 1363T257 1011T202 616V564Q202 366 252 163T391 -200T581 -427L562 -470Q446 -397 351 -239T202 130T148 586Z" />
<glyph unicode=")" horiz-adv-x="623" d="M461 566Q461 341 408 131T259 -238T47 -470L28 -427Q132 -357 221 -195T358 167T407 590Q407 792 356 995T217 1356T28 1580L47 1623Q160 1552 257 1386T408 1011T461 566Z" />
<glyph unicode="*" horiz-adv-x="856" d="M393 1017L30 1141L48 1195L410 1062L411 1456H467L460 1061L812 1204L832 1151L472 1014L721 697L674 664L432 986L204 661L159 693L393 1017Z" />
<glyph unicode="+" horiz-adv-x="1151" d="M590 702H1071V649H590V146H535V649H73V702H535V1206H590V702Z" />
<glyph unicode="," horiz-adv-x="383" d="M129 -255L92 -223Q173 -119 180 -8L181 159H235V13Q231 -146 129 -255Z" />
<glyph unicode="-" horiz-adv-x="607" d="M531 639H61V693H531V639Z" />
<glyph unicode="." horiz-adv-x="439" d="M147 49Q147 72 163 88T202 105T241 89T258 49T242 10T202 -6T163 10T147 49Z" />
<glyph unicode="/" horiz-adv-x="782" d="M101 -125H42L650 1456H709L101 -125Z" />
<glyph unicode="0" horiz-adv-x="1121" d="M996 594Q996 301 882 141T562 -20Q357 -20 241 142T125 598V862Q125 1152 239 1314T560 1477Q767 1477 881 1315T996 858V594ZM942 862Q942 1127 843 1275T560 1423Q376 1423 278 1275T179 857V596Q179 332 280 183T562
34Q744 34 843 183T942 601V862Z" />
<glyph unicode="1" horiz-adv-x="1121" d="M659 0H605V1388L187 1231V1290L648 1460H659V0Z" />
<glyph unicode="2" horiz-adv-x="1121" d="M1024 0H153V54L650 627Q772 770 831 881T891 1085Q891 1245 798 1333T536 1422Q434 1422 350 1373T219 1238T171 1045H117Q117 1162 171 1262T321 1419T536 1476Q730 1476 838 1373T946 1085Q946 915 755 678L664 567L224
54H1024V0Z" />
<glyph unicode="3" horiz-adv-x="1121" d="M417 770H539Q710 773 815 861T921 1085Q921 1240 827 1331T564 1422Q400 1422 294 1326T188 1074H134Q134 1190 190 1282T345 1425T564 1476Q753 1476 864 1370T975 1081Q975 965 902 874T703 745Q846 712 926 621T1007
386Q1007 200 888 90T573 -20Q441 -20 329 37T160 188T103 405H157Q157 245 275 140T573 34Q752 34 852 126T953 382Q953 543 846 628T531 714H417V770Z" />
<glyph unicode="4" horiz-adv-x="1121" d="M842 451H1094V397H842V0H788V397H82V427L777 1456H842V451ZM166 451H788V1391L704 1253L166 451Z" />
<glyph unicode="5" horiz-adv-x="1121" d="M231 762L299 1456H1009V1403H348L289 819Q341 862 426 889T594 916Q790 916 907 792T1024 464Q1024 227 918 104T614 -20Q427 -20 312 87T182 383H237Q253 212 349 123T614 34Q794 34 881 142T969 462Q969 644 868 753T595
862Q490 862 412 834T272 746L231 762Z" />
<glyph unicode="6" horiz-adv-x="1121" d="M840 1476V1422Q534 1422 365 1241T183 733Q241 836 351 896T592 957Q784 957 898 826T1013 480Q1013 341 961 226T814 46T602 -20Q468 -20 360 42T191 219T128 481V660Q128 1048 311 1262T840 1476ZM585 903Q445 903
329 823T182 621V493Q182 287 299 160T602 33Q757 33 858 162T959 480Q959 674 859 788T585 903Z" />
<glyph unicode="7" horiz-adv-x="1121" d="M1007 1422L366 0H311L945 1402H77V1456H1007V1422Z" />
<glyph unicode="8" horiz-adv-x="1121" d="M986 1086Q986 964 911 873T715 745Q858 707 943 607T1028 379Q1028 194 902 87T565 -20Q351 -20 226 87T100 379Q100 508 182 607T408 745Q288 781 215 872T141 1086Q141 1266 256 1371T561 1476Q751 1476 868 1369T986
1086ZM973 374Q973 524 858 621T563 718Q382 718 268 622T154 374Q154 220 265 127T565 34Q749 34 861 127T973 374ZM932 1091Q932 1233 825 1327T561 1422Q400 1422 298 1331T195 1091Q195 949 297 861T563 772Q725 772 828 861T932 1091Z" />
<glyph unicode="9" horiz-adv-x="1121" d="M939 724Q886 609 775 539T523 468Q403 468 307 532T157 710T103 958Q103 1101 158 1220T312 1408T531 1476Q756 1476 874 1330T993 907V740Q993 371 829 178T346 -20H298L300 34H343Q635 37 787 212T939 724ZM523 522Q671
522 785 609T939 840V902Q939 1155 835 1288T535 1422Q428 1422 341 1359T206 1188T157 958Q157 839 204 738T334 579T523 522Z" />
<glyph unicode=":" horiz-adv-x="364" d="M376 49Q376 72 392 88T431 105T470 89T487 49T471 10T431 -6T392 10T376 49ZM125 1011Q125 1034 141 1050T180 1067T219 1051T236 1011T220 972T180 956T141 972T125 1011Z" />
<glyph unicode=";" horiz-adv-x="364" d="M126 1011Q126 1034 142 1050T181 1067T220 1051T237 1011T221 972T181 956T142 972T126 1011ZM374 -255L337 -223Q418 -119 425 -8L426 159H480V13Q476 -146 374 -255Z" />
<glyph unicode="&lt;" horiz-adv-x="1053" d="M155 669L919 324V265L82 644V694L919 1072V1014L155 669Z" />
<glyph unicode="=" horiz-adv-x="1142" d="M981 843H147V897H981V843ZM981 436H147V490H981V436Z" />
<glyph unicode="&gt;" horiz-adv-x="1053" d="M872 668L114 1013V1072L950 694V644L114 265V324L872 668Z" />
<glyph unicode="?" horiz-adv-x="893" d="M395 400Q397 512 429 583T552 739T678 874T730 980T747 1112Q747 1257 670 1340T458 1423Q314 1423 232 1337T147 1116H93Q95 1278 198 1377T458 1476T708 1377T801 1110Q801 995 756 906T581 698Q449 595 449 400H395ZM371
49Q371 72 387 88T426 105T465 89T482 49T466 10T426 -6T387 10T371 49Z" />
<glyph unicode="@" horiz-adv-x="1902" d="M1770 523Q1765 369 1715 240T1584 46T1400 -20Q1300 -20 1238 41T1165 210Q1055 -20 832 -20Q696 -20 630 104T581 436Q605 687 726 837T1018 988Q1133 988 1216 922L1268 878L1219 293Q1208 170 1256 103T1403 35Q1537
35 1619 164T1713 523Q1735 934 1553 1144T1000 1354Q776 1354 593 1242T305 930T187 478Q175 223 259 24T513 -287T913 -398Q1003 -398 1091 -377T1243 -318L1267 -364Q1203 -406 1102 -429T909 -453Q659 -453 479 -341T210 -17T132 478Q144 758 255 970T560 1296T1004
1411Q1396 1411 1592 1182T1770 523ZM634 279Q645 163 696 99T830 34Q955 34 1036 111T1168 344L1211 851Q1142 933 1015 933T792 833T655 557Q621 405 634 279Z" />
<glyph unicode="A" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489Z" />
<glyph unicode="B" horiz-adv-x="1235" d="M200 0V1456H583Q818 1456 938 1361T1059 1083Q1059 951 992 864T803 753Q941 735 1033 634T1125 401Q1125 215 1005 108T669 0H200ZM254 719V54H675Q860 54 965 145T1071 399Q1071 537 969 626T696 719H254ZM254 773H603Q802
773 903 849T1004 1087Q1004 1397 595 1402H254V773Z" />
<glyph unicode="C" horiz-adv-x="1327" d="M1190 446Q1169 221 1035 101T671 -20Q516 -20 397 58T211 281T144 612V837Q144 1023 209 1169T394 1396T671 1476Q899 1476 1034 1356T1190 1012H1136Q1113 1213 996 1317T671 1422Q459 1422 329 1262T198 833V619Q198
447 256 315T422 108T671 34Q880 34 997 137T1136 446H1190Z" />
<glyph unicode="D" horiz-adv-x="1340" d="M200 0V1456H603Q772 1456 909 1376T1124 1152T1204 828V639Q1204 457 1128 311T914 83T608 0H200ZM254 1402V54H603Q756 54 881 128T1078 336T1150 633V820Q1150 983 1081 1116T887 1324T611 1402H254Z" />
<glyph unicode="E" horiz-adv-x="1166" d="M984 722H254V54H1086V0H200V1456H1086V1402H254V776H984V722Z" />
<glyph unicode="F" horiz-adv-x="1172" d="M1000 716H254V0H200V1456H1102V1402H254V772H1000V716Z" />
<glyph unicode="G" horiz-adv-x="1406" d="M1226 156Q1171 80 1033 30T729 -20Q567 -20 440 59T242 282T168 608V858Q168 1037 237 1179T431 1398T712 1476Q929 1476 1065 1365T1224 1062H1170Q1143 1236 1025 1329T712 1422Q492 1422 357 1265T222 852V620Q222
449 285 315T464 108T729 34Q875 34 1000 77T1172 181V605H727V660H1226V156Z" />
<glyph unicode="H" horiz-adv-x="1438" d="M1238 0H1184V722H254V0H200V1456H254V776H1184V1456H1238V0Z" />
<glyph unicode="I" horiz-adv-x="534" d="M294 0H240V1456H294V0Z" />
<glyph unicode="J" horiz-adv-x="1125" d="M876 1456H930V442Q930 231 815 106T510 -20Q306 -20 198 89T90 401H144Q144 223 235 129T510 34Q670 34 771 141T876 432V1456Z" />
<glyph unicode="K" horiz-adv-x="1300" d="M487 766L254 551V0H200V1456H254V614L494 849L1098 1456H1176L527 803L1226 0H1156L487 766Z" />
<glyph unicode="L" horiz-adv-x="1057" d="M255 54H1002V0H200V1456H255V54Z" />
<glyph unicode="M" horiz-adv-x="1756" d="M277 1456L876 79L1477 1456H1556V0H1502V1376L898 0H855L254 1369V0H200V1456H277Z" />
<glyph unicode="N" horiz-adv-x="1449" d="M1249 0H1195L255 1364V0H200V1456H255L1195 95V1456H1249V0Z" />
<glyph unicode="O" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103 1043 1262T681 1422Q456 1422 322
1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839Z" />
<glyph unicode="P" horiz-adv-x="1230" d="M254 615V0H200V1456H655Q878 1456 1001 1344T1125 1031Q1125 833 1005 725T662 615H254ZM254 669H655Q852 669 961 764T1071 1029Q1071 1205 962 1303T655 1402H254V669Z" />
<glyph unicode="Q" horiz-adv-x="1364" d="M1231 619Q1231 415 1152 261T924 33L1191 -228L1152 -263L868 10Q778 -20 683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103
1043 1262T681 1422Q456 1422 322 1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839Z" />
<glyph unicode="R" horiz-adv-x="1340" d="M754 623H249V0H195V1456H659Q878 1456 1007 1343T1137 1036Q1137 887 1045 776T809 637L1198 14V0H1141L754 623ZM249 677H708Q876 677 979 779T1083 1036Q1083 1206 969 1304T655 1402H249V677Z" />
<glyph unicode="S" horiz-adv-x="1211" d="M1072 349Q1072 442 1029 506T892 620T609 722T326 827T187 950T143 1120Q143 1279 277 1377T626 1476Q766 1476 877 1422T1050 1269T1111 1046H1057Q1057 1209 937 1315T626 1422Q434 1422 316 1337T197 1122Q197 991
300 911T640 770T987 627Q1127 524 1127 351Q1127 241 1065 157T889 26T633 -20Q475 -20 349 32T160 182T96 411H150Q150 232 284 133T633 34Q824 34 948 121T1072 349Z" />
<glyph unicode="T" horiz-adv-x="1224" d="M1169 1402H639V0H585V1402H55V1456H1169V1402Z" />
<glyph unicode="U" horiz-adv-x="1365" d="M1180 1456V470Q1180 239 1046 110T683 -20T320 109T185 466V1456H239V472Q239 270 360 152T683 34T1005 152T1126 473V1456H1180Z" />
<glyph unicode="V" horiz-adv-x="1223" d="M583 142L612 54L641 142L1130 1456H1189L645 0H579L35 1456H94L583 142Z" />
<glyph unicode="W" horiz-adv-x="1855" d="M489 90L555 330L899 1456H959L1301 330L1366 90L1434 330L1734 1456H1793L1401 0H1340L979 1214L928 1368L879 1214L515 0H454L61 1456H121L423 330L489 90Z" />
<glyph unicode="X" horiz-adv-x="1223" d="M611 785L1081 1456H1149L645 743L1168 0H1101L611 701L119 0H54L577 743L73 1456H141L611 785Z" />
<glyph unicode="Y" horiz-adv-x="1223" d="M609 602L1119 1456H1185L636 553V0H582V553L33 1456H105L609 602Z" />
<glyph unicode="Z" horiz-adv-x="1224" d="M168 54H1130V0H94V44L1023 1403H134V1456H1098V1418L168 54Z" />
<glyph unicode="[" horiz-adv-x="439" d="M464 1610H235V-258H464V-312H181V1664H464V1610Z" />
<glyph unicode="\" horiz-adv-x="774" d="M57 1456H115L723 -125H665L57 1456Z" />
<glyph unicode="]" horiz-adv-x="439" d="M-8 1664H275V-312H-8V-258H220V1610H-8V1664Z" />
<glyph unicode="^" horiz-adv-x="849" d="M416 1382L150 729H91L390 1456H442L741 729H680L416 1382Z" />
<glyph unicode="_" horiz-adv-x="845" d="M845 -54H-1V0H845V-54Z" />
<glyph unicode="`" horiz-adv-x="537" d="M403 1250H344L149 1516H215L403 1250Z" />
<glyph unicode="a" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33Z" />
<glyph unicode="b" horiz-adv-x="1121" d="M999 531Q999 278 890 129T593 -20Q471 -20 375 30T224 171V0H170V1536H224V885Q281 992 374 1047T591 1102Q781 1102 890 957T999 548V531ZM943 552Q943 785 851 916T592 1048Q456 1048 362 978T224 770V274Q267 159
361 97T594 34Q761 34 852 167T943 552Z" />
<glyph unicode="c" horiz-adv-x="1039" d="M539 34Q686 34 781 112T886 328H940Q932 171 819 76T539 -20Q336 -20 217 127T97 526V562Q97 808 216 955T537 1102Q709 1102 821 999T940 725H886Q879 871 784 959T537 1048Q356 1048 254 918T151 555V520Q151 293
254 164T539 34Z" />
<glyph unicode="d" horiz-adv-x="1121" d="M122 552Q122 811 231 956T530 1102Q652 1102 745 1047T897 883V1536H951V0H897V173Q842 81 746 31T528 -20Q340 -20 231 129T122 538V552ZM178 531Q178 301 269 168T527 34Q661 34 756 93T897 268V775Q804 1048 529
1048Q363 1048 271 917T178 531Z" />
<glyph unicode="e" horiz-adv-x="1032" d="M561 -20Q430 -20 321 50T149 244T87 517V562Q87 712 147 837T312 1032T541 1102Q722 1102 837 973T952 634V577H141V518Q141 386 196 274T349 97T561 33Q670 33 746 69T882 182L920 155Q799 -20 561 -20ZM541 1048Q383
1048 273 931T144 631H898V644Q898 754 852 848T724 995T541 1048Z" />
<glyph unicode="f" horiz-adv-x="645" d="M254 0V1027H66V1082H254V1240Q255 1390 329 1473T537 1557Q611 1557 665 1540L657 1488Q605 1503 538 1503Q431 1503 370 1434T308 1236V1082H594V1027H308V0H254Z" />
<glyph unicode="g" horiz-adv-x="1123" d="M121 552Q121 811 230 956T529 1102Q650 1102 744 1047T895 884V1082H950V19Q950 -195 840 -315T541 -436Q432 -436 342 -389T187 -254L225 -218Q288 -298 363 -340T539 -383Q706 -383 799 -282T895 5V171Q839 79 744
30T527 -20Q339 -20 230 129T121 538V552ZM176 531Q176 299 268 167T526 34Q663 34 759 97T895 276V767Q807 1048 528 1048Q361 1048 269 917T176 531Z" />
<glyph unicode="h" horiz-adv-x="1121" d="M226 830Q279 956 382 1029T610 1102Q784 1102 868 1004T954 706V0H900V708Q899 882 829 965T607 1049Q467 1049 365 950T226 693V0H172V1536H226V830Z" />
<glyph unicode="i" horiz-adv-x="422" d="M239 0H185V1082H239V0ZM157 1420Q157 1443 173 1459T212 1476T251 1460T268 1420T252 1381T212 1365T173 1381T157 1420Z" />
<glyph unicode="j" horiz-adv-x="445" d="M240 1082V-129Q240 -279 165 -358T-45 -437Q-94 -437 -143 -417L-140 -365Q-92 -383 -45 -383Q67 -383 126 -317T186 -129V1082H240ZM163 1420Q163 1443 179 1459T218 1476T257 1460T274 1420T258 1381T218 1365T179
1381T163 1420Z" />
<glyph unicode="k" horiz-adv-x="969" d="M385 585L383 583L226 448V0H172V1536H226V507L353 627L845 1082H922L425 621L953 0H883L385 585Z" />
<glyph unicode="l" horiz-adv-x="422" d="M239 0H185V1536H239V0Z" />
<glyph unicode="m" horiz-adv-x="1836" d="M946 0H892V727Q891 890 821 969T596 1049Q418 1049 305 892Q238 798 216 684V0H161V1082H216V826Q271 958 373 1030T599 1102Q735 1102 821 1042T935 846Q983 963 1091 1032T1333 1102Q1508 1102 1593 1003T1680 706V0H1626V702Q1626
880 1555 965T1330 1049Q1133 1046 1018 892Q952 803 946 720V0Z" />
<glyph unicode="n" horiz-adv-x="1121" d="M226 830Q279 956 382 1029T610 1102Q784 1102 868 1004T954 706V0H900V708Q899 882 829 965T607 1049Q467 1049 365 950T226 693V0H172V1082H226V830Z" />
<glyph unicode="o" horiz-adv-x="1127" d="M90 562Q90 717 149 840T317 1033T563 1102Q699 1102 807 1035T975 845T1037 568V520Q1037 364 978 241T811 49T565 -20T320 48T151 238T90 514V562ZM144 520Q144 385 197 273T346 97T565 34Q750 34 866 173T983 531V562Q983
695 929 808T780 984T563 1048Q378 1048 261 907T144 552V520Z" />
<glyph unicode="p" horiz-adv-x="1121" d="M999 531Q999 278 890 129T593 -20Q470 -20 374 30T224 168V-416H170V1082H224V889Q280 992 375 1047T591 1102Q781 1102 890 957T999 548V531ZM944 552Q944 785 852 916T592 1048Q456 1048 361 978T224 775V269Q266
157 361 96T594 34Q760 34 852 166T944 552Z" />
<glyph unicode="q" horiz-adv-x="1121" d="M122 552Q122 811 231 956T530 1102Q651 1102 746 1047T897 889V1082H951V-416H897V168Q839 77 744 29T528 -20Q340 -20 231 129T122 538V552ZM178 531Q178 301 269 168T527 34Q661 34 756 93T897 268V775Q850 910 755
979T529 1048Q363 1048 271 917T178 531Z" />
<glyph unicode="r" horiz-adv-x="685" d="M649 1043L579 1049Q441 1049 348 960T226 709V0H172V1082H226V857Q270 970 358 1036T579 1102Q626 1102 655 1091L649 1043Z" />
<glyph unicode="s" horiz-adv-x="1019" d="M839 265Q839 462 503 533Q301 576 222 643T143 829Q143 948 243 1025T505 1102Q680 1102 786 1019T892 793H837Q837 902 745 975T505 1048Q363 1048 280 986T197 831Q197 758 228 717T329 642T533 577T745 504T858 405T893
264Q893 136 788 58T513 -20Q331 -20 220 62T108 275H162Q170 161 262 98T513 34Q658 34 748 101T839 265Z" />
<glyph unicode="t" horiz-adv-x="648" d="M293 1374V1082H539V1027H293V259Q293 144 330 89T456 34Q500 34 563 43L572 -8Q539 -20 459 -20Q341 -20 290 45T238 252V1027H38V1082H238V1374H293Z" />
<glyph unicode="u" horiz-adv-x="1121" d="M897 0V175Q849 85 757 33T524 -20Q347 -20 259 83T168 385V1082H222V383Q224 211 300 123T522 34Q677 34 774 107T897 321V1082H952V0H897Z" />
<glyph unicode="v" horiz-adv-x="978" d="M490 86L879 1082H937L516 0H463L43 1082H101L490 86Z" />
<glyph unicode="w" horiz-adv-x="1550" d="M366 313L425 80L742 1082H797L1112 80L1173 313L1393 1082H1456L1141 0H1087L820 813L769 1007L714 813L451 0H397L83 1082H145L366 313Z" />
<glyph unicode="x" horiz-adv-x="978" d="M489 602L834 1082H902L522 555L922 0H855L488 508L122 0H55L455 555L75 1082H143L489 602Z" />
<glyph unicode="y" horiz-adv-x="978" d="M503 84L510 104L884 1082H944L460 -188L436 -248Q358 -437 178 -437Q120 -437 98 -426L97 -375Q129 -384 170 -384Q255 -384 311 -335T408 -173L474 6L43 1082H102L503 84Z" />
<glyph unicode="z" horiz-adv-x="978" d="M160 54H930V0H87V44L798 1027H118V1082H871V1034L160 54Z" />
<glyph unicode="{" horiz-adv-x="660" d="M642 -441Q482 -391 403 -278T323 20V261Q323 543 73 543V609Q323 609 323 889V1136Q324 1321 403 1434T642 1597L657 1552Q377 1461 377 1125V897Q377 625 166 576Q377 523 377 255V26Q377 -299 662 -395L642 -441Z" />
<glyph unicode="|" horiz-adv-x="406" d="M235 -270H181V1456H235V-270Z" />
<glyph unicode="}" horiz-adv-x="660" d="M0 -395Q284 -298 284 22V255Q284 523 495 576Q284 625 284 897V1124Q284 1462 5 1552L19 1597Q179 1547 257 1435T338 1141V892Q338 609 588 609V543Q338 543 338 258V21Q338 -165 260 -277T19 -441L0 -395Z" />
<glyph unicode="~" horiz-adv-x="1412" d="M1246 752Q1246 614 1173 529T977 443Q906 443 845 471T687 586T539 696T428 720Q328 720 272 655T215 462H160Q160 605 231 689T428 774Q500 774 563 745T723 629T870 519T977 496Q1078 496 1134 563T1190 753L1246 752Z" />
<glyph unicode="&#xa0;" horiz-adv-x="490" />
<glyph unicode="&#xa1;" horiz-adv-x="406" d="M179 696H233V-359H179V696ZM253 1048Q253 1025 237 1009T198 992T159 1008T142 1048T158 1087T198 1103T237 1087T253 1048Z" />
<glyph unicode="&#xa2;" horiz-adv-x="1110" d="M576 34Q723 34 818 112T923 328H977Q969 178 864 84T604 -19V-245H549V-19Q358 -9 246 136T134 526V562Q134 802 246 946T549 1101V1318H604V1101Q767 1090 868 989T977 725H923Q916 871 821 959T574 1048Q393
1048 291 918T188 555V520Q188 293 291 164T576 34Z" />
<glyph unicode="&#xa3;" horiz-adv-x="1150" d="M360 667L370 336Q374 142 303 54H1060L1061 0H99V54H219Q267 68 292 148T316 336L306 667H95V721H304L295 1039Q295 1243 394 1359T661 1476Q834 1476 934 1372T1035 1089H981Q981 1248 896 1335T661 1422Q514
1422 432 1322T349 1039L358 721H728V667H360Z" />
<glyph unicode="&#xa4;" horiz-adv-x="1502" d="M1159 156Q1078 73 972 27T745 -20T518 26T330 154L154 -26L114 13L293 195Q149 371 149 608Q149 854 303 1032L114 1225L154 1264L342 1072Q513 1234 745 1234Q863 1234 965 1191T1148 1070L1339 1265L1380 1225L1187
1029Q1339 851 1339 608Q1339 374 1198 199L1380 13L1339 -27L1159 156ZM204 608Q204 454 277 320T476 110T745 33Q888 33 1013 109T1211 320T1285 608Q1285 761 1213 893T1015 1103T745 1181T475 1104T277 894T204 608Z" />
<glyph unicode="&#xa5;" horiz-adv-x="1207" d="M1079 1456H1145L656 676H1080V621H628V381H1080V326H628V0H574V326H124V381H574V621H124V676H545L58 1456H123L575 738L599 687H604L628 738L1079 1456Z" />
<glyph unicode="&#xa6;" horiz-adv-x="398" d="M172 -270V482H226V-270H172ZM226 698H172V1456H226V698Z" />
<glyph unicode="&#xa7;" horiz-adv-x="1223" d="M1094 431Q1094 326 1012 255T790 164Q932 110 991 37T1050 -149Q1050 -309 929 -402T600 -495Q374 -495 245 -383T115 -64L169 -62Q169 -242 285 -341T600 -441Q783 -441 889 -362T995 -151Q995 -63 959 -10T840
85T607 166Q336 230 229 319T121 551Q121 660 198 731T407 822Q278 873 222 947T166 1129Q166 1286 288 1381T618 1476Q833 1476 952 1364T1072 1045H1018Q1018 1212 909 1317T618 1422Q434 1422 327 1345T220 1132Q220 1041 256 987T374 891T616 804Q824 752 914
705T1049 593T1094 431ZM590 766Q531 779 482 796Q339 791 257 726T175 553Q175 460 214 406T347 309T693 196Q850 198 945 262T1040 428Q1040 513 999 569T865 670T590 766Z" />
<glyph unicode="&#xa8;" horiz-adv-x="906" d="M184 1421Q184 1444 200 1460T239 1477T278 1461T295 1421T279 1382T239 1366T200 1382T184 1421ZM629 1421Q629 1444 645 1460T684 1477T723 1461T740 1421T724 1382T684 1366T645 1382T629 1421Z" />
<glyph unicode="&#xa9;" horiz-adv-x="1666" d="M1124 616Q1124 464 1046 383T826 302Q682 302 594 409T506 693V768Q506 941 595 1048T826 1155Q969 1155 1047 1073T1125 842H1073Q1073 973 1009 1037T826 1102T634 1010T561 763V689Q561 540 633 449T826 357Q1072
357 1072 616H1124ZM179 729Q179 541 267 380T507 126T833 34Q1009 34 1161 128T1400 382T1487 729Q1487 916 1400 1075T1161 1328T833 1421Q660 1421 508 1330T268 1079T179 729ZM123 729Q123 931 216 1104T475 1376T833 1476T1190 1377T1449 1104T1543 729Q1543
530 1452 358T1196 83T833 -21T471 82T214 358T123 729Z" />
<glyph unicode="&#xaa;" horiz-adv-x="898" d="M680 705Q662 759 658 823Q619 763 554 727T417 691Q296 691 232 748T168 900Q168 1009 251 1070T487 1132H657V1201Q657 1305 608 1363T458 1422Q349 1422 285 1378T221 1243H167Q167 1345 248 1410T458 1476Q574
1476 643 1404T712 1200V884Q712 792 738 705H680ZM418 746Q488 746 562 793T657 899V1078H490Q222 1078 222 904Q222 746 418 746Z" />
<glyph unicode="&#xab;" horiz-adv-x="905" d="M216 781L510 402H440L145 772V791L440 1161H510L216 781ZM503 525L797 146H727L432 516V535L727 905H797L503 525Z" />
<glyph unicode="&#xac;" horiz-adv-x="1101" d="M915 396H861V700H122V753H915V396Z" />
<glyph unicode="&#xad;" horiz-adv-x="607" d="M531 639H61V693H531V639Z" />
<glyph unicode="&#xae;" horiz-adv-x="1674" d="M115 729Q115 931 208 1104T467 1376T825 1476T1182 1377T1441 1104T1535 729Q1535 530 1444 358T1188 83T825 -21T463 82T206 358T115 729ZM170 729Q170 543 257 383T496 128T825 34Q1001 34 1153 128T1392 382T1479
729Q1479 916 1392 1075T1153 1328T825 1421Q649 1421 497 1328T257 1076T170 729ZM648 678V326H593V1156H832Q1121 1156 1121 916Q1121 772 968 710Q1100 671 1100 502Q1100 391 1117 342V326H1058Q1044 362 1044 502Q1044 594 1006 635T873 678H648ZM648 734H853Q949
734 1007 784T1066 917Q1066 1015 1015 1057T846 1101H648V734Z" />
<glyph unicode="&#xaf;" horiz-adv-x="811" d="M719 1403H92V1456H719V1403Z" />
<glyph unicode="&#xb0;" horiz-adv-x="783" d="M156 1236Q156 1333 225 1404T392 1476Q488 1476 556 1405T624 1236Q624 1138 556 1069T392 999Q294 999 225 1068T156 1236ZM211 1236Q211 1159 262 1107T392 1055Q468 1055 518 1105T568 1236Q568 1318 518 1369T392
1421Q314 1421 263 1368T211 1236Z" />
<glyph unicode="&#xb1;" horiz-adv-x="1077" d="M569 805H988V751H569V289H515V751H72V805H515V1267H569V805ZM957 -1H122V53H957V-1Z" />
<glyph unicode="&#xb2;" horiz-adv-x="728" d="M651 664H108V708L398 1003Q477 1080 514 1138T551 1247Q551 1324 502 1369T356 1415Q254 1415 197 1363T140 1226H86Q86 1329 161 1396T356 1464Q472 1464 538 1405T605 1248Q605 1154 492 1031L426 961L175 713H651V664Z" />
<glyph unicode="&#xb3;" horiz-adv-x="728" d="M270 1090H345Q446 1091 505 1135T564 1249Q564 1326 511 1370T362 1415Q271 1415 211 1369T150 1246H97Q97 1342 172 1403T362 1464Q481 1464 549 1406T618 1246Q618 1189 578 1140T463 1067Q549 1047 593 997T637
875Q637 775 563 714T367 653Q243 653 162 716T80 881H134Q134 803 199 752T367 701T526 747T583 874Q583 1041 330 1041H270V1090Z" />
<glyph unicode="&#xb4;" horiz-adv-x="511" d="M315 1516H381L186 1250H126L315 1516Z" />
<glyph unicode="&#xb5;" horiz-adv-x="1121" d="M223 1082V421Q226 232 302 133T529 34Q705 34 794 124T899 414V1082H953V0H902L899 203Q803 -20 538 -20Q424 -20 345 30T223 171V-416H171V1082H223Z" />
<glyph unicode="&#xb6;" horiz-adv-x="946" d="M716 0V520H589Q439 520 328 578T158 742T99 988Q99 1201 232 1328T593 1456H770V0H716Z" />
<glyph unicode="&#xb7;" horiz-adv-x="472" d="M179 706Q179 729 195 745T234 762T273 746T290 706T274 667T234 651T195 667T179 706Z" />
<glyph unicode="&#xb8;" horiz-adv-x="490" d="M207 0L196 -76Q373 -92 373 -245Q373 -330 297 -382T88 -435L81 -386Q182 -386 250 -347T318 -245Q318 -189 280 -161T129 -121L154 0H207Z" />
<glyph unicode="&#xb9;" horiz-adv-x="728" d="M433 664H379V1386L131 1305V1358L424 1455H433V664Z" />
<glyph unicode="&#xba;" horiz-adv-x="914" d="M148 1141Q148 1291 231 1383T452 1476T673 1384T757 1136V1024Q757 873 674 782T454 690Q317 690 233 781T148 1029V1141ZM202 1024Q202 893 268 819T454 744Q570 744 637 820T704 1028V1141Q704 1269 636 1345T452
1422Q338 1422 270 1346T202 1135V1024Z" />
<glyph unicode="&#xbb;" horiz-adv-x="897" d="M198 940L492 560V541L198 171H128L421 550L128 940H198ZM488 940L782 560V541L488 171H418L711 550L418 940H488Z" />
<glyph unicode="&#xbc;" horiz-adv-x="1467" d="M447 664H393V1386L145 1305V1358L438 1455H447V664ZM386 139L341 170L1052 1308L1097 1277L386 139ZM1225 253H1372V204H1225V0H1172V204H749L748 236L1165 789H1225V253ZM818 253H1172V727L1128 656L818 253Z" />
<glyph unicode="&#xbd;" horiz-adv-x="1508" d="M343 139L298 170L1009 1308L1054 1277L343 139ZM424 664H370V1386L122 1305V1358L415 1455H424V664ZM1392 0H849V44L1139 339Q1218 416 1255 474T1292 583Q1292 660 1243 705T1097 751Q995 751 938 699T881 562H827Q827
665 902 732T1097 800Q1213 800 1279 741T1346 584Q1346 490 1233 367L1167 297L916 49H1392V0Z" />
<glyph unicode="&#xbe;" horiz-adv-x="1586" d="M548 139L503 170L1214 1308L1259 1277L548 139ZM1365 253H1512V204H1365V0H1312V204H889L888 236L1305 789H1365V253ZM958 253H1312V727L1268 656L958 253ZM314 1090H389Q490 1091 549 1135T608 1249Q608 1326
555 1370T406 1415Q315 1415 255 1369T194 1246H141Q141 1342 216 1403T406 1464Q525 1464 593 1406T662 1246Q662 1189 622 1140T507 1067Q593 1047 637 997T681 875Q681 775 607 714T411 653Q287 653 206 716T124 881H178Q178 803 243 752T411 701T570 747T627
874Q627 1041 374 1041H314V1090Z" />
<glyph unicode="&#xbf;" horiz-adv-x="912" d="M514 695Q512 593 503 557T469 487T389 403L311 327Q232 248 197 166T162 -17Q162 -166 241 -247T461 -328Q599 -328 678 -246T762 -21H816Q814 -188 719 -284T461 -381Q296 -381 202 -281T108 -15Q108 106 160 207T361
445Q412 485 434 526T459 626L460 695H514ZM538 1046Q538 1023 522 1007T483 990T444 1006T427 1046T443 1085T483 1101T522 1085T538 1046Z" />
<glyph unicode="&#xc0;" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489ZM655 1569H596L401 1835H467L655 1569Z" />
<glyph unicode="&#xc1;" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489ZM761 1835H827L632 1569H572L761 1835Z" />
<glyph unicode="&#xc2;" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489ZM866 1593V1583H798L611 1779L426 1583H362V1597L592 1836H632L866 1593Z" />
<glyph unicode="&#xc3;" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489ZM940 1806Q940 1724 890 1672T764 1620Q683 1620 611 1682T477 1745Q421 1745 389 1711T356 1620H301Q301 1700 351 1749T477
1799Q555 1799 630 1737T764 1675Q818 1675 851 1711T885 1806H940Z" />
<glyph unicode="&#xc4;" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489ZM346 1740Q346 1763 362 1779T401 1796T440 1780T457 1740T441 1701T401 1685T362 1701T346 1740ZM791 1740Q791 1763 807
1779T846 1796T885 1780T902 1740T886 1701T846 1685T807 1701T791 1740Z" />
<glyph unicode="&#xc5;" horiz-adv-x="1223" d="M967 435H254L92 0H33L578 1456H644L1189 0H1130L967 435ZM274 489H947L611 1391L274 489ZM614 1875Q686 1875 735 1824T785 1701T736 1580T614 1531Q545 1531 494 1578T443 1701T493 1825T614 1875ZM497 1701Q497
1649 530 1617T614 1585T698 1617T731 1701Q731 1755 698 1788T614 1821T530 1788T497 1701Z" />
<glyph unicode="&#xc6;" horiz-adv-x="1816" d="M1768 0H1016L998 425H371L115 0H50L931 1456H1707V1402H1011L1037 786H1625V732H1039L1067 54H1768V0ZM403 478H996L957 1398L403 478Z" />
<glyph unicode="&#xc7;" horiz-adv-x="1327" d="M1190 446Q1169 221 1035 101T671 -20Q516 -20 397 58T211 281T144 612V837Q144 1023 209 1169T394 1396T671 1476Q899 1476 1034 1356T1190 1012H1136Q1113 1213 996 1317T671 1422Q459 1422 329 1262T198 833V619Q198
447 256 315T422 108T671 34Q880 34 997 137T1136 446H1190ZM706 -9L695 -85Q872 -101 872 -254Q872 -339 796 -391T587 -444L580 -395Q681 -395 749 -356T817 -254Q817 -198 779 -170T628 -130L653 -9H706Z" />
<glyph unicode="&#xc8;" horiz-adv-x="1166" d="M984 722H254V54H1086V0H200V1456H1086V1402H254V776H984V722ZM662 1569H603L408 1835H474L662 1569Z" />
<glyph unicode="&#xc9;" horiz-adv-x="1166" d="M984 722H254V54H1086V0H200V1456H1086V1402H254V776H984V722ZM768 1835H834L639 1569H579L768 1835Z" />
<glyph unicode="&#xca;" horiz-adv-x="1166" d="M984 722H254V54H1086V0H200V1456H1086V1402H254V776H984V722ZM873 1593V1583H805L618 1779L433 1583H369V1597L599 1836H639L873 1593Z" />
<glyph unicode="&#xcb;" horiz-adv-x="1166" d="M984 722H254V54H1086V0H200V1456H1086V1402H254V776H984V722ZM353 1740Q353 1763 369 1779T408 1796T447 1780T464 1740T448 1701T408 1685T369 1701T353 1740ZM798 1740Q798 1763 814 1779T853 1796T892 1780T909
1740T893 1701T853 1685T814 1701T798 1740Z" />
<glyph unicode="&#xcc;" horiz-adv-x="534" d="M294 0H240V1456H294V0ZM312 1569H253L58 1835H124L312 1569Z" />
<glyph unicode="&#xcd;" horiz-adv-x="534" d="M294 0H240V1456H294V0ZM417 1835H483L288 1569H228L417 1835Z" />
<glyph unicode="&#xce;" horiz-adv-x="534" d="M294 0H240V1456H294V0ZM523 1593V1583H455L268 1779L83 1583H19V1597L249 1836H289L523 1593Z" />
<glyph unicode="&#xcf;" horiz-adv-x="534" d="M294 0H240V1456H294V0ZM3 1740Q3 1763 19 1779T58 1796T97 1780T114 1740T98 1701T58 1685T19 1701T3 1740ZM448 1740Q448 1763 464 1779T503 1796T542 1780T559 1740T543 1701T503 1685T464 1701T448 1740Z" />
<glyph unicode="&#xd0;" horiz-adv-x="1370" d="M230 0V713H60V767H230V1456H633Q802 1456 939 1376T1154 1152T1234 828V639Q1234 457 1158 311T944 83T638 0H230ZM647 713H284V54H623Q870 54 1025 220T1180 647V820Q1180 983 1111 1116T917 1324T641 1402H284V767H647V713Z"
/>
<glyph unicode="&#xd1;" horiz-adv-x="1449" d="M1249 0H1195L255 1364V0H200V1456H255L1195 95V1456H1249V0ZM1054 1806Q1054 1724 1004 1672T878 1620Q797 1620 725 1682T591 1745Q535 1745 503 1711T470 1620H415Q415 1700 465 1749T591 1799Q669 1799 744
1737T878 1675Q932 1675 965 1711T999 1806H1054Z" />
<glyph unicode="&#xd2;" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103 1043 1262T681 1422Q456 1422
322 1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839ZM719 1590H660L465 1856H531L719 1590Z" />
<glyph unicode="&#xd3;" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103 1043 1262T681 1422Q456 1422
322 1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839ZM825 1856H891L696 1590H636L825 1856Z" />
<glyph unicode="&#xd4;" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103 1043 1262T681 1422Q456 1422
322 1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839ZM930 1593V1583H862L675 1779L490 1583H426V1597L656 1836H696L930 1593Z" />
<glyph unicode="&#xd5;" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103 1043 1262T681 1422Q456 1422
322 1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839ZM1004 1827Q1004 1745 954 1693T828 1641Q747 1641 675 1703T541 1766Q485 1766 453 1732T420 1641H365Q365 1721 415 1770T541 1820Q619 1820 694 1758T828 1696Q882 1696
915 1732T949 1827H1004Z" />
<glyph unicode="&#xd6;" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q437 -20 285 155T133 627V837Q133 1025 200 1171T393 1396T681 1476Q844 1476 969 1397T1163 1171T1231 837V619ZM1177 839Q1177 1103 1043 1262T681 1422Q456 1422
322 1264T188 832V619Q188 445 248 312T421 106T683 34Q911 34 1044 193T1177 627V839ZM410 1761Q410 1784 426 1800T465 1817T504 1801T521 1761T505 1722T465 1706T426 1722T410 1761ZM855 1761Q855 1784 871 1800T910 1817T949 1801T966 1761T950 1722T910 1706T871
1722T855 1761Z" />
<glyph unicode="&#xd7;" horiz-adv-x="1052" d="M98 36L482 429L125 793L164 832L520 468L877 832L916 793L559 429L944 36L905 -1L521 390L137 -1L98 36Z" />
<glyph unicode="&#xd8;" horiz-adv-x="1364" d="M1231 619Q1231 430 1164 285T971 60T683 -20Q488 -20 349 92L243 -75H177L307 130Q133 306 133 629V837Q133 1025 200 1171T393 1396T681 1476Q912 1476 1063 1319L1174 1495H1240L1100 1275Q1230 1103 1231 839V619ZM188
619Q188 335 337 176L1033 1273Q901 1422 681 1422Q456 1422 322 1264T188 832V619ZM1177 839Q1177 1076 1070 1227L378 137Q502 34 683 34Q911 34 1044 193T1177 627V839Z" />
<glyph unicode="&#xd9;" horiz-adv-x="1365" d="M1180 1456V470Q1180 239 1046 110T683 -20T320 109T185 466V1456H239V472Q239 270 360 152T683 34T1005 152T1126 473V1456H1180ZM740 1569H681L486 1835H552L740 1569Z" />
<glyph unicode="&#xda;" horiz-adv-x="1365" d="M1180 1456V470Q1180 239 1046 110T683 -20T320 109T185 466V1456H239V472Q239 270 360 152T683 34T1005 152T1126 473V1456H1180ZM846 1835H912L717 1569H657L846 1835Z" />
<glyph unicode="&#xdb;" horiz-adv-x="1365" d="M1180 1456V470Q1180 239 1046 110T683 -20T320 109T185 466V1456H239V472Q239 270 360 152T683 34T1005 152T1126 473V1456H1180ZM951 1593V1583H883L696 1779L511 1583H447V1597L677 1836H717L951 1593Z" />
<glyph unicode="&#xdc;" horiz-adv-x="1365" d="M1180 1456V470Q1180 239 1046 110T683 -20T320 109T185 466V1456H239V472Q239 270 360 152T683 34T1005 152T1126 473V1456H1180ZM431 1740Q431 1763 447 1779T486 1796T525 1780T542 1740T526 1701T486 1685T447
1701T431 1740ZM876 1740Q876 1763 892 1779T931 1796T970 1780T987 1740T971 1701T931 1685T892 1701T876 1740Z" />
<glyph unicode="&#xdd;" horiz-adv-x="1223" d="M609 602L1119 1456H1185L636 553V0H582V553L33 1456H105L609 602ZM757 1824H823L628 1558H568L757 1824Z" />
<glyph unicode="&#xde;" horiz-adv-x="1219" d="M254 1456V1143H631Q837 1141 956 1030T1075 738Q1075 558 958 448T639 334H254V0H200V1456H254ZM254 1089V388H625Q806 388 913 486T1021 736Q1021 889 918 987T640 1089H254Z" />
<glyph unicode="&#xdf;" horiz-adv-x="1183" d="M218 0H164V1143Q164 1334 248 1434T493 1535Q619 1535 711 1456T804 1257Q804 1157 745 1050T685 829Q685 770 727 717T871 589T1017 445T1062 297Q1062 207 1010 135T871 21T695 -21Q604 -21 513 6T383 68L408
117Q452 82 533 57T687 32Q822 32 915 111T1008 306Q1008 371 967 428T822 561T675 698T631 831Q631 942 687 1055T744 1259Q744 1349 671 1415T503 1481Q222 1481 218 1153V0Z" />
<glyph unicode="&#xe0;" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33ZM620 1250H561L366 1516H432L620 1250Z" />
<glyph unicode="&#xe1;" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33ZM726 1516H792L597 1250H537L726 1516Z" />
<glyph unicode="&#xe2;" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33ZM831 1274V1264H763L576 1460L391 1264H327V1278L557 1517H597L831 1274Z" />
<glyph unicode="&#xe3;" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33ZM905 1486Q905 1404 855 1352T729 1300Q648 1300 576 1362T442 1425Q386 1425 354 1391T321 1300H266Q266 1380 316 1429T442 1479Q520
1479 595 1417T729 1355Q783 1355 816 1391T850 1486H905Z" />
<glyph unicode="&#xe4;" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33ZM311 1421Q311 1444 327 1460T366 1477T405 1461T422 1421T406 1382T366 1366T327 1382T311 1421ZM756 1421Q756 1444 772 1460T811
1477T850 1461T867 1421T851 1382T811 1366T772 1382T756 1421Z" />
<glyph unicode="&#xe5;" horiz-adv-x="1081" d="M871 0Q851 69 851 198Q787 94 676 37T425 -20Q275 -20 184 61T92 274Q92 423 226 512T584 604H851V762Q851 898 766 973T521 1048Q373 1048 274 972T175 784L121 786Q121 918 237 1010T521 1102Q696 1102 799 1015T905
768V251Q905 73 933 9V0H871ZM425 33Q577 33 686 101T851 292V549H601Q369 549 246 457Q146 382 146 270Q146 171 225 102T425 33ZM579 1556Q651 1556 700 1505T750 1382T701 1261T579 1212Q510 1212 459 1259T408 1382T458 1506T579 1556ZM462 1382Q462 1330 495
1298T579 1266T663 1298T696 1382Q696 1436 663 1469T579 1502T495 1469T462 1382Z" />
<glyph unicode="&#xe6;" horiz-adv-x="1735" d="M1268 -20Q1121 -20 1021 47T868 230V218H869Q821 111 707 46T448 -20Q280 -20 187 62T93 284Q93 442 203 535T516 630H813V720Q813 876 741 962T521 1048Q363 1048 269 972T174 771L121 778Q121 923 232 1012T521
1102Q662 1102 749 1028T860 814Q916 951 1019 1026T1253 1102Q1439 1102 1548 986T1657 656V577H870V500Q870 282 974 158T1268 34Q1472 34 1600 164L1630 122Q1551 43 1465 12T1268 -20ZM447 32Q528 32 606 60T741 136T813 225V575H512Q345 572 247 492T148 280Q148
164 224 98T447 32ZM1253 1048Q1100 1048 996 935T873 632H1603V664Q1603 838 1510 943T1253 1048Z" />
<glyph unicode="&#xe7;" horiz-adv-x="1039" d="M539 34Q686 34 781 112T886 328H940Q932 171 819 76T539 -20Q336 -20 217 127T97 526V562Q97 808 216 955T537 1102Q709 1102 821 999T940 725H886Q879 871 784 959T537 1048Q356 1048 254 918T151 555V520Q151
293 254 164T539 34ZM575 -9L564 -85Q741 -101 741 -254Q741 -339 665 -391T456 -444L449 -395Q550 -395 618 -356T686 -254Q686 -198 648 -170T497 -130L522 -9H575Z" />
<glyph unicode="&#xe8;" horiz-adv-x="1032" d="M561 -20Q430 -20 321 50T149 244T87 517V562Q87 712 147 837T312 1032T541 1102Q722 1102 837 973T952 634V577H141V518Q141 386 196 274T349 97T561 33Q670 33 746 69T882 182L920 155Q799 -20 561 -20ZM541 1048Q383
1048 273 931T144 631H898V644Q898 754 852 848T724 995T541 1048ZM610 1249H551L356 1515H422L610 1249Z" />
<glyph unicode="&#xe9;" horiz-adv-x="1032" d="M561 -20Q430 -20 321 50T149 244T87 517V562Q87 712 147 837T312 1032T541 1102Q722 1102 837 973T952 634V577H141V518Q141 386 196 274T349 97T561 33Q670 33 746 69T882 182L920 155Q799 -20 561 -20ZM541 1048Q383
1048 273 931T144 631H898V644Q898 754 852 848T724 995T541 1048ZM716 1515H782L587 1249H527L716 1515Z" />
<glyph unicode="&#xea;" horiz-adv-x="1032" d="M561 -20Q430 -20 321 50T149 244T87 517V562Q87 712 147 837T312 1032T541 1102Q722 1102 837 973T952 634V577H141V518Q141 386 196 274T349 97T561 33Q670 33 746 69T882 182L920 155Q799 -20 561 -20ZM541 1048Q383
1048 273 931T144 631H898V644Q898 754 852 848T724 995T541 1048ZM821 1274V1264H753L566 1460L381 1264H317V1278L547 1517H587L821 1274Z" />
<glyph unicode="&#xeb;" horiz-adv-x="1032" d="M561 -20Q430 -20 321 50T149 244T87 517V562Q87 712 147 837T312 1032T541 1102Q722 1102 837 973T952 634V577H141V518Q141 386 196 274T349 97T561 33Q670 33 746 69T882 182L920 155Q799 -20 561 -20ZM541 1048Q383
1048 273 931T144 631H898V644Q898 754 852 848T724 995T541 1048ZM301 1676Q301 1699 317 1715T356 1732T395 1716T412 1676T396 1637T356 1621T317 1637T301 1676ZM746 1676Q746 1699 762 1715T801 1732T840 1716T857 1676T841 1637T801 1621T762 1637T746 1676Z"
/>
<glyph unicode="&#xec;" horiz-adv-x="406" d="M235 0H181V1082H235V0ZM253 1227H194L-1 1493H65L253 1227Z" />
<glyph unicode="&#xed;" horiz-adv-x="406" d="M235 0H181V1082H235V0ZM358 1749H424L229 1483H169L358 1749Z" />
<glyph unicode="&#xee;" horiz-adv-x="406" d="M235 0H181V1082H235V0ZM464 1274V1264H396L209 1460L24 1264H-40V1278L190 1517H230L464 1274Z" />
<glyph unicode="&#xef;" horiz-adv-x="406" d="M235 0H181V1082H235V0ZM-56 1398Q-56 1421 -40 1437T-1 1454T38 1438T55 1398T39 1359T-1 1343T-40 1359T-56 1398ZM389 1398Q389 1421 405 1437T444 1454T483 1438T500 1398T484 1359T444 1343T405 1359T389 1398Z" />
<glyph unicode="&#xf0;" horiz-adv-x="1183" d="M802 1308Q923 1183 982 1014T1041 615V535Q1041 376 990 250T843 52T629 -20Q500 -20 396 43T232 218T173 465Q173 696 286 824T601 953Q714 953 815 909T977 780Q957 948 899 1069T752 1280L517 1149L489 1197L709
1320Q571 1441 338 1527L358 1577Q610 1485 760 1348L962 1461L991 1413L802 1308ZM987 617L986 672Q940 777 837 836T601 895Q424 895 326 782T228 465Q228 350 279 250T423 94T633 38Q789 38 886 171T987 520V617Z" />
<glyph unicode="&#xf1;" horiz-adv-x="1121" d="M226 830Q279 956 382 1029T610 1102Q784 1102 868 1004T954 706V0H900V708Q899 882 829 965T607 1049Q467 1049 365 950T226 693V0H172V1082H226V830ZM906 1484Q906 1402 856 1350T730 1298Q649 1298 577 1360T443
1423Q387 1423 355 1389T322 1298H267Q267 1378 317 1427T443 1477Q521 1477 596 1415T730 1353Q784 1353 817 1389T851 1484H906Z" />
<glyph unicode="&#xf2;" horiz-adv-x="1127" d="M90 562Q90 717 149 840T317 1033T563 1102Q699 1102 807 1035T975 845T1037 568V520Q1037 364 978 241T811 49T565 -20T320 48T151 238T90 514V562ZM144 520Q144 385 197 273T346 97T565 34Q750 34 866 173T983
531V562Q983 695 929 808T780 984T563 1048Q378 1048 261 907T144 552V520ZM610 1248H551L356 1514H422L610 1248Z" />
<glyph unicode="&#xf3;" horiz-adv-x="1127" d="M90 562Q90 717 149 840T317 1033T563 1102Q699 1102 807 1035T975 845T1037 568V520Q1037 364 978 241T811 49T565 -20T320 48T151 238T90 514V562ZM144 520Q144 385 197 273T346 97T565 34Q750 34 866 173T983
531V562Q983 695 929 808T780 984T563 1048Q378 1048 261 907T144 552V520ZM716 1514H782L587 1248H527L716 1514Z" />
<glyph unicode="&#xf4;" horiz-adv-x="1127" d="M90 562Q90 717 149 840T317 1033T563 1102Q699 1102 807 1035T975 845T1037 568V520Q1037 364 978 241T811 49T565 -20T320 48T151 238T90 514V562ZM144 520Q144 385 197 273T346 97T565 34Q750 34 866 173T983
531V562Q983 695 929 808T780 984T563 1048Q378 1048 261 907T144 552V520ZM821 1274V1264H753L566 1460L381 1264H317V1278L547 1517H587L821 1274Z" />
<glyph unicode="&#xf5;" horiz-adv-x="1127" d="M90 562Q90 717 149 840T317 1033T563 1102Q699 1102 807 1035T975 845T1037 568V520Q1037 364 978 241T811 49T565 -20T320 48T151 238T90 514V562ZM144 520Q144 385 197 273T346 97T565 34Q750 34 866 173T983
531V562Q983 695 929 808T780 984T563 1048Q378 1048 261 907T144 552V520ZM895 1484Q895 1402 845 1350T719 1298Q638 1298 566 1360T432 1423Q376 1423 344 1389T311 1298H256Q256 1378 306 1427T432 1477Q510 1477 585 1415T719 1353Q773 1353 806 1389T840
1484H895Z" />
<glyph unicode="&#xf6;" horiz-adv-x="1127" d="M90 562Q90 717 149 840T317 1033T563 1102Q699 1102 807 1035T975 845T1037 568V520Q1037 364 978 241T811 49T565 -20T320 48T151 238T90 514V562ZM144 520Q144 385 197 273T346 97T565 34Q750 34 866 173T983
531V562Q983 695 929 808T780 984T563 1048Q378 1048 261 907T144 552V520ZM301 1675Q301 1698 317 1714T356 1731T395 1715T412 1675T396 1636T356 1620T317 1636T301 1675ZM746 1675Q746 1698 762 1714T801 1731T840 1715T857 1675T841 1636T801 1620T762 1636T746
1675Z" />
<glyph unicode="&#xf7;" horiz-adv-x="1159" d="M1071 686H73V738H1071V686ZM529 1079Q529 1102 545 1118T584 1135T623 1119T640 1079T624 1040T584 1024T545 1040T529 1079ZM529 301Q529 324 545 340T584 357T623 341T640 301T624 262T584 246T545 262T529 301Z" />
<glyph unicode="&#xf8;" horiz-adv-x="1121" d="M87 562Q87 717 146 840T314 1033T560 1102Q680 1102 784 1047L868 1219H931L832 1016Q927 946 980 829T1034 562V520Q1034 364 975 241T808 49T562 -20Q450 -20 352 28L268 -145H205L303 56Q200 125 144 247T87
522V562ZM141 520Q141 388 190 280T327 107L759 995Q671 1048 560 1048Q375 1048 258 907T141 552V520ZM980 562Q980 684 935 790T806 963L376 77Q459 34 562 34Q747 34 863 173T980 531V562Z" />
<glyph unicode="&#xf9;" horiz-adv-x="1121" d="M897 0V175Q849 85 757 33T524 -20Q347 -20 259 83T168 385V1082H222V383Q224 211 300 123T522 34Q677 34 774 107T897 321V1082H952V0H897ZM623 1250H564L369 1516H435L623 1250Z" />
<glyph unicode="&#xfa;" horiz-adv-x="1121" d="M897 0V175Q849 85 757 33T524 -20Q347 -20 259 83T168 385V1082H222V383Q224 211 300 123T522 34Q677 34 774 107T897 321V1082H952V0H897ZM729 1516H795L600 1250H540L729 1516Z" />
<glyph unicode="&#xfb;" horiz-adv-x="1121" d="M897 0V175Q849 85 757 33T524 -20Q347 -20 259 83T168 385V1082H222V383Q224 211 300 123T522 34Q677 34 774 107T897 321V1082H952V0H897ZM834 1274V1264H766L579 1460L394 1264H330V1278L560 1517H600L834 1274Z" />
<glyph unicode="&#xfc;" horiz-adv-x="1121" d="M897 0V175Q849 85 757 33T524 -20Q347 -20 259 83T168 385V1082H222V383Q224 211 300 123T522 34Q677 34 774 107T897 321V1082H952V0H897ZM314 1421Q314 1444 330 1460T369 1477T408 1461T425 1421T409 1382T369
1366T330 1382T314 1421ZM759 1421Q759 1444 775 1460T814 1477T853 1461T870 1421T854 1382T814 1366T775 1382T759 1421Z" />
<glyph unicode="&#xfd;" horiz-adv-x="978" d="M503 84L510 104L884 1082H944L460 -188L436 -248Q358 -437 178 -437Q120 -437 98 -426L97 -375Q129 -384 170 -384Q255 -384 311 -335T408 -173L474 6L43 1082H102L503 84ZM668 1516H734L539 1250H479L668 1516Z" />
<glyph unicode="&#xfe;" horiz-adv-x="1121" d="M999 531Q999 278 890 129T593 -20Q470 -20 374 30T224 168V-416H170V1536H224V889Q280 992 375 1047T591 1102Q781 1102 890 957T999 548V531ZM944 552Q944 785 852 916T592 1048Q456 1048 361 978T224 775V269Q266
157 361 96T594 34Q760 34 852 166T944 552Z" />
<glyph unicode="&#xff;" horiz-adv-x="978" d="M503 84L510 104L884 1082H944L460 -188L436 -248Q358 -437 178 -437Q120 -437 98 -426L97 -375Q129 -384 170 -384Q255 -384 311 -335T408 -173L474 6L43 1082H102L503 84ZM253 1421Q253 1444 269 1460T308 1477T347
1461T364 1421T348 1382T308 1366T269 1382T253 1421ZM698 1421Q698 1444 714 1460T753 1477T792 1461T809 1421T793 1382T753 1366T714 1382T698 1421Z" />
<glyph unicode="&#x2013;" horiz-adv-x="1324" d="M1415 721H413V775H1415V721Z" />
<glyph unicode="&#x2014;" horiz-adv-x="1561" d="M1446 721H110V775H1446V721Z" />
<glyph unicode="&#x2018;" horiz-adv-x="320" d="M207 1554L244 1522Q158 1414 155 1288V1168H101V1286Q105 1445 207 1554Z" />
<glyph unicode="&#x2019;" horiz-adv-x="320" d="M114 1151L77 1183Q158 1287 165 1398L166 1536H220V1419Q216 1260 114 1151Z" />
<glyph unicode="&#x201a;" horiz-adv-x="300" d="M84 -182L47 -150Q128 -46 135 65L136 228H190V86Q186 -73 84 -182Z" />
<glyph unicode="&#x201c;" horiz-adv-x="500" d="M458 1554L495 1522Q409 1414 406 1288V1168H352V1286Q356 1445 458 1554ZM387 1554L424 1522Q338 1414 335 1288V1168H281V1286Q285 1445 387 1554Z" />
<glyph unicode="&#x201d;" horiz-adv-x="502" d="M114 1151L77 1183Q158 1287 165 1398L166 1536H220V1419Q216 1260 114 1151ZM296 1151L259 1183Q340 1287 347 1398L348 1536H402V1419Q398 1260 296 1151Z" />
<glyph unicode="&#x201e;" horiz-adv-x="481" d="M84 -182L47 -150Q128 -46 135 65L136 228H190V86Q186 -73 84 -182ZM255 -182L218 -150Q299 -46 306 65L307 228H361V86Q357 -73 255 -182Z" />
<glyph unicode="&#x2022;" horiz-adv-x="635" d="M155 733Q155 804 200 848T321 893T442 849T489 730V703Q489 632 442 589T322 545Q250 545 203 587T155 701V733Z" />
<glyph unicode="&#x2039;" horiz-adv-x="604" d="M179 560L473 181H403L108 551V570L403 940H473L179 560Z" />
<glyph unicode="&#x203a;" horiz-adv-x="604" d="M176 940L470 560V541L176 171H106L399 550L106 940H176Z" />
</font>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 48 KiB

View file

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -1,314 +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">
<defs >
<font id="Roboto" horiz-adv-x="1137" ><font-face
font-family="Roboto Light"
units-per-em="2048"
panose-1="2 0 0 0 0 0 0 0 0 0"
ascent="1900"
descent="-500"
alphabetic="0" />
<glyph unicode=" " horiz-adv-x="498" />
<glyph unicode="!" horiz-adv-x="462" d="M284 405H173L167 1456H291L284 405ZM153 70Q153 104 175 127T235 151T295 128T318 70Q318 37 296 15T235 -8T175 14T153 70Z" />
<glyph unicode="&quot;" horiz-adv-x="588" d="M243 1396L223 1083H143L146 1536H243V1396ZM479 1396L459 1083H378L382 1536H479V1396Z" />
<glyph unicode="#" horiz-adv-x="1191" d="M753 410H439L362 0H263L340 410H85V503H357L440 944H161V1040H458L537 1456H636L557 1040H872L951 1456H1051L972 1040H1201V944H954L871 503H1126V410H853L776 0H676L753 410ZM456 503H771L854 944H539L456 503Z" />
<glyph unicode="$" horiz-adv-x="1135" d="M901 359Q901 470 829 540T575 674Q349 745 258 842T167 1095Q167 1258 267 1359T539 1475V1677H641V1475Q817 1459 913 1343T1010 1028H891Q891 1185 810 1277T587 1370Q445 1370 366 1296T286 1097Q286 977 359 910T607
783T862 669T981 540T1021 361Q1021 197 919 97T637 -18V-208H536V-19Q335 -6 225 107T115 418H235Q235 262 326 174T580 85Q722 85 811 161T901 359Z" />
<glyph unicode="%" horiz-adv-x="1513" d="M109 1176Q109 1306 189 1391T394 1477T598 1392T679 1170V1099Q679 971 600 886T396 800Q273 800 191 884T109 1106V1176ZM206 1099Q206 1006 257 946T396 886Q481 886 531 946T582 1103V1176Q582 1269 530 1329T394
1390Q311 1390 259 1330T206 1170V1099ZM842 357Q842 487 922 572T1126 657T1330 573T1412 350V279Q1412 149 1332 64T1128 -21T924 63T842 284V357ZM938 279Q938 185 989 125T1128 65Q1214 65 1264 125T1315 284V357Q1315 453 1264 511T1126 570Q1042 570 990
511T938 353V279ZM434 121L359 169L1070 1307L1145 1259L434 121Z" />
<glyph unicode="&amp;" horiz-adv-x="1260" d="M404 794Q317 899 278 981T238 1145Q238 1298 329 1387T573 1476Q712 1476 798 1396T884 1191Q884 1047 718 908L558 784L958 318Q1049 465 1049 651H1160Q1160 403 1032 232L1231 0H1087L961 146Q882 68 779 24T560
-20Q352 -20 230 86T108 371Q108 477 170 571T390 784L404 794ZM560 81Q651 81 736 119T890 229L483 701L469 716L423 681Q227 521 227 371Q227 240 317 161T560 81ZM358 1149Q358 1027 493 861L624 961Q688 1007 729 1062T770 1191Q770 1269 716 1321T572 1374Q474
1374 416 1311T358 1149Z" />
<glyph unicode="&apos;" horiz-adv-x="348" d="M226 1395L209 1090H119Q124 1386 124 1536H226V1395Z" />
<glyph unicode="(" horiz-adv-x="653" d="M140 588Q140 806 196 1011T360 1387T592 1632L621 1551Q555 1504 490 1414T374 1200T292 922T260 571Q260 362 307 169T438 -171T621 -393L592 -470Q465 -394 357 -225T195 148T140 588Z" />
<glyph unicode=")" horiz-adv-x="667" d="M514 573Q514 353 460 150T298 -223T62 -470L33 -393Q131 -323 214 -176T346 166T394 591Q394 798 346 990T214 1334T33 1555L62 1632Q188 1555 295 1386T458 1011T514 573Z" />
<glyph unicode="*" horiz-adv-x="869" d="M361 1000L29 1108L61 1209L393 1086L389 1456H493L485 1083L809 1210L842 1109L509 994L732 700L647 637L433 942L229 639L144 700L361 1000Z" />
<glyph unicode="+" horiz-adv-x="1156" d="M630 740H1073V628H630V146H509V628H75V740H509V1206H630V740Z" />
<glyph unicode="," horiz-adv-x="392" d="M131 -272L60 -220Q151 -98 154 33V188H271V63Q271 -145 131 -272Z" />
<glyph unicode="-" horiz-adv-x="586" d="M528 592H49V693H528V592Z" />
<glyph unicode="." horiz-adv-x="489" d="M145 72Q145 107 167 131T230 156T293 132T316 72T293 15T230 -8T168 14T145 72Z" />
<glyph unicode="/" horiz-adv-x="813" d="M139 -125H30L638 1456H746L139 -125Z" />
<glyph unicode="0" horiz-adv-x="1135" d="M1015 607Q1015 299 902 140T569 -20Q353 -20 238 136T120 592V853Q120 1160 234 1318T567 1476Q783 1476 897 1324T1015 874V607ZM895 868Q895 1118 814 1246T567 1374Q405 1374 323 1249T239 880V594Q239 345 323 213T569
81Q729 81 811 210T895 588V868Z" />
<glyph unicode="1" horiz-adv-x="1135" d="M694 0H574V1312L178 1165V1277L674 1461H694V0Z" />
<glyph unicode="2" horiz-adv-x="1135" d="M1049 0H137V92L636 658Q760 801 808 894T856 1075Q856 1213 775 1293T552 1374Q405 1374 315 1280T224 1036H105Q105 1159 160 1260T318 1418T552 1476Q752 1476 864 1371T977 1085Q977 983 914 862T690 560L284 101H1049V0Z" />
<glyph unicode="3" horiz-adv-x="1135" d="M403 793H527Q630 793 707 829T824 929T865 1076Q865 1216 786 1295T559 1374Q419 1374 330 1292T240 1074H120Q120 1187 177 1280T335 1425T559 1476Q757 1476 871 1368T985 1072Q985 967 919 879T736 746Q872 708 942
616T1012 395Q1012 208 890 94T564 -20Q434 -20 326 32T158 177T98 395H218Q218 256 315 169T564 81Q719 81 805 160T892 391Q892 537 799 614T523 691H403V793Z" />
<glyph unicode="4" horiz-adv-x="1135" d="M872 469H1099V368H872V0H752V368H67V436L741 1456H872V469ZM214 469H752V1301L699 1209L214 469Z" />
<glyph unicode="5" horiz-adv-x="1135" d="M218 746L289 1456H1017V1345H392L341 853Q458 933 615 933Q812 933 929 805T1046 464Q1046 234 932 107T611 -20Q421 -20 303 86T168 383H283Q300 234 384 158T611 81Q767 81 846 180T926 462Q926 622 837 723T594 824Q509
824 446 803T313 719L218 746Z" />
<glyph unicode="6" horiz-adv-x="1135" d="M843 1467V1362H829Q568 1362 418 1209T252 782Q312 865 405 910T613 956Q805 956 918 824T1032 477Q1032 335 979 221T827 44T601 -20Q392 -20 261 131T130 523V643Q130 1034 308 1248T813 1467H843ZM594 853Q480 853
382 786T250 614V512Q250 322 347 202T601 82Q741 82 827 193T914 473Q914 645 828 749T594 853Z" />
<glyph unicode="7" horiz-adv-x="1135" d="M1034 1387L412 0H287L905 1354H77V1456H1034V1387Z" />
<glyph unicode="8" horiz-adv-x="1135" d="M995 1081Q995 968 929 879T755 747Q881 704 957 608T1033 386Q1033 199 906 90T570 -20Q359 -20 233 89T106 386Q106 510 179 607T379 747Q271 789 207 878T143 1081Q143 1262 259 1369T568 1476T877 1368T995 1081ZM913
385Q913 521 816 608T568 696T321 610T225 385T318 164T570 81Q725 81 819 163T913 385ZM875 1082Q875 1207 789 1290T568 1374Q432 1374 348 1294T263 1082Q263 954 347 876T569 798Q704 798 789 876T875 1082Z" />
<glyph unicode="9" horiz-adv-x="1135" d="M884 674Q820 580 725 529T519 477Q395 477 300 541T153 718T101 965Q101 1109 156 1227T311 1410T541 1476Q760 1476 882 1323T1004 887V779Q1004 385 836 187T323 -11H301L302 93H344Q605 97 741 241T884 674ZM534
580Q654 580 749 651T885 837V906Q885 1128 793 1250T543 1373Q401 1373 310 1259T219 970Q219 803 306 692T534 580Z" />
<glyph unicode=":" horiz-adv-x="430" d="M383 72Q383 107 405 131T468 156T531 132T554 72T531 15T468 -8T406 14T383 72ZM129 995Q129 1030 151 1054T214 1079T277 1055T300 995T277 938T214 915T152 937T129 995Z" />
<glyph unicode=";" horiz-adv-x="399" d="M118 995Q118 1030 140 1054T203 1079T266 1055T289 995T266 938T203 915T141 937T118 995ZM131 -272L60 -220Q151 -98 154 33V188H271V63Q271 -145 131 -272Z" />
<glyph unicode="&lt;" horiz-adv-x="1047" d="M208 655L904 355V229L77 608V705L904 1083V957L208 655Z" />
<glyph unicode="=" horiz-adv-x="1133" d="M983 829H149V935H983V829ZM983 418H149V524H983V418Z" />
<glyph unicode="&gt;" horiz-adv-x="1061" d="M835 659L124 962V1085L969 707V610L124 231V355L835 659Z" />
<glyph unicode="?" horiz-adv-x="930" d="M376 404Q378 522 408 594T537 763T664 901T708 990T724 1101Q724 1226 658 1297T472 1369Q352 1369 279 1301T203 1115H84Q86 1279 195 1377T472 1476Q644 1476 743 1376T843 1103Q843 995 794 901T608 680Q495 585 495
404H376ZM360 70Q360 104 381 127T442 151Q480 151 502 128T525 70Q525 37 503 15T442 -8Q403 -8 382 14T360 70Z" />
<glyph unicode="@" horiz-adv-x="1870" d="M1754 513Q1749 366 1700 241T1565 48T1364 -20Q1267 -20 1206 31T1125 174Q1017 -20 827 -20Q687 -20 618 101T567 427Q582 590 641 717T796 916T1001 988Q1078 988 1136 967T1271 880L1220 310Q1210 194 1249 130T1376
66Q1499 66 1575 186T1661 513Q1680 918 1507 1122T983 1327Q772 1327 603 1222T335 923T225 478T291 35T528 -260T906 -363Q998 -363 1087 -341T1236 -284L1267 -364Q1210 -402 1108 -427T902 -453Q652 -453 472 -341T203 -17T125 478Q137 756 247 970T550 1302T987
1420Q1242 1420 1419 1314T1681 1002T1754 513ZM673 286Q684 186 729 132T848 77Q1033 77 1121 332L1166 848Q1099 897 1008 897Q897 897 816 809T696 565T673 286Z" />
<glyph unicode="A" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513Z" />
<glyph unicode="B" horiz-adv-x="1255" d="M184 0V1456H614Q848 1456 969 1360T1090 1075Q1090 962 1029 879T860 759Q987 731 1064 634T1142 410Q1142 217 1018 109T671 0H184ZM307 700V104H676Q834 104 926 184T1019 408Q1019 543 931 621T686 700H307ZM307
803H643Q797 806 881 875T966 1078Q966 1218 879 1284T614 1351H307V803Z" />
<glyph unicode="C" horiz-adv-x="1330" d="M1215 454Q1190 224 1051 102T679 -20Q517 -20 393 61T200 290T131 630V819Q131 1013 199 1163T394 1394T688 1476Q922 1476 1057 1350T1215 1000H1091Q1045 1371 688 1371Q490 1371 373 1223T255 814V636Q255 384 369
234T679 84Q872 84 970 176T1091 454H1215Z" />
<glyph unicode="D" horiz-adv-x="1341" d="M184 0V1456H591Q770 1456 912 1375T1133 1141T1213 795V661Q1213 466 1134 315T912 82T582 0H184ZM307 1351V104H583Q813 104 952 256T1091 669V797Q1091 1048 954 1199T593 1351H307Z" />
<glyph unicode="E" horiz-adv-x="1165" d="M988 698H307V104H1090V0H184V1456H1085V1351H307V802H988V698Z" />
<glyph unicode="F" horiz-adv-x="1152" d="M986 680H307V0H184V1456H1086V1351H307V785H986V680Z" />
<glyph unicode="G" horiz-adv-x="1400" d="M1235 173Q1171 82 1035 31T729 -20Q558 -20 425 62T219 294T145 638V822Q145 1125 298 1300T709 1476Q934 1476 1071 1362T1234 1046H1111Q1084 1206 981 1288T710 1371Q506 1371 387 1226T268 817V645Q268 479 324
352T486 154T729 84Q888 84 1002 134Q1076 167 1112 211V587H721V691H1235V173Z" />
<glyph unicode="H" horiz-adv-x="1449" d="M1263 0H1139V698H307V0H184V1456H307V802H1139V1456H1263V0Z" />
<glyph unicode="I" horiz-adv-x="545" d="M334 0H211V1456H334V0Z" />
<glyph unicode="J" horiz-adv-x="1127" d="M827 1456H951V433Q951 226 832 103T511 -20Q299 -20 185 91T71 401H194Q194 243 277 164T511 84Q650 84 737 176T827 426V1456Z" />
<glyph unicode="K" horiz-adv-x="1292" d="M512 723L307 521V0H184V1456H307V671L1053 1456H1208L598 808L1255 0H1105L512 723Z" />
<glyph unicode="L" horiz-adv-x="1079" d="M308 104H1027V0H184V1456H308V104Z" />
<glyph unicode="M" horiz-adv-x="1772" d="M347 1456L884 171L1423 1456H1587V0H1464V634L1474 1284L932 0H837L297 1279L307 638V0H184V1456H347Z" />
<glyph unicode="N" horiz-adv-x="1454" d="M1268 0H1145L308 1246V0H184V1456H308L1146 209V1456H1268V0Z" />
<glyph unicode="O" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q439 -20 282 162T125 655V805Q125 1004 195 1157T395 1393T692 1476T988 1395T1187 1166T1260 823V649ZM1137 807Q1137 1070 1018 1219T692 1368Q489 1368 369 1219T248
801V649Q248 390 368 239T694 87Q903 87 1020 236T1137 653V807Z" />
<glyph unicode="P" horiz-adv-x="1261" d="M307 593V0H184V1456H680Q907 1456 1038 1340T1170 1021Q1170 816 1044 705T677 593H307ZM307 697H680Q859 697 953 782T1047 1019Q1047 1170 954 1259T688 1351H307V697Z" />
<glyph unicode="Q" horiz-adv-x="1386" d="M1256 649Q1256 441 1183 287T973 53L1238 -178L1153 -254L856 3Q774 -20 689 -20Q523 -20 394 62T193 294T121 642V805Q121 1004 191 1157T391 1393T687 1476Q857 1476 986 1394T1185 1159T1256 806V649ZM1133 807Q1133
1070 1014 1219T687 1368Q485 1368 365 1219T244 801V649Q244 390 363 239T689 87Q897 87 1015 236T1133 652V807Z" />
<glyph unicode="R" horiz-adv-x="1300" d="M728 606H305V0H181V1456H654Q887 1456 1018 1343T1149 1027Q1149 887 1067 780T847 632L1211 13V0H1080L728 606ZM305 711H682Q837 711 931 799T1025 1027Q1025 1181 927 1266T652 1351H305V711Z" />
<glyph unicode="S" horiz-adv-x="1213" d="M1008 358Q1008 479 923 549T612 683T282 822Q134 928 134 1100Q134 1267 271 1371T623 1476Q768 1476 882 1420T1060 1264T1123 1041H999Q999 1190 897 1280T623 1371Q456 1371 357 1297T258 1102Q258 991 347 921T632
798T929 687T1081 549T1132 360Q1132 188 995 84T632 -20Q478 -20 350 35T155 189T88 416H211Q211 262 326 173T632 84Q802 84 905 159T1008 358Z" />
<glyph unicode="T" horiz-adv-x="1223" d="M1172 1351H673V0H550V1351H52V1456H1172V1351Z" />
<glyph unicode="U" horiz-adv-x="1346" d="M1187 1456V462Q1186 315 1122 206T942 39T674 -20Q444 -20 306 105T162 453V1456H284V471Q284 287 389 186T674 84T958 186T1063 470V1456H1187Z" />
<glyph unicode="V" horiz-adv-x="1263" d="M623 180L631 149L640 180L1098 1456H1233L691 0H573L31 1456H165L623 180Z" />
<glyph unicode="W" horiz-adv-x="1836" d="M453 393L498 167L553 383L869 1456H980L1292 383L1346 165L1394 393L1657 1456H1783L1410 0H1292L962 1139L925 1283L889 1139L551 0H433L61 1456H187L453 393Z" />
<glyph unicode="X" horiz-adv-x="1253" d="M627 840L1037 1456H1184L702 738L1199 0H1051L627 636L201 0H55L553 738L70 1456H217L627 840Z" />
<glyph unicode="Y" horiz-adv-x="1226" d="M611 662L1056 1456H1198L672 548V0H549V548L24 1456H170L611 662Z" />
<glyph unicode="Z" horiz-adv-x="1225" d="M239 104H1138V0H90V93L954 1351H116V1456H1106V1368L239 104Z" />
<glyph unicode="[" horiz-adv-x="491" d="M493 1562H283V-210H493V-312H163V1664H493V1562Z" />
<glyph unicode="\" horiz-adv-x="807" d="M48 1456H165L773 -125H656L48 1456Z" />
<glyph unicode="]" horiz-adv-x="491" d="M0 1664H331V-312H0V-210H211V1562H0V1664Z" />
<glyph unicode="^" horiz-adv-x="852" d="M421 1298L193 729H77L376 1456H466L764 729H648L421 1298Z" />
<glyph unicode="_" horiz-adv-x="884" d="M882 -101H1V0H882V-101Z" />
<glyph unicode="`" horiz-adv-x="585" d="M438 1245H329L103 1524H247L438 1245Z" />
<glyph unicode="a" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826 1012T934
759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86Z" />
<glyph unicode="b" horiz-adv-x="1135" d="M1027 530Q1027 277 915 129T614 -20Q388 -20 272 148L267 0H155V1536H274V925Q388 1102 612 1102Q804 1102 915 956T1027 548V530ZM907 551Q907 765 824 881T590 998Q475 998 395 942T274 776V288Q364 84 592 84Q740
84 823 201T907 551Z" />
<glyph unicode="c" horiz-adv-x="1055" d="M556 81Q681 81 765 151T857 334H972Q967 235 910 154T759 26T556 -20Q343 -20 219 128T94 526V562Q94 722 150 845T310 1035T555 1102Q733 1102 848 996T972 717H857Q849 844 766 922T555 1000Q393 1000 304 883T214
555V520Q214 313 303 197T556 81Z" />
<glyph unicode="d" horiz-adv-x="1138" d="M108 551Q108 803 220 952T526 1102Q745 1102 860 929V1536H979V0H867L862 144Q747 -20 524 -20Q337 -20 223 130T108 537V551ZM229 530Q229 323 312 204T546 84Q767 84 860 279V787Q767 998 548 998Q397 998 313 880T229 530Z" />
<glyph unicode="e" horiz-adv-x="1058" d="M575 -20Q437 -20 326 48T152 237T90 510V553Q90 709 150 834T319 1030T553 1102Q750 1102 865 968T981 600V533H209V510Q209 326 314 204T580 81Q676 81 749 116T883 228L958 171Q826 -20 575 -20ZM553 1000Q418 1000
326 901T213 635H862V648Q857 804 773 902T553 1000Z" />
<glyph unicode="f" horiz-adv-x="678" d="M242 0V984H63V1082H242V1213Q242 1379 326 1468T562 1557Q630 1557 689 1540L680 1440Q630 1452 571 1452Q472 1452 417 1391T362 1216V1082H620V984H362V0H242Z" />
<glyph unicode="g" horiz-adv-x="1136" d="M108 551Q108 805 220 953T526 1102Q747 1102 862 926L868 1082H980V22Q980 -187 863 -309T546 -431Q433 -431 331 -381T169 -246L236 -174Q363 -330 538 -330Q688 -330 772 -242T859 4V140Q744 -20 524 -20Q336 -20
222 130T108 535V551ZM229 530Q229 323 312 204T546 84Q767 84 859 282V785Q817 889 738 943T548 998Q397 998 313 880T229 530Z" />
<glyph unicode="h" horiz-adv-x="1124" d="M275 899Q334 996 426 1049T627 1102Q801 1102 886 1004T972 710V0H853V711Q852 856 792 927T598 998Q487 998 402 929T275 741V0H156V1536H275V899Z" />
<glyph unicode="i" horiz-adv-x="459" d="M290 0H170V1082H290V0ZM149 1395Q149 1429 171 1452T231 1476T291 1453T314 1395T292 1338T231 1315T171 1338T149 1395Z" />
<glyph unicode="j" horiz-adv-x="467" d="M285 1082V-129Q285 -279 213 -358T1 -437Q-53 -437 -104 -418L-102 -319Q-58 -332 -12 -332Q166 -332 166 -127V1082H285ZM226 1476Q265 1476 287 1453T309 1395T287 1338T226 1315Q188 1315 167 1338T145 1395T166 1452T226
1476Z" />
<glyph unicode="k" horiz-adv-x="1003" d="M413 545L276 413V0H156V1536H276V553L389 675L803 1082H954L495 626L994 0H851L413 545Z" />
<glyph unicode="l" horiz-adv-x="459" d="M290 0H170V1536H290V0Z" />
<glyph unicode="m" horiz-adv-x="1815" d="M265 1082L269 906Q329 1004 419 1053T619 1102Q875 1102 944 892Q1002 993 1099 1047T1313 1102Q1661 1102 1668 722V0H1548V713Q1547 858 1486 928T1285 998Q1156 996 1067 915T968 716V0H848V722Q847 861 783 929T584
998Q471 998 390 934T270 742V0H150V1082H265Z" />
<glyph unicode="n" horiz-adv-x="1125" d="M270 1082L274 897Q335 997 426 1049T627 1102Q801 1102 886 1004T972 710V0H853V711Q852 856 792 927T598 998Q487 998 402 929T275 741V0H156V1082H270Z" />
<glyph unicode="o" horiz-adv-x="1147" d="M90 557Q90 713 150 838T321 1032T572 1102Q788 1102 922 951T1056 549V524Q1056 367 996 242T825 48T574 -20Q359 -20 225 131T90 533V557ZM210 524Q210 330 310 206T574 81Q736 81 836 205T937 534V557Q937 681 891
784T762 943T572 1000Q412 1000 311 875T210 546V524Z" />
<glyph unicode="p" horiz-adv-x="1135" d="M1026 530Q1026 277 914 129T614 -20Q392 -20 274 136V-416H155V1082H266L272 929Q389 1102 611 1102Q805 1102 915 955T1026 547V530ZM906 551Q906 758 821 878T584 998Q474 998 395 945T274 791V272Q317 179 397 130T586
81Q737 81 821 201T906 551Z" />
<glyph unicode="q" horiz-adv-x="1142" d="M108 551Q108 805 220 953T528 1102Q747 1102 861 935L867 1082H979V-416H859V134Q741 -20 526 -20Q336 -20 222 130T108 535V551ZM229 530Q229 320 313 201T548 81Q763 81 859 268V798Q814 895 735 947T550 1000Q399
1000 314 881T229 530Z" />
<glyph unicode="r" horiz-adv-x="689" d="M656 980Q618 987 575 987Q463 987 386 925T275 743V0H156V1082H273L275 910Q370 1102 580 1102Q630 1102 659 1089L656 980Z" />
<glyph unicode="s" horiz-adv-x="1037" d="M804 275Q804 364 733 418T517 502T294 572T176 669T137 807Q137 935 244 1018T518 1102Q699 1102 808 1013T918 779H798Q798 874 719 937T518 1000Q400 1000 329 948T257 811Q257 730 316 686T533 604T769 525T886 424T924
281Q924 144 814 62T525 -20Q336 -20 219 71T101 303H221Q228 198 309 140T525 81Q650 81 727 136T804 275Z" />
<glyph unicode="t" horiz-adv-x="658" d="M342 1359V1082H566V984H342V263Q342 173 374 129T483 85Q513 85 580 95L585 -3Q538 -20 457 -20Q334 -20 278 51T222 262V984H23V1082H222V1359H342Z" />
<glyph unicode="u" horiz-adv-x="1125" d="M852 137Q744 -20 507 -20Q334 -20 244 80T152 378V1082H271V393Q271 84 521 84Q781 84 850 299V1082H970V0H854L852 137Z" />
<glyph unicode="v" horiz-adv-x="985" d="M493 165L822 1082H945L541 0H444L38 1082H161L493 165Z" />
<glyph unicode="w" horiz-adv-x="1544" d="M415 249L433 156L457 254L717 1082H819L1076 261L1104 147L1127 252L1349 1082H1473L1158 0H1056L778 858L765 917L752 857L479 0H377L63 1082H186L415 249Z" />
<glyph unicode="x" horiz-adv-x="996" d="M496 643L788 1082H930L563 551L946 0H805L497 458L189 0H48L430 551L63 1082H204L496 643Z" />
<glyph unicode="y" horiz-adv-x="973" d="M499 172L815 1082H944L482 -184L458 -240Q369 -437 183 -437Q140 -437 91 -423L90 -324L152 -330Q240 -330 294 -287T387 -137L440 9L32 1082H163L499 172Z" />
<glyph unicode="z" horiz-adv-x="996" d="M235 101H938V0H87V88L743 979H107V1082H894V993L235 101Z" />
<glyph unicode="{" horiz-adv-x="676" d="M637 -404Q469 -354 384 -241T299 59V280Q299 543 68 543V647Q299 647 299 908V1137Q300 1320 384 1433T637 1597L663 1518Q419 1440 419 1127V914Q419 668 235 595Q419 518 419 277V49Q423 -243 666 -324L637 -404Z" />
<glyph unicode="|" horiz-adv-x="452" d="M279 -270H178V1456H279V-270Z" />
<glyph unicode="}" horiz-adv-x="676" d="M9 -324Q252 -243 256 49V273Q256 526 449 594Q256 662 256 913V1126Q256 1442 12 1518L38 1597Q209 1546 292 1432T376 1131V908Q376 647 607 647V543Q376 543 376 280V59Q376 -128 291 -241T38 -404L9 -324Z" />
<glyph unicode="~" horiz-adv-x="1402" d="M1254 764Q1254 615 1171 519T958 423Q886 423 824 450T670 558T535 659T441 680Q352 680 303 621T253 450L145 449Q145 598 226 692T441 787Q515 787 581 756T740 643Q807 580 855 555T958 529Q1046 529 1098 592T1150
764H1254Z" />
<glyph unicode="&#xa0;" horiz-adv-x="498" />
<glyph unicode="&#xa1;" horiz-adv-x="452" d="M174 690H285L292 -359H168L174 690ZM305 1022Q305 988 283 965T223 942T163 965T140 1022T162 1079T223 1102T283 1079T305 1022Z" />
<glyph unicode="&#xa2;" horiz-adv-x="1115" d="M581 81Q704 81 788 150T882 334H997Q989 195 887 97T636 -17V-245H516V-16Q331 7 225 150T119 526V562Q119 784 224 929T516 1098V1318H636V1099Q791 1083 891 978T997 717H882Q874 844 791 922T580 1000Q418 1000
329 883T239 555V520Q239 313 328 197T581 81Z" />
<glyph unicode="&#xa3;" horiz-adv-x="1170" d="M404 645L413 368Q415 194 349 104H1094V0H97V104H195Q246 117 272 211Q292 285 290 367L281 645H93V749H277L268 1039Q268 1239 378 1357T674 1476Q856 1476 961 1371T1067 1088H944Q944 1223 869 1297T665 1371Q540
1371 466 1283T392 1039L401 749H745V645H404Z" />
<glyph unicode="&#xa4;" horiz-adv-x="1481" d="M1131 133Q1053 61 953 21T740 -20Q514 -20 349 132L194 -26L109 60L268 221Q144 389 144 608Q144 835 277 1006L109 1177L194 1264L361 1094Q526 1234 740 1234T1119 1092L1289 1265L1375 1177L1204 1002Q1334
832 1334 608Q1334 393 1212 224L1375 60L1289 -27L1131 133ZM257 608Q257 470 321 350T499 161T740 91Q869 91 981 161T1157 350T1221 608Q1221 747 1156 866T979 1054T740 1122T500 1054T323 867T257 608Z" />
<glyph unicode="&#xa5;" horiz-adv-x="1223" d="M607 734L1028 1456H1171L718 705H1085V616H667V412H1085V324H667V0H544V324H130V412H544V616H130V705H496L44 1456H187L607 734Z" />
<glyph unicode="&#xa6;" horiz-adv-x="444" d="M159 -270V501H279V-270H159ZM279 698H159V1456H279V698Z" />
<glyph unicode="&#xa7;" horiz-adv-x="1239" d="M1119 431Q1119 331 1058 262T887 159Q978 111 1026 41T1075 -139Q1075 -303 949 -399T606 -495Q497 -495 401 -467T236 -382Q102 -268 102 -64L222 -62Q222 -218 325 -305T606 -393Q766 -393 860 -324T954 -141Q954
-64 920 -17T805 69T548 156T284 255T153 378T108 551Q108 651 166 721T331 825Q245 872 199 942T153 1120Q153 1281 282 1378T624 1476Q848 1476 972 1363T1097 1045H977Q977 1191 881 1282T624 1374Q459 1374 366 1306T273 1122Q273 1043 304 996T411 911T646
828Q842 777 936 726T1075 603T1119 431ZM454 771Q346 758 287 700T228 553Q228 470 263 422T379 336T663 242L755 214Q867 227 933 284T999 428Q999 526 932 585T692 700L454 771Z" />
<glyph unicode="&#xa8;" horiz-adv-x="881" d="M143 1396Q143 1430 164 1453T225 1477Q263 1477 285 1454T308 1396Q308 1363 286 1340T225 1317Q186 1317 165 1340T143 1396ZM580 1395Q580 1429 602 1452T662 1476Q701 1476 723 1453T745 1395Q745 1362 723 1339T662
1316Q624 1316 602 1339T580 1395Z" />
<glyph unicode="&#xa9;" horiz-adv-x="1637" d="M1121 607Q1121 455 1039 374T807 293T566 399T474 686V776Q474 950 566 1056T807 1163T1039 1083T1122 850H1023Q1023 1074 807 1074Q701 1074 637 993T573 771V680Q573 546 636 465T807 383Q913 383 967 436T1022
607H1121ZM192 729Q192 553 273 399T502 155T817 65Q984 65 1129 154T1357 396T1441 729Q1441 907 1358 1059T1130 1300T817 1389Q646 1389 499 1298T272 1055T192 729ZM107 729Q107 931 200 1104T459 1376T817 1476T1174 1377T1432 1104T1526 729Q1526 532 1436
360T1181 84T817 -21Q620 -21 455 82T198 358T107 729Z" />
<glyph unicode="&#xaa;" horiz-adv-x="906" d="M649 705Q634 748 628 799Q541 691 406 691Q289 691 223 749T157 908Q157 1018 240 1079T486 1140H625V1201Q625 1286 585 1333T464 1380Q374 1380 323 1345T271 1237L164 1243Q164 1345 247 1410T464 1476Q588 1476
661 1405T734 1199V884Q734 792 760 705H649ZM426 786Q479 786 536 816T625 890V1058H496Q266 1058 266 912Q266 786 426 786Z" />
<glyph unicode="&#xab;" horiz-adv-x="933" d="M247 792L523 404H418L123 783V802L418 1181H523L247 792ZM556 536L832 148H727L432 527V546L727 925H832L556 536Z" />
<glyph unicode="&#xac;" horiz-adv-x="1117" d="M936 386H816V670H124V776H936V386Z" />
<glyph unicode="&#xad;" horiz-adv-x="586" d="M528 592H49V693H528V592Z" />
<glyph unicode="&#xae;" horiz-adv-x="1642" d="M102 729Q102 931 195 1104T454 1376T812 1476T1169 1377T1428 1104T1522 729Q1522 530 1431 358T1175 83T812 -21T450 82T193 358T102 729ZM187 729Q187 550 270 396T499 154T812 65T1125 153T1353 396T1436 729Q1436
905 1355 1057T1129 1299T812 1389Q644 1389 499 1301T270 1060T187 729ZM650 666V321H552V1160H810Q957 1160 1036 1099T1115 912Q1115 779 974 715Q1046 689 1074 635T1102 504T1106 394T1119 337V321H1017Q1003 357 1003 503Q1003 592 966 629T838 666H650ZM650
757H831Q912 757 964 799T1017 910Q1017 995 974 1031T824 1070H650V757Z" />
<glyph unicode="&#xaf;" horiz-adv-x="874" d="M776 1359H106V1456H776V1359Z" />
<glyph unicode="&#xb0;" horiz-adv-x="774" d="M630 1226Q630 1122 559 1051T388 980Q287 980 215 1051T143 1226T216 1402T388 1476T558 1403T630 1226ZM233 1226Q233 1159 277 1115T388 1071T497 1115T540 1226Q540 1295 497 1340T388 1385Q323 1385 278 1340T233
1226Z" />
<glyph unicode="&#xb1;" horiz-adv-x="1085" d="M609 829H1000V727H609V289H498V727H84V829H498V1267H609V829ZM963 0H128V101H963V0Z" />
<glyph unicode="&#xb2;" horiz-adv-x="740" d="M667 665H96V740L416 1054Q522 1164 522 1237Q522 1300 482 1338T362 1377Q275 1377 228 1333T181 1215H76Q76 1323 155 1394T360 1465T557 1403T628 1239Q628 1138 510 1016L455 961L229 752H667V665Z" />
<glyph unicode="&#xb3;" horiz-adv-x="740" d="M267 1107H353Q434 1109 481 1145T529 1241Q529 1303 486 1340T362 1377Q286 1377 238 1340T190 1245H85Q85 1341 163 1403T361 1465Q489 1465 562 1405T635 1243Q635 1187 597 1140T489 1069Q651 1027 651 880Q651
778 572 716T363 654Q234 654 153 717T71 884H177Q177 822 229 782T366 741Q453 741 499 779T546 883Q546 1025 340 1025H267V1107Z" />
<glyph unicode="&#xb4;" horiz-adv-x="576" d="M315 1524H460L229 1245H124L315 1524Z" />
<glyph unicode="&#xb5;" horiz-adv-x="1140" d="M281 1082V446Q281 266 344 174T544 81Q676 81 753 138T859 312V1082H979V0H870L863 154Q765 -20 552 -20Q368 -20 281 105V-416H162V1082H281Z" />
<glyph unicode="&#xb6;" horiz-adv-x="973" d="M681 0V520H573Q423 520 312 578T142 742T83 988Q83 1201 216 1328T577 1456H801V0H681Z" />
<glyph unicode="&#xb7;" horiz-adv-x="503" d="M163 717Q163 752 185 776T247 800T310 776T333 717T310 659T247 635T185 658T163 717Z" />
<glyph unicode="&#xb8;" horiz-adv-x="498" d="M246 0L234 -64Q399 -85 399 -235Q399 -327 320 -381T105 -435L98 -357Q187 -357 243 -325T300 -237Q300 -179 257 -157T124 -127L153 0H246Z" />
<glyph unicode="&#xb9;" horiz-adv-x="740" d="M464 669H358V1332L126 1262V1352L450 1459H464V669Z" />
<glyph unicode="&#xba;" horiz-adv-x="922" d="M135 1132Q135 1285 223 1380T458 1476Q605 1476 693 1381T782 1127V1033Q782 880 694 785T460 690Q313 690 224 784T135 1038V1132ZM243 1033Q243 919 299 852T460 785Q559 785 616 851T674 1037V1132Q674 1247
616 1313T458 1380T301 1312T243 1127V1033Z" />
<glyph unicode="&#xbb;" horiz-adv-x="928" d="M221 944L516 560V541L221 162H115L391 550L115 944H221ZM540 944L835 560V541L540 162H434L710 550L434 944H540Z" />
<glyph unicode="&#xbc;" horiz-adv-x="1484" d="M453 664H347V1327L115 1257V1347L439 1454H453V664ZM414 129L340 177L1051 1315L1125 1267L414 129ZM1272 275H1399V187H1272V0H1167V187H768L764 253L1161 789H1272V275ZM878 275H1167V659L1136 609L878 275Z" />
<glyph unicode="&#xbd;" horiz-adv-x="1548" d="M370 129L296 177L1007 1315L1081 1267L370 129ZM438 664H332V1327L100 1257V1347L424 1454H438V664ZM1436 0H865V75L1185 389Q1291 499 1291 572Q1291 635 1251 673T1131 712Q1044 712 997 668T950 550H845Q845
658 924 729T1129 800T1326 738T1397 574Q1397 473 1279 351L1224 296L998 87H1436V0Z" />
<glyph unicode="&#xbe;" horiz-adv-x="1590" d="M558 129L484 177L1195 1315L1269 1267L558 129ZM1387 275H1514V187H1387V0H1282V187H883L879 253L1276 789H1387V275ZM993 275H1282V659L1251 609L993 275ZM314 1107H400Q481 1109 528 1145T576 1241Q576 1303
533 1340T409 1377Q333 1377 285 1340T237 1245H132Q132 1341 210 1403T408 1465Q536 1465 609 1405T682 1243Q682 1187 644 1140T536 1069Q698 1027 698 880Q698 778 619 716T410 654Q281 654 200 717T118 884H224Q224 822 276 782T413 741Q500 741 546 779T593
883Q593 1025 387 1025H314V1107Z" />
<glyph unicode="&#xbf;" horiz-adv-x="940" d="M551 687Q549 564 524 505T405 352T288 228Q207 123 207 -8Q207 -137 274 -207T469 -277Q588 -277 659 -207T732 -20H852Q850 -186 745 -284T469 -383Q291 -383 190 -283T88 -10Q88 101 141 202T337 438Q422 509
429 618L431 687H551ZM567 1022Q567 988 545 965T485 941T425 964T402 1022Q402 1055 424 1078T485 1101T545 1078T567 1022Z" />
<glyph unicode="&#xc0;" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513ZM716 1560H607L381 1839H525L716 1560Z" />
<glyph unicode="&#xc1;" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513ZM762 1839H907L676 1560H571L762 1839Z" />
<glyph unicode="&#xc2;" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513ZM921 1583V1573H810L642 1756L475 1573H366V1586L604 1841H680L921 1583Z" />
<glyph unicode="&#xc3;" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513ZM983 1809Q983 1713 927 1655T788 1596Q712 1596 640 1651T510 1706Q463 1706 432 1675T400 1588L310 1591Q310 1683 364
1743T505 1803Q553 1803 587 1786T651 1748T711 1710T783 1693Q829 1693 861 1726T894 1815L983 1809Z" />
<glyph unicode="&#xc4;" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513ZM349 1711Q349 1745 370 1768T431 1792Q469 1792 491 1769T514 1711Q514 1678 492 1655T431 1632Q392 1632 371 1655T349
1711ZM786 1710Q786 1744 808 1767T868 1791Q907 1791 929 1768T951 1710Q951 1677 929 1654T868 1631Q830 1631 808 1654T786 1710Z" />
<glyph unicode="&#xc5;" horiz-adv-x="1279" d="M970 408H309L159 0H30L581 1456H698L1249 0H1121L970 408ZM347 513H931L639 1306L347 513ZM450 1715Q450 1795 506 1850T643 1905Q722 1905 779 1850T836 1715Q836 1636 781 1582T643 1528T505 1582T450 1715ZM527
1715Q527 1665 560 1632T643 1599Q692 1599 726 1631T760 1715Q760 1768 725 1801T643 1834Q594 1834 561 1800T527 1715Z" />
<glyph unicode="&#xc6;" horiz-adv-x="1865" d="M1823 0H1006L989 389H393L163 0H17L898 1456H1762V1354H1068L1091 809H1680V707H1095L1121 101H1823V0ZM460 502H985L950 1331L460 502Z" />
<glyph unicode="&#xc7;" horiz-adv-x="1330" d="M1215 454Q1190 224 1051 102T679 -20Q517 -20 393 61T200 290T131 630V819Q131 1013 199 1163T394 1394T688 1476Q922 1476 1057 1350T1215 1000H1091Q1045 1371 688 1371Q490 1371 373 1223T255 814V636Q255 384
369 234T679 84Q872 84 970 176T1091 454H1215ZM728 -9L716 -73Q881 -94 881 -244Q881 -336 802 -390T587 -444L580 -366Q669 -366 725 -334T782 -246Q782 -188 739 -166T606 -136L635 -9H728Z" />
<glyph unicode="&#xc8;" horiz-adv-x="1165" d="M988 698H307V104H1090V0H184V1456H1085V1351H307V802H988V698ZM693 1566H584L358 1845H502L693 1566Z" />
<glyph unicode="&#xc9;" horiz-adv-x="1165" d="M988 698H307V104H1090V0H184V1456H1085V1351H307V802H988V698ZM739 1845H884L653 1566H548L739 1845Z" />
<glyph unicode="&#xca;" horiz-adv-x="1165" d="M988 698H307V104H1090V0H184V1456H1085V1351H307V802H988V698ZM898 1589V1579H787L619 1762L452 1579H343V1592L581 1847H657L898 1589Z" />
<glyph unicode="&#xcb;" horiz-adv-x="1165" d="M988 698H307V104H1090V0H184V1456H1085V1351H307V802H988V698ZM326 1717Q326 1751 347 1774T408 1798Q446 1798 468 1775T491 1717Q491 1684 469 1661T408 1638Q369 1638 348 1661T326 1717ZM763 1716Q763 1750
785 1773T845 1797Q884 1797 906 1774T928 1716Q928 1683 906 1660T845 1637Q807 1637 785 1660T763 1716Z" />
<glyph unicode="&#xcc;" horiz-adv-x="545" d="M334 0H211V1456H334V0ZM348 1566H239L13 1845H157L348 1566Z" />
<glyph unicode="&#xcd;" horiz-adv-x="545" d="M334 0H211V1456H334V0ZM393 1845H538L307 1566H202L393 1845Z" />
<glyph unicode="&#xce;" horiz-adv-x="545" d="M334 0H211V1456H334V0ZM553 1589V1579H442L274 1762L107 1579H-2V1592L236 1847H312L553 1589Z" />
<glyph unicode="&#xcf;" horiz-adv-x="545" d="M334 0H211V1456H334V0ZM-19 1717Q-19 1751 2 1774T63 1798Q101 1798 123 1775T146 1717Q146 1684 124 1661T63 1638Q24 1638 3 1661T-19 1717ZM418 1716Q418 1750 440 1773T500 1797Q539 1797 561 1774T583 1716Q583
1683 561 1660T500 1637Q462 1637 440 1660T418 1716Z" />
<glyph unicode="&#xd0;" horiz-adv-x="1371" d="M214 0V689H33V791H214V1456H621Q800 1456 942 1375T1163 1141T1243 795V661Q1243 466 1164 315T942 82T612 0H214ZM645 689H337V104H608Q843 104 982 256T1121 669V797Q1121 1048 984 1199T623 1351H337V791H645V689Z" />
<glyph unicode="&#xd1;" horiz-adv-x="1454" d="M1268 0H1145L308 1246V0H184V1456H308L1146 209V1456H1268V0ZM1067 1809Q1067 1713 1011 1655T872 1596Q796 1596 724 1651T594 1706Q547 1706 516 1675T484 1588L394 1591Q394 1683 448 1743T589 1803Q637 1803
671 1786T735 1748T795 1710T867 1693Q913 1693 945 1726T978 1815L1067 1809Z" />
<glyph unicode="&#xd2;" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q439 -20 282 162T125 655V805Q125 1004 195 1157T395 1393T692 1476T988 1395T1187 1166T1260 823V649ZM1137 807Q1137 1070 1018 1219T692 1368Q489 1368 369 1219T248
801V649Q248 390 368 239T694 87Q903 87 1020 236T1137 653V807ZM765 1572H656L430 1851H574L765 1572Z" />
<glyph unicode="&#xd3;" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q439 -20 282 162T125 655V805Q125 1004 195 1157T395 1393T692 1476T988 1395T1187 1166T1260 823V649ZM1137 807Q1137 1070 1018 1219T692 1368Q489 1368 369 1219T248
801V649Q248 390 368 239T694 87Q903 87 1020 236T1137 653V807ZM811 1851H956L725 1572H620L811 1851Z" />
<glyph unicode="&#xd4;" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q439 -20 282 162T125 655V805Q125 1004 195 1157T395 1393T692 1476T988 1395T1187 1166T1260 823V649ZM1137 807Q1137 1070 1018 1219T692 1368Q489 1368 369 1219T248
801V649Q248 390 368 239T694 87Q903 87 1020 236T1137 653V807ZM970 1595V1585H859L691 1768L524 1585H415V1598L653 1853H729L970 1595Z" />
<glyph unicode="&#xd5;" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q439 -20 282 162T125 655V805Q125 1004 195 1157T395 1393T692 1476T988 1395T1187 1166T1260 823V649ZM1137 807Q1137 1070 1018 1219T692 1368Q489 1368 369 1219T248
801V649Q248 390 368 239T694 87Q903 87 1020 236T1137 653V807ZM1032 1821Q1032 1725 976 1667T837 1608Q761 1608 689 1663T559 1718Q512 1718 481 1687T449 1600L359 1603Q359 1695 413 1755T554 1815Q602 1815 636 1798T700 1760T760 1722T832 1705Q878 1705
910 1738T943 1827L1032 1821Z" />
<glyph unicode="&#xd6;" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q439 -20 282 162T125 655V805Q125 1004 195 1157T395 1393T692 1476T988 1395T1187 1166T1260 823V649ZM1137 807Q1137 1070 1018 1219T692 1368Q489 1368 369 1219T248
801V649Q248 390 368 239T694 87Q903 87 1020 236T1137 653V807ZM398 1723Q398 1757 419 1780T480 1804Q518 1804 540 1781T563 1723Q563 1690 541 1667T480 1644Q441 1644 420 1667T398 1723ZM835 1722Q835 1756 857 1779T917 1803Q956 1803 978 1780T1000 1722Q1000
1689 978 1666T917 1643Q879 1643 857 1666T835 1722Z" />
<glyph unicode="&#xd7;" horiz-adv-x="1072" d="M93 179L451 544L108 894L187 974L529 624L872 974L951 894L608 544L966 179L887 100L529 464L172 100L93 179Z" />
<glyph unicode="&#xd8;" horiz-adv-x="1386" d="M1260 649Q1260 448 1191 296T992 62T694 -20Q508 -20 375 77L274 -83H170L307 134Q125 318 125 658V805Q125 1004 195 1157T395 1393T692 1476Q916 1476 1064 1336L1171 1505H1274L1125 1268Q1259 1088 1260 807V649ZM248
649Q248 388 370 235L1002 1237Q883 1368 692 1368Q489 1368 369 1219T248 801V649ZM1137 807Q1137 1018 1057 1160L434 171Q541 87 694 87Q903 87 1020 236T1137 653V807Z" />
<glyph unicode="&#xd9;" horiz-adv-x="1346" d="M1187 1456V462Q1186 315 1122 206T942 39T674 -20Q444 -20 306 105T162 453V1456H284V471Q284 287 389 186T674 84T958 186T1063 470V1456H1187ZM756 1560H647L421 1839H565L756 1560Z" />
<glyph unicode="&#xda;" horiz-adv-x="1346" d="M1187 1456V462Q1186 315 1122 206T942 39T674 -20Q444 -20 306 105T162 453V1456H284V471Q284 287 389 186T674 84T958 186T1063 470V1456H1187ZM802 1839H947L716 1560H611L802 1839Z" />
<glyph unicode="&#xdb;" horiz-adv-x="1346" d="M1187 1456V462Q1186 315 1122 206T942 39T674 -20Q444 -20 306 105T162 453V1456H284V471Q284 287 389 186T674 84T958 186T1063 470V1456H1187ZM961 1583V1573H850L682 1756L515 1573H406V1586L644 1841H720L961 1583Z" />
<glyph unicode="&#xdc;" horiz-adv-x="1346" d="M1187 1456V462Q1186 315 1122 206T942 39T674 -20Q444 -20 306 105T162 453V1456H284V471Q284 287 389 186T674 84T958 186T1063 470V1456H1187ZM389 1711Q389 1745 410 1768T471 1792Q509 1792 531 1769T554 1711Q554
1678 532 1655T471 1632Q432 1632 411 1655T389 1711ZM826 1710Q826 1744 848 1767T908 1791Q947 1791 969 1768T991 1710Q991 1677 969 1654T908 1631Q870 1631 848 1654T826 1710Z" />
<glyph unicode="&#xdd;" horiz-adv-x="1226" d="M611 662L1056 1456H1198L672 548V0H549V548L24 1456H170L611 662ZM732 1833H877L646 1554H541L732 1833Z" />
<glyph unicode="&#xde;" horiz-adv-x="1214" d="M303 1456V1152H628Q771 1152 877 1101T1039 956T1096 738Q1096 553 974 441T641 324H303V0H183V1456H303ZM303 1051V425H627Q784 425 880 510T976 736T885 961T642 1051H303Z" />
<glyph unicode="&#xdf;" horiz-adv-x="1200" d="M271 0H151V1127Q151 1327 246 1435T512 1544Q665 1544 760 1460T856 1237Q856 1179 843 1131T794 1019T746 913T733 824Q733 768 774 716T911 593T1051 454T1096 306Q1096 160 990 70T720 -20Q636 -20 545 4T414
60L448 161Q485 132 562 106T706 80Q828 80 902 144T976 306Q976 367 932 423T797 547T659 681T613 826Q613 922 676 1034T739 1230Q739 1323 676 1382T522 1442Q275 1442 271 1136V0Z" />
<glyph unicode="&#xe0;" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826
1012T934 759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86ZM653 1245H544L318 1524H462L653 1245Z" />
<glyph unicode="&#xe1;" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826
1012T934 759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86ZM699 1524H844L613 1245H508L699 1524Z" />
<glyph unicode="&#xe2;" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826
1012T934 759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86ZM858 1268V1258H747L579 1441L412 1258H303V1271L541 1526H617L858 1268Z" />
<glyph unicode="&#xe3;" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826
1012T934 759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86ZM920 1494Q920 1398 864 1340T725 1281Q649 1281 577 1336T447 1391Q400 1391 369 1360T337 1273L247 1276Q247 1368 301 1428T442
1488Q490 1488 524 1471T588 1433T648 1395T720 1378Q766 1378 798 1411T831 1500L920 1494Z" />
<glyph unicode="&#xe4;" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826
1012T934 759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86ZM286 1396Q286 1430 307 1453T368 1477Q406 1477 428 1454T451 1396Q451 1363 429 1340T368 1317Q329 1317 308 1340T286 1396ZM723
1395Q723 1429 745 1452T805 1476Q844 1476 866 1453T888 1395Q888 1362 866 1339T805 1316Q767 1316 745 1339T723 1395Z" />
<glyph unicode="&#xe5;" horiz-adv-x="1097" d="M839 0Q821 51 816 151Q753 69 656 25T449 -20Q293 -20 197 67T100 287Q100 445 231 537T598 629H815V752Q815 868 744 934T535 1001Q410 1001 328 937T246 783L126 784Q126 913 246 1007T541 1102Q722 1102 826
1012T934 759V247Q934 90 967 12V0H839ZM463 86Q583 86 677 144T815 299V537H601Q422 535 321 472T220 297Q220 206 287 146T463 86ZM387 1400Q387 1480 443 1535T580 1590Q659 1590 716 1535T773 1400Q773 1321 718 1267T580 1213T442 1267T387 1400ZM464 1400Q464
1350 497 1317T580 1284Q629 1284 663 1316T697 1400Q697 1453 662 1486T580 1519Q531 1519 498 1485T464 1400Z" />
<glyph unicode="&#xe6;" horiz-adv-x="1732" d="M1265 -20Q1126 -20 1027 34T867 186Q807 88 693 34T440 -20Q271 -20 178 64T85 293Q85 450 195 539T511 632H781V720Q781 852 718 926T528 1000Q398 1000 315 935T232 765L113 778Q113 922 229 1012T528 1102Q653
1102 741 1049T870 889Q930 989 1024 1045T1235 1102Q1431 1102 1543 982T1658 644V538H901V509Q901 308 997 195T1265 81Q1450 81 1589 199L1636 112Q1491 -20 1265 -20ZM458 80Q549 80 642 126T781 236V536H525Q388 536 302 475T207 309L206 289Q206 192 271
136T458 80ZM1235 1000Q1103 1000 1013 902T904 636H1539V667Q1539 821 1459 910T1235 1000Z" />
<glyph unicode="&#xe7;" horiz-adv-x="1055" d="M556 81Q681 81 765 151T857 334H972Q967 235 910 154T759 26T556 -20Q343 -20 219 128T94 526V562Q94 722 150 845T310 1035T555 1102Q733 1102 848 996T972 717H857Q849 844 766 922T555 1000Q393 1000 304 883T214
555V520Q214 313 303 197T556 81ZM589 -9L577 -73Q742 -94 742 -244Q742 -336 663 -390T448 -444L441 -366Q530 -366 586 -334T643 -246Q643 -188 600 -166T467 -136L496 -9H589Z" />
<glyph unicode="&#xe8;" horiz-adv-x="1058" d="M575 -20Q437 -20 326 48T152 237T90 510V553Q90 709 150 834T319 1030T553 1102Q750 1102 865 968T981 600V533H209V510Q209 326 314 204T580 81Q676 81 749 116T883 228L958 171Q826 -20 575 -20ZM553 1000Q418
1000 326 901T213 635H862V648Q857 804 773 902T553 1000ZM640 1245H531L305 1524H449L640 1245Z" />
<glyph unicode="&#xe9;" horiz-adv-x="1058" d="M575 -20Q437 -20 326 48T152 237T90 510V553Q90 709 150 834T319 1030T553 1102Q750 1102 865 968T981 600V533H209V510Q209 326 314 204T580 81Q676 81 749 116T883 228L958 171Q826 -20 575 -20ZM553 1000Q418
1000 326 901T213 635H862V648Q857 804 773 902T553 1000ZM686 1524H831L600 1245H495L686 1524Z" />
<glyph unicode="&#xea;" horiz-adv-x="1058" d="M575 -20Q437 -20 326 48T152 237T90 510V553Q90 709 150 834T319 1030T553 1102Q750 1102 865 968T981 600V533H209V510Q209 326 314 204T580 81Q676 81 749 116T883 228L958 171Q826 -20 575 -20ZM553 1000Q418
1000 326 901T213 635H862V648Q857 804 773 902T553 1000ZM845 1268V1258H734L566 1441L399 1258H290V1271L528 1526H604L845 1268Z" />
<glyph unicode="&#xeb;" horiz-adv-x="1058" d="M575 -20Q437 -20 326 48T152 237T90 510V553Q90 709 150 834T319 1030T553 1102Q750 1102 865 968T981 600V533H209V510Q209 326 314 204T580 81Q676 81 749 116T883 228L958 171Q826 -20 575 -20ZM553 1000Q418
1000 326 901T213 635H862V648Q857 804 773 902T553 1000ZM273 1396Q273 1430 294 1453T355 1477Q393 1477 415 1454T438 1396Q438 1363 416 1340T355 1317Q316 1317 295 1340T273 1396ZM710 1395Q710 1429 732 1452T792 1476Q831 1476 853 1453T875 1395Q875 1362
853 1339T792 1316Q754 1316 732 1339T710 1395Z" />
<glyph unicode="&#xec;" horiz-adv-x="456" d="M288 0H168V1082H288V0ZM305 1233H196L-30 1512H114L305 1233Z" />
<glyph unicode="&#xed;" horiz-adv-x="456" d="M288 0H168V1082H288V0ZM350 1768H495L264 1489H159L350 1768Z" />
<glyph unicode="&#xee;" horiz-adv-x="456" d="M288 0H168V1082H288V0ZM510 1256V1246H399L231 1429L64 1246H-45V1259L193 1514H269L510 1256Z" />
<glyph unicode="&#xef;" horiz-adv-x="456" d="M288 0H168V1082H288V0ZM-62 1384Q-62 1418 -41 1441T20 1465Q58 1465 80 1442T103 1384Q103 1351 81 1328T20 1305Q-19 1305 -40 1328T-62 1384ZM375 1383Q375 1417 397 1440T457 1464Q496 1464 518 1441T540 1383Q540
1350 518 1327T457 1304Q419 1304 397 1327T375 1383Z" />
<glyph unicode="&#xf0;" horiz-adv-x="1191" d="M811 1303Q1049 1053 1055 645V535Q1055 376 999 249T842 51T615 -20Q485 -20 379 41T211 216T149 466Q149 695 268 830T587 965Q687 965 773 927T919 821Q877 1072 709 1240L484 1101L433 1174L639 1302Q502 1408
296 1475L335 1578Q577 1506 744 1366L938 1487L989 1414L811 1303ZM935 625L933 682Q894 765 807 813T609 861Q448 861 359 756T269 466Q269 363 314 274T438 134T619 83Q760 83 847 207T935 543V625Z" />
<glyph unicode="&#xf1;" horiz-adv-x="1125" d="M270 1082L274 897Q335 997 426 1049T627 1102Q801 1102 886 1004T972 710V0H853V711Q852 856 792 927T598 998Q487 998 402 929T275 741V0H156V1082H270ZM916 1493Q916 1397 860 1339T721 1280Q645 1280 573 1335T443
1390Q396 1390 365 1359T333 1272L243 1275Q243 1367 297 1427T438 1487Q486 1487 520 1470T584 1432T644 1394T716 1377Q762 1377 794 1410T827 1499L916 1493Z" />
<glyph unicode="&#xf2;" horiz-adv-x="1147" d="M90 557Q90 713 150 838T321 1032T572 1102Q788 1102 922 951T1056 549V524Q1056 367 996 242T825 48T574 -20Q359 -20 225 131T90 533V557ZM210 524Q210 330 310 206T574 81Q736 81 836 205T937 534V557Q937 681
891 784T762 943T572 1000Q412 1000 311 875T210 546V524ZM645 1245H536L310 1524H454L645 1245Z" />
<glyph unicode="&#xf3;" horiz-adv-x="1147" d="M90 557Q90 713 150 838T321 1032T572 1102Q788 1102 922 951T1056 549V524Q1056 367 996 242T825 48T574 -20Q359 -20 225 131T90 533V557ZM210 524Q210 330 310 206T574 81Q736 81 836 205T937 534V557Q937 681
891 784T762 943T572 1000Q412 1000 311 875T210 546V524ZM691 1524H836L605 1245H500L691 1524Z" />
<glyph unicode="&#xf4;" horiz-adv-x="1147" d="M90 557Q90 713 150 838T321 1032T572 1102Q788 1102 922 951T1056 549V524Q1056 367 996 242T825 48T574 -20Q359 -20 225 131T90 533V557ZM210 524Q210 330 310 206T574 81Q736 81 836 205T937 534V557Q937 681
891 784T762 943T572 1000Q412 1000 311 875T210 546V524ZM850 1268V1258H739L571 1441L404 1258H295V1271L533 1526H609L850 1268Z" />
<glyph unicode="&#xf5;" horiz-adv-x="1147" d="M90 557Q90 713 150 838T321 1032T572 1102Q788 1102 922 951T1056 549V524Q1056 367 996 242T825 48T574 -20Q359 -20 225 131T90 533V557ZM210 524Q210 330 310 206T574 81Q736 81 836 205T937 534V557Q937 681
891 784T762 943T572 1000Q412 1000 311 875T210 546V524ZM912 1493Q912 1397 856 1339T717 1280Q641 1280 569 1335T439 1390Q392 1390 361 1359T329 1272L239 1275Q239 1367 293 1427T434 1487Q482 1487 516 1470T580 1432T640 1394T712 1377Q758 1377 790 1410T823
1499L912 1493Z" />
<glyph unicode="&#xf6;" horiz-adv-x="1147" d="M90 557Q90 713 150 838T321 1032T572 1102Q788 1102 922 951T1056 549V524Q1056 367 996 242T825 48T574 -20Q359 -20 225 131T90 533V557ZM210 524Q210 330 310 206T574 81Q736 81 836 205T937 534V557Q937 681
891 784T762 943T572 1000Q412 1000 311 875T210 546V524ZM278 1396Q278 1430 299 1453T360 1477Q398 1477 420 1454T443 1396Q443 1363 421 1340T360 1317Q321 1317 300 1340T278 1396ZM715 1395Q715 1429 737 1452T797 1476Q836 1476 858 1453T880 1395Q880 1362
858 1339T797 1316Q759 1316 737 1339T715 1395Z" />
<glyph unicode="&#xf7;" horiz-adv-x="1164" d="M1070 644H72V760H1070V644ZM495 1088Q495 1123 517 1147T579 1171T642 1147T665 1088T642 1030T579 1006T517 1029T495 1088ZM495 291Q495 326 517 350T579 374T642 350T665 291T642 233T579 210T517 233T495 291Z" />
<glyph unicode="&#xf8;" horiz-adv-x="1140" d="M89 557Q89 713 149 838T320 1032T571 1102Q685 1102 785 1054L863 1214H957L857 1010Q951 938 1003 821T1055 557V524Q1055 368 994 242T823 48T573 -20Q465 -20 373 21L294 -140H200L299 63Q199 134 144 253T89
524V557ZM208 524Q208 414 243 319T348 163L737 957Q662 1000 571 1000Q410 1000 309 875T208 546V524ZM935 557Q935 660 902 751T806 905L419 115Q487 81 573 81Q734 81 834 205T935 534V557Z" />
<glyph unicode="&#xf9;" horiz-adv-x="1125" d="M852 137Q744 -20 507 -20Q334 -20 244 80T152 378V1082H271V393Q271 84 521 84Q781 84 850 299V1082H970V0H854L852 137ZM647 1245H538L312 1524H456L647 1245Z" />
<glyph unicode="&#xfa;" horiz-adv-x="1125" d="M852 137Q744 -20 507 -20Q334 -20 244 80T152 378V1082H271V393Q271 84 521 84Q781 84 850 299V1082H970V0H854L852 137ZM693 1524H838L607 1245H502L693 1524Z" />
<glyph unicode="&#xfb;" horiz-adv-x="1125" d="M852 137Q744 -20 507 -20Q334 -20 244 80T152 378V1082H271V393Q271 84 521 84Q781 84 850 299V1082H970V0H854L852 137ZM852 1268V1258H741L573 1441L406 1258H297V1271L535 1526H611L852 1268Z" />
<glyph unicode="&#xfc;" horiz-adv-x="1125" d="M852 137Q744 -20 507 -20Q334 -20 244 80T152 378V1082H271V393Q271 84 521 84Q781 84 850 299V1082H970V0H854L852 137ZM280 1396Q280 1430 301 1453T362 1477Q400 1477 422 1454T445 1396Q445 1363 423 1340T362
1317Q323 1317 302 1340T280 1396ZM717 1395Q717 1429 739 1452T799 1476Q838 1476 860 1453T882 1395Q882 1362 860 1339T799 1316Q761 1316 739 1339T717 1395Z" />
<glyph unicode="&#xfd;" horiz-adv-x="973" d="M499 172L815 1082H944L482 -184L458 -240Q369 -437 183 -437Q140 -437 91 -423L90 -324L152 -330Q240 -330 294 -287T387 -137L440 9L32 1082H163L499 172ZM633 1524H778L547 1245H442L633 1524Z" />
<glyph unicode="&#xfe;" horiz-adv-x="1150" d="M1031 530Q1031 277 919 129T618 -20Q397 -20 279 136V-416H159V1536H279V932Q396 1102 616 1102Q808 1102 919 956T1031 548V530ZM911 551Q911 758 826 878T589 998Q479 998 400 945T279 791V270Q321 180 400 131T591
81Q742 81 826 201T911 551Z" />
<glyph unicode="&#xff;" horiz-adv-x="973" d="M499 172L815 1082H944L482 -184L458 -240Q369 -437 183 -437Q140 -437 91 -423L90 -324L152 -330Q240 -330 294 -287T387 -137L440 9L32 1082H163L499 172ZM220 1396Q220 1430 241 1453T302 1477Q340 1477 362 1454T385
1396Q385 1363 363 1340T302 1317Q263 1317 242 1340T220 1396ZM657 1395Q657 1429 679 1452T739 1476Q778 1476 800 1453T822 1395Q822 1362 800 1339T739 1316Q701 1316 679 1339T657 1395Z" />
<glyph unicode="&#x2013;" horiz-adv-x="1334" d="M1417 686H415V788H1417V686Z" />
<glyph unicode="&#x2014;" horiz-adv-x="1580" d="M1462 686H126V788H1462V686Z" />
<glyph unicode="&#x2018;" horiz-adv-x="364" d="M238 1554L310 1503Q220 1385 217 1249V1121H98V1233Q98 1325 135 1410T238 1554Z" />
<glyph unicode="&#x2019;" horiz-adv-x="364" d="M133 1099L62 1151Q152 1272 155 1405V1536H273V1435Q273 1226 133 1099Z" />
<glyph unicode="&#x201a;" horiz-adv-x="353" d="M112 -231L41 -179Q124 -68 132 51L133 205H252V104Q252 -104 112 -231Z" />
<glyph unicode="&#x201c;" horiz-adv-x="612" d="M239 1554L311 1503Q221 1385 218 1249V1121H99V1233Q99 1325 136 1410T239 1554ZM490 1554L562 1503Q472 1385 469 1249V1121H350V1233Q350 1325 387 1410T490 1554Z" />
<glyph unicode="&#x201d;" horiz-adv-x="617" d="M139 1099L68 1151Q158 1272 161 1405V1536H279V1435Q279 1226 139 1099ZM383 1099L312 1151Q402 1272 405 1405V1536H523V1435Q523 1226 383 1099Z" />
<glyph unicode="&#x201e;" horiz-adv-x="593" d="M112 -240L41 -188Q130 -65 133 73V236H252V106Q252 -111 112 -240ZM346 -240L275 -188Q363 -66 366 73V236H486V106Q486 -111 346 -240Z" />
<glyph unicode="&#x2022;" horiz-adv-x="662" d="M146 752Q146 831 197 881T331 931Q413 931 464 883T517 757V717Q517 636 466 588T332 540Q248 540 197 589T146 719V752Z" />
<glyph unicode="&#x2039;" horiz-adv-x="609" d="M232 555L508 167H403L108 546V565L403 944H508L232 555Z" />
<glyph unicode="&#x203a;" horiz-adv-x="609" d="M203 944L498 560V541L203 162H97L373 550L97 944H203Z" />
</font>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 49 KiB

View file

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View file

@ -1,305 +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">
<defs >
<font id="Roboto" horiz-adv-x="1173" ><font-face
font-family="Roboto Medium"
units-per-em="2048"
panose-1="2 0 0 0 0 0 0 0 0 0"
ascent="1900"
descent="-500"
alphabetic="0" />
<glyph unicode=" " horiz-adv-x="510" />
<glyph unicode="!" horiz-adv-x="549" d="M382 429H173L150 1456H406L382 429ZM143 115Q143 172 180 209T281 247T382 210T419 115Q419 60 383 23T281 -14T179 23T143 115Z" />
<glyph unicode="&quot;" horiz-adv-x="664" d="M275 1399L240 1012H101V1536H275V1399ZM576 1399L541 1012H402V1536H576V1399Z" />
<glyph unicode="#" horiz-adv-x="1250" d="M719 410H495L419 0H251L327 410H96V568H357L415 881H172V1040H445L523 1456H690L612 1040H837L915 1456H1082L1004 1040H1212V881H974L916 568H1137V410H886L810 0H643L719 410ZM525 568H749L807 881H583L525 568Z" />
<glyph unicode="$" horiz-adv-x="1164" d="M819 380Q819 465 765 520T585 620T389 703Q156 828 156 1073Q156 1239 257 1346T531 1473V1691H691V1471Q865 1446 960 1324T1055 1005H813Q813 1131 757 1203T603 1276Q507 1276 453 1224T399 1075Q399 988 452 936T634
836T835 749T958 658T1035 539T1062 382Q1062 213 959 108T670 -16V-211H511V-17Q313 5 207 125T100 443H343Q343 317 406 248T586 179Q700 179 759 234T819 380Z" />
<glyph unicode="%" horiz-adv-x="1504" d="M99 1176Q99 1308 184 1392T407 1477Q547 1477 631 1393T716 1171V1099Q716 968 632 884T409 800Q274 800 187 882T99 1105V1176ZM269 1099Q269 1030 307 988T409 945Q471 945 509 987T547 1103V1176Q547 1245 509 1288T407
1331T307 1288T269 1173V1099ZM799 357Q799 491 886 574T1108 657Q1244 657 1330 574T1417 350V279Q1417 149 1334 65T1110 -20T885 63T799 284V357ZM969 279Q969 211 1008 168T1110 124Q1174 124 1210 165T1247 282V357Q1247 427 1208 469T1108 511Q1046 511 1008
469T969 353V279ZM459 109L334 181L1045 1319L1170 1247L459 109Z" />
<glyph unicode="&amp;" horiz-adv-x="1309" d="M86 393Q86 494 141 578T358 779Q273 886 240 961T206 1106Q206 1277 310 1376T590 1476Q749 1476 850 1383T952 1151Q952 1060 906 984T755 831L656 759L937 427Q998 547 998 694H1209Q1209 425 1083 253L1297 0H1015L933
97Q777 -20 561 -20T216 94T86 393ZM568 174Q691 174 798 256L480 631L449 609Q329 518 329 401Q329 300 394 237T568 174ZM434 1112Q434 1028 537 901L648 977L679 1002Q741 1057 741 1143Q741 1200 698 1240T589 1281Q518 1281 476 1233T434 1112Z" />
<glyph unicode="&apos;" horiz-adv-x="346" d="M267 1411L241 1020H82V1536H267V1411Z" />
<glyph unicode="(" horiz-adv-x="714" d="M128 592Q128 823 190 1030T372 1401T626 1631L674 1489Q533 1382 446 1163T350 660L349 574Q349 271 434 34T674 -328L626 -463Q492 -397 372 -233T190 138T128 592Z" />
<glyph unicode=")" horiz-adv-x="722" d="M593 576Q593 354 532 148T347 -228T88 -463L40 -328Q190 -212 277 26T365 571V594Q365 872 289 1100T71 1467L40 1495L88 1631Q216 1569 336 1411T520 1058T592 654L593 576Z" />
<glyph unicode="*" horiz-adv-x="905" d="M332 972L27 1060L82 1229L384 1112L369 1456H548L533 1106L830 1221L884 1049L574 961L774 695L629 589L449 877L271 598L125 700L332 972Z" />
<glyph unicode="+" horiz-adv-x="1141" d="M686 801H1066V579H686V146H450V579H68V801H450V1206H686V801Z" />
<glyph unicode="," horiz-adv-x="450" d="M159 -328L28 -250Q86 -159 107 -92T130 46V235H349L348 60Q347 -46 295 -152T159 -328Z" />
<glyph unicode="-" horiz-adv-x="672" d="M596 521H71V717H596V521Z" />
<glyph unicode="." horiz-adv-x="572" d="M276 256Q344 256 381 218T418 121Q418 64 381 27T276 -11Q211 -11 173 26T135 121T172 217T276 256Z" />
<glyph unicode="/" horiz-adv-x="810" d="M193 -125H2L575 1456H766L193 -125Z" />
<glyph unicode="0" horiz-adv-x="1164" d="M1058 613Q1058 299 941 140T583 -20Q347 -20 228 135T105 596V848Q105 1162 222 1319T581 1476Q820 1476 937 1323T1058 865V613ZM815 885Q815 1090 759 1185T581 1281Q462 1281 406 1191T347 908V578Q347 374 404 274T583
174Q700 174 756 266T815 556V885Z" />
<glyph unicode="1" horiz-adv-x="1164" d="M767 0H525V1169L168 1047V1252L736 1461H767V0Z" />
<glyph unicode="2" horiz-adv-x="1164" d="M1088 0H109V167L594 696Q699 813 743 891T788 1049Q788 1153 730 1217T572 1281Q454 1281 389 1209T324 1012H81Q81 1145 141 1251T314 1417T574 1476Q786 1476 908 1370T1031 1075Q1031 966 970 847T768 575L412 194H1088V0Z" />
<glyph unicode="3" horiz-adv-x="1164" d="M390 839H538Q650 840 715 897T781 1062Q781 1166 727 1223T560 1281Q462 1281 399 1225T336 1077H93Q93 1189 152 1281T318 1424T557 1476Q775 1476 899 1367T1024 1062Q1024 964 962 878T800 747Q920 706 982 618T1045
408Q1045 212 911 96T557 -20Q347 -20 213 92T79 390H322Q322 294 386 234T560 174Q673 174 738 234T803 408Q803 523 735 585T533 647H390V839Z" />
<glyph unicode="4" horiz-adv-x="1164" d="M931 519H1112V324H931V0H688V324H59L52 472L680 1456H931V519ZM307 519H688V1127L670 1095L307 519Z" />
<glyph unicode="5" horiz-adv-x="1164" d="M174 722L253 1456H1035V1246H455L415 898Q516 956 643 956Q851 956 966 823T1082 465Q1082 243 954 112T603 -20Q403 -20 272 93T129 393H364Q378 287 440 231T602 174Q714 174 776 254T839 472Q839 605 770 682T580
760Q514 760 468 743T368 674L174 722Z" />
<glyph unicode="6" horiz-adv-x="1164" d="M865 1463V1262H835Q631 1259 509 1150T364 841Q481 964 663 964Q856 964 967 828T1079 477Q1079 255 949 118T606 -20Q388 -20 253 141T117 563V646Q117 1029 303 1246T840 1463H865ZM604 768Q524 768 458 723T360 603V529Q360
367 428 272T604 176T775 257T838 470T774 685T604 768Z" />
<glyph unicode="7" horiz-adv-x="1164" d="M1078 1321L496 0H241L822 1261H69V1456H1078V1321Z" />
<glyph unicode="8" horiz-adv-x="1164" d="M1026 1072Q1026 965 971 882T821 750Q935 697 996 605T1058 397Q1058 205 928 93T582 -20Q365 -20 235 93T104 397Q104 514 166 607T340 750Q246 798 192 881T137 1072Q137 1258 257 1367T581 1476Q786 1476 906 1367T1026
1072ZM815 409Q815 517 751 583T580 650T411 584T347 409Q347 302 409 238T582 174T753 236T815 409ZM784 1063Q784 1158 729 1219T581 1281T434 1223T380 1063Q380 963 434 904T582 845T729 904T784 1063Z" />
<glyph unicode="9" horiz-adv-x="1164" d="M798 609Q676 480 513 480Q321 480 207 614T93 968Q93 1112 151 1229T316 1411T564 1476Q784 1476 913 1312T1042 873V805Q1042 411 864 204T333 -6H304V195H339Q554 198 669 298T798 609ZM564 670Q637 670 701 712T800
828V923Q800 1084 734 1182T563 1280T396 1194T333 975Q333 838 396 754T564 670Z" />
<glyph unicode=":" horiz-adv-x="543" d="M527 256Q595 256 632 218T669 121Q669 64 632 27T527 -11Q462 -11 424 26T386 121T423 217T527 256ZM271 1105Q339 1105 376 1067T413 970Q413 913 376 876T271 838Q206 838 168 875T130 970T167 1066T271 1105Z" />
<glyph unicode=";" horiz-adv-x="487" d="M250 1105Q318 1105 355 1067T392 970Q392 913 355 876T250 838Q185 838 147 875T109 970T146 1066T250 1105ZM177 -328L46 -250Q104 -159 125 -92T148 46V235H367L366 60Q365 -46 313 -152T177 -328Z" />
<glyph unicode="&lt;" horiz-adv-x="1041" d="M310 631L900 407V164L63 537V730L900 1102V859L310 631Z" />
<glyph unicode="=" horiz-adv-x="1146" d="M1007 780H145V982H1007V780ZM1007 356H145V557H1007V356Z" />
<glyph unicode="&gt;" horiz-adv-x="1066" d="M746 636L128 863V1102L992 730V537L128 165V404L746 636Z" />
<glyph unicode="?" horiz-adv-x="996" d="M350 428Q350 561 383 640T513 813T637 948Q677 1009 677 1080Q677 1174 631 1223T494 1273Q408 1273 356 1225T303 1093H60Q62 1270 180 1373T494 1476Q695 1476 807 1374T920 1089Q920 926 768 768L645 647Q579 572
577 428H350ZM333 117Q333 176 370 212T470 249Q534 249 571 212T608 117Q608 62 572 25T470 -12T369 25T333 117Z" />
<glyph unicode="@" horiz-adv-x="1832" d="M1741 518Q1729 268 1618 124T1317 -21Q1136 -21 1075 133Q1024 57 957 19T815 -19Q669 -19 594 101T536 422Q552 585 615 716T776 918T984 990Q1068 990 1132 969T1284 882L1232 319Q1213 121 1346 121Q1448 121 1513
230T1585 514Q1602 883 1443 1079T963 1275Q767 1275 616 1177T375 894T277 471Q265 230 334 56T547 -210T898 -301Q982 -301 1073 -281T1229 -227L1267 -364Q1206 -404 1103 -428T894 -453Q640 -453 458 -346T185 -34Q91 177 102 471Q114 745 225 963T528 1303T967
1424Q1216 1424 1395 1315T1664 1000T1741 518ZM732 422Q719 286 756 216T874 145Q928 145 976 192T1054 323L1099 816Q1049 835 1002 835Q891 835 821 731T732 422Z" />
<glyph unicode="A" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543Z" />
<glyph unicode="B" horiz-adv-x="1292" d="M148 0V1456H647Q894 1456 1023 1357T1152 1062Q1152 962 1098 882T940 758Q1058 726 1122 638T1187 425Q1187 220 1056 110T679 0H148ZM401 657V202H682Q801 202 868 261T935 425Q935 652 703 657H401ZM401 843H649Q767
843 833 896T900 1048Q900 1156 839 1204T647 1252H401V843Z" />
<glyph unicode="C" horiz-adv-x="1337" d="M1259 474Q1237 241 1087 111T688 -20Q514 -20 382 62T177 297T102 650V786Q102 992 175 1149T384 1391T700 1476Q941 1476 1088 1345T1259 975H1007Q989 1132 916 1201T700 1271Q535 1271 447 1151T356 797V668Q356
432 440 308T688 184Q837 184 912 251T1007 474H1259Z" />
<glyph unicode="D" horiz-adv-x="1338" d="M148 0V1456H578Q771 1456 920 1370T1152 1126T1234 764V691Q1234 484 1152 327T917 85T567 0H148ZM401 1252V202H566Q765 202 871 326T980 684V765Q980 1002 877 1127T578 1252H401Z" />
<glyph unicode="E" horiz-adv-x="1158" d="M999 650H401V202H1100V0H148V1456H1093V1252H401V850H999V650Z" />
<glyph unicode="F" horiz-adv-x="1125" d="M987 617H401V0H148V1456H1073V1252H401V819H987V617Z" />
<glyph unicode="G" horiz-adv-x="1394" d="M1264 189Q1185 86 1045 33T727 -20Q544 -20 403 63T186 300T106 661V775Q106 1105 264 1290T705 1476Q948 1476 1091 1356T1263 1010H1015Q973 1273 710 1273Q540 1273 452 1151T360 791V679Q360 443 459 313T736 182Q930
182 1012 270V555H712V747H1264V189Z" />
<glyph unicode="H" horiz-adv-x="1455" d="M1304 0H1052V647H401V0H148V1456H401V850H1052V1456H1304V0Z" />
<glyph unicode="I" horiz-adv-x="578" d="M415 0H163V1456H415V0Z" />
<glyph unicode="J" horiz-adv-x="1137" d="M744 1456H996V435Q996 226 866 103T521 -20Q293 -20 169 95T45 415H297Q297 299 354 241T521 182Q623 182 683 249T744 436V1456Z" />
<glyph unicode="K" horiz-adv-x="1291" d="M566 629L401 454V0H148V1456H401V773L541 946L967 1456H1273L732 811L1304 0H1004L566 629Z" />
<glyph unicode="L" horiz-adv-x="1108" d="M401 202H1062V0H148V1456H401V202Z" />
<glyph unicode="M" horiz-adv-x="1793" d="M476 1456L896 340L1315 1456H1642V0H1390V480L1415 1122L985 0H804L375 1121L400 480V0H148V1456H476Z" />
<glyph unicode="N" horiz-adv-x="1454" d="M1303 0H1050L401 1033V0H148V1456H401L1052 419V1456H1303V0Z" />
<glyph unicode="O" horiz-adv-x="1414" d="M1310 690Q1310 476 1236 315T1025 67T708 -20Q531 -20 393 66T179 313T102 682V764Q102 977 177 1140T390 1389T706 1476T1021 1391T1234 1145T1310 771V690ZM1057 766Q1057 1008 966 1137T706 1266Q542 1266 450 1138T355
774V690Q355 450 448 319T708 188Q876 188 966 316T1057 690V766Z" />
<glyph unicode="P" horiz-adv-x="1309" d="M401 541V0H148V1456H705Q949 1456 1092 1329T1236 993Q1236 779 1096 660T702 541H401ZM401 744H705Q840 744 911 807T982 991Q982 1109 910 1179T712 1252H401V744Z" />
<glyph unicode="Q" horiz-adv-x="1414" d="M1305 690Q1305 483 1240 332T1056 91L1306 -104L1142 -252L832 -7Q771 -20 701 -20Q525 -20 387 66T173 313T96 682V764Q96 977 171 1140T384 1389T699 1476Q879 1476 1016 1391T1229 1145T1305 771V690ZM1051 766Q1051
1012 959 1139T699 1266Q536 1266 444 1138T349 775V690Q349 454 441 321T701 188Q870 188 960 316T1051 690V766Z" />
<glyph unicode="R" horiz-adv-x="1278" d="M683 561H401V0H148V1456H660Q912 1456 1049 1343T1186 1016Q1186 870 1116 772T919 620L1246 13V0H975L683 561ZM401 764H661Q789 764 861 828T933 1005Q933 1122 867 1186T668 1252H401V764Z" />
<glyph unicode="S" horiz-adv-x="1236" d="M909 375Q909 471 842 523T598 628T318 746Q119 871 119 1072Q119 1248 262 1362T635 1476Q787 1476 906 1420T1093 1261T1161 1031H909Q909 1145 838 1209T633 1274Q509 1274 441 1221T372 1073Q372 993 446 940T690
836T963 721T1114 573T1162 377Q1162 195 1023 88T644 -20Q486 -20 354 38T148 200T74 440H327Q327 316 409 248T644 180Q776 180 842 233T909 375Z" />
<glyph unicode="T" horiz-adv-x="1243" d="M1200 1252H746V0H495V1252H45V1456H1200V1252Z" />
<glyph unicode="U" horiz-adv-x="1335" d="M1213 1456V483Q1213 251 1065 116T669 -20Q419 -20 272 113T125 484V1456H377V482Q377 336 451 259T669 182Q961 182 961 490V1456H1213Z" />
<glyph unicode="V" horiz-adv-x="1325" d="M661 317L1031 1456H1309L785 0H540L18 1456H295L661 317Z" />
<glyph unicode="W" horiz-adv-x="1802" d="M1290 360L1514 1456H1765L1429 0H1187L910 1063L627 0H384L48 1456H299L525 362L803 1456H1015L1290 360Z" />
<glyph unicode="X" horiz-adv-x="1296" d="M649 930L955 1456H1247L807 734L1257 0H962L649 534L335 0H41L492 734L51 1456H343L649 930Z" />
<glyph unicode="Y" horiz-adv-x="1248" d="M623 766L958 1456H1238L750 536V0H496V536L7 1456H288L623 766Z" />
<glyph unicode="Z" horiz-adv-x="1233" d="M386 202H1164V0H80V164L833 1252H85V1456H1140V1296L386 202Z" />
<glyph unicode="[" horiz-adv-x="561" d="M540 1488H375V-135H540V-324H132V1678H540V1488Z" />
<glyph unicode="\" horiz-adv-x="856" d="M20 1456H260L868 -125H628L20 1456Z" />
<glyph unicode="]" horiz-adv-x="561" d="M12 1678H422V-324H12V-135H179V1488H12V1678Z" />
<glyph unicode="^" horiz-adv-x="875" d="M437 1190L259 729H53L352 1456H523L821 729H616L437 1190Z" />
<glyph unicode="_" horiz-adv-x="924" d="M920 -191H3V0H920V-191Z" />
<glyph unicode="`" horiz-adv-x="660" d="M521 1233H319L49 1536H326L521 1233Z" />
<glyph unicode="a" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978 738V250Q978
104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175Z" />
<glyph unicode="b" horiz-adv-x="1153" d="M1074 530Q1074 278 962 129T652 -20Q462 -20 356 117L344 0H124V1536H367V978Q472 1102 650 1102Q848 1102 961 955T1074 544V530ZM831 551Q831 727 769 815T589 903Q431 903 367 765V319Q432 178 591 178Q705 178 767
263T831 520V551Z" />
<glyph unicode="c" horiz-adv-x="1072" d="M569 174Q660 174 720 227T784 358H1013Q1009 257 950 170T790 31T572 -20Q345 -20 212 127T79 533V558Q79 805 211 953T571 1102Q764 1102 885 990T1013 694H784Q780 787 721 847T569 907Q451 907 387 822T322 562V523Q322
347 385 261T569 174Z" />
<glyph unicode="d" horiz-adv-x="1156" d="M79 549Q79 799 195 950T506 1102Q678 1102 784 982V1536H1027V0H807L795 112Q686 -20 504 -20Q314 -20 197 133T79 549ZM322 528Q322 363 385 271T566 178Q715 178 784 311V773Q717 903 568 903Q450 903 386 810T322 528Z" />
<glyph unicode="e" horiz-adv-x="1099" d="M601 -20Q370 -20 227 125T83 513V543Q83 705 145 832T321 1031T573 1102Q794 1102 914 961T1035 562V464H328Q339 330 417 252T615 174Q782 174 887 309L1018 184Q953 87 845 34T601 -20ZM572 907Q472 907 411 837T332
642H795V660Q787 782 730 844T572 907Z" />
<glyph unicode="f" horiz-adv-x="726" d="M210 0V902H45V1082H210V1181Q210 1361 310 1459T590 1557Q654 1557 726 1539L720 1349Q680 1357 627 1357Q453 1357 453 1178V1082H673V902H453V0H210Z" />
<glyph unicode="g" horiz-adv-x="1161" d="M82 549Q82 801 200 951T515 1102Q700 1102 806 973L817 1082H1036V33Q1036 -180 904 -303T546 -426Q427 -426 314 -377T141 -247L256 -101Q368 -234 532 -234Q653 -234 723 -169T793 24V97Q688 -20 513 -20Q323 -20
203 131T82 549ZM324 528Q324 365 390 272T575 178Q722 178 793 304V780Q724 903 577 903Q457 903 391 808T324 528Z" />
<glyph unicode="h" horiz-adv-x="1137" d="M364 964Q483 1102 665 1102Q1011 1102 1016 707V0H773V698Q773 810 725 856T582 903Q436 903 364 773V0H121V1536H364V964Z" />
<glyph unicode="i" horiz-adv-x="523" d="M383 0H140V1082H383V0ZM125 1363Q125 1419 160 1456T262 1493T364 1456T400 1363Q400 1308 364 1272T262 1235T161 1271T125 1363Z" />
<glyph unicode="j" horiz-adv-x="513" d="M378 1082V-96Q378 -262 296 -349T54 -437Q-13 -437 -75 -420V-228Q-37 -237 11 -237Q132 -237 135 -105V1082H378ZM114 1363Q114 1419 149 1456T251 1493T353 1456T389 1363Q389 1308 353 1272T251 1235T150 1271T114 1363Z" />
<glyph unicode="k" horiz-adv-x="1069" d="M476 464L368 353V0H125V1536H368V650L444 745L743 1082H1035L633 631L1078 0H797L476 464Z" />
<glyph unicode="l" horiz-adv-x="523" d="M383 0H140V1536H383V0Z" />
<glyph unicode="m" horiz-adv-x="1782" d="M353 1082L360 969Q474 1102 672 1102Q889 1102 969 936Q1087 1102 1301 1102Q1480 1102 1567 1003T1657 711V0H1414V704Q1414 807 1369 855T1220 903Q1137 903 1085 859T1011 742L1012 0H769V712Q764 903 574 903Q428
903 367 784V0H124V1082H353Z" />
<glyph unicode="n" horiz-adv-x="1139" d="M350 1082L357 957Q477 1102 672 1102Q1010 1102 1016 715V0H773V701Q773 804 729 853T583 903Q436 903 364 770V0H121V1082H350Z" />
<glyph unicode="o" horiz-adv-x="1166" d="M79 551Q79 710 142 837T319 1033T581 1102Q800 1102 936 961T1084 587L1085 530Q1085 370 1024 244T848 49T583 -20Q354 -20 217 132T79 539V551ZM322 530Q322 363 391 269T583 174T774 270T843 551Q843 715 773 811T581
907Q462 907 392 813T322 530Z" />
<glyph unicode="p" horiz-adv-x="1153" d="M1072 530Q1072 279 958 130T652 -20Q474 -20 367 97V-416H124V1082H348L358 972Q465 1102 649 1102Q847 1102 959 955T1072 545V530ZM830 551Q830 713 766 808T581 903Q432 903 367 780V300Q433 174 583 174Q699 174
764 267T830 551Z" />
<glyph unicode="q" horiz-adv-x="1163" d="M79 550Q79 804 195 953T509 1102Q690 1102 796 975L810 1082H1026V-416H783V92Q677 -20 507 -20Q313 -20 196 131T79 550ZM322 529Q322 363 387 269T569 174Q713 174 783 297V789Q713 907 571 907Q455 907 389 814T322 529Z" />
<glyph unicode="r" horiz-adv-x="720" d="M691 860Q643 868 592 868Q425 868 367 740V0H124V1082H356L362 961Q450 1102 606 1102Q658 1102 692 1088L691 860Z" />
<glyph unicode="s" horiz-adv-x="1057" d="M731 294Q731 359 678 393T500 453T293 519Q111 607 111 774Q111 914 229 1008T529 1102Q723 1102 842 1006T962 757H719Q719 827 667 873T529 920Q449 920 399 883T348 784Q348 728 395 697T585 635T809 560T930 455T970
307Q970 161 849 71T532 -20Q399 -20 295 28T133 160T75 341H311Q316 255 376 209T535 162Q631 162 681 198T731 294Z" />
<glyph unicode="t" horiz-adv-x="681" d="M429 1345V1082H620V902H429V298Q429 236 453 209T541 181Q583 181 626 191V3Q543 -20 466 -20Q186 -20 186 289V902H8V1082H186V1345H429Z" />
<glyph unicode="u" horiz-adv-x="1138" d="M780 106Q673 -20 476 -20Q300 -20 210 83T119 381V1082H362V384Q362 178 533 178Q710 178 772 305V1082H1015V0H786L780 106Z" />
<glyph unicode="v" horiz-adv-x="1013" d="M506 308L735 1082H986L611 0H400L22 1082H274L506 308Z" />
<glyph unicode="w" horiz-adv-x="1522" d="M1075 335L1247 1082H1484L1189 0H989L757 743L529 0H329L33 1082H270L445 343L667 1082H850L1075 335Z" />
<glyph unicode="x" horiz-adv-x="1030" d="M513 726L719 1082H989L658 549L1000 0H732L516 370L301 0H31L373 549L43 1082H311L513 726Z" />
<glyph unicode="y" horiz-adv-x="997" d="M503 348L723 1082H982L552 -164Q453 -437 216 -437Q163 -437 99 -419V-231L145 -234Q237 -234 283 -201T357 -88L392 5L12 1082H274L503 348Z" />
<glyph unicode="z" horiz-adv-x="1030" d="M384 194H960V0H82V159L631 886H92V1082H939V928L384 194Z" />
<glyph unicode="{" horiz-adv-x="687" d="M609 -360Q256 -261 249 91V304Q249 529 56 529V707Q249 707 249 933V1145Q252 1325 342 1436T609 1597L657 1457Q484 1401 478 1151V935Q478 710 305 619Q478 527 478 300V87Q484 -163 657 -219L609 -360Z" />
<glyph unicode="|" horiz-adv-x="514" d="M341 -270H174V1456H341V-270Z" />
<glyph unicode="}" horiz-adv-x="687" d="M27 -219Q203 -162 207 93V301Q207 532 389 618Q207 704 207 938V1145Q203 1400 27 1457L75 1597Q257 1546 346 1432T435 1132V932Q435 707 629 707V529Q435 529 435 304V107Q435 -80 346 -194T75 -360L27 -219Z" />
<glyph unicode="~" horiz-adv-x="1361" d="M1244 786Q1244 610 1149 499T912 387Q838 387 776 415T636 511T526 596T454 613Q387 613 349 561T310 425H117Q117 596 208 705T447 815Q521 815 587 786T726 690T832 607T905 590Q972 590 1014 646T1056 786H1244Z" />
<glyph unicode="&#xa0;" horiz-adv-x="510" />
<glyph unicode="&#xa1;" horiz-adv-x="542" d="M170 662H379L403 -364H146L170 662ZM409 971Q409 915 373 878T272 840Q206 840 170 877T134 971Q134 1026 170 1063T272 1101Q337 1101 373 1064T409 971Z" />
<glyph unicode="&#xa2;" horiz-adv-x="1149" d="M591 174Q680 174 740 226T806 358H1034Q1030 222 932 120T687 -11V-245H487V-11Q304 23 202 166T100 530V558Q100 771 202 915T487 1093V1318H687V1094Q845 1066 937 958T1034 694H806Q799 790 740 848T590 907Q360
907 344 595L343 523Q343 347 406 261T591 174Z" />
<glyph unicode="&#xa3;" horiz-adv-x="1205" d="M509 598L516 422Q516 287 452 202H1148L1147 0H98V202H180Q219 211 240 266T262 413L255 598H94V797H249L241 1039Q241 1241 366 1358T694 1475T1013 1366T1129 1073H884Q884 1168 832 1220T685 1273Q596 1273
545 1208T493 1039L502 797H813V598H509Z" />
<glyph unicode="&#xa4;" horiz-adv-x="1437" d="M1085 107Q926 -20 723 -20Q521 -20 363 106L234 -26L93 118L228 255Q128 411 128 608Q128 808 237 973L93 1120L234 1264L376 1119Q531 1234 723 1234Q917 1234 1072 1117L1217 1265L1359 1120L1211 969Q1318 810
1318 608Q1318 415 1220 259L1359 118L1217 -27L1085 107ZM313 608Q313 488 368 385T518 224T723 165T928 224T1077 386T1132 608T1078 829T929 989T723 1048T517 990T368 829T313 608Z" />
<glyph unicode="&#xa5;" horiz-adv-x="1248" d="M621 820L936 1456H1216L823 742H1092V590H743V452H1092V301H743V0H491V301H137V452H491V590H137V742H418L25 1456H306L621 820Z" />
<glyph unicode="&#xa6;" horiz-adv-x="508" d="M136 -270V525H365V-270H136ZM365 698H136V1456H365V698Z" />
<glyph unicode="&#xa7;" horiz-adv-x="1272" d="M1164 455Q1164 271 993 182Q1128 82 1128 -103Q1128 -276 993 -375T624 -474Q378 -474 234 -366T90 -50L332 -49Q332 -159 410 -219T624 -279Q745 -279 815 -232T886 -105Q886 -28 819 17T565 118Q377 169 282
224T141 356T94 542Q94 726 263 816Q198 866 164 934T130 1102Q130 1272 267 1374T635 1476Q875 1476 1009 1364T1143 1047H900Q900 1153 828 1217T635 1281Q512 1281 443 1234T373 1104Q373 1020 433 977T686 881T977 773T1119 640T1164 455ZM601 673Q520 694
444 722Q336 682 336 558Q336 477 385 434T584 344L763 291L809 275Q924 322 924 439Q924 520 856 568T601 673Z" />
<glyph unicode="&#xa8;" horiz-adv-x="901" d="M93 1366Q93 1416 126 1450T219 1484T312 1450T346 1366T312 1282T219 1248T127 1282T93 1366ZM549 1365Q549 1415 583 1449T676 1483T769 1449T803 1365T769 1281T676 1247T583 1281T549 1365Z" />
<glyph unicode="&#xa9;" horiz-adv-x="1604" d="M1118 596Q1118 444 1031 363T783 282T529 388T434 675V788Q434 962 529 1068T783 1175Q946 1175 1032 1093T1119 861H963Q963 957 917 998T783 1040Q691 1040 640 972T588 786V669Q588 551 640 484T783 417Q872
417 917 457T962 596H1118ZM1384 729Q1384 895 1309 1037T1097 1265T797 1351Q638 1351 502 1269T287 1043T209 729T286 415T500 188T797 104T1094 189T1308 418T1384 729ZM87 729Q87 931 180 1104T439 1376T797 1476T1154 1377T1412 1104T1506 729T1413 354T1155
81T797 -20Q604 -20 440 80T181 353T87 729Z" />
<glyph unicode="&#xaa;" horiz-adv-x="913" d="M608 705L591 773Q514 691 390 691Q272 691 207 752T141 919Q141 1029 225 1089T482 1150H584V1201Q584 1328 468 1328Q403 1328 367 1303T330 1229L157 1243Q157 1347 244 1411T468 1476Q605 1476 682 1404T759
1199V883Q759 786 785 705H608ZM433 835Q473 835 515 853T584 896V1033H478Q402 1032 359 1002T316 923Q316 835 433 835Z" />
<glyph unicode="&#xab;" horiz-adv-x="994" d="M551 537L798 138H631L343 528V547L631 937H798L551 537ZM654 537L901 138H734L446 528V547L734 937H901L654 537Z" />
<glyph unicode="&#xac;" horiz-adv-x="1133" d="M962 374H762V634H127V805H962V374Z" />
<glyph unicode="&#xad;" horiz-adv-x="672" d="M596 521H71V717H596V521Z" />
<glyph unicode="&#xae;" horiz-adv-x="1604" d="M87 729Q87 931 180 1104T439 1376T797 1476T1154 1377T1412 1104T1506 729T1413 354T1155 81T797 -20Q604 -20 440 80T181 353T87 729ZM1384 729Q1384 895 1309 1037T1097 1265T797 1351Q638 1351 502 1269T287
1043T209 729T286 415T500 188T797 104T1094 189T1308 418T1384 729ZM653 653V316H502V1166H783Q936 1166 1022 1099T1108 906Q1108 789 988 726Q1053 697 1079 642T1105 505T1108 389T1122 332V316H967Q954 350 954 510Q954 586 921 619T811 653H653ZM653 787H796Q865
787 911 818T958 903Q958 973 923 1002T794 1033H653V787Z" />
<glyph unicode="&#xaf;" horiz-adv-x="987" d="M862 1298H135V1456H862V1298Z" />
<glyph unicode="&#xb0;" horiz-adv-x="778" d="M391 1476Q497 1476 574 1397T651 1208T575 1021T391 943Q282 943 205 1020T127 1208T205 1397T391 1476ZM391 1084Q444 1084 478 1119T513 1208Q513 1260 479 1298T391 1336T302 1298T266 1208T302 1120T391 1084Z" />
<glyph unicode="&#xb1;" horiz-adv-x="1098" d="M668 899H1011V700H668V312H452V700H95V899H452V1276H668V899ZM974 1H125V197H974V1Z" />
<glyph unicode="&#xb2;" horiz-adv-x="758" d="M690 667H78V792L363 1053Q476 1156 476 1223Q476 1265 449 1291T370 1318Q312 1318 279 1285T246 1198H60Q60 1314 144 1390T364 1467Q507 1467 585 1403T663 1224Q663 1117 557 1015L459 928L319 815H690V667Z" />
<glyph unicode="&#xb3;" horiz-adv-x="758" d="M268 1132H349Q481 1132 481 1229Q481 1264 454 1290T365 1317Q317 1317 285 1298T252 1243H66Q66 1342 148 1404T361 1466Q504 1466 585 1406T667 1240Q667 1121 532 1070Q681 1029 681 887Q681 781 593 718T361
655Q226 655 141 718T55 895H241Q241 857 275 831T370 804Q433 804 463 831T494 901Q494 1002 360 1003H268V1132Z" />
<glyph unicode="&#xb4;" horiz-adv-x="667" d="M307 1536H584L307 1233H112L307 1536Z" />
<glyph unicode="&#xb5;" horiz-adv-x="1211" d="M388 1082V446Q390 305 434 240T585 175Q753 175 812 296V1082H1055V0H832L825 86Q733 -21 586 -21Q465 -21 388 34V-416H146V1082H388Z" />
<glyph unicode="&#xb6;" horiz-adv-x="1005" d="M644 0V520H564Q334 520 202 647T69 988Q69 1201 202 1328T565 1456H854V0H644Z" />
<glyph unicode="&#xb7;" horiz-adv-x="578" d="M142 714Q142 772 179 811T283 850T387 811T425 714Q425 655 386 618T283 581Q218 581 180 618T142 714Z" />
<glyph unicode="&#xb8;" horiz-adv-x="528" d="M318 3L307 -51Q457 -78 457 -224Q457 -329 371 -388T130 -447L123 -310Q189 -310 224 -287T260 -221Q260 -176 225 -159T109 -136L141 3H318Z" />
<glyph unicode="&#xb9;" horiz-adv-x="758" d="M514 672H329V1242L128 1194V1340L495 1459H514V672Z" />
<glyph unicode="&#xba;" horiz-adv-x="935" d="M119 1121Q119 1281 214 1378T465 1476T716 1379T812 1116V1044Q812 885 718 788T467 690Q309 690 214 788T119 1049V1121ZM294 1044Q294 946 340 891T467 836Q545 836 590 890T637 1041V1121Q637 1218 591 1273T465
1328Q387 1328 341 1274T294 1117V1044Z" />
<glyph unicode="&#xbb;" horiz-adv-x="994" d="M260 937L548 547V528L260 138H93L340 537L93 937H260ZM633 937L921 547V528L633 138H466L713 537L466 937H633Z" />
<glyph unicode="&#xbc;" horiz-adv-x="1488" d="M475 664H290V1234L89 1186V1332L456 1451H475V664ZM453 117L328 189L1039 1327L1164 1255L453 117ZM1316 314H1411V163H1316V0H1129V163H771L762 284L1127 789H1316V314ZM943 314H1129V556L1115 534L943 314Z" />
<glyph unicode="&#xbd;" horiz-adv-x="1579" d="M410 117L285 189L996 1327L1121 1255L410 117ZM466 667H281V1237L80 1189V1335L447 1454H466V667ZM1484 0H872V125L1157 386Q1270 489 1270 556Q1270 598 1243 624T1164 651Q1106 651 1073 618T1040 531H854Q854
647 938 723T1158 800Q1301 800 1379 736T1457 557Q1457 450 1351 348L1253 261L1113 148H1484V0Z" />
<glyph unicode="&#xbe;" horiz-adv-x="1623" d="M594 117L469 189L1180 1327L1305 1255L594 117ZM1437 314H1532V163H1437V0H1250V163H892L883 284L1248 789H1437V314ZM1064 314H1250V556L1236 534L1064 314ZM316 1133H397Q529 1133 529 1230Q529 1265 502 1291T413
1318Q365 1318 333 1299T300 1244H114Q114 1343 196 1405T409 1467Q552 1467 633 1407T715 1241Q715 1122 580 1071Q729 1030 729 888Q729 782 641 719T409 656Q274 656 189 719T103 896H289Q289 858 323 832T418 805Q481 805 511 832T542 902Q542 1003 408 1004H316V1133Z"
/>
<glyph unicode="&#xbf;" horiz-adv-x="996" d="M630 661Q628 537 602 465T502 313L399 207Q309 110 309 4Q309 -90 358 -136T496 -183Q584 -183 637 -133T690 0H933Q931 -177 812 -281T498 -385Q292 -385 179 -285T66 0Q66 165 221 328L313 421Q391 493 401 608L403
661H630ZM650 972Q650 916 615 879T513 841T411 878T375 972Q375 1027 411 1064T513 1102T614 1065T650 972Z" />
<glyph unicode="&#xc0;" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543ZM812 1543H610L340 1846H617L812 1543Z" />
<glyph unicode="&#xc1;" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543ZM757 1846H1034L757 1543H562L757 1846Z" />
<glyph unicode="&#xc2;" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543ZM1030 1569V1558H835L685 1714L536 1558H343V1571L614 1847H757L1030 1569Z" />
<glyph unicode="&#xc3;" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543ZM1052 1824Q1052 1714 989 1641T829 1568Q790 1568 762 1576T681 1615T607 1651T559 1657Q521 1657 495 1629T468 1554L319
1562Q319 1672 382 1747T541 1822Q598 1822 678 1777T811 1732Q849 1732 876 1760T903 1836L1052 1824Z" />
<glyph unicode="&#xc4;" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543ZM331 1676Q331 1726 364 1760T457 1794T550 1760T584 1676T550 1592T457 1558T365 1592T331 1676ZM787 1675Q787 1725
821 1759T914 1793T1007 1759T1041 1675T1007 1591T914 1557T821 1591T787 1675Z" />
<glyph unicode="&#xc5;" horiz-adv-x="1363" d="M963 339H399L281 0H18L568 1456H795L1346 0H1082L963 339ZM470 543H892L681 1147L470 543ZM686 1940Q779 1940 843 1879T907 1732T845 1587T686 1527Q589 1527 527 1587T464 1732T527 1878T686 1940ZM574 1732Q574
1685 607 1653T686 1620Q733 1620 765 1652T798 1732Q798 1778 767 1811T686 1845T606 1812T574 1732Z" />
<glyph unicode="&#xc6;" horiz-adv-x="1925" d="M1879 0H981L966 340H464L280 0H-10L825 1456H1817V1259H1171L1188 851H1736V654H1196L1216 196H1879V0ZM580 555H957L930 1203L580 555Z" />
<glyph unicode="&#xc7;" horiz-adv-x="1337" d="M1259 474Q1237 241 1087 111T688 -20Q514 -20 382 62T177 297T102 650V786Q102 992 175 1149T384 1391T700 1476Q941 1476 1088 1345T1259 975H1007Q989 1132 916 1201T700 1271Q535 1271 447 1151T356 797V668Q356
432 440 308T688 184Q837 184 912 251T1007 474H1259ZM775 -2L764 -56Q914 -83 914 -229Q914 -334 828 -393T587 -452L580 -315Q646 -315 681 -292T717 -226Q717 -181 682 -164T566 -141L598 -2H775Z" />
<glyph unicode="&#xc8;" horiz-adv-x="1158" d="M999 650H401V202H1100V0H148V1456H1093V1252H401V850H999V650ZM753 1550H551L281 1853H558L753 1550Z" />
<glyph unicode="&#xc9;" horiz-adv-x="1158" d="M999 650H401V202H1100V0H148V1456H1093V1252H401V850H999V650ZM698 1853H975L698 1550H503L698 1853Z" />
<glyph unicode="&#xca;" horiz-adv-x="1158" d="M999 650H401V202H1100V0H148V1456H1093V1252H401V850H999V650ZM971 1576V1565H776L626 1721L477 1565H284V1578L555 1854H698L971 1576Z" />
<glyph unicode="&#xcb;" horiz-adv-x="1158" d="M999 650H401V202H1100V0H148V1456H1093V1252H401V850H999V650ZM272 1683Q272 1733 305 1767T398 1801T491 1767T525 1683T491 1599T398 1565T306 1599T272 1683ZM728 1682Q728 1732 762 1766T855 1800T948 1766T982
1682T948 1598T855 1564T762 1598T728 1682Z" />
<glyph unicode="&#xcc;" horiz-adv-x="578" d="M415 0H163V1456H415V0ZM416 1550H214L-56 1853H221L416 1550Z" />
<glyph unicode="&#xcd;" horiz-adv-x="578" d="M415 0H163V1456H415V0ZM360 1853H637L360 1550H165L360 1853Z" />
<glyph unicode="&#xce;" horiz-adv-x="578" d="M415 0H163V1456H415V0ZM634 1576V1565H439L289 1721L140 1565H-53V1578L218 1854H361L634 1576Z" />
<glyph unicode="&#xcf;" horiz-adv-x="578" d="M415 0H163V1456H415V0ZM-65 1683Q-65 1733 -32 1767T61 1801T154 1767T188 1683T154 1599T61 1565T-31 1599T-65 1683ZM391 1682Q391 1732 425 1766T518 1800T611 1766T645 1682T611 1598T518 1564T425 1598T391 1682Z" />
<glyph unicode="&#xd0;" horiz-adv-x="1368" d="M178 0V652H-9V822H178V1456H608Q801 1456 950 1370T1182 1126T1264 764V691Q1264 484 1182 327T947 85T597 0H178ZM660 652H431V202H594Q797 202 903 328T1010 695V765Q1010 1002 907 1127T608 1252H431V822H660V652Z" />
<glyph unicode="&#xd1;" horiz-adv-x="1454" d="M1303 0H1050L401 1033V0H148V1456H401L1052 419V1456H1303V0ZM1093 1824Q1093 1714 1030 1641T870 1568Q831 1568 803 1576T722 1615T648 1651T600 1657Q562 1657 536 1629T509 1554L360 1562Q360 1672 423 1747T582
1822Q639 1822 719 1777T852 1732Q890 1732 917 1760T944 1836L1093 1824Z" />
<glyph unicode="&#xd2;" horiz-adv-x="1414" d="M1310 690Q1310 476 1236 315T1025 67T708 -20Q531 -20 393 66T179 313T102 682V764Q102 977 177 1140T390 1389T706 1476T1021 1391T1234 1145T1310 771V690ZM1057 766Q1057 1008 966 1137T706 1266Q542 1266 450
1138T355 774V690Q355 450 448 319T708 188Q876 188 966 316T1057 690V766ZM835 1543H633L363 1846H640L835 1543Z" />
<glyph unicode="&#xd3;" horiz-adv-x="1414" d="M1310 690Q1310 476 1236 315T1025 67T708 -20Q531 -20 393 66T179 313T102 682V764Q102 977 177 1140T390 1389T706 1476T1021 1391T1234 1145T1310 771V690ZM1057 766Q1057 1008 966 1137T706 1266Q542 1266 450
1138T355 774V690Q355 450 448 319T708 188Q876 188 966 316T1057 690V766ZM780 1846H1057L780 1543H585L780 1846Z" />
<glyph unicode="&#xd4;" horiz-adv-x="1414" d="M1310 690Q1310 476 1236 315T1025 67T708 -20Q531 -20 393 66T179 313T102 682V764Q102 977 177 1140T390 1389T706 1476T1021 1391T1234 1145T1310 771V690ZM1057 766Q1057 1008 966 1137T706 1266Q542 1266 450
1138T355 774V690Q355 450 448 319T708 188Q876 188 966 316T1057 690V766ZM1053 1569V1558H858L708 1714L559 1558H366V1571L637 1847H780L1053 1569Z" />
<glyph unicode="&#xd5;" horiz-adv-x="1414" d="M1310 690Q1310 476 1236 315T1025 67T708 -20Q531 -20 393 66T179 313T102 682V764Q102 977 177 1140T390 1389T706 1476T1021 1391T1234 1145T1310 771V690ZM1057 766Q1057 1008 966 1137T706 1266Q542 1266 450
1138T355 774V690Q355 450 448 319T708 188Q876 188 966 316T1057 690V766ZM1075 1824Q1075 1714 1012 1641T852 1568Q813 1568 785 1576T704 1615T630 1651T582 1657Q544 1657 518 1629T491 1554L342 1562Q342 1672 405 1747T564 1822Q621 1822 701 1777T834 1732Q872
1732 899 1760T926 1836L1075 1824Z" />
<glyph unicode="&#xd6;" horiz-adv-x="1414" d="M1310 690Q1310 476 1236 315T1025 67T708 -20Q531 -20 393 66T179 313T102 682V764Q102 977 177 1140T390 1389T706 1476T1021 1391T1234 1145T1310 771V690ZM1057 766Q1057 1008 966 1137T706 1266Q542 1266 450
1138T355 774V690Q355 450 448 319T708 188Q876 188 966 316T1057 690V766ZM354 1676Q354 1726 387 1760T480 1794T573 1760T607 1676T573 1592T480 1558T388 1592T354 1676ZM810 1675Q810 1725 844 1759T937 1793T1030 1759T1064 1675T1030 1591T937 1557T844
1591T810 1675Z" />
<glyph unicode="&#xd7;" horiz-adv-x="1092" d="M77 364L393 686L77 1008L225 1158L540 836L856 1158L1004 1008L688 686L1004 364L856 214L540 535L225 214L77 364Z" />
<glyph unicode="&#xd8;" horiz-adv-x="1412" d="M1314 690Q1314 476 1240 315T1029 67T711 -20Q547 -20 415 55L324 -95H155L300 143Q105 338 105 697V764Q105 977 180 1139T393 1388T709 1476Q906 1476 1049 1375L1136 1518H1303L1156 1275Q1313 1082 1314 765V690ZM358
690Q358 483 429 355L931 1181Q844 1266 709 1266Q545 1266 453 1138T358 774V690ZM1061 766Q1061 932 1017 1046L528 242Q606 188 711 188Q880 188 970 316T1061 690V766Z" />
<glyph unicode="&#xd9;" horiz-adv-x="1335" d="M1213 1456V483Q1213 251 1065 116T669 -20Q419 -20 272 113T125 484V1456H377V482Q377 336 451 259T669 182Q961 182 961 490V1456H1213ZM794 1543H592L322 1846H599L794 1543Z" />
<glyph unicode="&#xda;" horiz-adv-x="1335" d="M1213 1456V483Q1213 251 1065 116T669 -20Q419 -20 272 113T125 484V1456H377V482Q377 336 451 259T669 182Q961 182 961 490V1456H1213ZM739 1846H1016L739 1543H544L739 1846Z" />
<glyph unicode="&#xdb;" horiz-adv-x="1335" d="M1213 1456V483Q1213 251 1065 116T669 -20Q419 -20 272 113T125 484V1456H377V482Q377 336 451 259T669 182Q961 182 961 490V1456H1213ZM1012 1569V1558H817L667 1714L518 1558H325V1571L596 1847H739L1012 1569Z" />
<glyph unicode="&#xdc;" horiz-adv-x="1335" d="M1213 1456V483Q1213 251 1065 116T669 -20Q419 -20 272 113T125 484V1456H377V482Q377 336 451 259T669 182Q961 182 961 490V1456H1213ZM313 1676Q313 1726 346 1760T439 1794T532 1760T566 1676T532 1592T439
1558T347 1592T313 1676ZM769 1675Q769 1725 803 1759T896 1793T989 1759T1023 1675T989 1591T896 1557T803 1591T769 1675Z" />
<glyph unicode="&#xdd;" horiz-adv-x="1248" d="M623 766L958 1456H1238L750 536V0H496V536L7 1456H288L623 766ZM698 1846H975L698 1543H503L698 1846Z" />
<glyph unicode="&#xde;" horiz-adv-x="1226" d="M391 1456V1176H632Q876 1176 1013 1057T1150 738Q1150 539 1013 420T633 300H391V0H148V1456H391ZM391 981V495H637Q762 495 834 560T907 736T837 913T645 981H391Z" />
<glyph unicode="&#xdf;" horiz-adv-x="1255" d="M378 0H136V1105Q136 1319 250 1438T571 1557Q758 1557 865 1464T973 1201Q973 1139 960 1090T912 985T866 896T855 824Q855 780 887 738T1009 622T1138 480T1179 336Q1179 165 1071 73T764 -20Q684 -20 599 -1T475
44L524 239Q569 211 632 193T750 174Q847 174 892 217T937 327Q937 376 902 421T780 535T653 671T612 819Q612 907 675 1007T738 1185Q738 1266 692 1314T566 1363Q382 1363 378 1116V0Z" />
<glyph unicode="&#xe0;" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978
738V250Q978 104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175ZM694 1233H492L222 1536H499L694 1233Z" />
<glyph unicode="&#xe1;" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978
738V250Q978 104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175ZM639 1536H916L639 1233H444L639 1536Z" />
<glyph unicode="&#xe2;" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978
738V250Q978 104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175ZM912 1259V1248H717L567 1404L418 1248H225V1261L496 1537H639L912 1259Z" />
<glyph unicode="&#xe3;" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978
738V250Q978 104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175ZM934 1514Q934 1404 871 1331T711 1258Q672 1258 644 1266T563 1305T489 1341T441 1347Q403 1347 377 1319T350 1244L201 1252Q201
1362 264 1437T423 1512Q480 1512 560 1467T693 1422Q731 1422 758 1450T785 1526L934 1514Z" />
<glyph unicode="&#xe4;" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978
738V250Q978 104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175ZM213 1366Q213 1416 246 1450T339 1484T432 1450T466 1366T432 1282T339 1248T247 1282T213 1366ZM669 1365Q669 1415 703 1449T796
1483T889 1449T923 1365T889 1281T796 1247T703 1281T669 1365Z" />
<glyph unicode="&#xe5;" horiz-adv-x="1108" d="M771 0Q755 31 743 101Q627 -20 459 -20Q296 -20 193 73T90 303Q90 476 218 568T586 661H735V732Q735 816 688 866T545 917Q462 917 409 876T356 770H113Q113 859 172 936T332 1058T559 1102Q749 1102 862 1007T978
738V250Q978 104 1019 17V0H771ZM504 175Q576 175 639 210T735 304V508H604Q469 508 401 461T333 328Q333 258 379 217T504 175ZM568 1630Q661 1630 725 1569T789 1422T727 1277T568 1217Q471 1217 409 1277T346 1422T409 1568T568 1630ZM456 1422Q456 1375 489
1343T568 1310Q615 1310 647 1342T680 1422Q680 1468 649 1501T568 1535T488 1502T456 1422Z" />
<glyph unicode="&#xe6;" horiz-adv-x="1729" d="M1254 -20Q1001 -20 861 141Q796 64 689 22T448 -20Q272 -20 172 68T72 312Q72 470 191 556T543 642H734V713Q734 804 687 855T551 907Q460 907 403 863T345 752L103 771Q103 917 229 1009T553 1102Q776 1102 887
969Q1018 1104 1218 1102Q1430 1102 1549 973T1668 608V471H973Q982 332 1058 253T1268 174Q1405 174 1512 232L1573 266L1646 100Q1576 44 1472 12T1254 -20ZM495 164Q553 164 621 193T734 266V475H538Q434 473 374 426T314 308Q314 243 360 204T495 164ZM1218
907Q1119 907 1056 838T976 642H1428V672Q1428 785 1374 846T1218 907Z" />
<glyph unicode="&#xe7;" horiz-adv-x="1072" d="M569 174Q660 174 720 227T784 358H1013Q1009 257 950 170T790 31T572 -20Q345 -20 212 127T79 533V558Q79 805 211 953T571 1102Q764 1102 885 990T1013 694H784Q780 787 721 847T569 907Q451 907 387 822T322
562V523Q322 347 385 261T569 174ZM635 -2L624 -56Q774 -83 774 -229Q774 -334 688 -393T447 -452L440 -315Q506 -315 541 -292T577 -226Q577 -181 542 -164T426 -141L458 -2H635Z" />
<glyph unicode="&#xe8;" horiz-adv-x="1099" d="M601 -20Q370 -20 227 125T83 513V543Q83 705 145 832T321 1031T573 1102Q794 1102 914 961T1035 562V464H328Q339 330 417 252T615 174Q782 174 887 309L1018 184Q953 87 845 34T601 -20ZM572 907Q472 907 411
837T332 642H795V660Q787 782 730 844T572 907ZM682 1233H480L210 1536H487L682 1233Z" />
<glyph unicode="&#xe9;" horiz-adv-x="1099" d="M601 -20Q370 -20 227 125T83 513V543Q83 705 145 832T321 1031T573 1102Q794 1102 914 961T1035 562V464H328Q339 330 417 252T615 174Q782 174 887 309L1018 184Q953 87 845 34T601 -20ZM572 907Q472 907 411
837T332 642H795V660Q787 782 730 844T572 907ZM627 1536H904L627 1233H432L627 1536Z" />
<glyph unicode="&#xea;" horiz-adv-x="1099" d="M601 -20Q370 -20 227 125T83 513V543Q83 705 145 832T321 1031T573 1102Q794 1102 914 961T1035 562V464H328Q339 330 417 252T615 174Q782 174 887 309L1018 184Q953 87 845 34T601 -20ZM572 907Q472 907 411
837T332 642H795V660Q787 782 730 844T572 907ZM900 1259V1248H705L555 1404L406 1248H213V1261L484 1537H627L900 1259Z" />
<glyph unicode="&#xeb;" horiz-adv-x="1099" d="M601 -20Q370 -20 227 125T83 513V543Q83 705 145 832T321 1031T573 1102Q794 1102 914 961T1035 562V464H328Q339 330 417 252T615 174Q782 174 887 309L1018 184Q953 87 845 34T601 -20ZM572 907Q472 907 411
837T332 642H795V660Q787 782 730 844T572 907ZM201 1366Q201 1416 234 1450T327 1484T420 1450T454 1366T420 1282T327 1248T235 1282T201 1366ZM657 1365Q657 1415 691 1449T784 1483T877 1449T911 1365T877 1281T784 1247T691 1281T657 1365Z" />
<glyph unicode="&#xec;" horiz-adv-x="538" d="M386 0H143V1082H386V0ZM652 1482H450L180 1785H457L652 1482Z" />
<glyph unicode="&#xed;" horiz-adv-x="538" d="M386 0H143V1082H386V0ZM340 1785H617L340 1482H145L340 1785Z" />
<glyph unicode="&#xee;" horiz-adv-x="538" d="M386 0H143V1082H386V0ZM614 1252V1241H419L269 1397L120 1241H-73V1254L198 1530H341L614 1252Z" />
<glyph unicode="&#xef;" horiz-adv-x="538" d="M386 0H143V1082H386V0ZM-85 1359Q-85 1409 -52 1443T41 1477T134 1443T168 1359T134 1275T41 1241T-51 1275T-85 1359ZM371 1358Q371 1408 405 1442T498 1476T591 1442T625 1358T591 1274T498 1240T405 1274T371 1358Z" />
<glyph unicode="&#xf0;" horiz-adv-x="1191" d="M834 1303Q1088 1038 1088 637V555Q1088 389 1025 258T848 53T593 -20Q455 -20 342 43T166 219T103 468Q103 617 159 732T319 910T554 973Q700 973 813 882Q764 1051 638 1173L434 1038L356 1147L528 1261Q402 1343
240 1385L315 1580Q553 1530 730 1395L910 1515L988 1406L834 1303ZM845 663L844 681Q812 729 751 757T611 785Q485 785 416 701T346 468Q346 342 416 258T597 174Q708 174 776 274T845 547V663Z" />
<glyph unicode="&#xf1;" horiz-adv-x="1139" d="M350 1082L357 957Q477 1102 672 1102Q1010 1102 1016 715V0H773V701Q773 804 729 853T583 903Q436 903 364 770V0H121V1082H350ZM940 1514Q940 1404 877 1331T717 1258Q678 1258 650 1266T569 1305T495 1341T447
1347Q409 1347 383 1319T356 1244L207 1252Q207 1362 270 1437T429 1512Q486 1512 566 1467T699 1422Q737 1422 764 1450T791 1526L940 1514Z" />
<glyph unicode="&#xf2;" horiz-adv-x="1166" d="M79 551Q79 710 142 837T319 1033T581 1102Q800 1102 936 961T1084 587L1085 530Q1085 370 1024 244T848 49T583 -20Q354 -20 217 132T79 539V551ZM322 530Q322 363 391 269T583 174T774 270T843 551Q843 715 773
811T581 907Q462 907 392 813T322 530ZM703 1233H501L231 1536H508L703 1233Z" />
<glyph unicode="&#xf3;" horiz-adv-x="1166" d="M79 551Q79 710 142 837T319 1033T581 1102Q800 1102 936 961T1084 587L1085 530Q1085 370 1024 244T848 49T583 -20Q354 -20 217 132T79 539V551ZM322 530Q322 363 391 269T583 174T774 270T843 551Q843 715 773
811T581 907Q462 907 392 813T322 530ZM648 1536H925L648 1233H453L648 1536Z" />
<glyph unicode="&#xf4;" horiz-adv-x="1166" d="M79 551Q79 710 142 837T319 1033T581 1102Q800 1102 936 961T1084 587L1085 530Q1085 370 1024 244T848 49T583 -20Q354 -20 217 132T79 539V551ZM322 530Q322 363 391 269T583 174T774 270T843 551Q843 715 773
811T581 907Q462 907 392 813T322 530ZM921 1259V1248H726L576 1404L427 1248H234V1261L505 1537H648L921 1259Z" />
<glyph unicode="&#xf5;" horiz-adv-x="1166" d="M79 551Q79 710 142 837T319 1033T581 1102Q800 1102 936 961T1084 587L1085 530Q1085 370 1024 244T848 49T583 -20Q354 -20 217 132T79 539V551ZM322 530Q322 363 391 269T583 174T774 270T843 551Q843 715 773
811T581 907Q462 907 392 813T322 530ZM943 1514Q943 1404 880 1331T720 1258Q681 1258 653 1266T572 1305T498 1341T450 1347Q412 1347 386 1319T359 1244L210 1252Q210 1362 273 1437T432 1512Q489 1512 569 1467T702 1422Q740 1422 767 1450T794 1526L943 1514Z"
/>
<glyph unicode="&#xf6;" horiz-adv-x="1166" d="M79 551Q79 710 142 837T319 1033T581 1102Q800 1102 936 961T1084 587L1085 530Q1085 370 1024 244T848 49T583 -20Q354 -20 217 132T79 539V551ZM322 530Q322 363 391 269T583 174T774 270T843 551Q843 715 773
811T581 907Q462 907 392 813T322 530ZM222 1366Q222 1416 255 1450T348 1484T441 1450T475 1366T441 1282T348 1248T256 1282T222 1366ZM678 1365Q678 1415 712 1449T805 1483T898 1449T932 1365T898 1281T805 1247T712 1281T678 1365Z" />
<glyph unicode="&#xf7;" horiz-adv-x="1169" d="M1079 582H67V794H1079V582ZM576 1228Q644 1228 681 1190T718 1095T681 1001T576 963Q509 963 472 1000T435 1095T472 1190T576 1228ZM435 278Q435 336 472 374T576 412Q644 412 681 374T718 278Q718 221 681 184T576
147Q509 147 472 184T435 278Z" />
<glyph unicode="&#xf8;" horiz-adv-x="1160" d="M79 551Q79 710 142 837T319 1033T581 1102Q687 1102 775 1068L846 1211H991L889 1003Q1085 850 1085 530Q1085 370 1024 244T848 49T583 -20Q490 -20 400 10L328 -137H183L285 70Q79 220 79 551ZM322 530Q322 374
386 276L685 885Q638 907 581 907Q462 907 392 813T322 530ZM843 551Q843 699 785 792L489 191Q532 174 583 174Q706 174 774 270T843 551Z" />
<glyph unicode="&#xf9;" horiz-adv-x="1138" d="M780 106Q673 -20 476 -20Q300 -20 210 83T119 381V1082H362V384Q362 178 533 178Q710 178 772 305V1082H1015V0H786L780 106ZM696 1233H494L224 1536H501L696 1233Z" />
<glyph unicode="&#xfa;" horiz-adv-x="1138" d="M780 106Q673 -20 476 -20Q300 -20 210 83T119 381V1082H362V384Q362 178 533 178Q710 178 772 305V1082H1015V0H786L780 106ZM641 1536H918L641 1233H446L641 1536Z" />
<glyph unicode="&#xfb;" horiz-adv-x="1138" d="M780 106Q673 -20 476 -20Q300 -20 210 83T119 381V1082H362V384Q362 178 533 178Q710 178 772 305V1082H1015V0H786L780 106ZM914 1259V1248H719L569 1404L420 1248H227V1261L498 1537H641L914 1259Z" />
<glyph unicode="&#xfc;" horiz-adv-x="1138" d="M780 106Q673 -20 476 -20Q300 -20 210 83T119 381V1082H362V384Q362 178 533 178Q710 178 772 305V1082H1015V0H786L780 106ZM215 1366Q215 1416 248 1450T341 1484T434 1450T468 1366T434 1282T341 1248T249 1282T215
1366ZM671 1365Q671 1415 705 1449T798 1483T891 1449T925 1365T891 1281T798 1247T705 1281T671 1365Z" />
<glyph unicode="&#xfd;" horiz-adv-x="997" d="M503 348L723 1082H982L552 -164Q453 -437 216 -437Q163 -437 99 -419V-231L145 -234Q237 -234 283 -201T357 -88L392 5L12 1082H274L503 348ZM585 1536H862L585 1233H390L585 1536Z" />
<glyph unicode="&#xfe;" horiz-adv-x="1175" d="M1079 530Q1079 283 966 132T658 -20Q480 -20 373 97V-416H130V1536H373V983Q479 1102 655 1102Q852 1102 965 955T1079 546V530ZM836 551Q836 717 771 810T587 903Q438 903 373 780V300Q439 174 589 174Q705 174
770 267T836 551Z" />
<glyph unicode="&#xff;" horiz-adv-x="997" d="M503 348L723 1082H982L552 -164Q453 -437 216 -437Q163 -437 99 -419V-231L145 -234Q237 -234 283 -201T357 -88L392 5L12 1082H274L503 348ZM159 1366Q159 1416 192 1450T285 1484T378 1450T412 1366T378 1282T285
1248T193 1282T159 1366ZM615 1365Q615 1415 649 1449T742 1483T835 1449T869 1365T835 1281T742 1247T649 1281T615 1365Z" />
<glyph unicode="&#x2013;" horiz-adv-x="1321" d="M1432 621H414V817H1432V621Z" />
<glyph unicode="&#x2014;" horiz-adv-x="1584" d="M1744 621H386V817H1744V621Z" />
<glyph unicode="&#x2018;" horiz-adv-x="448" d="M282 1562L406 1485Q315 1352 312 1208V1056H99V1194Q100 1290 151 1394T282 1562Z" />
<glyph unicode="&#x2019;" horiz-adv-x="444" d="M175 1024L51 1101Q141 1232 144 1378V1536H357V1398Q357 1295 305 1191T175 1024Z" />
<glyph unicode="&#x201a;" horiz-adv-x="462" d="M173 -298L50 -220Q135 -93 138 55V202H356V69Q355 -24 304 -128T173 -298Z" />
<glyph unicode="&#x201c;" horiz-adv-x="788" d="M291 1562L415 1485Q324 1352 321 1208V1056H108V1194Q109 1290 160 1394T291 1562ZM627 1562L751 1485Q660 1352 657 1208V1056H444V1194Q445 1290 496 1394T627 1562Z" />
<glyph unicode="&#x201d;" horiz-adv-x="795" d="M188 1024L64 1101Q154 1232 157 1378V1536H370V1398Q370 1295 318 1191T188 1024ZM522 1024L398 1101Q488 1232 491 1378V1536H704V1398Q704 1295 652 1191T522 1024Z" />
<glyph unicode="&#x201e;" horiz-adv-x="776" d="M177 -318L50 -240Q135 -103 138 54V255H356V69Q355 -39 300 -153Q251 -253 177 -318ZM499 -318L372 -240Q460 -98 464 52V255H682V73Q682 -26 631 -136T499 -318Z" />
<glyph unicode="&#x2022;" horiz-adv-x="715" d="M136 771Q136 866 196 926T357 987Q460 987 520 927T580 768V731Q580 637 521 578T358 518Q259 518 199 575T136 726V771Z" />
<glyph unicode="&#x2039;" horiz-adv-x="626" d="M316 537L563 138H396L108 528V547L396 937H563L316 537Z" />
<glyph unicode="&#x203a;" horiz-adv-x="617" d="M251 937L539 547V528L251 138H84L331 537L84 937H251Z" />
</font>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 48 KiB

View file

@ -5,9 +5,9 @@
@keydown.j = "playNext"
@keydown.k = "playPrev"
@keydown.f = "search"
@keydown.177 = "playPrev"
@keydown.176 = "playNext"
@keydown.179 = "togglePlayback"
@keydown.mediaPrev = "playPrev"
@keydown.mediaNext = "playNext"
@keydown.mediaToggle = "togglePlayback"
>
<site-header></site-header>
<main-wrapper></main-wrapper>
@ -33,10 +33,11 @@ import overlay from './components/shared/overlay.vue';
import loginForm from './components/auth/login-form.vue';
import editSongsForm from './components/modals/edit-songs-form.vue';
import { event, showOverlay, hideOverlay, loadMainView, forceReloadWindow } from './utils';
import { sharedStore, queueStore, songStore, userStore, preferenceStore as preferences } from './stores';
import { event, showOverlay, hideOverlay, forceReloadWindow, url } from './utils';
import { sharedStore, songStore, userStore, preferenceStore as preferences } from './stores';
import { playback, ls } from './services';
import { focusDirective, clickawayDirective } from './directives';
import router from './router';
export default {
components: { siteHeader, siteFooter, mainWrapper, overlay, loginForm, editSongsForm },
@ -58,6 +59,9 @@ export default {
// Create the element to be the ghost drag image.
$('<div id="dragGhost"></div>').appendTo('body');
// And the textarea to copy stuff
$('<textarea id="copyArea"></textarea>').appendTo('body');
// Add an ugly mac/non-mac class for OS-targeting styles.
// I'm crying inside.
$('html').addClass(navigator.userAgent.indexOf('Mac') !== -1 ? 'mac' : 'non-mac');
@ -73,9 +77,6 @@ export default {
playback.init();
hideOverlay();
// Load the default view.
loadMainView('home');
// Ask for user's notification permission.
this.requestNotifPermission();
@ -85,6 +86,8 @@ export default {
return;
}
// Notice that a custom message like this has ceased to be supported
// starting from Chrome 51.
return 'You asked Koel to confirm before closing, so here it is.';
};
@ -190,10 +193,28 @@ export default {
forceReloadWindow();
});
},
/**
* Init our basic, custom router on ready to determine app state.
*/
'koel:ready': () => {
router.init();
},
});
},
};
// Register our custom key codes
Vue.config.keyCodes = {
a: 65,
j: 74,
k: 75,
f: 70,
mediaNext: 176,
mediaPrev: 177,
mediaToggle: 179
};
// and the global directives
Vue.directive('koel-focus', focusDirective);
Vue.directive('koel-clickaway',clickawayDirective);
@ -224,6 +245,17 @@ Vue.directive('koel-clickaway',clickawayDirective);
}
}
#copyArea {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
html.touchevents & {
display: none;
}
}
#main, .login-wrapper {
display: flex;
min-height: 100vh;

View file

@ -51,14 +51,13 @@ export default {
};
},
methods: {
/**
* Reset the component's current state.
*/
resetState() {
watch: {
album() {
this.showingFullWiki = false;
},
},
methods: {
/**
* Shuffle all songs in the current album.
*/

View file

@ -41,14 +41,13 @@ export default {
};
},
methods: {
/**
* Reset the component's current state.
*/
resetState() {
watch: {
artist() {
this.showingFullBio = false;
},
},
methods: {
/**
* Shuffle all songs performed by the current song's artist.
*/

View file

@ -8,6 +8,9 @@
:class="{ active: currentView === 'artistInfo' }">Artist</a>
<a @click.prevent="currentView = 'albumInfo'"
:class="{ active: currentView === 'albumInfo' }">Album</a>
<a @click.prevent="currentView = 'youtube'"
v-if="sharedState.useYouTube"
:class="{ active: currentView === 'youtube' }"><i class="fa fa-youtube-play"></i></a>
</div>
<div class="panes">
@ -24,6 +27,11 @@
ref="album-info"
v-show="currentView === 'albumInfo'">
</album-info>
<youtube v-if="sharedState.useYouTube"
:song="song" :youtube="song.youtube"
ref="youtube"
v-show="currentView === 'youtube'">
</youtube>
</div>
</div>
</section>
@ -35,21 +43,23 @@ import { invokeMap } from 'lodash';
import $ from 'jquery';
import { event } from '../../../utils';
import { songStore, preferenceStore as preferences } from '../../../stores';
import { sharedStore, songStore, preferenceStore as preferences } from '../../../stores';
import { songInfo } from '../../../services';
import lyrics from './lyrics.vue';
import artistInfo from './artist-info.vue';
import albumInfo from './album-info.vue';
import youtube from './youtube.vue';
export default {
name: 'main-wrapper--extra--index',
components: { lyrics, artistInfo, albumInfo },
components: { lyrics, artistInfo, albumInfo, youtube },
data() {
return {
song: songStore.stub,
state: preferences.state,
sharedState: sharedStore.state,
currentView: 'lyrics',
};
},
@ -89,7 +99,6 @@ export default {
resetState() {
this.currentView = 'lyrics';
this.song = songStore.stub;
invokeMap(this.$refs, 'resetState');
},
},
@ -102,7 +111,11 @@ export default {
}
},
'song:played': song => songInfo.fetch(this.song = song),
'song:played': song => {
songInfo.fetch(song).then(song => {
this.song = song;
});
},
'koel:teardown': () => this.resetState(),
});

View file

@ -10,10 +10,6 @@
<script>
export default {
props: ['song'],
methods: {
resetState() {},
},
};
</script>

View file

@ -0,0 +1,93 @@
<template>
<div id="youtube-wrapper">
<template v-if="videos && videos.length">
<a class="video" v-for="video in videos" href="#" @click.prevent="playYouTube(video.id.videoId)">
<div class="thumb">
<img :src="video.snippet.thumbnails.default.url" width="90">
</div>
<div class="meta">
<h3 class="title">{{ video.snippet.title }}</h3>
<p class="desc">{{ video.snippet.description }}</p>
</div>
</a>
<button @click="loadMore" v-if="!loading" class="more btn-blue">Load More</button>
</template>
<p class="nope" v-else>Play a song to retreive related YouTube videos.</p>
<p class="nope" v-show="loading">Loading</p>
</div>
</template>
<script>
import { event } from '../../../utils';
import { youtube as youtubeService } from '../../../services';
export default {
name: 'main-wrapper--extra--youtube',
props: ['song'],
data() {
return {
loading: false,
videos: [],
};
},
watch: {
song(val) {
this.videos = val.youtube ? val.youtube.items : [];
},
},
methods: {
playYouTube(id) {
youtubeService.play(id);
},
/**
* Load more videos.
*/
loadMore() {
this.loading = true;
youtubeService.searchVideosRelatedToSong(this.song, () => {
this.videos = this.song.youtube.items;
this.loading = false;
});
},
},
};
</script>
<style lang="sass" scoped>
#youtube-wrapper {
overflow-x: hidden;
.video {
display: flex;
padding: 12px 0;
border-bottom: 1px solid #333;
.thumb {
margin-right: 10px;
}
.title {
font-size: 1.1rem;
margin-bottom: .4rem;
}
.desc {
font-size: .9rem;
}
&:hover {
.title {
color: #fff;
}
}
&:last-of-type {
margin-bottom: 16px;
}
}
}
</style>

View file

@ -13,7 +13,7 @@
<span class="meta" v-show="meta.songCount">
by
<a class="artist" v-if="isNormalArtist" @click.prevent="viewArtistDetails(album.artist)">{{ album.artist.name }}</a>
<a class="artist" v-if="isNormalArtist" :href="'/#!/artist/' + album.artist.id">{{ album.artist.name }}</a>
<span class="nope" v-else>{{ album.artist.name }}</span>
{{ meta.songCount | pluralize('song') }}
@ -63,17 +63,17 @@
<script>
import isMobile from 'ismobilejs';
import { pluralize, event, loadMainView } from '../../../utils';
import { pluralize, event } from '../../../utils';
import { albumStore, artistStore, sharedStore } from '../../../stores';
import { playback, download, albumInfo as albumInfoService } from '../../../services';
import router from '../../../router';
import hasSongList from '../../../mixins/has-song-list';
import artistAlbumDetails from '../../../mixins/artist-album-details';
import albumInfo from '../extra/album-info.vue';
import soundBar from '../../shared/sound-bar.vue';
export default {
name: 'main-wrapper--main-content--album',
mixins: [hasSongList, artistAlbumDetails],
mixins: [hasSongList],
components: { albumInfo, soundBar },
filters: { pluralize },
@ -104,9 +104,9 @@ export default {
* and move all of them into another album.
* We should then go back to the album list.
*/
'album.songs.length': function (newVal) {
'album.songs.length' (newVal) {
if (!newVal) {
loadMainView('albums');
router.go('albums');
}
},
},

View file

@ -62,9 +62,10 @@
<script>
import isMobile from 'ismobilejs';
import { pluralize, event, loadMainView } from '../../../utils';
import { pluralize, event } from '../../../utils';
import { sharedStore, artistStore } from '../../../stores';
import { playback, download, artistInfo as artistInfoService } from '../../../services';
import router from '../../../router';
import hasSongList from '../../../mixins/has-song-list';
import artistInfo from '../extra/artist-info.vue';
import soundBar from '../../shared/sound-bar.vue';
@ -95,9 +96,9 @@ export default {
* and move all of them to another artist (thus delete this artist entirely).
* We should then go back to the artist list.
*/
'artist.albums.length': function (newVal) {
'artist.albums.length' (newVal) {
if (!newVal) {
loadMainView('artists');
router.go('artists');
}
},
},

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