diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 00000000..3c44241c
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/.env.example b/.env.example
index db3e5175..bbad988d 100644
--- a/.env.example
+++ b/.env.example
@@ -1,46 +1,52 @@
-APP_NAME=Laravel
+APP_NAME="PixelFed Test"
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
+ADMIN_DOMAIN="localhost"
+APP_DOMAIN="localhost"
+
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
-DB_DATABASE=homestead
-DB_USERNAME=homestead
-DB_PASSWORD=secret
+DB_DATABASE=
+DB_USERNAME=
+DB_PASSWORD=
BROADCAST_DRIVER=log
-CACHE_DRIVER=file
-SESSION_DRIVER=file
+CACHE_DRIVER=redis
+SESSION_DRIVER=redis
SESSION_LIFETIME=120
-QUEUE_DRIVER=sync
+QUEUE_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
-MAIL_DRIVER=smtp
+MAIL_DRIVER=log
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS="pixelfed@example.com"
+MAIL_FROM_NAME="Pixelfed"
-PUSHER_APP_ID=
-PUSHER_APP_KEY=
-PUSHER_APP_SECRET=
-PUSHER_APP_CLUSTER=mt1
-
-SESSION_DOMAIN=".pixelfed.dev"
+SESSION_DOMAIN="${APP_DOMAIN}"
SESSION_SECURE_COOKIE=true
API_BASE="/api/1/"
API_SEARCH="/api/search"
OPEN_REGISTRATION=true
+RECAPTCHA_ENABLED=false
+ENFORCE_EMAIL_VERIFICATION=true
+
+MAX_PHOTO_SIZE=15000
+MAX_CAPTION_LENGTH=150
+MAX_ALBUM_LENGTH=4
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
diff --git a/Dockerfile b/Dockerfile
index c9ee294a..5a04578c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -5,7 +5,7 @@ ARG COMPOSER_CHECKSUM="67bebe9df9866a795078bb2cf21798d8b0214f2e0b2fd81f2e907a8ef
RUN apk add --no-cache --virtual .build build-base autoconf imagemagick-dev libtool && \
apk --no-cache add imagemagick git && \
- docker-php-ext-install pdo_mysql pcntl && \
+ docker-php-ext-install pdo_mysql pcntl bcmath && \
pecl install imagick && \
docker-php-ext-enable imagick pcntl imagick && \
curl -LsS https://getcomposer.org/download/${COMPOSER_VERSION}/composer.phar -o /tmp/composer.phar && \
diff --git a/README.md b/README.md
index c6ea6e00..d2679abc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,76 @@
-# PixelFed
-Federated Image Sharing
+# PixelFed: Federated Image Sharing
-> This project is still in active development and not yet ready for use.
\ No newline at end of file
+PixelFed is a federated social image sharing platform, similar to Instagram.
+Federation is done using the [ActivityPub](https://activitypub.rocks/) protocol,
+which is used by [Mastodon](http://joinmastodon.org/), [PeerTube](https://joinpeertube.org/en/),
+[Pleroma](https://pleroma.social/), and more. Through ActivityPub PixelFed can share
+and interact with these platforms, as well as other instances of PixelFed.
+
+**_Please note this is alpha software, not recommended for production use,
+and federation is not supported yet._**
+
+PixelFed is very early into the development stage. If you would like to have a
+permanent instance with minimal breakage, **do not use this software until
+there is a stable release**. The following setup instructions are intended for
+testing and development.
+
+## Requirements
+ - PHP >= 7.1.3 (7.2+ recommended for stable version)
+ - MySQL >= 5.7, Postgres (MariaDB and sqlite are not supported yet)
+ - Redis
+ - Composer
+ - GD or ImageMagick
+ - OpenSSL PHP Extension
+ - PDO PHP Extension
+ - Mbstring PHP Extension
+ - Tokenizer PHP Extension
+ - XML PHP Extension
+ - Ctype PHP Extension
+ - JSON PHP Extension
+ - JpegOptim
+ - Optipng
+ - Pngquant 2
+ - SVGO
+ - Gifsicle
+
+## Installation
+
+This guide assumes you have NGINX/Apache installed, along with the dependencies.
+Those will not be covered in these early docs.
+
+```bash
+git clone https://github.com/dansup/pixelfed.git
+cd pixelfed
+composer install
+cp .env.example .env
+```
+
+**Edit .env file with proper values**
+
+```bash
+php artisan key:generate
+```
+
+```bash
+php artisan storage:link
+php artisan migrate
+php artisan horizon
+php artisan serve --host=localhost --port=80
+```
+
+Check your browser at http://localhost
+
+## Communication
+
+The ways you can communicate on the project are below. Before interacting, please
+read through the [Code Of Conduct](CODE_OF_CONDUCT.md).
+
+* IRC: #pixelfed on irc.freenode.net ([#freenode_#pixelfed:matrix.org through
+Matrix](https://matrix.to/#/#freenode_#pixelfed:matrix.org)
+* Project on Mastodon: [@pixelfed@mastodon.social](https://mastodon.social/@pixelfed)
+* E-mail: [hello@pixelfed.org](mailto:hello@pixelfed.org)
+
+## Support
+
+The lead maintainer is on Patreon! You can become a Patron at
+https://www.patreon.com/dansup
diff --git a/app/AccountLog.php b/app/AccountLog.php
new file mode 100644
index 00000000..f5ccedd9
--- /dev/null
+++ b/app/AccountLog.php
@@ -0,0 +1,10 @@
+user_token . '/' . $this->random_token;
+ return "{$base}{$path}";
+ }
+}
diff --git a/app/Events/AuthLoginEvent.php b/app/Events/AuthLoginEvent.php
new file mode 100644
index 00000000..946cbe09
--- /dev/null
+++ b/app/Events/AuthLoginEvent.php
@@ -0,0 +1,36 @@
+settings)) {
+ $settings = new UserSetting;
+ $settings->user_id = $user->id;
+ $settings->save();
+ }
+ }
+}
diff --git a/app/Hashtag.php b/app/Hashtag.php
index 497bc94e..6314accc 100644
--- a/app/Hashtag.php
+++ b/app/Hashtag.php
@@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Model;
class Hashtag extends Model
{
- protected $fillable = ['name','slug'];
+ public $fillable = ['name','slug'];
public function posts()
{
diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php
index 4a0b5bd5..76a47e93 100644
--- a/app/Http/Controllers/AccountController.php
+++ b/app/Http/Controllers/AccountController.php
@@ -3,11 +3,24 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
-use Auth, Cache, Redis;
-use App\{Notification, Profile, User};
+use Carbon\Carbon;
+use App\Mail\ConfirmEmail;
+use Auth, DB, Cache, Mail, Redis;
+use App\{
+ EmailVerification,
+ Notification,
+ Profile,
+ User,
+ UserFilter
+};
class AccountController extends Controller
{
+ protected $filters = [
+ 'user.mute',
+ 'user.block'
+ ];
+
public function __construct()
{
$this->middleware('auth');
@@ -15,13 +28,98 @@ class AccountController extends Controller
public function notifications(Request $request)
{
+ $this->validate($request, [
+ 'page' => 'nullable|min:1|max:3',
+ 'a' => 'nullable|alpha_dash',
+ ]);
$profile = Auth::user()->profile;
- //$notifications = $this->fetchNotifications($profile->id);
- $notifications = Notification::whereProfileId($profile->id)
- ->orderBy('id','desc')->take(30)->simplePaginate();
+ $action = $request->input('a');
+ $timeago = Carbon::now()->subMonths(6);
+ if($action && in_array($action, ['comment', 'follow', 'mention'])) {
+ $notifications = Notification::whereProfileId($profile->id)
+ ->whereAction($action)
+ ->whereDate('created_at', '>', $timeago)
+ ->orderBy('id','desc')
+ ->simplePaginate(30);
+ } else {
+ $notifications = Notification::whereProfileId($profile->id)
+ ->whereDate('created_at', '>', $timeago)
+ ->orderBy('id','desc')
+ ->simplePaginate(30);
+ }
+
return view('account.activity', compact('profile', 'notifications'));
}
+ public function followingActivity(Request $request)
+ {
+ $this->validate($request, [
+ 'page' => 'nullable|min:1|max:3',
+ 'a' => 'nullable|alpha_dash',
+ ]);
+ $profile = Auth::user()->profile;
+ $action = $request->input('a');
+ $timeago = Carbon::now()->subMonths(1);
+ $following = $profile->following->pluck('id');
+ $notifications = Notification::whereIn('actor_id', $following)
+ ->where('profile_id', '!=', $profile->id)
+ ->whereDate('created_at', '>', $timeago)
+ ->orderBy('notifications.id','desc')
+ ->simplePaginate(30);
+
+ return view('account.following', compact('profile', 'notifications'));
+ }
+
+ public function verifyEmail(Request $request)
+ {
+ return view('account.verify_email');
+ }
+
+ public function sendVerifyEmail(Request $request)
+ {
+ $timeLimit = Carbon::now()->subDays(1)->toDateTimeString();
+ $recentAttempt = EmailVerification::whereUserId(Auth::id())
+ ->where('created_at', '>', $timeLimit)->count();
+ $exists = EmailVerification::whereUserId(Auth::id())->count();
+
+ if($recentAttempt == 1 && $exists == 1) {
+ return redirect()->back()->with('error', 'A verification email has already been sent recently. Please check your email, or try again later.');
+ } elseif ($recentAttempt == 0 && $exists !== 0) {
+ // Delete old verification and send new one.
+ EmailVerification::whereUserId(Auth::id())->delete();
+ }
+
+
+ $user = User::whereNull('email_verified_at')->find(Auth::id());
+ $utoken = hash('sha512', $user->id);
+ $rtoken = str_random(40);
+
+ $verify = new EmailVerification;
+ $verify->user_id = $user->id;
+ $verify->email = $user->email;
+ $verify->user_token = $utoken;
+ $verify->random_token = $rtoken;
+ $verify->save();
+
+ Mail::to($user->email)->send(new ConfirmEmail($verify));
+
+ return redirect()->back()->with('status', 'Verification email sent!');
+ }
+
+ public function confirmVerifyEmail(Request $request, $userToken, $randomToken)
+ {
+ $verify = EmailVerification::where('user_token', $userToken)
+ ->where('random_token', $randomToken)
+ ->firstOrFail();
+
+ if(Auth::id() === $verify->user_id) {
+ $user = User::find(Auth::id());
+ $user->email_verified_at = Carbon::now();
+ $user->save();
+ return redirect('/');
+ }
+ }
+
public function fetchNotifications($id)
{
$key = config('cache.prefix') . ":user.{$id}.notifications";
@@ -46,4 +144,98 @@ class AccountController extends Controller
}
return $notifications;
}
+
+ public function messages()
+ {
+ return view('account.messages');
+ }
+
+
+ public function showMessage(Request $request, $id)
+ {
+ return view('account.message');
+ }
+
+ public function mute(Request $request)
+ {
+ $this->validate($request, [
+ 'type' => 'required|string',
+ 'item' => 'required|integer|min:1'
+ ]);
+
+ $user = Auth::user()->profile;
+ $type = $request->input('type');
+ $item = $request->input('item');
+ $action = "{$type}.mute";
+
+ if(!in_array($action, $this->filters)) {
+ return abort(406);
+ }
+ $filterable = [];
+ switch ($type) {
+ case 'user':
+ $profile = Profile::findOrFail($item);
+ if($profile->id == $user->id) {
+ return abort(403);
+ }
+ $class = get_class($profile);
+ $filterable['id'] = $profile->id;
+ $filterable['type'] = $class;
+ break;
+
+ default:
+ # code...
+ break;
+ }
+
+ $filter = UserFilter::firstOrCreate([
+ 'user_id' => $user->id,
+ 'filterable_id' => $filterable['id'],
+ 'filterable_type' => $filterable['type'],
+ 'filter_type' => 'mute'
+ ]);
+
+ return redirect()->back();
+
+ }
+
+ public function block(Request $request)
+ {
+ $this->validate($request, [
+ 'type' => 'required|string',
+ 'item' => 'required|integer|min:1'
+ ]);
+
+ $user = Auth::user()->profile;
+ $type = $request->input('type');
+ $item = $request->input('item');
+ $action = "{$type}.block";
+ if(!in_array($action, $this->filters)) {
+ return abort(406);
+ }
+ $filterable = [];
+ switch ($type) {
+ case 'user':
+ $profile = Profile::findOrFail($item);
+ $class = get_class($profile);
+ $filterable['id'] = $profile->id;
+ $filterable['type'] = $class;
+ break;
+
+ default:
+ # code...
+ break;
+ }
+
+ $filter = UserFilter::firstOrCreate([
+ 'user_id' => $user->id,
+ 'filterable_id' => $filterable['id'],
+ 'filterable_type' => $filterable['type'],
+ 'filter_type' => 'block'
+ ]);
+
+ return redirect()->back();
+
+ }
+
}
diff --git a/app/Http/Controllers/Admin/AdminReportController.php b/app/Http/Controllers/Admin/AdminReportController.php
new file mode 100644
index 00000000..0e72e7ef
--- /dev/null
+++ b/app/Http/Controllers/Admin/AdminReportController.php
@@ -0,0 +1,85 @@
+validate($request, [
+ 'action' => 'required|string'
+ ]);
+
+ $action = $request->input('action');
+
+ $actions = [
+ 'ignore',
+ 'cw',
+ 'unlist',
+ 'delete',
+ 'shadowban',
+ 'ban'
+ ];
+
+ if(!in_array($action, $actions)) {
+ return abort(403);
+ }
+
+ $report = Report::findOrFail($id);
+
+ $this->handleReportAction($report, $action);
+
+ return response()->json(['msg'=> 'Success']);
+ }
+
+ public function handleReportAction(Report $report, $action)
+ {
+ $item = $report->reported();
+ $report->admin_seen = Carbon::now();
+
+ switch ($action) {
+ case 'ignore':
+ $report->not_interested = true;
+ break;
+
+ case 'cw':
+ $item->is_nsfw = true;
+ $item->save();
+ $report->nsfw = true;
+ break;
+
+ case 'unlist':
+ $item->visibility = 'unlisted';
+ $item->save();
+ break;
+
+ case 'delete':
+ // Todo: fire delete job
+ $report->admin_seen = null;
+ break;
+
+ case 'shadowban':
+ // Todo: fire delete job
+ $report->admin_seen = null;
+ break;
+
+ case 'ban':
+ // Todo: fire delete job
+ $report->admin_seen = null;
+ break;
+
+ default:
+ $report->admin_seen = null;
+ break;
+ }
+
+ $report->save();
+
+ return $this;
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/Api/BaseApiController.php b/app/Http/Controllers/Api/BaseApiController.php
new file mode 100644
index 00000000..41c9f68f
--- /dev/null
+++ b/app/Http/Controllers/Api/BaseApiController.php
@@ -0,0 +1,113 @@
+middleware('auth');
+ $this->fractal = new Fractal\Manager();
+ $this->fractal->setSerializer(new ArraySerializer());
+ }
+
+ public function accounts(Request $request, $id)
+ {
+ $profile = Profile::findOrFail($id);
+ $resource = new Fractal\Resource\Item($profile, new AccountTransformer);
+ $res = $this->fractal->createData($resource)->toArray();
+ return response()->json($res, 200, [], JSON_PRETTY_PRINT);
+ }
+
+ public function accountFollowers(Request $request, $id)
+ {
+ $profile = Profile::findOrFail($id);
+ $followers = $profile->followers;
+ $resource = new Fractal\Resource\Collection($followers, new AccountTransformer);
+ $res = $this->fractal->createData($resource)->toArray();
+ return response()->json($res, 200, [], JSON_PRETTY_PRINT);
+ }
+
+ public function accountFollowing(Request $request, $id)
+ {
+ $profile = Profile::findOrFail($id);
+ $following = $profile->following;
+ $resource = new Fractal\Resource\Collection($following, new AccountTransformer);
+ $res = $this->fractal->createData($resource)->toArray();
+ return response()->json($res, 200, [], JSON_PRETTY_PRINT);
+ }
+
+ public function accountStatuses(Request $request, $id)
+ {
+ $profile = Profile::findOrFail($id);
+ $statuses = $profile->statuses()->orderBy('id', 'desc')->paginate(20);
+ $resource = new Fractal\Resource\Collection($statuses, new StatusTransformer);
+ $res = $this->fractal->createData($resource)->toArray();
+ return response()->json($res, 200, [], JSON_PRETTY_PRINT);
+ }
+
+
+ public function followSuggestions(Request $request)
+ {
+ $followers = Auth::user()->profile->recommendFollowers();
+ $resource = new Fractal\Resource\Collection($followers, new AccountTransformer);
+ $res = $this->fractal->createData($resource)->toArray();
+ return response()->json($res);
+ }
+
+ public function avatarUpdate(Request $request)
+ {
+ $this->validate($request, [
+ 'upload' => 'required|mimes:jpeg,png,gif|max:2000',
+ ]);
+ try {
+ $user = Auth::user();
+ $profile = $user->profile;
+ $file = $request->file('upload');
+ $path = (new AvatarController())->getPath($user, $file);
+ $dir = $path['root'];
+ $name = $path['name'];
+ $public = $path['storage'];
+ $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
+ $loc = $request->file('upload')->storeAs($public, $name);
+
+ $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
+ $opath = $avatar->media_path;
+ $avatar->media_path = "$public/$name";
+ $avatar->thumb_path = null;
+ $avatar->change_count = ++$avatar->change_count;
+ $avatar->last_processed_at = null;
+ $avatar->save();
+
+ Cache::forget("avatar:{$profile->id}");
+ AvatarOptimize::dispatch($user->profile, $currentAvatar);
+ } catch (Exception $e) {
+ }
+
+ return response()->json([
+ 'code' => 200,
+ 'msg' => 'Avatar successfully updated'
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/ApiController.php b/app/Http/Controllers/ApiController.php
index a596346b..e28dc3d9 100644
--- a/app/Http/Controllers/ApiController.php
+++ b/app/Http/Controllers/ApiController.php
@@ -2,16 +2,13 @@
namespace App\Http\Controllers;
-use Auth;
-use App\Like;
+use Auth, Cache;
+use App\{Like, Status};
use Illuminate\Http\Request;
+use App\Http\Controllers\Api\BaseApiController;
-class ApiController extends Controller
+class ApiController extends BaseApiController
{
- public function __construct()
- {
- $this->middleware('auth');
- }
public function hydrateLikes(Request $request)
{
@@ -21,12 +18,18 @@ class ApiController extends Controller
]);
$profile = Auth::user()->profile;
-
- $likes = Like::whereProfileId($profile->id)
+ $res = Cache::remember('api:like-ids:user:'.$profile->id, 1440, function() use ($profile) {
+ return Like::whereProfileId($profile->id)
->orderBy('id', 'desc')
->take(1000)
->pluck('status_id');
+ });
- return response()->json($likes);
+ return response()->json($res);
+ }
+
+ public function loadMoreComments(Request $request)
+ {
+ return;
}
}
diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php
index 83f844da..af596e02 100644
--- a/app/Http/Controllers/Auth/LoginController.php
+++ b/app/Http/Controllers/Auth/LoginController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\Auth;
+use App\{AccountLog, User};
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
@@ -25,7 +26,7 @@ class LoginController extends Controller
*
* @var string
*/
- protected $redirectTo = '/home';
+ protected $redirectTo = '/';
/**
* Create a new controller instance.
@@ -56,4 +57,25 @@ class LoginController extends Controller
$this->validate($request, $rules);
}
+
+ /**
+ * The user has been authenticated.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param mixed $user
+ * @return mixed
+ */
+ protected function authenticated($request, $user)
+ {
+ $log = new AccountLog;
+ $log->user_id = $user->id;
+ $log->item_id = $user->id;
+ $log->item_type = 'App\User';
+ $log->action = 'auth.login';
+ $log->message = 'Account Login';
+ $log->link = null;
+ $log->ip_address = $request->ip();
+ $log->user_agent = $request->userAgent();
+ $log->save();
+ }
}
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
index 6d6f4d53..5217a992 100644
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ b/app/Http/Controllers/Auth/RegisterController.php
@@ -51,11 +51,22 @@ class RegisterController extends Controller
protected function validator(array $data)
{
$this->validateUsername($data['username']);
-
+ $usernameRules = [
+ 'required',
+ 'alpha_dash',
+ 'min:2',
+ 'max:15',
+ 'unique:users',
+ function($attribute, $value, $fail) {
+ if(!ctype_alpha($value[0])) {
+ return $fail($attribute . ' is invalid. Username must be alpha-numeric and start with a letter.');
+ }
+ }
+ ];
$rules = [
'name' => 'required|string|max' . config('pixelfed.max_name_length'),
- 'username' => 'required|alpha_dash|min:2|max:15|unique:users',
+ 'username' => $usernameRules,
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed',
];
diff --git a/app/Http/Controllers/AvatarController.php b/app/Http/Controllers/AvatarController.php
index afb89305..3c131f2a 100644
--- a/app/Http/Controllers/AvatarController.php
+++ b/app/Http/Controllers/AvatarController.php
@@ -3,8 +3,93 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
+use Auth, Cache, Log, Storage;
+use App\Avatar;
+use App\Jobs\AvatarPipeline\AvatarOptimize;
class AvatarController extends Controller
{
- //
+ public function __construct()
+ {
+ return $this->middleware('auth');
+ }
+
+ public function store(Request $request)
+ {
+ $this->validate($request, [
+ 'avatar' => 'required|mimes:jpeg,png|max:2000'
+ ]);
+ try {
+ $user = Auth::user();
+ $profile = $user->profile;
+ $file = $request->file('avatar');
+ $path = $this->getPath($user, $file);
+ $dir = $path['root'];
+ $name = $path['name'];
+ $public = $path['storage'];
+ $currentAvatar = storage_path('app/'.$profile->avatar->media_path);
+ $loc = $request->file('avatar')->storeAs($public, $name);
+
+ $avatar = Avatar::whereProfileId($profile->id)->firstOrFail();
+ $opath = $avatar->media_path;
+ $avatar->media_path = "$public/$name";
+ $avatar->thumb_path = null;
+ $avatar->change_count = ++$avatar->change_count;
+ $avatar->last_processed_at = null;
+ $avatar->save();
+
+ Cache::forget("avatar:{$profile->id}");
+ AvatarOptimize::dispatch($user->profile, $currentAvatar);
+ } catch (Exception $e) {
+ }
+ return redirect()->back()->with('status', 'Avatar updated successfully. It may take a few minutes to update across the site.');
+ }
+
+ public function getPath($user, $file)
+ {
+ $basePath = storage_path('app/public/avatars');
+ $this->checkDir($basePath);
+
+ $id = $user->profile->id;
+ $path = $this->buildPath($id);
+ $dir = storage_path('app/'.$path);
+ $this->checkDir($dir);
+ $name = 'avatar.' . $file->guessExtension();
+ $res = ['root' => 'storage/app/' . $path, 'name' => $name, 'storage' => $path];
+
+ return $res;
+ }
+
+ public function checkDir($path)
+ {
+ if(!is_dir($path)) {
+ mkdir($path);
+ }
+ }
+
+ public function buildPath($id)
+ {
+ $padded = str_pad($id, 12, 0, STR_PAD_LEFT);
+ $parts = str_split($padded, 3);
+ foreach($parts as $k => $part) {
+ if($k == 0) {
+ $prefix = storage_path('app/public/avatars/'.$parts[0]);
+ $this->checkDir($prefix);
+ }
+ if($k == 1) {
+ $prefix = storage_path('app/public/avatars/'.$parts[0].'/'.$parts[1]);
+ $this->checkDir($prefix);
+ }
+ if($k == 2) {
+ $prefix = storage_path('app/public/avatars/'.$parts[0].'/'.$parts[1].'/'.$parts[2]);
+ $this->checkDir($prefix);
+ }
+ if($k == 3) {
+ $avatarpath = 'public/avatars/'.$parts[0].'/'.$parts[1].'/'.$parts[2].'/'.$parts[3];
+ $prefix = storage_path('app/'.$avatarpath);
+ $this->checkDir($prefix);
+ }
+ }
+ return $avatarpath;
+ }
}
diff --git a/app/Http/Controllers/BookmarkController.php b/app/Http/Controllers/BookmarkController.php
index 17c788d0..fb374dbc 100644
--- a/app/Http/Controllers/BookmarkController.php
+++ b/app/Http/Controllers/BookmarkController.php
@@ -16,23 +16,27 @@ class BookmarkController extends Controller
public function store(Request $request)
{
$this->validate($request, [
- 'item' => 'required|integer|min:1'
+ 'item' => 'required|integer|min:1'
]);
$profile = Auth::user()->profile;
$status = Status::findOrFail($request->input('item'));
$bookmark = Bookmark::firstOrCreate(
- ['status_id' => $status->id], ['profile_id' => $profile->id]
+ ['status_id' => $status->id], ['profile_id' => $profile->id]
);
+ if(!$bookmark->wasRecentlyCreated) {
+ $bookmark->delete();
+ }
+
if($request->ajax()) {
$response = ['code' => 200, 'msg' => 'Bookmark saved!'];
- } else {
+ } else {
$response = redirect()->back();
- }
+ }
- return $response;
- }
+ return $response;
+ }
}
diff --git a/app/Http/Controllers/CommentController.php b/app/Http/Controllers/CommentController.php
index 1ec7bbf4..2cfb4f4c 100644
--- a/app/Http/Controllers/CommentController.php
+++ b/app/Http/Controllers/CommentController.php
@@ -18,6 +18,14 @@ class CommentController extends Controller
return view('status.reply', compact('user', 'status'));
}
+ public function showAll(Request $request, $username, int $id)
+ {
+ $user = Profile::whereUsername($username)->firstOrFail();
+ $status = Status::whereProfileId($user->id)->findOrFail($id);
+ $replies = Status::whereInReplyToId($id)->paginate(40);
+ return view('status.comments', compact('user', 'status', 'replies'));
+ }
+
public function store(Request $request)
{
if(Auth::check() === false) { abort(403); }
@@ -34,8 +42,8 @@ class CommentController extends Controller
$reply = new Status();
$reply->profile_id = $profile->id;
- $reply->caption = $comment;
- $reply->rendered = e($comment);
+ $reply->caption = e($comment);
+ $reply->rendered = $comment;
$reply->in_reply_to_id = $status->id;
$reply->in_reply_to_profile_id = $status->profile_id;
$reply->save();
@@ -44,7 +52,7 @@ class CommentController extends Controller
CommentPipeline::dispatch($status, $reply);
if($request->ajax()) {
- $response = ['code' => 200, 'msg' => 'Comment saved', 'username' => $profile->username, 'url' => $reply->url(), 'profile' => $profile->url()];
+ $response = ['code' => 200, 'msg' => 'Comment saved', 'username' => $profile->username, 'url' => $reply->url(), 'profile' => $profile->url(), 'comment' => $reply->caption];
} else {
$response = redirect($status->url());
}
diff --git a/app/Http/Controllers/DiscoverController.php b/app/Http/Controllers/DiscoverController.php
index 8a64c937..dc3692ba 100644
--- a/app/Http/Controllers/DiscoverController.php
+++ b/app/Http/Controllers/DiscoverController.php
@@ -15,17 +15,44 @@ class DiscoverController extends Controller
public function home()
{
- $following = Follower::whereProfileId(Auth::user()->profile->id)->pluck('following_id');
- $people = Profile::inRandomOrder()->where('id', '!=', Auth::user()->profile->id)->whereNotIn('id', $following)->take(3)->get();
- $posts = Status::whereHas('media')->where('profile_id', '!=', Auth::user()->profile->id)->whereNotIn('profile_id', $following)->orderBy('created_at', 'desc')->take('21')->get();
+ $pid = Auth::user()->profile->id;
+
+ $following = Follower::whereProfileId($pid)
+ ->pluck('following_id');
+
+ $people = Profile::inRandomOrder()
+ ->where('id', '!=', $pid)
+ ->whereNotIn('id', $following)
+ ->take(3)
+ ->get();
+
+ $posts = Status::whereHas('media')
+ ->where('profile_id', '!=', $pid)
+ ->whereNotIn('profile_id', $following)
+ ->orderBy('created_at', 'desc')
+ ->simplePaginate(21);
+
return view('discover.home', compact('people', 'posts'));
}
public function showTags(Request $request, $hashtag)
{
- $tag = Hashtag::whereSlug($hashtag)->firstOrFail();
- $posts = $tag->posts()->has('media')->orderBy('id','desc')->paginate(12);
- $count = $tag->posts()->has('media')->orderBy('id','desc')->count();
- return view('discover.tags.show', compact('tag', 'posts', 'count'));
+ $this->validate($request, [
+ 'page' => 'nullable|integer|min:1|max:10'
+ ]);
+
+ $tag = Hashtag::with('posts')
+ ->withCount('posts')
+ ->whereSlug($hashtag)
+ ->firstOrFail();
+
+ $posts = $tag->posts()
+ ->whereIsNsfw(false)
+ ->whereVisibility('public')
+ ->has('media')
+ ->orderBy('id','desc')
+ ->simplePaginate(12);
+
+ return view('discover.tags.show', compact('tag', 'posts'));
}
}
diff --git a/app/Http/Controllers/FederationController.php b/app/Http/Controllers/FederationController.php
index 29711945..376cad61 100644
--- a/app/Http/Controllers/FederationController.php
+++ b/app/Http/Controllers/FederationController.php
@@ -2,8 +2,9 @@
namespace App\Http\Controllers;
-use Auth;
+use Auth, Cache;
use App\Profile;
+use Carbon\Carbon;
use League\Fractal;
use Illuminate\Http\Request;
use App\Util\Lexer\Nickname;
@@ -13,15 +14,26 @@ use App\Transformer\ActivityPub\{
ProfileTransformer
};
use App\Jobs\RemoteFollowPipeline\RemoteFollowPipeline;
+use App\Jobs\InboxPipeline\InboxWorker;
class FederationController extends Controller
{
public function authCheck()
{
if(!Auth::check()) {
- abort(403);
+ return abort(403);
}
- return;
+ }
+
+ public function authorizeFollow(Request $request)
+ {
+ $this->authCheck();
+ $this->validate($request, [
+ 'acct' => 'required|string|min:3|max:255'
+ ]);
+ $acct = $request->input('acct');
+ $nickname = Nickname::normalizeProfileUrl($acct);
+ return view('federation.authorizefollow', compact('acct', 'nickname'));
}
public function remoteFollow()
@@ -64,61 +76,58 @@ class FederationController extends Controller
public function nodeinfo()
{
- $res = [
- 'metadata' => [
- 'nodeName' => config('app.name'),
- 'software' => [
- 'homepage' => 'https://pixelfed.org',
- 'github' => 'https://github.com/pixelfed',
- 'follow' => 'https://mastodon.social/@pixelfed'
- ],
- /*
- TODO: Custom Features for Trending
- 'customFeatures' => [
- 'trending' => [
- 'description' => 'Trending API for federated discovery',
- 'api' => [
- 'url' => null,
- 'docs' => null
- ],
+ $res = Cache::remember('api:nodeinfo', 60, function() {
+ return [
+ 'metadata' => [
+ 'nodeName' => config('app.name'),
+ 'software' => [
+ 'homepage' => 'https://pixelfed.org',
+ 'github' => 'https://github.com/pixelfed',
+ 'follow' => 'https://mastodon.social/@pixelfed'
],
],
- */
- ],
- 'openRegistrations' => config('pixelfed.open_registration'),
- 'protocols' => [
- 'activitypub'
- ],
- 'services' => [
- 'inbound' => [],
- 'outbound' => []
- ],
- 'software' => [
- 'name' => 'pixelfed',
- 'version' => config('pixelfed.version')
- ],
- 'usage' => [
- 'localPosts' => \App\Status::whereLocal(true)->count(),
- 'users' => [
- 'total' => \App\User::count()
- ]
- ],
- 'version' => '2.0'
- ];
-
- return response()->json($res);
+ 'openRegistrations' => config('pixelfed.open_registration'),
+ 'protocols' => [
+ 'activitypub'
+ ],
+ 'services' => [
+ 'inbound' => [],
+ 'outbound' => []
+ ],
+ 'software' => [
+ 'name' => 'pixelfed',
+ 'version' => config('pixelfed.version')
+ ],
+ 'usage' => [
+ 'localPosts' => \App\Status::whereLocal(true)->whereHas('media')->count(),
+ 'localComments' => \App\Status::whereLocal(true)->whereNotNull('in_reply_to_id')->count(),
+ 'users' => [
+ 'total' => \App\User::count(),
+ 'activeHalfyear' => \App\User::where('updated_at', '>', Carbon::now()->subMonths(6)->toDateTimeString())->count(),
+ 'activeMonth' => \App\User::where('updated_at', '>', Carbon::now()->subMonths(1)->toDateTimeString())->count(),
+ ]
+ ],
+ 'version' => '2.0'
+ ];
+ });
+ return response()->json($res, 200, [], JSON_PRETTY_PRINT);
}
public function webfinger(Request $request)
{
- $this->validate($request, ['resource'=>'required']);
- $resource = $request->input('resource');
- $parsed = Nickname::normalizeProfileUrl($resource);
- $username = $parsed['username'];
- $user = Profile::whereUsername($username)->firstOrFail();
- $webfinger = (new Webfinger($user))->generate();
- return response()->json($webfinger);
+ $this->validate($request, ['resource'=>'required|string|min:3|max:255']);
+
+ $hash = hash('sha256', $request->input('resource'));
+
+ $webfinger = Cache::remember('api:webfinger:'.$hash, 1440, function() use($request) {
+ $resource = $request->input('resource');
+ $parsed = Nickname::normalizeProfileUrl($resource);
+ $username = $parsed['username'];
+ $user = Profile::whereUsername($username)->firstOrFail();
+ return (new Webfinger($user))->generate();
+ });
+ return response()->json($webfinger, 200, [], JSON_PRETTY_PRINT);
}
public function userOutbox(Request $request, $username)
@@ -132,7 +141,23 @@ class FederationController extends Controller
$fractal = new Fractal\Manager();
$resource = new Fractal\Resource\Item($user, new ProfileOutbox);
$res = $fractal->createData($resource)->toArray();
- return response()->json($res['data']);
+ return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json');
+ }
+
+ public function userInbox(Request $request, $username)
+ {
+ if(config('pixelfed.activitypub_enabled') == false) {
+ abort(403);
+ }
+ $mimes = [
+ 'application/activity+json',
+ 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'
+ ];
+ if(!in_array($request->header('Content-Type'), $mimes)) {
+ abort(500, 'Invalid request');
+ }
+ $profile = Profile::whereUsername($username)->firstOrFail();
+ InboxWorker::dispatch($request, $profile, $request->all());
}
}
diff --git a/app/Http/Controllers/ImportDataController.php b/app/Http/Controllers/ImportDataController.php
deleted file mode 100644
index 1b0a12e6..00000000
--- a/app/Http/Controllers/ImportDataController.php
+++ /dev/null
@@ -1,10 +0,0 @@
-likes()->whereProfileId($profile->id)->count() !== 0) {
$like = Like::whereProfileId($profile->id)->whereStatusId($status->id)->firstOrFail();
- $like->delete();
+ $like->forceDelete();
$count--;
} else {
$like = new Like;
@@ -35,9 +35,15 @@ class LikeController extends Controller
$like->status_id = $status->id;
$like->save();
$count++;
+ LikePipeline::dispatch($like);
}
- LikePipeline::dispatch($like);
+ $likes = Like::whereProfileId($profile->id)
+ ->orderBy('id', 'desc')
+ ->take(1000)
+ ->pluck('status_id');
+
+ Cache::put('api:like-ids:user:'.$profile->id, $likes, 1440);
if($request->ajax()) {
$response = ['code' => 200, 'msg' => 'Like saved', 'count' => $count];
diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php
index 9c7fa904..4e647cab 100644
--- a/app/Http/Controllers/ProfileController.php
+++ b/app/Http/Controllers/ProfileController.php
@@ -18,28 +18,63 @@ class ProfileController extends Controller
public function show(Request $request, $username)
{
$user = Profile::whereUsername($username)->firstOrFail();
+ if($user->remote_url) {
+ $settings = new \StdClass;
+ $settings->crawlable = false;
+ } else {
+ $settings = User::whereUsername($username)->firstOrFail()->settings;
+ }
- $mimes = [
- 'application/activity+json',
- 'application/ld+json',
- 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'
- ];
-
- if(in_array($request->header('accept'), $mimes) && config('pixelfed.activitypub_enabled')) {
+ if($request->wantsJson() && config('pixelfed.activitypub_enabled')) {
return $this->showActivityPub($request, $user);
}
+ if($user->is_private == true) {
+ $can_access = $this->privateProfileCheck($user);
+ if($can_access !== true) {
+ abort(403);
+ }
+ }
// TODO: refactor this mess
$owner = Auth::check() && Auth::id() === $user->user_id;
$is_following = ($owner == false && Auth::check()) ? $user->followedBy(Auth::user()->profile) : false;
+ $is_admin = is_null($user->domain) ? $user->user->is_admin : false;
$timeline = $user->statuses()
->whereHas('media')
->whereNull('in_reply_to_id')
- ->orderBy('id','desc')
+ ->whereNull('reblog_of_id')
+ ->orderBy('created_at','desc')
->withCount(['comments', 'likes'])
->simplePaginate(21);
- return view('profile.show', compact('user', 'owner', 'is_following', 'timeline'));
+ return view('profile.show', compact('user', 'settings', 'owner', 'is_following', 'is_admin', 'timeline'));
+ }
+
+ public function permalinkRedirect(Request $request, $username)
+ {
+ $user = Profile::whereUsername($username)->firstOrFail();
+ $settings = User::whereUsername($username)->firstOrFail()->settings;
+
+ if($request->wantsJson() && config('pixelfed.activitypub_enabled')) {
+ return $this->showActivityPub($request, $user);
+ }
+
+ return redirect($user->url());
+ }
+
+ protected function privateProfileCheck(Profile $profile)
+ {
+ if(Auth::check() === false) {
+ return false;
+ }
+
+ $follower_ids = (array) $profile->followers()->pluck('followers.profile_id');
+ $pid = Auth::user()->profile->id;
+ if(!in_array($pid, $follower_ids) && $pid !== $profile->id) {
+ return false;
+ }
+
+ return true;
}
public function showActivityPub(Request $request, $user)
@@ -47,7 +82,7 @@ class ProfileController extends Controller
$fractal = new Fractal\Manager();
$resource = new Fractal\Resource\Item($user, new ProfileTransformer);
$res = $fractal->createData($resource)->toArray();
- return response()->json($res['data']);
+ return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json');
}
public function showAtomFeed(Request $request, $user)
@@ -66,7 +101,8 @@ class ProfileController extends Controller
$owner = Auth::check() && Auth::id() === $user->user_id;
$is_following = ($owner == false && Auth::check()) ? $user->followedBy(Auth::user()->profile) : false;
$followers = $profile->followers()->orderBy('created_at','desc')->simplePaginate(12);
- return view('profile.followers', compact('user', 'profile', 'followers', 'owner', 'is_following'));
+ $is_admin = is_null($user->domain) ? $user->user->is_admin : false;
+ return view('profile.followers', compact('user', 'profile', 'followers', 'owner', 'is_following', 'is_admin'));
}
public function following(Request $request, $username)
@@ -77,7 +113,8 @@ class ProfileController extends Controller
$owner = Auth::check() && Auth::id() === $user->user_id;
$is_following = ($owner == false && Auth::check()) ? $user->followedBy(Auth::user()->profile) : false;
$following = $profile->following()->orderBy('created_at','desc')->simplePaginate(12);
- return view('profile.following', compact('user', 'profile', 'following', 'owner', 'is_following'));
+ $is_admin = is_null($user->domain) ? $user->user->is_admin : false;
+ return view('profile.following', compact('user', 'profile', 'following', 'owner', 'is_following', 'is_admin'));
}
public function savedBookmarks(Request $request, $username)
@@ -86,9 +123,12 @@ class ProfileController extends Controller
abort(403);
}
$user = Auth::user()->profile;
+ $settings = User::whereUsername($username)->firstOrFail()->settings;
$owner = true;
$following = false;
- $timeline = $user->bookmarks()->orderBy('created_at','desc')->simplePaginate(10);
- return view('profile.show', compact('user', 'owner', 'following', 'timeline'));
+ $timeline = $user->bookmarks()->withCount(['likes','comments'])->orderBy('created_at','desc')->simplePaginate(10);
+ $is_following = ($owner == false && Auth::check()) ? $user->followedBy(Auth::user()->profile) : false;
+ $is_admin = is_null($user->domain) ? $user->user->is_admin : false;
+ return view('profile.show', compact('user', 'settings', 'owner', 'following', 'timeline', 'is_following', 'is_admin'));
}
}
diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php
index c775d937..832cb88c 100644
--- a/app/Http/Controllers/ReportController.php
+++ b/app/Http/Controllers/ReportController.php
@@ -2,12 +2,25 @@
namespace App\Http\Controllers;
+use Auth;
use Illuminate\Http\Request;
+use App\{Avatar, Profile, Report, Status, User};
class ReportController extends Controller
{
+ protected $profile;
+
+ public function __construct()
+ {
+ $this->middleware('auth');
+ }
+
public function showForm(Request $request)
{
+ $this->validate($request, [
+ 'type' => 'required|alpha_dash',
+ 'id' => 'required|integer|min:1'
+ ]);
return view('report.form');
}
@@ -35,4 +48,92 @@ class ReportController extends Controller
{
return view('report.spam.profile');
}
+
+ public function sensitiveCommentForm(Request $request)
+ {
+ return view('report.sensitive.comment');
+ }
+
+ public function sensitivePostForm(Request $request)
+ {
+ return view('report.sensitive.post');
+ }
+
+ public function sensitiveProfileForm(Request $request)
+ {
+ return view('report.sensitive.profile');
+ }
+
+ public function abusiveCommentForm(Request $request)
+ {
+ return view('report.abusive.comment');
+ }
+
+ public function abusivePostForm(Request $request)
+ {
+ return view('report.abusive.post');
+ }
+
+ public function abusiveProfileForm(Request $request)
+ {
+ return view('report.abusive.profile');
+ }
+
+ public function formStore(Request $request)
+ {
+ $this->validate($request, [
+ 'report' => 'required|alpha_dash',
+ 'type' => 'required|alpha_dash',
+ 'id' => 'required|integer|min:1',
+ 'msg' => 'nullable|string|max:150'
+ ]);
+
+ $profile = Auth::user()->profile;
+ $reportType = $request->input('report');
+ $object_id = $request->input('id');
+ $object_type = $request->input('type');
+ $msg = $request->input('msg');
+ $object = null;
+ $types = ['spam', 'sensitive', 'abusive'];
+
+ if(!in_array($reportType, $types)) {
+ return redirect('/timeline')->with('error', 'Invalid report type');
+ }
+
+ switch ($object_type) {
+ case 'post':
+ $object = Status::findOrFail($object_id);
+ $object_type = 'App\Status';
+ $exists = Report::whereUserId(Auth::id())
+ ->whereObjectId($object->id)
+ ->whereObjectType('App\Status')
+ ->count();
+ break;
+
+ default:
+ return redirect('/timeline')->with('error', 'Invalid report type');
+ break;
+ }
+
+ if($exists !== 0) {
+ return redirect('/timeline')->with('error', 'You have already reported this!');
+ }
+
+ if($object->profile_id == $profile->id) {
+ return redirect('/timeline')->with('error', 'You cannot report your own content!');
+ }
+
+ $report = new Report;
+ $report->profile_id = $profile->id;
+ $report->user_id = Auth::id();
+ $report->object_id = $object->id;
+ $report->object_type = $object_type;
+ $report->reported_profile_id = $object->profile_id;
+ $report->type = $request->input('report');
+ $report->message = $request->input('msg');
+ $report->save();
+
+ return redirect('/timeline')->with('status', 'Report successfully sent!');
+ }
+
}
diff --git a/app/Http/Controllers/SettingsController.php b/app/Http/Controllers/SettingsController.php
index c367fdd7..14eced67 100644
--- a/app/Http/Controllers/SettingsController.php
+++ b/app/Http/Controllers/SettingsController.php
@@ -3,19 +3,28 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
-use App\{Profile, User};
-use Auth;
+use App\{AccountLog, EmailVerification, Media, Profile, User};
+use Auth, DB;
+use App\Util\Lexer\PrettyNumber;
class SettingsController extends Controller
{
public function __construct()
{
- return $this->middleware('auth');
+ $this->middleware('auth');
}
public function home()
{
- return view('settings.home');
+ $id = Auth::user()->profile->id;
+ $storage = [];
+ $used = Media::whereProfileId($id)->sum('size');
+ $storage['limit'] = config('pixelfed.max_account_size') * 1024;
+ $storage['used'] = $used;
+ $storage['percentUsed'] = ceil($storage['used'] / $storage['limit'] * 100);
+ $storage['limitPretty'] = PrettyNumber::size($storage['limit']);
+ $storage['usedPretty'] = PrettyNumber::size($storage['used']);
+ return view('settings.home', compact('storage'));
}
public function homeUpdate(Request $request)
@@ -23,23 +32,48 @@ class SettingsController extends Controller
$this->validate($request, [
'name' => 'required|string|max:' . config('pixelfed.max_name_length'),
'bio' => 'nullable|string|max:' . config('pixelfed.max_bio_length')
+ 'website' => 'nullable|url',
+ 'email' => 'nullable|email'
]);
$changes = false;
$name = $request->input('name');
$bio = $request->input('bio');
+ $website = $request->input('website');
+ $email = $request->input('email');
$user = Auth::user();
$profile = $user->profile;
- if($profile->name != $name) {
+ $validate = config('pixelfed.enforce_email_verification');
+
+ if($user->email != $email) {
$changes = true;
- $user->name = $name;
- $profile->name = $name;
+ $user->email = $email;
+
+ if($validate) {
+ $user->email_verified_at = null;
+ // Prevent old verifications from working
+ EmailVerification::whereUserId($user->id)->delete();
+ }
}
- if($profile->bio != $bio) {
- $changes = true;
- $profile->bio = $bio;
+ // Only allow email to be updated if not yet verified
+ if(!$validate || !$changes && $user->email_verified_at) {
+ if($profile->name != $name) {
+ $changes = true;
+ $user->name = $name;
+ $profile->name = $name;
+ }
+
+ if(!$profile->website || $profile->website != $website) {
+ $changes = true;
+ $profile->website = $website;
+ }
+
+ if(!$profile->bio || !$profile->bio != $bio) {
+ $changes = true;
+ $profile->bio = $bio;
+ }
}
if($changes === true) {
@@ -89,6 +123,34 @@ class SettingsController extends Controller
return view('settings.avatar');
}
+ public function accessibility()
+ {
+ $settings = Auth::user()->settings;
+ return view('settings.accessibility', compact('settings'));
+ }
+
+ public function accessibilityStore(Request $request)
+ {
+ $settings = Auth::user()->settings;
+ $fields = [
+ 'compose_media_descriptions',
+ 'reduce_motion',
+ 'optimize_screen_reader',
+ 'high_contrast_mode',
+ 'video_autoplay'
+ ];
+ foreach($fields as $field) {
+ $form = $request->input($field);
+ if($form == 'on') {
+ $settings->{$field} = true;
+ } else {
+ $settings->{$field} = false;
+ }
+ $settings->save();
+ }
+ return redirect(route('settings.accessibility'))->with('status', 'Settings successfully updated!');
+ }
+
public function notifications()
{
return view('settings.notifications');
@@ -96,12 +158,63 @@ class SettingsController extends Controller
public function privacy()
{
- return view('settings.privacy');
+ $settings = Auth::user()->settings;
+ $is_private = Auth::user()->profile->is_private;
+ $settings['is_private'] = (bool) $is_private;
+ return view('settings.privacy', compact('settings'));
+ }
+
+ public function privacyStore(Request $request)
+ {
+ $settings = Auth::user()->settings;
+ $profile = Auth::user()->profile;
+ $fields = [
+ 'is_private',
+ 'crawlable',
+ 'show_profile_follower_count',
+ 'show_profile_following_count'
+ ];
+ foreach($fields as $field) {
+ $form = $request->input($field);
+ if($field == 'is_private') {
+ if($form == 'on') {
+ $profile->{$field} = true;
+ $settings->show_guests = false;
+ $settings->show_discover = false;
+ $profile->save();
+ } else {
+ $profile->{$field} = false;
+ $profile->save();
+ }
+ } elseif($field == 'crawlable') {
+ if($form == 'on') {
+ $settings->{$field} = false;
+ } else {
+ $settings->{$field} = true;
+ }
+ } else {
+ if($form == 'on') {
+ $settings->{$field} = true;
+ } else {
+ $settings->{$field} = false;
+ }
+ }
+ $settings->save();
+ }
+ return redirect(route('settings.privacy'))->with('status', 'Settings successfully updated!');
}
public function security()
{
- return view('settings.security');
+ $sessions = DB::table('sessions')
+ ->whereUserId(Auth::id())
+ ->limit(20)
+ ->get();
+ $activity = AccountLog::whereUserId(Auth::id())
+ ->orderBy('created_at','desc')
+ ->limit(50)
+ ->get();
+ return view('settings.security', compact('sessions', 'activity'));
}
public function applications()
@@ -121,7 +234,7 @@ class SettingsController extends Controller
public function dataImportInstagram()
{
- return view('settings.import.ig');
+ return view('settings.import.instagram.home');
}
public function developers()
diff --git a/app/Http/Controllers/SiteController.php b/app/Http/Controllers/SiteController.php
index 31603176..18eb861b 100644
--- a/app/Http/Controllers/SiteController.php
+++ b/app/Http/Controllers/SiteController.php
@@ -2,11 +2,42 @@
namespace App\Http\Controllers;
-use App;
+use App, Auth, Cache;
use Illuminate\Http\Request;
+use App\{Follower, Profile, Status, User};
+use App\Util\Lexer\PrettyNumber;
class SiteController extends Controller
{
+
+ public function home()
+ {
+ if(Auth::check()) {
+ return $this->homeTimeline();
+ } else {
+ return $this->homeGuest();
+ }
+ }
+
+ public function homeGuest()
+ {
+ return view('site.index');
+ }
+
+ public function homeTimeline()
+ {
+ // TODO: Use redis for timelines
+ $following = Follower::whereProfileId(Auth::user()->profile->id)->pluck('following_id');
+ $following->push(Auth::user()->profile->id);
+ $timeline = Status::whereIn('profile_id', $following)
+ ->whereHas('media')
+ ->orderBy('id','desc')
+ ->withCount(['comments', 'likes', 'shares'])
+ ->simplePaginate(20);
+ $type = 'personal';
+ return view('timeline.template', compact('timeline', 'type'));
+ }
+
public function changeLocale(Request $request, $locale)
{
if(!App::isLocale($locale)) {
@@ -15,4 +46,20 @@ class SiteController extends Controller
App::setLocale($locale);
return redirect()->back();
}
+
+ public function about()
+ {
+ $res = Cache::remember('site:page:about', 15, function() {
+ $statuses = Status::whereHas('media')
+ ->whereNull('in_reply_to_id')
+ ->whereNull('reblog_of_id')
+ ->count();
+ $statusCount = PrettyNumber::convert($statuses);
+ $userCount = PrettyNumber::convert(User::count());
+ $remoteCount = PrettyNumber::convert(Profile::whereNotNull('remote_url')->count());
+ $adminContact = User::whereIsAdmin(true)->first();
+ return view('site.about')->with(compact('statusCount', 'userCount', 'remoteCount', 'adminContact'))->render();
+ });
+ return $res;
+ }
}
diff --git a/app/Http/Controllers/StatusController.php b/app/Http/Controllers/StatusController.php
index 27cf768f..57a7e41c 100644
--- a/app/Http/Controllers/StatusController.php
+++ b/app/Http/Controllers/StatusController.php
@@ -3,83 +3,180 @@
namespace App\Http\Controllers;
use Auth, Cache;
-use App\Jobs\StatusPipeline\{NewStatusPipeline, StatusDelete};
+use League\Fractal;
use Illuminate\Http\Request;
-use App\{Media, Profile, Status, User};
use Vinkla\Hashids\Facades\Hashids;
+use App\{Media, Profile, Status, User};
+use App\Jobs\ImageOptimizePipeline\ImageOptimize;
+use App\Transformer\ActivityPub\StatusTransformer;
+use App\Jobs\StatusPipeline\{NewStatusPipeline, StatusDelete};
class StatusController extends Controller
{
public function show(Request $request, $username, int $id)
{
- $user = Profile::whereUsername($username)->firstOrFail();
- $status = Status::whereProfileId($user->id)
- ->withCount(['likes', 'comments'])
- ->findOrFail($id);
- if(!$status->media_path && $status->in_reply_to_id) {
- return redirect($status->url());
- }
- return view('status.show', compact('user', 'status'));
+ $user = Profile::whereUsername($username)->firstOrFail();
+
+ $status = Status::whereProfileId($user->id)
+ ->withCount(['likes', 'comments', 'media'])
+ ->findOrFail($id);
+
+ if(!$status->media_path && $status->in_reply_to_id) {
+ return redirect($status->url());
+ }
+
+ if($request->wantsJson() && config('pixelfed.activitypub_enabled')) {
+ return $this->showActivityPub($request, $status);
+ }
+
+ $replies = Status::whereInReplyToId($status->id)->simplePaginate(30);
+
+ return view('status.show', compact('user', 'status', 'replies'));
+ }
+
+ public function compose()
+ {
+ $this->authCheck();
+ return view('status.compose');
}
public function store(Request $request)
{
- if(Auth::check() == false)
- {
- abort(403);
- }
+ if(Auth::check() == false)
+ {
+ abort(403);
+ }
- $user = Auth::user();
+ $user = Auth::user();
- $this->validate($request, [
- 'photo' => 'required|mimes:jpeg,png,bmp,gif|max:' . config('pixelfed.max_photo_size'),
- 'caption' => 'string|max:' . config('pixelfed.max_caption_length')
- ]);
+ $size = Media::whereUserId($user->id)->sum('size') / 1000;
+ $limit = (int) config('pixelfed.max_account_size');
+ if($size >= $limit) {
+ return redirect()->back()->with('error', 'You have exceeded your storage limit. Please click here for more info.');
+ }
- $monthHash = hash('sha1', date('Y') . date('m'));
- $userHash = hash('sha1', $user->id . (string) $user->created_at);
- $storagePath = "public/m/{$monthHash}/{$userHash}";
- $path = $request->photo->store($storagePath);
- $profile = $user->profile;
+ $this->validate($request, [
+ 'photo.*' => 'required|mimes:jpeg,png,bmp,gif|max:' . config('pixelfed.max_photo_size'),
+ 'caption' => 'string|max:' . config('pixelfed.max_caption_length'),
+ 'cw' => 'nullable|string',
+ 'filter_class' => 'nullable|string',
+ 'filter_name' => 'nullable|string',
+ ]);
- $status = new Status;
- $status->profile_id = $profile->id;
- $status->caption = $request->caption;
- $status->save();
+ if(count($request->file('photo')) > config('pixelfed.max_album_length')) {
+ return redirect()->back()->with('error', 'Too many files, max limit per post: ' . config('pixelfed.max_album_length'));
+ }
+ $cw = $request->filled('cw') && $request->cw == 'on' ? true : false;
+ $monthHash = hash('sha1', date('Y') . date('m'));
+ $userHash = hash('sha1', $user->id . (string) $user->created_at);
+ $profile = $user->profile;
- $media = new Media;
- $media->status_id = $status->id;
- $media->profile_id = $profile->id;
- $media->user_id = $user->id;
- $media->media_path = $path;
- $media->size = $request->file('photo')->getClientSize();
- $media->mime = $request->file('photo')->getClientMimeType();
- $media->save();
- NewStatusPipeline::dispatch($status, $media);
+ $status = new Status;
+ $status->profile_id = $profile->id;
+ $status->caption = strip_tags($request->caption);
+ $status->is_nsfw = $cw;
- // TODO: Parse Caption
- // TODO: Send to subscribers
-
- return redirect($status->url());
+ $status->save();
+
+ $photos = $request->file('photo');
+ $order = 1;
+ foreach ($photos as $k => $v) {
+ $storagePath = "public/m/{$monthHash}/{$userHash}";
+ $path = $v->store($storagePath);
+ $media = new Media;
+ $media->status_id = $status->id;
+ $media->profile_id = $profile->id;
+ $media->user_id = $user->id;
+ $media->media_path = $path;
+ $media->size = $v->getClientSize();
+ $media->mime = $v->getClientMimeType();
+ $media->filter_class = $request->input('filter_class');
+ $media->filter_name = $request->input('filter_name');
+ $media->order = $order;
+ $media->save();
+ ImageOptimize::dispatch($media);
+ $order++;
+ }
+
+ NewStatusPipeline::dispatch($status);
+
+ // TODO: Send to subscribers
+
+ return redirect($status->url());
}
public function delete(Request $request)
{
- if(!Auth::check()) {
- abort(403);
- }
+ if(!Auth::check()) {
+ abort(403);
+ }
- $this->validate($request, [
- 'type' => 'required|string',
- 'item' => 'required|integer|min:1'
- ]);
+ $this->validate($request, [
+ 'type' => 'required|string',
+ 'item' => 'required|integer|min:1'
+ ]);
- $status = Status::findOrFail($request->input('item'));
+ $status = Status::findOrFail($request->input('item'));
- if($status->profile_id === Auth::user()->profile->id || Auth::user()->is_admin == true) {
- StatusDelete::dispatch($status);
- }
+ if($status->profile_id === Auth::user()->profile->id || Auth::user()->is_admin == true) {
+ StatusDelete::dispatch($status);
+ }
- return redirect(Auth::user()->url());
+ return redirect(Auth::user()->url());
+ }
+
+ public function storeShare(Request $request)
+ {
+ $this->validate($request, [
+ 'item' => 'required|integer',
+ ]);
+
+ $profile = Auth::user()->profile;
+ $status = Status::withCount('shares')->findOrFail($request->input('item'));
+
+ $count = $status->shares_count;
+
+ $exists = Status::whereProfileId(Auth::user()->profile->id)
+ ->whereReblogOfId($status->id)
+ ->count();
+ if($exists !== 0) {
+ $shares = Status::whereProfileId(Auth::user()->profile->id)
+ ->whereReblogOfId($status->id)
+ ->get();
+ foreach($shares as $share) {
+ $share->delete();
+ $count--;
+ }
+ } else {
+ $share = new Status;
+ $share->profile_id = $profile->id;
+ $share->reblog_of_id = $status->id;
+ $share->save();
+ $count++;
+ }
+
+ if($request->ajax()) {
+ $response = ['code' => 200, 'msg' => 'Share saved', 'count' => $count];
+ } else {
+ $response = redirect($status->url());
+ }
+
+ return $response;
+ }
+
+ public function showActivityPub(Request $request, $status)
+ {
+ $fractal = new Fractal\Manager();
+ $resource = new Fractal\Resource\Item($status, new StatusTransformer);
+ $res = $fractal->createData($resource)->toArray();
+ return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json');
+ }
+
+ protected function authCheck()
+ {
+ if(Auth::check() == false)
+ {
+ abort(403);
+ }
}
}
diff --git a/app/Http/Controllers/TimelineController.php b/app/Http/Controllers/TimelineController.php
index c49b98b3..5cc84530 100644
--- a/app/Http/Controllers/TimelineController.php
+++ b/app/Http/Controllers/TimelineController.php
@@ -18,24 +18,25 @@ class TimelineController extends Controller
// TODO: Use redis for timelines
$following = Follower::whereProfileId(Auth::user()->profile->id)->pluck('following_id');
$following->push(Auth::user()->profile->id);
- $timeline = Status::whereHas('media')
- ->whereNull('in_reply_to_id')
- ->whereIn('profile_id', $following)
+ $timeline = Status::whereIn('profile_id', $following)
->orderBy('id','desc')
->withCount(['comments', 'likes'])
- ->simplePaginate(10);
- return view('timeline.personal', compact('timeline'));
+ ->simplePaginate(20);
+ $type = 'personal';
+ return view('timeline.template', compact('timeline', 'type'));
}
public function local()
{
// TODO: Use redis for timelines
+ // $timeline = Timeline::build()->local();
$timeline = Status::whereHas('media')
->whereNull('in_reply_to_id')
- ->orderBy('id','desc')
->withCount(['comments', 'likes'])
- ->simplePaginate(10);
- return view('timeline.public', compact('timeline'));
+ ->orderBy('id','desc')
+ ->simplePaginate(20);
+ $type = 'local';
+ return view('timeline.template', compact('timeline', 'type'));
}
}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 52a07284..61e44822 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -60,5 +60,6 @@ class Kernel extends HttpKernel
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+ 'validemail' => \App\Http\Middleware\EmailVerificationCheck::class,
];
}
diff --git a/app/Http/Middleware/EmailVerificationCheck.php b/app/Http/Middleware/EmailVerificationCheck.php
new file mode 100644
index 00000000..1d748db3
--- /dev/null
+++ b/app/Http/Middleware/EmailVerificationCheck.php
@@ -0,0 +1,27 @@
+user() &&
+ config('pixelfed.enforce_email_verification') &&
+ is_null($request->user()->email_verified_at) &&
+ !$request->is('i/verify-email', 'log*', 'i/confirm-email/*', 'settings/home')
+ ) {
+ return redirect('/i/verify-email');
+ }
+ return $next($request);
+ }
+}
diff --git a/app/ImportJob.php b/app/ImportJob.php
new file mode 100644
index 00000000..dc0e1cda
--- /dev/null
+++ b/app/ImportJob.php
@@ -0,0 +1,10 @@
+profile = $profile;
+ $this->current = $current;
+ }
+
+ /**
+ * Execute the job.
+ *
+ * @return void
+ */
+ public function handle()
+ {
+ $avatar = $this->profile->avatar;
+ $file = storage_path("app/$avatar->media_path");
+
+ try {
+ $img = Intervention::make($file)->orientate();
+ $img->fit(200, 200, function ($constraint) {
+ $constraint->upsize();
+ });
+ $quality = config('pixelfed.image_quality');
+ $img->save($file, $quality);
+
+ $avatar = Avatar::whereProfileId($this->profile->id)->firstOrFail();
+ $avatar->thumb_path = $avatar->media_path;
+ $avatar->change_count = ++$avatar->change_count;
+ $avatar->last_processed_at = Carbon::now();
+ $avatar->save();
+ $this->deleteOldAvatar($avatar->media_path, $this->current);
+ } catch (Exception $e) {
+
+ }
+ }
+
+ protected function deleteOldAvatar($new, $current)
+ {
+ if(storage_path('app/' . $new) == $current) {
+ return;
+ }
+ if(is_file($current)) {
+ @unlink($current);
+ }
+ }
+}
diff --git a/app/Jobs/ImageOptimizePipeline/ImageUpdate.php b/app/Jobs/ImageOptimizePipeline/ImageUpdate.php
index fab0975b..5b21ea7e 100644
--- a/app/Jobs/ImageOptimizePipeline/ImageUpdate.php
+++ b/app/Jobs/ImageOptimizePipeline/ImageUpdate.php
@@ -38,7 +38,10 @@ class ImageUpdate implements ShouldQueue
$thumb = storage_path('app/'. $media->thumbnail_path);
try {
ImageOptimizer::optimize($thumb);
- ImageOptimizer::optimize($path);
+ if($media->mime !== 'image/gif')
+ {
+ ImageOptimizer::optimize($path);
+ }
} catch (Exception $e) {
return;
}
diff --git a/app/Jobs/InboxPipeline/InboxWorker.php b/app/Jobs/InboxPipeline/InboxWorker.php
new file mode 100644
index 00000000..db65c358
--- /dev/null
+++ b/app/Jobs/InboxPipeline/InboxWorker.php
@@ -0,0 +1,43 @@
+request = $request;
+ $this->profile = $profile;
+ $this->payload = $payload;
+ }
+
+ /**
+ * Execute the job.
+ *
+ * @return void
+ */
+ public function handle()
+ {
+ (new Inbox($this->request, $this->profile, $this->payload))->handle();
+ }
+
+}
diff --git a/app/Jobs/InboxPipeline/SharedInboxWorker.php b/app/Jobs/InboxPipeline/SharedInboxWorker.php
new file mode 100644
index 00000000..dcc0db28
--- /dev/null
+++ b/app/Jobs/InboxPipeline/SharedInboxWorker.php
@@ -0,0 +1,41 @@
+request = $request;
+ $this->payload = $payload;
+ }
+
+ /**
+ * Execute the job.
+ *
+ * @return void
+ */
+ public function handle()
+ {
+ (new Inbox($this->request, null, $this->payload))->handleSharedInbox();
+ }
+}
diff --git a/app/Jobs/LikePipeline/LikePipeline.php b/app/Jobs/LikePipeline/LikePipeline.php
index 28410bfc..8eccd726 100644
--- a/app/Jobs/LikePipeline/LikePipeline.php
+++ b/app/Jobs/LikePipeline/LikePipeline.php
@@ -37,7 +37,19 @@ class LikePipeline implements ShouldQueue
$status = $this->like->status;
$actor = $this->like->actor;
- if($actor->id === $status->profile_id) {
+ if($status->url !== null) {
+ // Ignore notifications to remote statuses
+ return;
+ }
+
+ $exists = Notification::whereProfileId($status->profile_id)
+ ->whereActorId($actor->id)
+ ->whereAction('like')
+ ->whereItemId($status->id)
+ ->whereItemType('App\Status')
+ ->count();
+
+ if($actor->id === $status->profile_id || $exists !== 0) {
return true;
}
diff --git a/app/Jobs/MentionPipeline/MentionPipeline.php b/app/Jobs/MentionPipeline/MentionPipeline.php
new file mode 100644
index 00000000..69b7ebbb
--- /dev/null
+++ b/app/Jobs/MentionPipeline/MentionPipeline.php
@@ -0,0 +1,72 @@
+status = $status;
+ $this->mention = $mention;
+ }
+
+ /**
+ * Execute the job.
+ *
+ * @return void
+ */
+ public function handle()
+ {
+
+ $status = $this->status;
+ $mention = $this->mention;
+ $actor = $this->status->profile;
+ $target = $this->mention->profile_id;
+
+ $exists = Notification::whereProfileId($target)
+ ->whereActorId($actor->id)
+ ->whereAction('mention')
+ ->whereItemId($status->id)
+ ->whereItemType('App\Status')
+ ->count();
+
+ if($actor->id === $target || $exists !== 0) {
+ return true;
+ }
+
+ try {
+
+ $notification = new Notification;
+ $notification->profile_id = $target;
+ $notification->actor_id = $actor->id;
+ $notification->action = 'mention';
+ $notification->message = $mention->toText();
+ $notification->rendered = $mention->toHtml();
+ $notification->item_id = $status->id;
+ $notification->item_type = "App\Status";
+ $notification->save();
+
+ } catch (Exception $e) {
+
+ }
+
+ }
+}
diff --git a/app/Jobs/StatusPipeline/NewStatusPipeline.php b/app/Jobs/StatusPipeline/NewStatusPipeline.php
index 01392aa4..8939dd9a 100644
--- a/app/Jobs/StatusPipeline/NewStatusPipeline.php
+++ b/app/Jobs/StatusPipeline/NewStatusPipeline.php
@@ -16,17 +16,15 @@ class NewStatusPipeline implements ShouldQueue
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $status;
- protected $media;
/**
* Create a new job instance.
*
* @return void
*/
- public function __construct(Status $status, $media = false)
+ public function __construct(Status $status)
{
$this->status = $status;
- $this->media = $media;
}
/**
@@ -37,13 +35,10 @@ class NewStatusPipeline implements ShouldQueue
public function handle()
{
$status = $this->status;
- $media = $this->media;
StatusEntityLexer::dispatch($status);
- StatusActivityPubDeliver::dispatch($status);
- if($media) {
- ImageOptimize::dispatch($media);
- }
+ //StatusActivityPubDeliver::dispatch($status);
+
Cache::forever('post.' . $status->id, $status);
$redis = Redis::connection();
diff --git a/app/Jobs/StatusPipeline/StatusDelete.php b/app/Jobs/StatusPipeline/StatusDelete.php
index 571b41a5..f48b200a 100644
--- a/app/Jobs/StatusPipeline/StatusDelete.php
+++ b/app/Jobs/StatusPipeline/StatusDelete.php
@@ -2,7 +2,7 @@
namespace App\Jobs\StatusPipeline;
-use App\{Media, StatusHashtag, Status};
+use App\{Media, Notification, StatusHashtag, Status};
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
@@ -58,8 +58,19 @@ class StatusDelete implements ShouldQueue
}
}
+ $comments = Status::where('in_reply_to_id', $status->id)->get();
+ foreach($comments as $comment) {
+ $comment->in_reply_to_id = null;
+ $comment->save();
+ Notification::whereItemType('App\Status')
+ ->whereItemId($comment->id)
+ ->delete();
+ }
$status->likes()->delete();
+ Notification::whereItemType('App\Status')
+ ->whereItemId($status->id)
+ ->delete();
StatusHashtag::whereStatusId($status->id)->delete();
$status->delete();
diff --git a/app/Jobs/StatusPipeline/StatusEntityLexer.php b/app/Jobs/StatusPipeline/StatusEntityLexer.php
index c1d09ccb..48b95d9a 100644
--- a/app/Jobs/StatusPipeline/StatusEntityLexer.php
+++ b/app/Jobs/StatusPipeline/StatusEntityLexer.php
@@ -2,25 +2,32 @@
namespace App\Jobs\StatusPipeline;
-use Cache;
+use DB, Cache;
use App\{
Hashtag,
Media,
+ Mention,
+ Profile,
Status,
StatusHashtag
};
use App\Util\Lexer\Hashtag as HashtagLexer;
+use App\Util\Lexer\{Autolink, Extractor};
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
+use App\Jobs\MentionPipeline\MentionPipeline;
class StatusEntityLexer implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $status;
+ protected $entities;
+ protected $autolink;
+
/**
* Create a new job instance.
*
@@ -39,36 +46,77 @@ class StatusEntityLexer implements ShouldQueue
public function handle()
{
$status = $this->status;
- $this->parseHashtags();
+ $this->parseEntities();
}
- public function parseHashtags()
+ public function parseEntities()
{
+ $this->extractEntities();
+ }
+
+ public function extractEntities()
+ {
+ $this->entities = Extractor::create()->extract($this->status->caption);
+ $this->autolinkStatus();
+ }
+
+ public function autolinkStatus()
+ {
+ $this->autolink = Autolink::create()->autolink($this->status->caption);
+ $this->storeEntities();
+ }
+
+ public function storeEntities()
+ {
+ $this->storeHashtags();
+ $this->storeMentions();
+ DB::transaction(function () {
+ $status = $this->status;
+ $status->rendered = $this->autolink;
+ $status->entities = json_encode($this->entities);
+ $status->save();
+ });
+ }
+
+ public function storeHashtags()
+ {
+ $tags = array_unique($this->entities['hashtags']);
$status = $this->status;
- $text = e($status->caption);
- $tags = HashtagLexer::getHashtags($text);
- $rendered = $text;
- if(count($tags) > 0) {
- $rendered = HashtagLexer::replaceHashtagsWithLinks($text);
- }
- $status->rendered = $rendered;
- $status->save();
-
- Cache::forever('post.' . $status->id, $status);
foreach($tags as $tag) {
- $slug = str_slug($tag);
-
- $htag = Hashtag::firstOrCreate(
- ['name' => $tag],
- ['slug' => $slug]
- );
-
- $stag = new StatusHashtag;
- $stag->status_id = $status->id;
- $stag->hashtag_id = $htag->id;
- $stag->save();
+ DB::transaction(function () use ($status, $tag) {
+ $slug = str_slug($tag);
+ $hashtag = Hashtag::firstOrCreate(
+ ['name' => $tag, 'slug' => $slug]
+ );
+ StatusHashtag::firstOrCreate(
+ ['status_id' => $status->id, 'hashtag_id' => $hashtag->id]
+ );
+ });
}
-
}
+
+ public function storeMentions()
+ {
+ $mentions = array_unique($this->entities['mentions']);
+ $status = $this->status;
+
+ foreach($mentions as $mention) {
+ $mentioned = Profile::whereUsername($mention)->firstOrFail();
+
+ if(empty($mentioned) || !isset($mentioned->id)) {
+ continue;
+ }
+
+ DB::transaction(function () use ($status, $mentioned) {
+ $m = new Mention;
+ $m->status_id = $status->id;
+ $m->profile_id = $mentioned->id;
+ $m->save();
+
+ MentionPipeline::dispatch($status, $m);
+ });
+ }
+ }
+
}
diff --git a/app/Like.php b/app/Like.php
index a4ce9f0a..c70b647b 100644
--- a/app/Like.php
+++ b/app/Like.php
@@ -3,9 +3,19 @@
namespace App;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
class Like extends Model
{
+ use SoftDeletes;
+
+ /**
+ * The attributes that should be mutated to dates.
+ *
+ * @var array
+ */
+ protected $dates = ['deleted_at'];
+
public function actor()
{
return $this->belongsTo(Profile::class, 'profile_id', 'id');
diff --git a/app/Mail/ConfirmEmail.php b/app/Mail/ConfirmEmail.php
new file mode 100644
index 00000000..83191f5f
--- /dev/null
+++ b/app/Mail/ConfirmEmail.php
@@ -0,0 +1,34 @@
+verify = $verify;
+ }
+
+ /**
+ * Build the message.
+ *
+ * @return $this
+ */
+ public function build()
+ {
+ return $this->markdown('emails.confirm_email')->with(['verify'=>$this->verify]);
+ }
+}
diff --git a/app/Media.php b/app/Media.php
index 8cc2ffd1..7ac547f3 100644
--- a/app/Media.php
+++ b/app/Media.php
@@ -2,15 +2,32 @@
namespace App;
-use Illuminate\Database\Eloquent\Model;
use Storage;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
class Media extends Model
{
+ use SoftDeletes;
+
+ /**
+ * The attributes that should be mutated to dates.
+ *
+ * @var array
+ */
+ protected $dates = ['deleted_at'];
+
public function url()
{
$path = $this->media_path;
$url = Storage::url($path);
return url($url);
}
+
+ public function thumbnailUrl()
+ {
+ $path = $this->thumbnail_path;
+ $url = Storage::url($path);
+ return url($url);
+ }
}
diff --git a/app/Mention.php b/app/Mention.php
new file mode 100644
index 00000000..bc76bdc9
--- /dev/null
+++ b/app/Mention.php
@@ -0,0 +1,42 @@
+belongsTo(Profile::class, 'profile_id', 'id');
+ }
+
+ public function status()
+ {
+ return $this->belongsTo(Status::class, 'status_id', 'id');
+ }
+
+ public function toText()
+ {
+ $actorName = $this->status->profile->username;
+ return "{$actorName} " . __('notification.mentionedYou');
+ }
+
+ public function toHtml()
+ {
+ $actorName = $this->status->profile->username;
+ $actorUrl = $this->status->profile->url();
+ return "{$actorName} " .
+ __('notification.mentionedYou');
+ }
+}
diff --git a/app/Notification.php b/app/Notification.php
index c40e0a55..9aef5b19 100644
--- a/app/Notification.php
+++ b/app/Notification.php
@@ -3,28 +3,37 @@
namespace App;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
class Notification extends Model
{
+ use SoftDeletes;
- public function actor()
- {
- return $this->belongsTo(Profile::class, 'actor_id', 'id');
- }
+ /**
+ * The attributes that should be mutated to dates.
+ *
+ * @var array
+ */
+ protected $dates = ['deleted_at'];
+
+ public function actor()
+ {
+ return $this->belongsTo(Profile::class, 'actor_id', 'id');
+ }
- public function profile()
- {
- return $this->belongsTo(Profile::class, 'profile_id', 'id');
- }
+ public function profile()
+ {
+ return $this->belongsTo(Profile::class, 'profile_id', 'id');
+ }
- public function item()
- {
- return $this->morphTo();
- }
+ public function item()
+ {
+ return $this->morphTo();
+ }
- public function status()
- {
- return $this->belongsTo(Status::class, 'item_id', 'id');
- }
+ public function status()
+ {
+ return $this->belongsTo(Status::class, 'item_id', 'id');
+ }
}
diff --git a/app/Observer/UserObserver.php b/app/Observer/UserObserver.php
index e9104283..6f2a1dfc 100644
--- a/app/Observer/UserObserver.php
+++ b/app/Observer/UserObserver.php
@@ -2,7 +2,7 @@
namespace App\Observers;
-use App\{Profile, User};
+use App\{Profile, User, UserSetting};
use App\Jobs\AvatarPipeline\CreateAvatar;
class UserObserver
@@ -36,6 +36,12 @@ class UserObserver
CreateAvatar::dispatch($profile);
}
+
+ if(empty($user->settings)) {
+ $settings = new UserSetting;
+ $settings->user_id = $user->id;
+ $settings->save();
+ }
}
}
\ No newline at end of file
diff --git a/app/Profile.php b/app/Profile.php
index 3c4b27ce..c620582b 100644
--- a/app/Profile.php
+++ b/app/Profile.php
@@ -2,19 +2,42 @@
namespace App;
-use Storage;
+use Auth, Cache, Storage;
use App\Util\Lexer\PrettyNumber;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
class Profile extends Model
{
+ use SoftDeletes;
+
+ /**
+ * The attributes that should be mutated to dates.
+ *
+ * @var array
+ */
+ protected $dates = ['deleted_at'];
protected $hidden = [
'private_key',
];
protected $visible = ['id', 'username', 'name'];
+ public function user()
+ {
+ return $this->belongsTo(User::class);
+ }
+
public function url($suffix = '')
+ {
+ if($this->remote_url) {
+ return $this->remote_url;
+ } else {
+ return url($this->username . $suffix);
+ }
+ }
+
+ public function localUrl($suffix = '')
{
return url($this->username . $suffix);
}
@@ -102,12 +125,55 @@ class Profile extends Model
public function avatar()
{
- return $this->hasOne(Avatar::class);
+ return $this->hasOne(Avatar::class)->withDefault([
+ 'media_path' => 'public/avatars/default.png'
+ ]);
}
public function avatarUrl()
{
- $url = url(Storage::url($this->avatar->media_path ?? 'public/avatars/default.png'));
+ $url = Cache::remember("avatar:{$this->id}", 1440, function() {
+ $path = optional($this->avatar)->media_path;
+ $version = hash('sha1', $this->avatar->created_at);
+ $path = "{$path}?v={$version}";
+ return url(Storage::url($path));
+ });
return $url;
}
+
+ public function statusCount()
+ {
+ return $this->statuses()->whereHas('media')->count();
+ }
+
+ public function recommendFollowers()
+ {
+ $follows = $this->following()->pluck('followers.id');
+ $following = $this->following()
+ ->orderByRaw('rand()')
+ ->take(3)
+ ->pluck('following_id');
+ $following->push(Auth::id());
+ $following = Follower::whereNotIn('profile_id', $follows)
+ ->whereNotIn('following_id', $following)
+ ->whereNotIn('following_id', $follows)
+ ->whereIn('profile_id', $following)
+ ->orderByRaw('rand()')
+ ->limit(3)
+ ->pluck('following_id');
+ $recommended = [];
+ foreach($following as $follow) {
+ $recommended[] = Profile::findOrFail($follow);
+ }
+
+ return $recommended;
+ }
+
+ public function keyId()
+ {
+ if($this->remote_url) {
+ return;
+ }
+ return $this->permalink('#main-key');
+ }
}
diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php
index fca6152c..d05aed73 100644
--- a/app/Providers/EventServiceProvider.php
+++ b/app/Providers/EventServiceProvider.php
@@ -16,6 +16,9 @@ class EventServiceProvider extends ServiceProvider
'App\Events\Event' => [
'App\Listeners\EventListener',
],
+ 'auth.login' => [
+ 'App\Events\AuthLoginEvent',
+ ],
];
/**
diff --git a/app/Report.php b/app/Report.php
index a57f84ac..879a8df3 100644
--- a/app/Report.php
+++ b/app/Report.php
@@ -6,5 +6,33 @@ use Illuminate\Database\Eloquent\Model;
class Report extends Model
{
- //
+ public function url()
+ {
+ return url('/i/admin/reports/show/' . $this->id);
+ }
+
+ public function reporter()
+ {
+ return $this->belongsTo(Profile::class, 'profile_id');
+ }
+
+ public function reported()
+ {
+ $class = $this->object_type;
+ switch ($class) {
+ case 'App\Status':
+ $column = 'id';
+ break;
+
+ default:
+ $column = 'id';
+ break;
+ }
+ return (new $class())->where($column, $this->object_id)->firstOrFail();
+ }
+
+ public function reportedUser()
+ {
+ return $this->belongsTo(Profile::class, 'reported_profile_id', 'id');
+ }
}
diff --git a/app/ReportComment.php b/app/ReportComment.php
new file mode 100644
index 00000000..5d364e1e
--- /dev/null
+++ b/app/ReportComment.php
@@ -0,0 +1,10 @@
+belongsTo(Profile::class);
@@ -25,6 +34,9 @@ class Status extends Model
public function thumb()
{
+ if($this->media->count() == 0 || $this->is_nsfw) {
+ return "data:image/gif;base64,R0lGODlhAQABAIAAAMLCwgAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==";
+ }
return url(Storage::url($this->firstMedia()->thumbnail_path));
}
@@ -40,6 +52,19 @@ class Status extends Model
return url($path);
}
+ public function permalink($suffix = '/activity')
+ {
+ $id = $this->id;
+ $username = $this->profile->username;
+ $path = config('app.url') . "/p/{$username}/{$id}{$suffix}";
+ return url($path);
+ }
+
+ public function editUrl()
+ {
+ return $this->url() . '/edit';
+ }
+
public function mediaUrl()
{
$media = $this->firstMedia();
@@ -54,15 +79,42 @@ class Status extends Model
return $this->hasMany(Like::class);
}
+ public function liked() : bool
+ {
+ $profile = Auth::user()->profile;
+ return Like::whereProfileId($profile->id)->whereStatusId($this->id)->count();
+ }
+
public function comments()
{
return $this->hasMany(Status::class, 'in_reply_to_id');
}
+ public function bookmarked()
+ {
+ if(!Auth::check()) {
+ return 0;
+ }
+ $profile = Auth::user()->profile;
+ return Bookmark::whereProfileId($profile->id)->whereStatusId($this->id)->count();
+ }
+
+ public function shares()
+ {
+ return $this->hasMany(Status::class, 'reblog_of_id');
+ }
+
+ public function shared() : bool
+ {
+ $profile = Auth::user()->profile;
+ return Status::whereProfileId($profile->id)->whereReblogOfId($this->id)->count();
+ }
+
public function parent()
{
- if(!empty($this->in_reply_to_id)) {
- return Status::findOrFail($this->in_reply_to_id);
+ $parent = $this->in_reply_to_id ?? $this->reblog_of_id;
+ if(!empty($parent)) {
+ return Status::findOrFail($parent);
}
}
@@ -83,6 +135,23 @@ class Status extends Model
);
}
+ public function mentions()
+ {
+ return $this->hasManyThrough(
+ Profile::class,
+ Mention::class,
+ 'status_id',
+ 'id',
+ 'id',
+ 'profile_id'
+ );
+ }
+
+ public function reportUrl()
+ {
+ return route('report.form') . "?type=post&id={$this->id}";
+ }
+
public function toActivityStream()
{
$media = $this->media;
@@ -116,4 +185,9 @@ class Status extends Model
return "{$actorName} " .
__('notification.commented');
}
+
+ public function recentComments()
+ {
+ return $this->comments()->orderBy('created_at','desc')->take(3);
+ }
}
diff --git a/app/StatusHashtag.php b/app/StatusHashtag.php
index 7ceac056..3d15b203 100644
--- a/app/StatusHashtag.php
+++ b/app/StatusHashtag.php
@@ -6,5 +6,5 @@ use Illuminate\Database\Eloquent\Model;
class StatusHashtag extends Model
{
- protected $fillable = ['status_id', 'hashtag_id'];
+ public $fillable = ['status_id', 'hashtag_id'];
}
diff --git a/app/Transformer/ActivityPub/ProfileOutbox.php b/app/Transformer/ActivityPub/ProfileOutbox.php
index 9d3b487c..02dcb4b6 100644
--- a/app/Transformer/ActivityPub/ProfileOutbox.php
+++ b/app/Transformer/ActivityPub/ProfileOutbox.php
@@ -13,7 +13,7 @@ class ProfileOutbox extends Fractal\TransformerAbstract
$count = $profile->statuses()->count();
$statuses = $profile->statuses()->has('media')->orderBy('id','desc')->take(20)->get()->map(function($i, $k) {
$item = [
- 'id' => $i->url(),
+ 'id' => $i->permalink(),
// TODO: handle other types
'type' => 'Create',
'actor' => $i->profile->url(),
@@ -47,10 +47,9 @@ class ProfileOutbox extends Fractal\TransformerAbstract
// TODO: add cc's
//"{$notice->getProfile()->getUrl()}/subscribers",
],
- 'sensitive' => null,
+ 'sensitive' => (bool) $i->is_nsfw,
'atomUri' => $i->url(),
'inReplyToAtomUri' => null,
- 'conversation' => $i->url(),
'attachment' => [
// TODO: support more than 1 attachment
diff --git a/app/Transformer/ActivityPub/ProfileTransformer.php b/app/Transformer/ActivityPub/ProfileTransformer.php
index f3b1b84b..a41313e4 100644
--- a/app/Transformer/ActivityPub/ProfileTransformer.php
+++ b/app/Transformer/ActivityPub/ProfileTransformer.php
@@ -11,7 +11,16 @@ class ProfileTransformer extends Fractal\TransformerAbstract
public function transform(Profile $profile)
{
return [
- '@context' => 'https://www.w3.org/ns/activitystreams',
+ '@context' => [
+ 'https://www.w3.org/ns/activitystreams',
+ 'https://w3id.org/security/v1',
+ [
+ "manuallyApprovesFollowers" => "as:manuallyApprovesFollowers",
+ "featured" => [
+ "https://pixelfed.org/ns#featured" => ["@type" => "@id"],
+ ]
+ ]
+ ],
'id' => $profile->permalink(),
'type' => 'Person',
'following' => $profile->permalink('/following'),
@@ -23,9 +32,9 @@ class ProfileTransformer extends Fractal\TransformerAbstract
'name' => $profile->name,
'summary' => $profile->bio,
'url' => $profile->url(),
- 'manuallyApprovesFollowers' => $profile->is_private,
- 'follower_count' => $profile->followers()->count(),
- 'following_count' => $profile->following()->count(),
+ 'manuallyApprovesFollowers' => (bool) $profile->is_private,
+ // 'follower_count' => $profile->followers()->count(),
+ // 'following_count' => $profile->following()->count(),
'publicKey' => [
'id' => $profile->permalink() . '#main-key',
'owner' => $profile->permalink(),
@@ -34,7 +43,11 @@ class ProfileTransformer extends Fractal\TransformerAbstract
'endpoints' => [
'sharedInbox' => config('routes.api.sharedInbox')
],
-
+ 'icon' => [
+ 'type' => 'Image',
+ 'mediaType' => 'image/jpeg',
+ 'url' => $profile->avatarUrl()
+ ]
];
}
diff --git a/app/Transformer/ActivityPub/StatusTransformer.php b/app/Transformer/ActivityPub/StatusTransformer.php
new file mode 100644
index 00000000..fb90cbd5
--- /dev/null
+++ b/app/Transformer/ActivityPub/StatusTransformer.php
@@ -0,0 +1,61 @@
+ [
+ 'https://www.w3.org/ns/activitystreams',
+ 'https://w3id.org/security/v1',
+ [
+ "manuallyApprovesFollowers" => "as:manuallyApprovesFollowers",
+ "featured" => [
+ "https://pixelfed.org/ns#featured" => ["@type" => "@id"],
+ ]
+ ]
+ ],
+ 'id' => $status->url(),
+
+ // TODO: handle other types
+ 'type' => 'Note',
+
+ // XXX: CW Title
+ 'summary' => null,
+ 'content' => $status->rendered ?? $status->caption,
+ 'inReplyTo' => null,
+
+ // TODO: fix date format
+ 'published' => $status->created_at->toAtomString(),
+ 'url' => $status->url(),
+ 'attributedTo' => $status->profile->permalink(),
+ 'to' => [
+ // TODO: handle proper scope
+ 'https://www.w3.org/ns/activitystreams#Public'
+ ],
+ 'cc' => [
+ // TODO: add cc's
+ $status->profile->permalink('/followers'),
+ ],
+ 'sensitive' => (bool) $status->is_nsfw,
+ 'atomUri' => $status->url(),
+ 'inReplyToAtomUri' => null,
+ 'attachment' => $status->media->map(function($media) {
+ return [
+ 'type' => 'Document',
+ 'mediaType' => $media->mime,
+ 'url' => $media->url(),
+ 'name' => null
+ ];
+ }),
+ 'tag' => []
+ ];
+ }
+
+}
\ No newline at end of file
diff --git a/app/Transformer/Api/AccountTransformer.php b/app/Transformer/Api/AccountTransformer.php
new file mode 100644
index 00000000..1f95c813
--- /dev/null
+++ b/app/Transformer/Api/AccountTransformer.php
@@ -0,0 +1,33 @@
+ $profile->id,
+ 'username' => $profile->username,
+ 'acct' => $profile->username,
+ 'display_name' => $profile->name,
+ 'locked' => (bool) $profile->is_private,
+ 'created_at' => $profile->created_at->format('c'),
+ 'followers_count' => $profile->followerCount(),
+ 'following_count' => $profile->followingCount(),
+ 'statuses_count' => $profile->statusCount(),
+ 'note' => $profile->bio,
+ 'url' => $profile->url(),
+ 'avatar' => $profile->avatarUrl(),
+ 'avatar_static' => $profile->avatarUrl(),
+ 'header' => '',
+ 'header_static' => '',
+ 'moved' => null,
+ 'fields' => null,
+ 'bot' => null
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Transformer/Api/ApplicationTransformer.php b/app/Transformer/Api/ApplicationTransformer.php
new file mode 100644
index 00000000..a0fefcaa
--- /dev/null
+++ b/app/Transformer/Api/ApplicationTransformer.php
@@ -0,0 +1,16 @@
+ '',
+ 'website' => null
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Transformer/Api/HashtagTransformer.php b/app/Transformer/Api/HashtagTransformer.php
new file mode 100644
index 00000000..417cc985
--- /dev/null
+++ b/app/Transformer/Api/HashtagTransformer.php
@@ -0,0 +1,18 @@
+ $hashtag->name,
+ 'url' => $hashtag->url(),
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Transformer/Api/MediaTransformer.php b/app/Transformer/Api/MediaTransformer.php
new file mode 100644
index 00000000..959bae65
--- /dev/null
+++ b/app/Transformer/Api/MediaTransformer.php
@@ -0,0 +1,24 @@
+ $media->id,
+ 'type' => 'image',
+ 'url' => $media->url(),
+ 'remote_url' => null,
+ 'preview_url' => $media->thumbnailUrl(),
+ 'text_url' => null,
+ 'meta' => null,
+ 'description' => null
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Transformer/Api/MentionTransformer.php b/app/Transformer/Api/MentionTransformer.php
new file mode 100644
index 00000000..1d0580af
--- /dev/null
+++ b/app/Transformer/Api/MentionTransformer.php
@@ -0,0 +1,19 @@
+ $profile->id,
+ 'url' => $profile->url(),
+ 'username' => $profile->username,
+ 'acct' => $profile->username,
+ ];
+ }
+}
\ No newline at end of file
diff --git a/app/Transformer/Api/StatusTransformer.php b/app/Transformer/Api/StatusTransformer.php
new file mode 100644
index 00000000..ad5129a9
--- /dev/null
+++ b/app/Transformer/Api/StatusTransformer.php
@@ -0,0 +1,69 @@
+ $status->id,
+ 'uri' => $status->url(),
+ 'url' => $status->url(),
+ 'in_reply_to_id' => $status->in_reply_to_id,
+ 'in_reply_to_account_id' => $status->in_reply_to_profile_id,
+
+ // TODO: fixme
+ 'reblog' => null,
+
+ 'content' => "
$status->rendered
",
+ 'created_at' => $status->created_at->format('c'),
+ 'emojis' => [],
+ 'reblogs_count' => $status->shares()->count(),
+ 'favourites_count' => $status->likes()->count(),
+ 'reblogged' => $status->shared(),
+ 'favourited' => $status->liked(),
+ 'muted' => null,
+ 'sensitive' => (bool) $status->is_nsfw,
+ 'spoiler_text' => '',
+ 'visibility' => $status->visibility,
+ 'application' => null,
+ 'language' => null,
+ 'pinned' => null
+ ];
+ }
+
+ public function includeAccount(Status $status)
+ {
+ $account = $status->profile;
+ return $this->item($account, new AccountTransformer);
+ }
+
+ public function includeMentions(Status $status)
+ {
+ $mentions = $status->mentions;
+ return $this->collection($mentions, new MentionTransformer);
+ }
+
+ public function includeMediaAttachments(Status $status)
+ {
+ $media = $status->media;
+ return $this->collection($media, new MediaTransformer);
+ }
+
+ public function includeTags(Status $status)
+ {
+ $tags = $status->hashtags;
+ return $this->collection($tags, new HashtagTransformer);
+ }
+}
\ No newline at end of file
diff --git a/app/User.php b/app/User.php
index 33297e48..a3fb76fb 100644
--- a/app/User.php
+++ b/app/User.php
@@ -3,11 +3,19 @@
namespace App;
use Illuminate\Notifications\Notifiable;
+use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
- use Notifiable;
+ use Notifiable, SoftDeletes;
+
+ /**
+ * The attributes that should be mutated to dates.
+ *
+ * @var array
+ */
+ protected $dates = ['deleted_at', 'email_verified_at'];
/**
* The attributes that are mass assignable.
@@ -36,4 +44,9 @@ class User extends Authenticatable
{
return url(config('app.url') . '/' . $this->username);
}
+
+ public function settings()
+ {
+ return $this->hasOne(UserSetting::class);
+ }
}
diff --git a/app/UserFilter.php b/app/UserFilter.php
new file mode 100644
index 00000000..41edd539
--- /dev/null
+++ b/app/UserFilter.php
@@ -0,0 +1,15 @@
+
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Mike Cochrane, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+
+namespace App\Util\Lexer;
+
+use App\Util\Lexer\Regex;
+use App\Util\Lexer\Extractor;
+use App\Util\Lexer\StringUtils;
+
+/**
+ * Twitter Autolink Class
+ *
+ * Parses tweets and generates HTML anchor tags around URLs, usernames,
+ * username/list pairs and hashtags.
+ *
+ * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
+ * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
+ * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
+ *
+ * @author Mike Cochrane
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Mike Cochrane, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+class Autolink extends Regex
+{
+
+ /**
+ * CSS class for auto-linked URLs.
+ *
+ * @var string
+ */
+ protected $class_url = '';
+
+ /**
+ * CSS class for auto-linked username URLs.
+ *
+ * @var string
+ */
+ protected $class_user = 'u-url mention';
+
+ /**
+ * CSS class for auto-linked list URLs.
+ *
+ * @var string
+ */
+ protected $class_list = 'u-url list-slug';
+
+ /**
+ * CSS class for auto-linked hashtag URLs.
+ *
+ * @var string
+ */
+ protected $class_hash = 'u-url hashtag';
+
+ /**
+ * CSS class for auto-linked cashtag URLs.
+ *
+ * @var string
+ */
+ protected $class_cash = 'u-url cashtag';
+
+ /**
+ * URL base for username links (the username without the @ will be appended).
+ *
+ * @var string
+ */
+ protected $url_base_user = null;
+
+ /**
+ * URL base for list links (the username/list without the @ will be appended).
+ *
+ * @var string
+ */
+ protected $url_base_list = null;
+
+ /**
+ * URL base for hashtag links (the hashtag without the # will be appended).
+ *
+ * @var string
+ */
+ protected $url_base_hash = null;
+
+ /**
+ * URL base for cashtag links (the hashtag without the $ will be appended).
+ *
+ * @var string
+ */
+ protected $url_base_cash = null;
+
+ /**
+ * Whether to include the value 'nofollow' in the 'rel' attribute.
+ *
+ * @var bool
+ */
+ protected $nofollow = true;
+
+ /**
+ * Whether to include the value 'noopener' in the 'rel' attribute.
+ *
+ * @var bool
+ */
+ protected $noopener = true;
+
+ /**
+ * Whether to include the value 'external' in the 'rel' attribute.
+ *
+ * Often this is used to be matched on in JavaScript for dynamically adding
+ * the 'target' attribute which is deprecated in HTML 4.01. In HTML 5 it has
+ * been undeprecated and thus the 'target' attribute can be used. If this is
+ * set to false then the 'target' attribute will be output.
+ *
+ * @var bool
+ */
+ protected $external = true;
+
+ /**
+ * The scope to open the link in.
+ *
+ * Support for the 'target' attribute was deprecated in HTML 4.01 but has
+ * since been reinstated in HTML 5. To output the 'target' attribute you
+ * must disable the adding of the string 'external' to the 'rel' attribute.
+ *
+ * @var string
+ */
+ protected $target = '_blank';
+
+ /**
+ * attribute for invisible span tag
+ *
+ * @var string
+ */
+ protected $invisibleTagAttrs = "style='position:absolute;left:-9999px;'";
+
+ /**
+ *
+ * @var Extractor
+ */
+ protected $extractor = null;
+
+ /**
+ * Provides fluent method chaining.
+ *
+ * @param string $tweet The tweet to be converted.
+ * @param bool $full_encode Whether to encode all special characters.
+ *
+ * @see __construct()
+ *
+ * @return Autolink
+ */
+ public static function create($tweet = null, $full_encode = false)
+ {
+ return new static($tweet, $full_encode);
+ }
+
+ /**
+ * Reads in a tweet to be parsed and converted to contain links.
+ *
+ * As the intent is to produce links and output the modified tweet to the
+ * user, we take this opportunity to ensure that we escape user input.
+ *
+ * @see htmlspecialchars()
+ *
+ * @param string $tweet The tweet to be converted.
+ * @param bool $escape Whether to escape the tweet (default: true).
+ * @param bool $full_encode Whether to encode all special characters.
+ */
+ public function __construct($tweet = null, $escape = true, $full_encode = false)
+ {
+ if ($escape && !empty($tweet)) {
+ if ($full_encode) {
+ parent::__construct(htmlentities($tweet, ENT_QUOTES, 'UTF-8', false));
+ } else {
+ parent::__construct(htmlspecialchars($tweet, ENT_QUOTES, 'UTF-8', false));
+ }
+ } else {
+ parent::__construct($tweet);
+ }
+ $this->extractor = Extractor::create();
+ $this->url_base_user = config('app.url') . '/';
+ $this->url_base_list = config('app.url') . '/';
+ $this->url_base_hash = config('app.url') . "/discover/tags/";
+ $this->url_base_cash = config('app.url') . '/search?q=%24';
+ }
+
+ /**
+ * CSS class for auto-linked URLs.
+ *
+ * @return string CSS class for URL links.
+ */
+ public function getURLClass()
+ {
+ return $this->class_url;
+ }
+
+ /**
+ * CSS class for auto-linked URLs.
+ *
+ * @param string $v CSS class for URL links.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setURLClass($v)
+ {
+ $this->class_url = trim($v);
+ return $this;
+ }
+
+ /**
+ * CSS class for auto-linked username URLs.
+ *
+ * @return string CSS class for username links.
+ */
+ public function getUsernameClass()
+ {
+ return $this->class_user;
+ }
+
+ /**
+ * CSS class for auto-linked username URLs.
+ *
+ * @param string $v CSS class for username links.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setUsernameClass($v)
+ {
+ $this->class_user = trim($v);
+ return $this;
+ }
+
+ /**
+ * CSS class for auto-linked username/list URLs.
+ *
+ * @return string CSS class for username/list links.
+ */
+ public function getListClass()
+ {
+ return $this->class_list;
+ }
+
+ /**
+ * CSS class for auto-linked username/list URLs.
+ *
+ * @param string $v CSS class for username/list links.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setListClass($v)
+ {
+ $this->class_list = trim($v);
+ return $this;
+ }
+
+ /**
+ * CSS class for auto-linked hashtag URLs.
+ *
+ * @return string CSS class for hashtag links.
+ */
+ public function getHashtagClass()
+ {
+ return $this->class_hash;
+ }
+
+ /**
+ * CSS class for auto-linked hashtag URLs.
+ *
+ * @param string $v CSS class for hashtag links.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setHashtagClass($v)
+ {
+ $this->class_hash = trim($v);
+ return $this;
+ }
+
+ /**
+ * CSS class for auto-linked cashtag URLs.
+ *
+ * @return string CSS class for cashtag links.
+ */
+ public function getCashtagClass()
+ {
+ return $this->class_cash;
+ }
+
+ /**
+ * CSS class for auto-linked cashtag URLs.
+ *
+ * @param string $v CSS class for cashtag links.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setCashtagClass($v)
+ {
+ $this->class_cash = trim($v);
+ return $this;
+ }
+
+ /**
+ * Whether to include the value 'nofollow' in the 'rel' attribute.
+ *
+ * @return bool Whether to add 'nofollow' to the 'rel' attribute.
+ */
+ public function getNoFollow()
+ {
+ return $this->nofollow;
+ }
+
+ /**
+ * Whether to include the value 'nofollow' in the 'rel' attribute.
+ *
+ * @param bool $v The value to add to the 'target' attribute.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setNoFollow($v)
+ {
+ $this->nofollow = $v;
+ return $this;
+ }
+
+ /**
+ * Whether to include the value 'external' in the 'rel' attribute.
+ *
+ * Often this is used to be matched on in JavaScript for dynamically adding
+ * the 'target' attribute which is deprecated in HTML 4.01. In HTML 5 it has
+ * been undeprecated and thus the 'target' attribute can be used. If this is
+ * set to false then the 'target' attribute will be output.
+ *
+ * @return bool Whether to add 'external' to the 'rel' attribute.
+ */
+ public function getExternal()
+ {
+ return $this->external;
+ }
+
+ /**
+ * Whether to include the value 'external' in the 'rel' attribute.
+ *
+ * Often this is used to be matched on in JavaScript for dynamically adding
+ * the 'target' attribute which is deprecated in HTML 4.01. In HTML 5 it has
+ * been undeprecated and thus the 'target' attribute can be used. If this is
+ * set to false then the 'target' attribute will be output.
+ *
+ * @param bool $v The value to add to the 'target' attribute.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setExternal($v)
+ {
+ $this->external = $v;
+ return $this;
+ }
+
+ /**
+ * The scope to open the link in.
+ *
+ * Support for the 'target' attribute was deprecated in HTML 4.01 but has
+ * since been reinstated in HTML 5. To output the 'target' attribute you
+ * must disable the adding of the string 'external' to the 'rel' attribute.
+ *
+ * @return string The value to add to the 'target' attribute.
+ */
+ public function getTarget()
+ {
+ return $this->target;
+ }
+
+ /**
+ * The scope to open the link in.
+ *
+ * Support for the 'target' attribute was deprecated in HTML 4.01 but has
+ * since been reinstated in HTML 5. To output the 'target' attribute you
+ * must disable the adding of the string 'external' to the 'rel' attribute.
+ *
+ * @param string $v The value to add to the 'target' attribute.
+ *
+ * @return Autolink Fluid method chaining.
+ */
+ public function setTarget($v)
+ {
+ $this->target = trim($v);
+ return $this;
+ }
+
+ /**
+ * Autolink with entities
+ *
+ * @param string $tweet
+ * @param array $entities
+ * @return string
+ * @since 1.1.0
+ */
+ public function autoLinkEntities($tweet = null, $entities = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+
+ $text = '';
+ $beginIndex = 0;
+ foreach ($entities as $entity) {
+ if (isset($entity['screen_name'])) {
+ $text .= StringUtils::substr($tweet, $beginIndex, $entity['indices'][0] - $beginIndex + 1);
+ } else {
+ $text .= StringUtils::substr($tweet, $beginIndex, $entity['indices'][0] - $beginIndex);
+ }
+
+ if (isset($entity['url'])) {
+ $text .= $this->linkToUrl($entity);
+ } elseif (isset($entity['hashtag'])) {
+ $text .= $this->linkToHashtag($entity, $tweet);
+ } elseif (isset($entity['screen_name'])) {
+ $text .= $this->linkToMentionAndList($entity);
+ } elseif (isset($entity['cashtag'])) {
+ $text .= $this->linkToCashtag($entity, $tweet);
+ }
+ $beginIndex = $entity['indices'][1];
+ }
+ $text .= StringUtils::substr($tweet, $beginIndex, StringUtils::strlen($tweet));
+ return $text;
+ }
+
+ /**
+ * Auto-link hashtags, URLs, usernames and lists, with JSON entities.
+ *
+ * @param string The tweet to be converted
+ * @param mixed The entities info
+ * @return string that auto-link HTML added
+ * @since 1.1.0
+ */
+ public function autoLinkWithJson($tweet = null, $json = null)
+ {
+ // concatenate entities
+ $entities = array();
+ if (is_object($json)) {
+ $json = $this->object2array($json);
+ }
+ if (is_array($json)) {
+ foreach ($json as $key => $vals) {
+ $entities = array_merge($entities, $json[$key]);
+ }
+ }
+
+ // map JSON entity to twitter-text entity
+ foreach ($entities as $idx => $entity) {
+ if (!empty($entity['text'])) {
+ $entities[$idx]['hashtag'] = $entity['text'];
+ }
+ }
+
+ $entities = $this->extractor->removeOverlappingEntities($entities);
+ return $this->autoLinkEntities($tweet, $entities);
+ }
+
+ /**
+ * convert Object to Array
+ *
+ * @param mixed $obj
+ * @return array
+ */
+ protected function object2array($obj)
+ {
+ $array = (array) $obj;
+ foreach ($array as $key => $var) {
+ if (is_object($var) || is_array($var)) {
+ $array[$key] = $this->object2array($var);
+ }
+ }
+ return $array;
+ }
+
+ /**
+ * Auto-link hashtags, URLs, usernames and lists.
+ *
+ * @param string The tweet to be converted
+ * @return string that auto-link HTML added
+ * @since 1.1.0
+ */
+ public function autoLink($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $entities = $this->extractor->extractURLWithoutProtocol(false)->extractEntitiesWithIndices($tweet);
+ return $this->autoLinkEntities($tweet, $entities);
+ }
+
+ /**
+ * Auto-link the @username and @username/list references in the provided text. Links to @username references will
+ * have the usernameClass CSS classes added. Links to @username/list references will have the listClass CSS class
+ * added.
+ *
+ * @return string that auto-link HTML added
+ * @since 1.1.0
+ */
+ public function autoLinkUsernamesAndLists($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $entities = $this->extractor->extractMentionsOrListsWithIndices($tweet);
+ return $this->autoLinkEntities($tweet, $entities);
+ }
+
+ /**
+ * Auto-link #hashtag references in the provided Tweet text. The #hashtag links will have the hashtagClass CSS class
+ * added.
+ *
+ * @return string that auto-link HTML added
+ * @since 1.1.0
+ */
+ public function autoLinkHashtags($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $entities = $this->extractor->extractHashtagsWithIndices($tweet);
+ return $this->autoLinkEntities($tweet, $entities);
+ }
+
+ /**
+ * Auto-link URLs in the Tweet text provided.
+ *
+ * This only auto-links URLs with protocol.
+ *
+ * @return string that auto-link HTML added
+ * @since 1.1.0
+ */
+ public function autoLinkURLs($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $entities = $this->extractor->extractURLWithoutProtocol(false)->extractURLsWithIndices($tweet);
+ return $this->autoLinkEntities($tweet, $entities);
+ }
+
+ /**
+ * Auto-link $cashtag references in the provided Tweet text. The $cashtag links will have the cashtagClass CSS class
+ * added.
+ *
+ * @return string that auto-link HTML added
+ * @since 1.1.0
+ */
+ public function autoLinkCashtags($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $entities = $this->extractor->extractCashtagsWithIndices($tweet);
+ return $this->autoLinkEntities($tweet, $entities);
+ }
+
+ public function linkToUrl($entity)
+ {
+ if (!empty($this->class_url)) {
+ $attributes['class'] = $this->class_url;
+ }
+ $attributes['href'] = $entity['url'];
+ $linkText = $this->escapeHTML($entity['url']);
+
+ if (!empty($entity['display_url']) && !empty($entity['expanded_url'])) {
+ // Goal: If a user copies and pastes a tweet containing t.co'ed link, the resulting paste
+ // should contain the full original URL (expanded_url), not the display URL.
+ //
+ // Method: Whenever possible, we actually emit HTML that contains expanded_url, and use
+ // font-size:0 to hide those parts that should not be displayed (because they are not part of display_url).
+ // Elements with font-size:0 get copied even though they are not visible.
+ // Note that display:none doesn't work here. Elements with display:none don't get copied.
+ //
+ // Additionally, we want to *display* ellipses, but we don't want them copied. To make this happen we
+ // wrap the ellipses in a tco-ellipsis class and provide an onCopy handler that sets display:none on
+ // everything with the tco-ellipsis class.
+ //
+ // As an example: The user tweets "hi http://longdomainname.com/foo"
+ // This gets shortened to "hi http://t.co/xyzabc", with display_url = "…nname.com/foo"
+ // This will get rendered as:
+ //
+ // …
+ //
+ // http://longdomai
+ //
+ //
+ // nname.com/foo
+ //
+ //
+ //
+ // …
+ //
+ //
+ // Exception: pic.socialhub.dev images, for which expandedUrl = "https://socialhub.dev/#!/username/status/1234/photo/1
+ // For those URLs, display_url is not a substring of expanded_url, so we don't do anything special to render the elided parts.
+ // For a pic.socialhub.dev URL, the only elided part will be the "https://", so this is fine.
+ $displayURL = $entity['display_url'];
+ $expandedURL = $entity['expanded_url'];
+ $displayURLSansEllipses = preg_replace('/…/u', '', $displayURL);
+ $diplayURLIndexInExpandedURL = mb_strpos($expandedURL, $displayURLSansEllipses);
+
+ if ($diplayURLIndexInExpandedURL !== false) {
+ $beforeDisplayURL = mb_substr($expandedURL, 0, $diplayURLIndexInExpandedURL);
+ $afterDisplayURL = mb_substr($expandedURL, $diplayURLIndexInExpandedURL + mb_strlen($displayURLSansEllipses));
+ $precedingEllipsis = (preg_match('/\A…/u', $displayURL)) ? '…' : '';
+ $followingEllipsis = (preg_match('/…\z/u', $displayURL)) ? '…' : '';
+
+ $invisibleSpan = "invisibleTagAttrs}>";
+
+ $linkText = "{$precedingEllipsis}{$invisibleSpan} ";
+ $linkText .= "{$invisibleSpan}{$this->escapeHTML($beforeDisplayURL)}";
+ $linkText .= "{$this->escapeHTML($displayURLSansEllipses)} ";
+ $linkText .= "{$invisibleSpan}{$this->escapeHTML($afterDisplayURL)}";
+ $linkText .= "{$invisibleSpan} {$followingEllipsis}";
+ } else {
+ $linkText = $entity['display_url'];
+ }
+ $attributes['title'] = $entity['expanded_url'];
+ } elseif (!empty($entity['display_url'])) {
+ $linkText = $entity['display_url'];
+ }
+
+ return $this->linkToText($entity, $linkText, $attributes);
+ }
+
+ /**
+ *
+ * @param array $entity
+ * @param string $tweet
+ * @return string
+ * @since 1.1.0
+ */
+ public function linkToHashtag($entity, $tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $this->target = false;
+ $attributes = array();
+ $class = array();
+ $hash = StringUtils::substr($tweet, $entity['indices'][0], 1);
+ $linkText = $hash . $entity['hashtag'];
+
+ $attributes['href'] = $this->url_base_hash . $entity['hashtag'] . '?src=hash';
+ $attributes['title'] = '#' . $entity['hashtag'];
+ if (!empty($this->class_hash)) {
+ $class[] = $this->class_hash;
+ }
+ if (preg_match(self::$patterns['rtl_chars'], $linkText)) {
+ $class[] = 'rtl';
+ }
+ if (!empty($class)) {
+ $attributes['class'] = join(' ', $class);
+ }
+
+ return $this->linkToText($entity, $linkText, $attributes);
+ }
+
+ /**
+ *
+ * @param array $entity
+ * @return string
+ * @since 1.1.0
+ */
+ public function linkToMentionAndList($entity)
+ {
+ $attributes = array();
+
+ if (!empty($entity['list_slug'])) {
+ # Replace the list and username
+ $linkText = $entity['screen_name'] . $entity['list_slug'];
+ $class = $this->class_list;
+ $url = $this->url_base_list . $linkText;
+ } else {
+ # Replace the username
+ $linkText = $entity['screen_name'];
+ $class = $this->class_user;
+ $url = $this->url_base_user . $linkText;
+ }
+ if (!empty($class)) {
+ $attributes['class'] = $class;
+ }
+ $attributes['href'] = $url;
+
+ return $this->linkToText($entity, $linkText, $attributes);
+ }
+
+ /**
+ *
+ * @param array $entity
+ * @param string $tweet
+ * @return string
+ * @since 1.1.0
+ */
+ public function linkToCashtag($entity, $tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $attributes = array();
+ $doller = StringUtils::substr($tweet, $entity['indices'][0], 1);
+ $linkText = $doller . $entity['cashtag'];
+ $attributes['href'] = $this->url_base_cash . $entity['cashtag'];
+ $attributes['title'] = $linkText;
+ if (!empty($this->class_cash)) {
+ $attributes['class'] = $this->class_cash;
+ }
+
+ return $this->linkToText($entity, $linkText, $attributes);
+ }
+
+ /**
+ *
+ * @param array $entity
+ * @param string $text
+ * @param array $attributes
+ * @return string
+ * @since 1.1.0
+ */
+ public function linkToText(array $entity, $text, $attributes = array())
+ {
+ $rel = array();
+ if ($this->external) {
+ $rel[] = 'external';
+ }
+ if ($this->nofollow) {
+ $rel[] = 'nofollow';
+ }
+ if ($this->noopener) {
+ $rel[] = 'noopener';
+ }
+ if (!empty($rel)) {
+ $attributes['rel'] = join(' ', $rel);
+ }
+ if ($this->target) {
+ $attributes['target'] = $this->target;
+ }
+ $link = ' $val) {
+ $link .= ' ' . $key . '="' . $this->escapeHTML($val) . '"';
+ }
+ $link .= '>' . $text . ' ';
+ return $link;
+ }
+
+ /**
+ * html escape
+ *
+ * @param string $text
+ * @return string
+ */
+ protected function escapeHTML($text)
+ {
+ return htmlspecialchars($text, ENT_QUOTES, 'UTF-8', false);
+ }
+}
diff --git a/app/Util/Lexer/Extractor.php b/app/Util/Lexer/Extractor.php
new file mode 100755
index 00000000..5a066985
--- /dev/null
+++ b/app/Util/Lexer/Extractor.php
@@ -0,0 +1,548 @@
+
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Mike Cochrane, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+
+namespace App\Util\Lexer;
+
+use App\Util\Lexer\Regex;
+use App\Util\Lexer\StringUtils;
+
+/**
+ * Twitter Extractor Class
+ *
+ * Parses tweets and extracts URLs, usernames, username/list pairs and
+ * hashtags.
+ *
+ * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
+ * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
+ * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
+ *
+ * @author Mike Cochrane
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Mike Cochrane, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+class Extractor extends Regex
+{
+
+ /**
+ * @var boolean
+ */
+ protected $extractURLWithoutProtocol = true;
+
+ /**
+ * Provides fluent method chaining.
+ *
+ * @param string $tweet The tweet to be converted.
+ *
+ * @see __construct()
+ *
+ * @return Extractor
+ */
+ public static function create($tweet = null)
+ {
+ return new self($tweet);
+ }
+
+ /**
+ * Reads in a tweet to be parsed and extracts elements from it.
+ *
+ * Extracts various parts of a tweet including URLs, usernames, hashtags...
+ *
+ * @param string $tweet The tweet to extract.
+ */
+ public function __construct($tweet = null)
+ {
+ parent::__construct($tweet);
+ }
+
+ /**
+ * Extracts all parts of a tweet and returns an associative array containing
+ * the extracted elements.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The elements in the tweet.
+ */
+ public function extract($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ return array(
+ 'hashtags' => $this->extractHashtags($tweet),
+ 'urls' => $this->extractURLs($tweet),
+ 'mentions' => $this->extractMentionedUsernames($tweet),
+ 'replyto' => $this->extractRepliedUsernames($tweet),
+ 'hashtags_with_indices' => $this->extractHashtagsWithIndices($tweet),
+ 'urls_with_indices' => $this->extractURLsWithIndices($tweet),
+ 'mentions_with_indices' => $this->extractMentionedUsernamesWithIndices($tweet),
+ );
+ }
+
+ /**
+ * Extract URLs, @mentions, lists and #hashtag from a given text/tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array list of extracted entities
+ */
+ public function extractEntitiesWithIndices($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $entities = array();
+ $entities = array_merge($entities, $this->extractURLsWithIndices($tweet));
+ $entities = array_merge($entities, $this->extractHashtagsWithIndices($tweet, false));
+ $entities = array_merge($entities, $this->extractMentionsOrListsWithIndices($tweet));
+ $entities = array_merge($entities, $this->extractCashtagsWithIndices($tweet));
+ $entities = $this->removeOverlappingEntities($entities);
+ return $entities;
+ }
+
+ /**
+ * Extracts all the hashtags from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The hashtag elements in the tweet.
+ */
+ public function extractHashtags($tweet = null)
+ {
+ $hashtagsOnly = array();
+ $hashtagsWithIndices = $this->extractHashtagsWithIndices($tweet);
+
+ foreach ($hashtagsWithIndices as $hashtagWithIndex) {
+ $hashtagsOnly[] = $hashtagWithIndex['hashtag'];
+ }
+ return $hashtagsOnly;
+ }
+
+ /**
+ * Extracts all the cashtags from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The cashtag elements in the tweet.
+ */
+ public function extractCashtags($tweet = null)
+ {
+ $cashtagsOnly = array();
+ $cashtagsWithIndices = $this->extractCashtagsWithIndices($tweet);
+
+ foreach ($cashtagsWithIndices as $cashtagWithIndex) {
+ $cashtagsOnly[] = $cashtagWithIndex['cashtag'];
+ }
+ return $cashtagsOnly;
+ }
+
+ /**
+ * Extracts all the URLs from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The URL elements in the tweet.
+ */
+ public function extractURLs($tweet = null)
+ {
+ $urlsOnly = array();
+ $urlsWithIndices = $this->extractURLsWithIndices($tweet);
+
+ foreach ($urlsWithIndices as $urlWithIndex) {
+ $urlsOnly[] = $urlWithIndex['url'];
+ }
+ return $urlsOnly;
+ }
+
+ /**
+ * Extract all the usernames from the tweet.
+ *
+ * A mention is an occurrence of a username anywhere in a tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The usernames elements in the tweet.
+ */
+ public function extractMentionedScreennames($tweet = null)
+ {
+ $usernamesOnly = array();
+ $mentionsWithIndices = $this->extractMentionsOrListsWithIndices($tweet);
+
+ foreach ($mentionsWithIndices as $mentionWithIndex) {
+ $screen_name = mb_strtolower($mentionWithIndex['screen_name']);
+ if (empty($screen_name) OR in_array($screen_name, $usernamesOnly)) {
+ continue;
+ }
+ $usernamesOnly[] = $screen_name;
+ }
+ return $usernamesOnly;
+ }
+
+ /**
+ * Extract all the usernames from the tweet.
+ *
+ * A mention is an occurrence of a username anywhere in a tweet.
+ *
+ * @return array The usernames elements in the tweet.
+ * @deprecated since version 1.1.0
+ */
+ public function extractMentionedUsernames($tweet)
+ {
+ $this->tweet = $tweet;
+ return $this->extractMentionedScreennames($tweet);
+ }
+
+ /**
+ * Extract all the usernames replied to from the tweet.
+ *
+ * A reply is an occurrence of a username at the beginning of a tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The usernames replied to in a tweet.
+ */
+ public function extractReplyScreenname($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $matched = preg_match(self::$patterns['valid_reply'], $tweet, $matches);
+ # Check username ending in
+ if ($matched && preg_match(self::$patterns['end_mention_match'], $matches[2])) {
+ $matched = false;
+ }
+ return $matched ? $matches[1] : null;
+ }
+
+ /**
+ * Extract all the usernames replied to from the tweet.
+ *
+ * A reply is an occurrence of a username at the beginning of a tweet.
+ *
+ * @return array The usernames replied to in a tweet.
+ * @deprecated since version 1.1.0
+ */
+ public function extractRepliedUsernames()
+ {
+ return $this->extractReplyScreenname();
+ }
+
+ /**
+ * Extracts all the hashtags and the indices they occur at from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @param boolean $checkUrlOverlap if true, check if extracted hashtags overlap URLs and remove overlapping ones
+ * @return array The hashtag elements in the tweet.
+ */
+ public function extractHashtagsWithIndices($tweet = null, $checkUrlOverlap = true)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+
+ if (!preg_match('/[##]/iu', $tweet)) {
+ return array();
+ }
+
+ preg_match_all(self::$patterns['valid_hashtag'], $tweet, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
+ $tags = array();
+
+ foreach ($matches as $match) {
+ list($all, $before, $hash, $hashtag, $outer) = array_pad($match, 3, array('', 0));
+ $start_position = $hash[1] > 0 ? StringUtils::strlen(substr($tweet, 0, $hash[1])) : $hash[1];
+ $end_position = $start_position + StringUtils::strlen($hash[0] . $hashtag[0]);
+
+ if (preg_match(self::$patterns['end_hashtag_match'], $outer[0])) {
+ continue;
+ }
+
+ $tags[] = array(
+ 'hashtag' => $hashtag[0],
+ 'indices' => array($start_position, $end_position)
+ );
+ }
+
+ if (!$checkUrlOverlap) {
+ return $tags;
+ }
+
+ # check url overlap
+ $urls = $this->extractURLsWithIndices($tweet);
+ $entities = $this->removeOverlappingEntities(array_merge($tags, $urls));
+
+ $validTags = array();
+ foreach ($entities as $entity) {
+ if (empty($entity['hashtag'])) {
+ continue;
+ }
+ $validTags[] = $entity;
+ }
+
+ return $validTags;
+ }
+
+ /**
+ * Extracts all the cashtags and the indices they occur at from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The cashtag elements in the tweet.
+ */
+ public function extractCashtagsWithIndices($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+
+ if (!preg_match('/\$/iu', $tweet)) {
+ return array();
+ }
+
+ preg_match_all(self::$patterns['valid_cashtag'], $tweet, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
+ $tags = array();
+
+ foreach ($matches as $match) {
+ list($all, $before, $dollar, $cash_text, $outer) = array_pad($match, 3, array('', 0));
+ $start_position = $dollar[1] > 0 ? StringUtils::strlen(substr($tweet, 0, $dollar[1])) : $dollar[1];
+ $end_position = $start_position + StringUtils::strlen($dollar[0] . $cash_text[0]);
+
+ if (preg_match(self::$patterns['end_hashtag_match'], $outer[0])) {
+ continue;
+ }
+
+ $tags[] = array(
+ 'cashtag' => $cash_text[0],
+ 'indices' => array($start_position, $end_position)
+ );
+ }
+
+ return $tags;
+ }
+
+ /**
+ * Extracts all the URLs and the indices they occur at from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The URLs elements in the tweet.
+ */
+ public function extractURLsWithIndices($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+
+ $needle = $this->extractURLWithoutProtocol() ? '.' : ':';
+ if (strpos($tweet, $needle) === false) {
+ return array();
+ }
+
+ $urls = array();
+ preg_match_all(self::$patterns['valid_url'], $tweet, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
+
+ foreach ($matches as $match) {
+ list($all, $before, $url, $protocol, $domain, $port, $path, $query) = array_pad($match, 8, array(''));
+ $start_position = $url[1] > 0 ? StringUtils::strlen(substr($tweet, 0, $url[1])) : $url[1];
+ $end_position = $start_position + StringUtils::strlen($url[0]);
+
+ $all = $all[0];
+ $before = $before[0];
+ $url = $url[0];
+ $protocol = $protocol[0];
+ $domain = $domain[0];
+ $port = $port[0];
+ $path = $path[0];
+ $query = $query[0];
+
+ // If protocol is missing and domain contains non-ASCII characters,
+ // extract ASCII-only domains.
+ if (empty($protocol)) {
+ if (!$this->extractURLWithoutProtocol || preg_match(self::$patterns['invalid_url_without_protocol_preceding_chars'], $before)) {
+ continue;
+ }
+
+ $last_url = null;
+ $ascii_end_position = 0;
+
+ if (preg_match(self::$patterns['valid_ascii_domain'], $domain, $asciiDomain)) {
+ $asciiDomain[0] = preg_replace('/' . preg_quote($domain, '/') . '/u', $asciiDomain[0], $url);
+ $ascii_start_position = StringUtils::strpos($domain, $asciiDomain[0], $ascii_end_position);
+ $ascii_end_position = $ascii_start_position + StringUtils::strlen($asciiDomain[0]);
+ $last_url = array(
+ 'url' => $asciiDomain[0],
+ 'indices' => array($start_position + $ascii_start_position, $start_position + $ascii_end_position),
+ );
+ if (!empty($path)
+ || preg_match(self::$patterns['valid_special_short_domain'], $asciiDomain[0])
+ || !preg_match(self::$patterns['invalid_short_domain'], $asciiDomain[0])) {
+ $urls[] = $last_url;
+ }
+ }
+
+ // no ASCII-only domain found. Skip the entire URL
+ if (empty($last_url)) {
+ continue;
+ }
+
+ // $last_url only contains domain. Need to add path and query if they exist.
+ if (!empty($path)) {
+ // last_url was not added. Add it to urls here.
+ $last_url['url'] = preg_replace('/' . preg_quote($domain, '/') . '/u', $last_url['url'], $url);
+ $last_url['indices'][1] = $end_position;
+ }
+ } else {
+ // In the case of t.co URLs, don't allow additional path characters
+ if (preg_match(self::$patterns['valid_tco_url'], $url, $tcoUrlMatches)) {
+ $url = $tcoUrlMatches[0];
+ $end_position = $start_position + StringUtils::strlen($url);
+ }
+ $urls[] = array(
+ 'url' => $url,
+ 'indices' => array($start_position, $end_position),
+ );
+ }
+ }
+
+ return $urls;
+ }
+
+ /**
+ * Extracts all the usernames and the indices they occur at from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The username elements in the tweet.
+ */
+ public function extractMentionedScreennamesWithIndices($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+
+ $usernamesOnly = array();
+ $mentions = $this->extractMentionsOrListsWithIndices($tweet);
+ foreach ($mentions as $mention) {
+ if (isset($mention['list_slug'])) {
+ unset($mention['list_slug']);
+ }
+ $usernamesOnly[] = $mention;
+ }
+ return $usernamesOnly;
+ }
+
+ /**
+ * Extracts all the usernames and the indices they occur at from the tweet.
+ *
+ * @return array The username elements in the tweet.
+ * @deprecated since version 1.1.0
+ */
+ public function extractMentionedUsernamesWithIndices()
+ {
+ return $this->extractMentionedScreennamesWithIndices();
+ }
+
+ /**
+ * Extracts all the usernames and the indices they occur at from the tweet.
+ *
+ * @param string $tweet The tweet to extract.
+ * @return array The username elements in the tweet.
+ */
+ public function extractMentionsOrListsWithIndices($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+
+ if (!preg_match('/[@@]/iu', $tweet)) {
+ return array();
+ }
+
+ preg_match_all(self::$patterns['valid_mentions_or_lists'], $tweet, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
+ $results = array();
+
+ foreach ($matches as $match) {
+ list($all, $before, $at, $username, $list_slug, $outer) = array_pad($match, 6, array('', 0));
+ $start_position = $at[1] > 0 ? StringUtils::strlen(substr($tweet, 0, $at[1])) : $at[1];
+ $end_position = $start_position + StringUtils::strlen($at[0]) + StringUtils::strlen($username[0]);
+ $entity = array(
+ 'screen_name' => $username[0],
+ 'list_slug' => $list_slug[0],
+ 'indices' => array($start_position, $end_position),
+ );
+
+ if (preg_match(self::$patterns['end_mention_match'], $outer[0])) {
+ continue;
+ }
+
+ if (!empty($list_slug[0])) {
+ $entity['indices'][1] = $end_position + StringUtils::strlen($list_slug[0]);
+ }
+
+ $results[] = $entity;
+ }
+
+ return $results;
+ }
+
+ /**
+ * Extracts all the usernames and the indices they occur at from the tweet.
+ *
+ * @return array The username elements in the tweet.
+ * @deprecated since version 1.1.0
+ */
+ public function extractMentionedUsernamesOrListsWithIndices()
+ {
+ return $this->extractMentionsOrListsWithIndices();
+ }
+
+ /**
+ * setter/getter for extractURLWithoutProtocol
+ *
+ * @param boolean $flag
+ * @return Extractor
+ */
+ public function extractURLWithoutProtocol($flag = null)
+ {
+ if (is_null($flag)) {
+ return $this->extractURLWithoutProtocol;
+ }
+ $this->extractURLWithoutProtocol = (bool) $flag;
+ return $this;
+ }
+
+ /**
+ * Remove overlapping entities.
+ * This returns a new array with no overlapping entities.
+ *
+ * @param array $entities
+ * @return array
+ */
+ public function removeOverlappingEntities($entities)
+ {
+ $result = array();
+ usort($entities, array($this, 'sortEntites'));
+
+ $prev = null;
+ foreach ($entities as $entity) {
+ if (isset($prev) && $entity['indices'][0] < $prev['indices'][1]) {
+ continue;
+ }
+ $prev = $entity;
+ $result[] = $entity;
+ }
+ return $result;
+ }
+
+ /**
+ * sort by entity start index
+ *
+ * @param array $a
+ * @param array $b
+ * @return int
+ */
+ protected function sortEntites($a, $b)
+ {
+ if ($a['indices'][0] == $b['indices'][0]) {
+ return 0;
+ }
+ return ($a['indices'][0] < $b['indices'][0]) ? -1 : 1;
+ }
+}
diff --git a/app/Util/Lexer/HitHighlighter.php b/app/Util/Lexer/HitHighlighter.php
new file mode 100755
index 00000000..77b56157
--- /dev/null
+++ b/app/Util/Lexer/HitHighlighter.php
@@ -0,0 +1,202 @@
+
+ * @copyright Copyright © 2010, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+
+namespace App\Util\Lexer;
+
+use App\Util\Lexer\Regex;
+use App\Util\Lexer\StringUtils;
+
+/**
+ * Twitter HitHighlighter Class
+ *
+ * Performs "hit highlighting" on tweets that have been auto-linked already.
+ * Useful with the results returned from the search API.
+ *
+ * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
+ * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
+ * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
+ *
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+class HitHighlighter extends Regex
+{
+
+ /**
+ * The tag to surround hits with.
+ *
+ * @var string
+ */
+ protected $tag = 'em';
+
+ /**
+ * Provides fluent method chaining.
+ *
+ * @param string $tweet The tweet to be hit highlighted.
+ * @param bool $full_encode Whether to encode all special characters.
+ *
+ * @see __construct()
+ *
+ * @return HitHighlighter
+ */
+ public static function create($tweet = null, $full_encode = false)
+ {
+ return new self($tweet, $full_encode);
+ }
+
+ /**
+ * Reads in a tweet to be parsed and hit highlighted.
+ *
+ * We take this opportunity to ensure that we escape user input.
+ *
+ * @see htmlspecialchars()
+ *
+ * @param string $tweet The tweet to be hit highlighted.
+ * @param bool $escape Whether to escape the tweet (default: true).
+ * @param bool $full_encode Whether to encode all special characters.
+ */
+ public function __construct($tweet = null, $escape = true, $full_encode = false)
+ {
+ if (!empty($tweet) && $escape) {
+ if ($full_encode) {
+ parent::__construct(htmlentities($tweet, ENT_QUOTES, 'UTF-8', false));
+ } else {
+ parent::__construct(htmlspecialchars($tweet, ENT_QUOTES, 'UTF-8', false));
+ }
+ } else {
+ parent::__construct($tweet);
+ }
+ }
+
+ /**
+ * Set the highlighting tag to surround hits with. The default tag is 'em'.
+ *
+ * @return string The tag name.
+ */
+ public function getTag()
+ {
+ return $this->tag;
+ }
+
+ /**
+ * Set the highlighting tag to surround hits with. The default tag is 'em'.
+ *
+ * @param string $v The tag name.
+ *
+ * @return HitHighlighter Fluid method chaining.
+ */
+ public function setTag($v)
+ {
+ $this->tag = $v;
+ return $this;
+ }
+
+ /**
+ * Hit highlights the tweet.
+ *
+ * @param string $tweet The tweet to be hit highlighted.
+ * @param array $hits An array containing the start and end index pairs
+ * for the highlighting.
+ * @param bool $escape Whether to escape the tweet (default: true).
+ * @param bool $full_encode Whether to encode all special characters.
+ *
+ * @return string The hit highlighted tweet.
+ */
+ public function highlight($tweet = null, array $hits = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ if (empty($hits)) {
+ return $tweet;
+ }
+ $highlightTweet = '';
+ $tags = array('<' . $this->tag . '>', '' . $this->tag . '>');
+ # Check whether we can simply replace or whether we need to chunk...
+ if (strpos($tweet, '<') === false) {
+ $ti = 0; // tag increment (for added tags)
+ $highlightTweet = $tweet;
+ foreach ($hits as $hit) {
+ $highlightTweet = StringUtils::substrReplace($highlightTweet, $tags[0], $hit[0] + $ti, 0);
+ $ti += StringUtils::strlen($tags[0]);
+ $highlightTweet = StringUtils::substrReplace($highlightTweet, $tags[1], $hit[1] + $ti, 0);
+ $ti += StringUtils::strlen($tags[1]);
+ }
+ } else {
+ $chunks = preg_split('/[<>]/iu', $tweet);
+ $chunk = $chunks[0];
+ $chunk_index = 0;
+ $chunk_cursor = 0;
+ $offset = 0;
+ $start_in_chunk = false;
+ # Flatten the multidimensional hits array:
+ $hits_flat = array();
+ foreach ($hits as $hit) {
+ $hits_flat = array_merge($hits_flat, $hit);
+ }
+ # Loop over the hit indices:
+ for ($index = 0; $index < count($hits_flat); $index++) {
+ $hit = $hits_flat[$index];
+ $tag = $tags[$index % 2];
+ $placed = false;
+ while ($chunk !== null && $hit >= ($i = $offset + StringUtils::strlen($chunk))) {
+ $highlightTweet .= StringUtils::substr($chunk, $chunk_cursor);
+ if ($start_in_chunk && $hit === $i) {
+ $highlightTweet .= $tag;
+ $placed = true;
+ }
+ if (isset($chunks[$chunk_index + 1])) {
+ $highlightTweet .= '<' . $chunks[$chunk_index + 1] . '>';
+ }
+ $offset += StringUtils::strlen($chunk);
+ $chunk_cursor = 0;
+ $chunk_index += 2;
+ $chunk = (isset($chunks[$chunk_index]) ? $chunks[$chunk_index] : null);
+ $start_in_chunk = false;
+ }
+ if (!$placed && $chunk !== null) {
+ $hit_spot = $hit - $offset;
+ $highlightTweet .= StringUtils::substr($chunk, $chunk_cursor, $hit_spot - $chunk_cursor) . $tag;
+ $chunk_cursor = $hit_spot;
+ $start_in_chunk = ($index % 2 === 0);
+ $placed = true;
+ }
+ # Ultimate fallback - hits that run off the end get a closing tag:
+ if (!$placed) {
+ $highlightTweet .= $tag;
+ }
+ }
+ if ($chunk !== null) {
+ if ($chunk_cursor < StringUtils::strlen($chunk)) {
+ $highlightTweet .= StringUtils::substr($chunk, $chunk_cursor);
+ }
+ for ($index = $chunk_index + 1; $index < count($chunks); $index++) {
+ $highlightTweet .= ($index % 2 === 0 ? $chunks[$index] : '<' . $chunks[$index] . '>');
+ }
+ }
+ }
+ return $highlightTweet;
+ }
+
+ /**
+ * Hit highlights the tweet.
+ *
+ * @param array $hits An array containing the start and end index pairs
+ * for the highlighting.
+ *
+ * @return string The hit highlighted tweet.
+ * @deprecated since version 1.1.0
+ */
+ public function addHitHighlighting(array $hits)
+ {
+ return $this->highlight($this->tweet, $hits);
+ }
+}
diff --git a/app/Util/Lexer/LooseAutolink.php b/app/Util/Lexer/LooseAutolink.php
new file mode 100755
index 00000000..979b0d0b
--- /dev/null
+++ b/app/Util/Lexer/LooseAutolink.php
@@ -0,0 +1,348 @@
+
+ * @author Nick Pope
+ * @author Takashi Nojima
+ * @copyright Copyright 2014 Mike Cochrane, Nick Pope, Takashi Nojima
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+
+namespace App\Util\Lexer;
+
+use App\Util\Lexer\Autolink;
+
+/**
+ * Twitter LooseAutolink Class
+ *
+ * Parses tweets and generates HTML anchor tags around URLs, usernames,
+ * username/list pairs and hashtags.
+ *
+ * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
+ * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
+ * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
+ *
+ * @author Mike Cochrane
+ * @author Nick Pope
+ * @author Takashi Nojima
+ * @copyright Copyright 2014 Mike Cochrane, Nick Pope, Takashi Nojima
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ * @since 1.8.0
+ * @deprecated since version 1.9.0
+ */
+class LooseAutolink extends Autolink
+{
+
+ /**
+ * Auto-link hashtags, URLs, usernames and lists.
+ *
+ * @param string The tweet to be converted
+ * @return string that auto-link HTML added
+ * @deprecated since version 1.9.0
+ */
+ public function autoLink($tweet = null)
+ {
+ if (!is_null($tweet)) {
+ $this->tweet = $tweet;
+ }
+ return $this->addLinks();
+ }
+
+ /**
+ * Auto-link the @username and @username/list references in the provided text. Links to @username references will
+ * have the usernameClass CSS classes added. Links to @username/list references will have the listClass CSS class
+ * added.
+ *
+ * @return string that auto-link HTML added
+ */
+ public function autoLinkUsernamesAndLists($tweet = null)
+ {
+ if (!is_null($tweet)) {
+ $this->tweet = $tweet;
+ }
+ return $this->addLinksToUsernamesAndLists();
+ }
+
+ /**
+ * Auto-link #hashtag references in the provided Tweet text. The #hashtag links will have the hashtagClass CSS class
+ * added.
+ *
+ * @return string that auto-link HTML added
+ */
+ public function autoLinkHashtags($tweet = null)
+ {
+ if (!is_null($tweet)) {
+ $this->tweet = $tweet;
+ }
+ return $this->addLinksToHashtags();
+ }
+
+ /**
+ * Auto-link URLs in the Tweet text provided.
+ *
+ * This only auto-links URLs with protocol.
+ *
+ * @return string that auto-link HTML added
+ */
+ public function autoLinkURLs($tweet = null)
+ {
+ if (!is_null($tweet)) {
+ $this->tweet = $tweet;
+ }
+ return $this->addLinksToURLs();
+ }
+
+ /**
+ * Auto-link $cashtag references in the provided Tweet text. The $cashtag links will have the cashtagClass CSS class
+ * added.
+ *
+ * @return string that auto-link HTML added
+ */
+ public function autoLinkCashtags($tweet = null)
+ {
+ if (!is_null($tweet)) {
+ $this->tweet = $tweet;
+ }
+ return $this->addLinksToCashtags();
+ }
+
+ /**
+ * Adds links to all elements in the tweet.
+ *
+ * @return string The modified tweet.
+ * @deprecated since version 1.9.0
+ */
+ public function addLinks()
+ {
+ $original = $this->tweet;
+ $this->tweet = $this->addLinksToURLs();
+ $this->tweet = $this->addLinksToHashtags();
+ $this->tweet = $this->addLinksToCashtags();
+ $this->tweet = $this->addLinksToUsernamesAndLists();
+ $modified = $this->tweet;
+ $this->tweet = $original;
+ return $modified;
+ }
+
+ /**
+ * Adds links to hashtag elements in the tweet.
+ *
+ * @return string The modified tweet.
+ */
+ public function addLinksToHashtags()
+ {
+ return preg_replace_callback(
+ self::$patterns['valid_hashtag'],
+ array($this, '_addLinksToHashtags'),
+ $this->tweet
+ );
+ }
+
+ /**
+ * Adds links to cashtag elements in the tweet.
+ *
+ * @return string The modified tweet.
+ */
+ public function addLinksToCashtags()
+ {
+ return preg_replace_callback(
+ self::$patterns['valid_cashtag'],
+ array($this, '_addLinksToCashtags'),
+ $this->tweet
+ );
+ }
+
+ /**
+ * Adds links to URL elements in the tweet.
+ *
+ * @return string The modified tweet
+ */
+ public function addLinksToURLs()
+ {
+ return preg_replace_callback(self::$patterns['valid_url'], array($this, '_addLinksToURLs'), $this->tweet);
+ }
+
+ /**
+ * Adds links to username/list elements in the tweet.
+ *
+ * @return string The modified tweet.
+ */
+ public function addLinksToUsernamesAndLists()
+ {
+ return preg_replace_callback(
+ self::$patterns['valid_mentions_or_lists'],
+ array($this, '_addLinksToUsernamesAndLists'),
+ $this->tweet
+ );
+ }
+
+ /**
+ * Wraps a tweet element in an HTML anchor tag using the provided URL.
+ *
+ * This is a helper function to perform the generation of the link.
+ *
+ * @param string $url The URL to use as the href.
+ * @param string $class The CSS class(es) to apply (space separated).
+ * @param string $element The tweet element to wrap.
+ *
+ * @return string The tweet element with a link applied.
+ * @deprecated since version 1.1.0
+ */
+ protected function wrap($url, $class, $element)
+ {
+ $link = 'external) {
+ $rel[] = 'external';
+ }
+ if ($this->nofollow) {
+ $rel[] = 'nofollow';
+ }
+ if (!empty($rel)) {
+ $link .= ' rel="' . implode(' ', $rel) . '"';
+ }
+ if ($this->target) {
+ $link .= ' target="' . $this->target . '"';
+ }
+ $link .= '>' . $element . ' ';
+ return $link;
+ }
+
+ /**
+ * Wraps a tweet element in an HTML anchor tag using the provided URL.
+ *
+ * This is a helper function to perform the generation of the hashtag link.
+ *
+ * @param string $url The URL to use as the href.
+ * @param string $class The CSS class(es) to apply (space separated).
+ * @param string $element The tweet element to wrap.
+ *
+ * @return string The tweet element with a link applied.
+ */
+ protected function wrapHash($url, $class, $element)
+ {
+ $title = preg_replace('/#/u', '#', $element);
+ $link = 'external) {
+ $rel[] = 'external';
+ }
+ if ($this->nofollow) {
+ $rel[] = 'nofollow';
+ }
+ if (!empty($rel)) {
+ $link .= ' rel="' . implode(' ', $rel) . '"';
+ }
+ if ($this->target) {
+ $link .= ' target="' . $this->target . '"';
+ }
+ $link .= '>' . $element . ' ';
+ return $link;
+ }
+
+ /**
+ * Callback used by the method that adds links to hashtags.
+ *
+ * @see addLinksToHashtags()
+ * @param array $matches The regular expression matches.
+ * @return string The link-wrapped hashtag.
+ */
+ protected function _addLinksToHashtags($matches)
+ {
+ list($all, $before, $hash, $tag, $after) = array_pad($matches, 5, '');
+ if (preg_match(self::$patterns['end_hashtag_match'], $after)
+ || (!preg_match('!\A["\']!', $before) && preg_match('!\A["\']!', $after)) || preg_match('!\A!', $after)) {
+ return $all;
+ }
+ $replacement = $before;
+ $element = $hash . $tag;
+ $url = $this->url_base_hash . $tag;
+ $class_hash = $this->class_hash;
+ if (preg_match(self::$patterns['rtl_chars'], $element)) {
+ $class_hash .= ' rtl';
+ }
+ $replacement .= $this->wrapHash($url, $class_hash, $element);
+ return $replacement;
+ }
+
+ /**
+ * Callback used by the method that adds links to cashtags.
+ *
+ * @see addLinksToCashtags()
+ * @param array $matches The regular expression matches.
+ * @return string The link-wrapped cashtag.
+ */
+ protected function _addLinksToCashtags($matches)
+ {
+ list($all, $before, $cash, $tag, $after) = array_pad($matches, 5, '');
+ if (preg_match(self::$patterns['end_cashtag_match'], $after)
+ || (!preg_match('!\A["\']!', $before) && preg_match('!\A["\']!', $after)) || preg_match('!\A!', $after)) {
+ return $all;
+ }
+ $replacement = $before;
+ $element = $cash . $tag;
+ $url = $this->url_base_cash . $tag;
+ $replacement .= $this->wrapHash($url, $this->class_cash, $element);
+ return $replacement;
+ }
+
+ /**
+ * Callback used by the method that adds links to URLs.
+ *
+ * @see addLinksToURLs()
+ * @param array $matches The regular expression matches.
+ * @return string The link-wrapped URL.
+ */
+ protected function _addLinksToURLs($matches)
+ {
+ list($all, $before, $url, $protocol, $domain, $path, $query) = array_pad($matches, 7, '');
+ $url = htmlspecialchars($url, ENT_QUOTES, 'UTF-8', false);
+ if (!$protocol) {
+ return $all;
+ }
+ return $before . $this->wrap($url, $this->class_url, $url);
+ }
+
+ /**
+ * Callback used by the method that adds links to username/list pairs.
+ *
+ * @see addLinksToUsernamesAndLists()
+ * @param array $matches The regular expression matches.
+ * @return string The link-wrapped username/list pair.
+ */
+ protected function _addLinksToUsernamesAndLists($matches)
+ {
+ list($all, $before, $at, $username, $slash_listname, $after) = array_pad($matches, 6, '');
+ # If $after is not empty, there is an invalid character.
+ if (!empty($slash_listname)) {
+ # Replace the list and username
+ $element = $username . $slash_listname;
+ $class = $this->class_list;
+ $url = $this->url_base_list . $element;
+ } else {
+ if (preg_match(self::$patterns['end_mention_match'], $after)) {
+ return $all;
+ }
+ # Replace the username
+ $element = $username;
+ $class = $this->class_user;
+ $url = $this->url_base_user . $element;
+ }
+ # XXX: Due to use of preg_replace_callback() for multiple replacements in a
+ # single tweet and also as only the match is replaced and we have to
+ # use a look-ahead for $after because there is no equivalent for the
+ # $' (dollar apostrophe) global from Ruby, we MUST NOT append $after.
+ return $before . $at . $this->wrap($url, $class, $element);
+ }
+}
diff --git a/app/Util/Lexer/Regex.php b/app/Util/Lexer/Regex.php
new file mode 100755
index 00000000..7c1f0627
--- /dev/null
+++ b/app/Util/Lexer/Regex.php
@@ -0,0 +1,337 @@
+
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Mike Cochrane, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+
+namespace App\Util\Lexer;
+
+/**
+ * Twitter Regex Abstract Class
+ *
+ * Used by subclasses that need to parse tweets.
+ *
+ * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
+ * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
+ * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
+ *
+ * @author Mike Cochrane
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Mike Cochrane, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter
+ */
+abstract class Regex
+{
+
+ /**
+ * Contains all generated regular expressions.
+ *
+ * @var string The regex patterns.
+ */
+ protected static $patterns = array();
+
+ /**
+ * The tweet to be used in parsing. This should be populated by the
+ * constructor of all subclasses.
+ *
+ * @var string
+ */
+ protected $tweet = '';
+
+ /**
+ * This constructor is used to populate some variables.
+ *
+ * @param string $tweet The tweet to parse.
+ */
+ protected function __construct($tweet = null)
+ {
+ $this->tweet = $tweet;
+ }
+
+ /**
+ * Emulate a static initialiser while PHP doesn't have one.
+ */
+ public static function __static()
+ {
+ # Check whether we have initialized the regular expressions:
+ static $initialized = false;
+ if ($initialized) {
+ return;
+ }
+ # Get a shorter reference to the regular expression array:
+ $re = & self::$patterns;
+ # Initialise local storage arrays:
+ $tmp = array();
+
+ # Expression to match whitespace characters.
+ #
+ # 0x0009-0x000D Cc # ..
+ # 0x0020 Zs # SPACE
+ # 0x0085 Cc #
+ # 0x00A0 Zs # NO-BREAK SPACE
+ # 0x1680 Zs # OGHAM SPACE MARK
+ # 0x180E Zs # MONGOLIAN VOWEL SEPARATOR
+ # 0x2000-0x200A Zs # EN QUAD..HAIR SPACE
+ # 0x2028 Zl # LINE SEPARATOR
+ # 0x2029 Zp # PARAGRAPH SEPARATOR
+ # 0x202F Zs # NARROW NO-BREAK SPACE
+ # 0x205F Zs # MEDIUM MATHEMATICAL SPACE
+ # 0x3000 Zs # IDEOGRAPHIC SPACE
+ $tmp['spaces'] = '\x{0009}-\x{000D}\x{0020}\x{0085}\x{00a0}\x{1680}\x{180E}\x{2000}-\x{200a}\x{2028}\x{2029}\x{202f}\x{205f}\x{3000}';
+
+ # Invalid Characters:
+ # 0xFFFE,0xFEFF # BOM
+ # 0xFFFF # Special
+ # 0x202A-0x202E # Directional change
+ $tmp['invalid_characters'] = '\x{202a}-\x{202e}\x{feff}\x{fffe}\x{ffff}';
+
+ # Expression to match at and hash sign characters:
+ $tmp['at_signs'] = '@@';
+ $tmp['hash_signs'] = '##';
+
+ # Expression to match latin accented characters.
+ #
+ # 0x00C0-0x00D6
+ # 0x00D8-0x00F6
+ # 0x00F8-0x00FF
+ # 0x0100-0x024f
+ # 0x0253-0x0254
+ # 0x0256-0x0257
+ # 0x0259
+ # 0x025b
+ # 0x0263
+ # 0x0268
+ # 0x026f
+ # 0x0272
+ # 0x0289
+ # 0x028b
+ # 0x02bb
+ # 0x0300-0x036f
+ # 0x1e00-0x1eff
+ #
+ # Excludes 0x00D7 - multiplication sign (confusable with 'x').
+ # Excludes 0x00F7 - division sign.
+ $tmp['latin_accents'] = '\x{00c0}-\x{00d6}\x{00d8}-\x{00f6}\x{00f8}-\x{00ff}';
+ $tmp['latin_accents'] .= '\x{0100}-\x{024f}\x{0253}-\x{0254}\x{0256}-\x{0257}';
+ $tmp['latin_accents'] .= '\x{0259}\x{025b}\x{0263}\x{0268}\x{026f}\x{0272}\x{0289}\x{028b}\x{02bb}\x{0300}-\x{036f}\x{1e00}-\x{1eff}';
+
+ # Expression to match RTL characters.
+ #
+ # 0x0600-0x06FF Arabic
+ # 0x0750-0x077F Arabic Supplement
+ # 0x08A0-0x08FF Arabic Extended-A
+ # 0x0590-0x05FF Hebrew
+ # 0xFB50-0xFDFF Arabic Presentation Forms-A
+ # 0xFE70-0xFEFF Arabic Presentation Forms-B
+ $tmp['rtl_chars'] = '\x{0600}-\x{06ff}\x{0750}-\x{077f}\x{08a0}-\x{08ff}\x{0590}-\x{05ff}\x{fb50}-\x{fdff}\x{fe70}-\x{feff}';
+
+ $tmp['hashtag_letters'] = '\p{L}\p{M}';
+ $tmp['hashtag_numerals'] = '\p{Nd}';
+ # Hashtag special chars
+ #
+ # _ underscore
+ # 0x200c ZERO WIDTH NON-JOINER (ZWNJ)
+ # 0x200d ZERO WIDTH JOINER (ZWJ)
+ # 0xa67e CYRILLIC KAVYKA
+ # 0x05be HEBREW PUNCTUATION MAQAF
+ # 0x05f3 HEBREW PUNCTUATION GERESH
+ # 0x05f4 HEBREW PUNCTUATION GERSHAYIM
+ # 0xff5e FULLWIDTH TILDE
+ # 0x301c WAVE DASH
+ # 0x309b KATAKANA-HIRAGANA VOICED SOUND MARK
+ # 0x309c KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+ # 0x30a0 KATAKANA-HIRAGANA DOUBLE HYPHEN
+ # 0x30fb KATAKANA MIDDLE DOT
+ # 0x3003 DITTO MARK
+ # 0x0f0b TIBETAN MARK INTERSYLLABIC TSHEG
+ # 0x0f0c TIBETAN MARK DELIMITER TSHEG BSTAR
+ # 0x00b7 MIDDLE DOT
+ $tmp['hashtag_special_chars'] = '_\x{200c}\x{200d}\x{a67e}\x{05be}\x{05f3}\x{05f4}\x{ff5e}\x{301c}\x{309b}\x{309c}\x{30a0}\x{30fb}\x{3003}\x{0f0b}\x{0f0c}\x{00b7}';
+ $tmp['hashtag_letters_numerals_set'] = '[' . $tmp['hashtag_letters'] . $tmp['hashtag_numerals'] . $tmp['hashtag_special_chars'] . ']';
+ $tmp['hashtag_letters_set'] = '[' . $tmp['hashtag_letters'] . ']';
+ $tmp['hashtag_boundary'] = '(?:\A|\x{fe0e}|\x{fe0f}|[^&' . $tmp['hashtag_letters'] . $tmp['hashtag_numerals'] . $tmp['hashtag_special_chars'] . '])';
+ $tmp['hashtag'] = '(' . $tmp['hashtag_boundary'] . ')(#|\x{ff03})(?!\x{fe0f}|\x{20e3})(' . $tmp['hashtag_letters_numerals_set'] . '*' . $tmp['hashtag_letters_set'] . $tmp['hashtag_letters_numerals_set'] . '*)';
+
+ $re['valid_hashtag'] = '/' . $tmp['hashtag'] . '(?=(.*|$))/iu';
+ $re['end_hashtag_match'] = '/\A(?:[' . $tmp['hash_signs'] . ']|:\/\/)/u';
+
+ # XXX: PHP doesn't have Ruby's $' (dollar apostrophe) so we have to capture
+ # $after in the following regular expression. Note that we only use a
+ # look-ahead capture here and don't append $after when we return.
+ $tmp['valid_mention_preceding_chars'] = '([^a-zA-Z0-9_!#\$%&*@@\/]|^|(?:^|[^a-z0-9_+~.-])RT:?)';
+ $re['valid_mentions_or_lists'] = '/' . $tmp['valid_mention_preceding_chars'] . '([' . $tmp['at_signs'] . '])([a-z0-9_]{1,20})(\/[a-z][a-z0-9_\-]{0,24})?(?=(.*|$))/iu';
+ $re['valid_reply'] = '/^(?:[' . $tmp['spaces'] . '])*[' . $tmp['at_signs'] . ']([a-z0-9_]{1,20})(?=(.*|$))/iu';
+ $re['end_mention_match'] = '/\A(?:[' . $tmp['at_signs'] . ']|[' . $tmp['latin_accents'] . ']|:\/\/)/iu';
+
+ # URL related hash regex collection
+
+ $tmp['valid_url_preceding_chars'] = '(?:[^A-Z0-9_@@\$##\.' . $tmp['invalid_characters'] . ']|^)';
+
+ $tmp['domain_valid_chars'] = '0-9a-z' . $tmp['latin_accents'];
+ $tmp['valid_subdomain'] = '(?>(?:[' . $tmp['domain_valid_chars'] . '][' . $tmp['domain_valid_chars'] . '\-_]*)?[' . $tmp['domain_valid_chars'] . ']\.)';
+ $tmp['valid_domain_name'] = '(?:(?:[' . $tmp['domain_valid_chars'] . '][' . $tmp['domain_valid_chars'] . '\-]*)?[' . $tmp['domain_valid_chars'] . ']\.)';
+ $tmp['domain_valid_unicode_chars'] = '[^\p{P}\p{Z}\p{C}' . $tmp['invalid_characters'] . $tmp['spaces'] . ']';
+
+ $gTLD = 'abb|abbott|abogado|academy|accenture|accountant|accountants|aco|active|actor|ads|adult|aeg|aero|afl|agency|aig|airforce|airtel|allfinanz|alsace|amsterdam|android|apartments|app|aquarelle|archi|army|arpa|asia|associates|attorney|auction|audio|auto|autos|axa|azure|band|bank|bar|barcelona|barclaycard|barclays|bargains|bauhaus|bayern|bbc|bbva|bcn|beer|bentley|berlin|best|bet|bharti|bible|bid|bike|bing|bingo|bio|biz|black|blackfriday|bloomberg|blue|bmw|bnl|bnpparibas|boats|bond|boo|boots|boutique|bradesco|bridgestone|broker|brother|brussels|budapest|build|builders|business|buzz|bzh|cab|cafe|cal|camera|camp|cancerresearch|canon|capetown|capital|caravan|cards|care|career|careers|cars|cartier|casa|cash|casino|cat|catering|cba|cbn|ceb|center|ceo|cern|cfa|cfd|chanel|channel|chat|cheap|chloe|christmas|chrome|church|cisco|citic|city|claims|cleaning|click|clinic|clothing|cloud|club|coach|codes|coffee|college|cologne|com|commbank|community|company|computer|condos|construction|consulting|contractors|cooking|cool|coop|corsica|country|coupons|courses|credit|creditcard|cricket|crown|crs|cruises|cuisinella|cymru|cyou|dabur|dad|dance|date|dating|datsun|day|dclk|deals|degree|delivery|delta|democrat|dental|dentist|desi|design|dev|diamonds|diet|digital|direct|directory|discount|dnp|docs|dog|doha|domains|doosan|download|drive|durban|dvag|earth|eat|edu|education|email|emerck|energy|engineer|engineering|enterprises|epson|equipment|erni|esq|estate|eurovision|eus|events|everbank|exchange|expert|exposed|express|fage|fail|faith|family|fan|fans|farm|fashion|feedback|film|finance|financial|firmdale|fish|fishing|fit|fitness|flights|florist|flowers|flsmidth|fly|foo|football|forex|forsale|forum|foundation|frl|frogans|fund|furniture|futbol|fyi|gal|gallery|game|garden|gbiz|gdn|gent|genting|ggee|gift|gifts|gives|giving|glass|gle|global|globo|gmail|gmo|gmx|gold|goldpoint|golf|goo|goog|google|gop|gov|graphics|gratis|green|gripe|group|guge|guide|guitars|guru|hamburg|hangout|haus|healthcare|help|here|hermes|hiphop|hitachi|hiv|hockey|holdings|holiday|homedepot|homes|honda|horse|host|hosting|hoteles|hotmail|house|how|hsbc|ibm|icbc|ice|icu|ifm|iinet|immo|immobilien|industries|infiniti|info|ing|ink|institute|insure|int|international|investments|ipiranga|irish|ist|istanbul|itau|iwc|java|jcb|jetzt|jewelry|jlc|jll|jobs|joburg|jprs|juegos|kaufen|kddi|kim|kitchen|kiwi|koeln|komatsu|krd|kred|kyoto|lacaixa|lancaster|land|lasalle|lat|latrobe|law|lawyer|lds|lease|leclerc|legal|lexus|lgbt|liaison|lidl|life|lighting|limited|limo|link|live|lixil|loan|loans|lol|london|lotte|lotto|love|ltda|lupin|luxe|luxury|madrid|maif|maison|man|management|mango|market|marketing|markets|marriott|mba|media|meet|melbourne|meme|memorial|men|menu|miami|microsoft|mil|mini|mma|mobi|moda|moe|mom|monash|money|montblanc|mormon|mortgage|moscow|motorcycles|mov|movie|movistar|mtn|mtpc|museum|nadex|nagoya|name|navy|nec|net|netbank|network|neustar|new|news|nexus|ngo|nhk|nico|ninja|nissan|nokia|nra|nrw|ntt|nyc|office|okinawa|omega|one|ong|onl|online|ooo|oracle|orange|org|organic|osaka|otsuka|ovh|page|panerai|paris|partners|parts|party|pet|pharmacy|philips|photo|photography|photos|physio|piaget|pics|pictet|pictures|pink|pizza|place|play|plumbing|plus|pohl|poker|porn|post|praxi|press|pro|prod|productions|prof|properties|property|pub|qpon|quebec|racing|realtor|realty|recipes|red|redstone|rehab|reise|reisen|reit|ren|rent|rentals|repair|report|republican|rest|restaurant|review|reviews|rich|ricoh|rio|rip|rocks|rodeo|rsvp|ruhr|run|ryukyu|saarland|sakura|sale|samsung|sandvik|sandvikcoromant|sanofi|sap|sarl|saxo|sca|scb|schmidt|scholarships|school|schule|schwarz|science|scor|scot|seat|seek|sener|services|sew|sex|sexy|shiksha|shoes|show|shriram|singles|site|ski|sky|skype|sncf|soccer|social|software|sohu|solar|solutions|sony|soy|space|spiegel|spreadbetting|srl|starhub|statoil|studio|study|style|sucks|supplies|supply|support|surf|surgery|suzuki|swatch|swiss|sydney|systems|taipei|tatamotors|tatar|tattoo|tax|taxi|team|tech|technology|tel|telefonica|temasek|tennis|thd|theater|tickets|tienda|tips|tires|tirol|today|tokyo|tools|top|toray|toshiba|tours|town|toyota|toys|trade|trading|training|travel|trust|tui|ubs|university|uno|uol|vacations|vegas|ventures|vermögensberater|vermögensberatung|versicherung|vet|viajes|video|villas|vin|vision|vista|vistaprint|vlaanderen|vodka|vote|voting|voto|voyage|wales|walter|wang|watch|webcam|website|wed|wedding|weir|whoswho|wien|wiki|williamhill|win|windows|wine|wme|work|works|world|wtc|wtf|xbox|xerox|xin|xperia|xxx|xyz|yachts|yandex|yodobashi|yoga|yokohama|youtube|zip|zone|zuerich|дети|ком|москва|онлайн|орг|рус|сайт|קום|بازار|شبكة|كوم|موقع|कॉम|नेट|संगठन|คอม|みんな|グーグル|コム|世界|中信|中文网|企业|佛山|信息|健康|八卦|公司|公益|商城|商店|商标|在线|大拿|娱乐|工行|广东|慈善|我爱你|手机|政务|政府|新闻|时尚|机构|淡马锡|游戏|点看|移动|组织机构|网址|网店|网络|谷歌|集团|飞利浦|餐厅|닷넷|닷컴|삼성|onion';
+ $ccTLD = '한국|香港|澳門|新加坡|台灣|台湾|中國|中国|გე|ไทย|ලංකා|ഭാരതം|ಭಾರತ|భారత్|சிங்கப்பூர்|இலங்கை|இந்தியா|ଭାରତ|ભારત|ਭਾਰਤ|ভাৰত|ভারত|বাংলা|भारोत|भारतम्|भारत|ڀارت|پاکستان|مليسيا|مصر|قطر|فلسطين|عمان|عراق|سورية|سودان|تونس|بھارت|بارت|ایران|امارات|المغرب|السعودية|الجزائر|الاردن|հայ|қаз|укр|срб|рф|мон|мкд|ею|бел|бг|ελ|zw|zm|za|yt|ye|ws|wf|vu|vn|vi|vg|ve|vc|va|uz|uy|us|um|uk|ug|ua|tz|tw|tv|tt|tr|tp|to|tn|tm|tl|tk|tj|th|tg|tf|td|tc|sz|sy|sx|sv|su|st|ss|sr|so|sn|sm|sl|sk|sj|si|sh|sg|se|sd|sc|sb|sa|rw|ru|rs|ro|re|qa|py|pw|pt|ps|pr|pn|pm|pl|pk|ph|pg|pf|pe|pa|om|nz|nu|nr|np|no|nl|ni|ng|nf|ne|nc|na|mz|my|mx|mw|mv|mu|mt|ms|mr|mq|mp|mo|mn|mm|ml|mk|mh|mg|mf|me|md|mc|ma|ly|lv|lu|lt|ls|lr|lk|li|lc|lb|la|kz|ky|kw|kr|kp|kn|km|ki|kh|kg|ke|jp|jo|jm|je|it|is|ir|iq|io|in|im|il|ie|id|hu|ht|hr|hn|hm|hk|gy|gw|gu|gt|gs|gr|gq|gp|gn|gm|gl|gi|gh|gg|gf|ge|gd|gb|ga|fr|fo|fm|fk|fj|fi|eu|et|es|er|eh|eg|ee|ec|dz|do|dm|dk|dj|de|cz|cy|cx|cw|cv|cu|cr|co|cn|cm|cl|ck|ci|ch|cg|cf|cd|cc|ca|bz|by|bw|bv|bt|bs|br|bq|bo|bn|bm|bl|bj|bi|bh|bg|bf|be|bd|bb|ba|az|ax|aw|au|at|as|ar|aq|ao|an|am|al|ai|ag|af|ae|ad|ac';
+
+ $tmp['valid_gTLD'] = '(?:(?:' . $gTLD . ')(?=[^0-9a-z@]|$))';
+ $tmp['valid_ccTLD'] = '(?:(?:' . $ccTLD . ')(?=[^0-9a-z@]|$))';
+ $tmp['valid_special_ccTLD'] = '(?:(?:' . 'co|tv' . ')(?=[^0-9a-z@]|$))';
+ $tmp['valid_punycode'] = '(?:xn--[0-9a-z]+)';
+
+ $tmp['valid_domain'] = '(?:' // subdomains + domain + TLD
+ . $tmp['valid_subdomain'] . '+' . $tmp['valid_domain_name'] // e.g. www.twitter.com, foo.co.jp, bar.co.uk
+ . '(?:' . $tmp['valid_gTLD'] . '|' . $tmp['valid_ccTLD'] . '|' . $tmp['valid_punycode'] . '))'
+ . '|(?:' // domain + gTLD | some ccTLD
+ . $tmp['valid_domain_name'] // e.g. twitter.com
+ . '(?:' . $tmp['valid_gTLD'] . '|' . $tmp['valid_punycode'] . '|' . $tmp['valid_special_ccTLD'] . ')'
+ . ')'
+ . '|(?:(?:(?<=http:\/\/)|(?<=https:\/\/))'
+ . '(?:'
+ . '(?:' . $tmp['valid_domain_name'] . $tmp['valid_ccTLD'] . ')' // protocol + domain + ccTLD
+ . '|(?:' // protocol + unicode domain + TLD
+ . $tmp['domain_valid_unicode_chars'] . '+\.'
+ . '(?:' . $tmp['valid_gTLD'] . '|' . $tmp['valid_ccTLD'] . ')'
+ . ')'
+ . ')'
+ . ')'
+ . '|(?:' // domain + ccTLD + '/'
+ . $tmp['valid_domain_name'] . $tmp['valid_ccTLD'] . '(?=\/)' // e.g. t.co/
+ . ')';
+ # Used by the extractor:
+ $re['valid_ascii_domain'] = '/' . $tmp['valid_subdomain'] . '*' . $tmp['valid_domain_name'] . '(?:' . $tmp['valid_gTLD'] . '|' . $tmp['valid_ccTLD'] . '|' . $tmp['valid_punycode'] . ')/iu';
+
+ # Used by the extractor for stricter t.co URL extraction:
+ $re['valid_tco_url'] = '/^https?:\/\/t\.co\/[a-z0-9]+/iu';
+
+ # Used by the extractor to filter out unwanted URLs:
+ $re['invalid_short_domain'] = '/\A' . $tmp['valid_domain_name'] . $tmp['valid_ccTLD'] . '\Z/iu';
+ $re['valid_special_short_domain'] = '/\A' . $tmp['valid_domain_name'] . $tmp['valid_special_ccTLD'] . '\Z/iu';
+ $re['invalid_url_without_protocol_preceding_chars'] = '/[\-_.\/]\z/iu';
+
+ $tmp['valid_port_number'] = '[0-9]+';
+
+ $tmp['valid_general_url_path_chars'] = '[a-z\p{Cyrillic}0-9!\*;:=\+\,\.\$\/%#\[\]\-_~&|@' . $tmp['latin_accents'] . ']';
+ # Allow URL paths to contain up to two nested levels of balanced parentheses:
+ # 1. Used in Wikipedia URLs, e.g. /Primer_(film)
+ # 2. Used in IIS sessions, e.g. /S(dfd346)/
+ # 3. Used in Rdio URLs like /track/We_Up_(Album_Version_(Edited))/
+ $tmp['valid_url_balanced_parens'] = '(?:\('
+ . '(?:' . $tmp['valid_general_url_path_chars'] . '+'
+ . '|'
+ // allow one nested level of balanced parentheses
+ . '(?:'
+ . $tmp['valid_general_url_path_chars'] . '*'
+ . '\(' . $tmp['valid_general_url_path_chars'] . '+' . '\)'
+ . $tmp['valid_general_url_path_chars'] . '*'
+ . ')'
+ . ')'
+ . '\))';
+ # Valid end-of-path characters (so /foo. does not gobble the period).
+ # 1. Allow = for empty URL parameters and other URL-join artifacts.
+ $tmp['valid_url_path_ending_chars'] = '[a-z\p{Cyrillic}0-9=_#\/\+\-' . $tmp['latin_accents'] . ']|(?:' . $tmp['valid_url_balanced_parens'] . ')';
+ $tmp['valid_url_path'] = '(?:(?:'
+ . $tmp['valid_general_url_path_chars'] . '*(?:'
+ . $tmp['valid_url_balanced_parens'] . ' '
+ . $tmp['valid_general_url_path_chars'] . '*)*'
+ . $tmp['valid_url_path_ending_chars'] . ')|(?:@'
+ . $tmp['valid_general_url_path_chars'] . '+\/))';
+
+ $tmp['valid_url_query_chars'] = '[a-z0-9!?\*\'\(\);:&=\+\$\/%#\[\]\-_\.,~|@]';
+ $tmp['valid_url_query_ending_chars'] = '[a-z0-9_&=#\/\-]';
+
+ $re['valid_url'] = '/(?:' # $1 Complete match (preg_match() already matches everything.)
+ . '(' . $tmp['valid_url_preceding_chars'] . ')' # $2 Preceding characters
+ . '(' # $3 Complete URL
+ . '(https?:\/\/)?' # $4 Protocol (optional)
+ . '(' . $tmp['valid_domain'] . ')' # $5 Domain(s)
+ . '(?::(' . $tmp['valid_port_number'] . '))?' # $6 Port number (optional)
+ . '(\/' . $tmp['valid_url_path'] . '*)?' # $7 URL Path
+ . '(\?' . $tmp['valid_url_query_chars'] . '*' . $tmp['valid_url_query_ending_chars'] . ')?' # $8 Query String
+ . ')'
+ . ')/iux';
+
+ $tmp['cash_signs'] = '\$';
+ $tmp['cashtag'] = '[a-z]{1,6}(?:[._][a-z]{1,2})?';
+ $re['valid_cashtag'] = '/(^|[' . $tmp['spaces'] . '])([' . $tmp['cash_signs'] . '])(' . $tmp['cashtag'] . ')(?=($|\s|[[:punct:]]))/iu';
+ $re['end_cashtag_match'] = '/\A(?:[' . $tmp['cash_signs'] . ']|:\/\/)/u';
+
+ # These URL validation pattern strings are based on the ABNF from RFC 3986
+ $tmp['validate_url_unreserved'] = '[a-z\p{Cyrillic}0-9\-._~]';
+ $tmp['validate_url_pct_encoded'] = '(?:%[0-9a-f]{2})';
+ $tmp['validate_url_sub_delims'] = '[!$&\'()*+,;=]';
+ $tmp['validate_url_pchar'] = '(?:' . $tmp['validate_url_unreserved'] . '|' . $tmp['validate_url_pct_encoded'] . '|' . $tmp['validate_url_sub_delims'] . '|[:\|@])'; #/iox
+
+ $tmp['validate_url_userinfo'] = '(?:' . $tmp['validate_url_unreserved'] . '|' . $tmp['validate_url_pct_encoded'] . '|' . $tmp['validate_url_sub_delims'] . '|:)*'; #/iox
+
+ $tmp['validate_url_dec_octet'] = '(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'; #/i
+ $tmp['validate_url_ipv4'] = '(?:' . $tmp['validate_url_dec_octet'] . '(?:\.' . $tmp['validate_url_dec_octet'] . '){3})'; #/iox
+ # Punting on real IPv6 validation for now
+ $tmp['validate_url_ipv6'] = '(?:\[[a-f0-9:\.]+\])'; #/i
+ # Also punting on IPvFuture for now
+ $tmp['validate_url_ip'] = '(?:' . $tmp['validate_url_ipv4'] . '|' . $tmp['validate_url_ipv6'] . ')'; #/iox
+ # This is more strict than the rfc specifies
+ $tmp['validate_url_subdomain_segment'] = '(?:[a-z0-9](?:[a-z0-9_\-]*[a-z0-9])?)'; #/i
+ $tmp['validate_url_domain_segment'] = '(?:[a-z0-9](?:[a-z0-9\-]*[a-z0-9])?)'; #/i
+ $tmp['validate_url_domain_tld'] = '(?:[a-z](?:[a-z0-9\-]*[a-z0-9])?)'; #/i
+ $tmp['validate_url_domain'] = '(?:(?:' . $tmp['validate_url_subdomain_segment'] . '\.)*(?:' . $tmp['validate_url_domain_segment'] . '\.)' . $tmp['validate_url_domain_tld'] . ')'; #/iox
+
+ $tmp['validate_url_host'] = '(?:' . $tmp['validate_url_ip'] . '|' . $tmp['validate_url_domain'] . ')'; #/iox
+ # Unencoded internationalized domains - this doesn't check for invalid UTF-8 sequences
+ $tmp['validate_url_unicode_subdomain_segment'] = '(?:(?:[a-z0-9]|[^\x00-\x7f])(?:(?:[a-z0-9_\-]|[^\x00-\x7f])*(?:[a-z0-9]|[^\x00-\x7f]))?)'; #/ix
+ $tmp['validate_url_unicode_domain_segment'] = '(?:(?:[a-z0-9]|[^\x00-\x7f])(?:(?:[a-z0-9\-]|[^\x00-\x7f])*(?:[a-z0-9]|[^\x00-\x7f]))?)'; #/ix
+ $tmp['validate_url_unicode_domain_tld'] = '(?:(?:[a-z]|[^\x00-\x7f])(?:(?:[a-z0-9\-]|[^\x00-\x7f])*(?:[a-z0-9]|[^\x00-\x7f]))?)'; #/ix
+ $tmp['validate_url_unicode_domain'] = '(?:(?:' . $tmp['validate_url_unicode_subdomain_segment'] . '\.)*(?:' . $tmp['validate_url_unicode_domain_segment'] . '\.)' . $tmp['validate_url_unicode_domain_tld'] . ')'; #/iox
+
+ $tmp['validate_url_unicode_host'] = '(?:' . $tmp['validate_url_ip'] . '|' . $tmp['validate_url_unicode_domain'] . ')'; #/iox
+
+ $tmp['validate_url_port'] = '[0-9]{1,5}';
+
+ $re['validate_url_unicode_authority'] = '/'
+ . '(?:(' . $tmp['validate_url_userinfo'] . ')@)?' # $1 userinfo
+ . '(' . $tmp['validate_url_unicode_host'] . ')' # $2 host
+ . '(?::(' . $tmp['validate_url_port'] . '))?' # $3 port
+ . '/iux';
+
+ $re['validate_url_authority'] = '/'
+ . '(?:(' . $tmp['validate_url_userinfo'] . ')@)?' # $1 userinfo
+ . '(' . $tmp['validate_url_host'] . ')' # $2 host
+ . '(?::(' . $tmp['validate_url_port'] . '))?' # $3 port
+ . '/ix';
+
+ $re['validate_url_scheme'] = '/(?:[a-z][a-z0-9+\-.]*)/i';
+ $re['validate_url_path'] = '/(\/' . $tmp['validate_url_pchar'] . '*)*/iu';
+ $re['validate_url_query'] = '/(' . $tmp['validate_url_pchar'] . '|\/|\?)*/iu';
+ $re['validate_url_fragment'] = '/(' . $tmp['validate_url_pchar'] . '|\/|\?)*/iu';
+
+ # Modified version of RFC 3986 Appendix B
+ $re['validate_url_unencoded'] = '/^' # Full URL
+ . '(?:'
+ . '([^:\/?#]+):\/\/' # $1 Scheme
+ . ')?'
+ . '([^\/?#]*)' # $2 Authority
+ . '([^?#]*)' # $3 Path
+ . '(?:'
+ . '\?([^#]*)' # $4 Query
+ . ')?'
+ . '(?:'
+ . '\#(.*)' # $5 Fragment
+ . ')?$/iux';
+
+ $re['invalid_characters'] = '/[' . $tmp['invalid_characters'] . ']/u';
+
+ $re['rtl_chars'] = '/[' . $tmp['rtl_chars'] . ']/iu';
+
+ # Flag that initialization is complete:
+ $initialized = true;
+ }
+}
+
+# Cause regular expressions to be initialized as soon as this file is loaded:
+Regex::__static();
diff --git a/app/Util/Lexer/RestrictedNames.php b/app/Util/Lexer/RestrictedNames.php
index 8f968092..c2a851b1 100644
--- a/app/Util/Lexer/RestrictedNames.php
+++ b/app/Util/Lexer/RestrictedNames.php
@@ -17,7 +17,6 @@ class RestrictedNames {
"contact-us",
"contact_us",
"copyright",
- "css",
"d",
"dashboard",
"dev",
@@ -52,7 +51,6 @@ class RestrictedNames {
"is",
"isatap",
"it",
- "js",
"localdomain",
"localhost",
"mail",
@@ -118,6 +116,7 @@ class RestrictedNames {
// Static Assets
"assets",
+ "storage",
// Laravel Horizon
"horizon",
@@ -126,19 +125,42 @@ class RestrictedNames {
"account",
"api",
"auth",
+ "css",
+ "c",
"i",
+ "dashboard",
+ "deck",
"discover",
+ "docs",
+ "fonts",
"home",
+ "img",
+ "js",
"login",
"logout",
+ "media",
"p",
"password",
+ "report",
+ "reports",
"search",
"settings",
+ "statuses",
"site",
+ "sites",
"timeline",
+ "timelines",
+ "tour",
"user",
"users",
+ "vendor",
+ "400",
+ "401",
+ "403",
+ "404",
+ "500",
+ "503",
+ "504",
];
public static function get()
diff --git a/app/Util/Lexer/StringUtils.php b/app/Util/Lexer/StringUtils.php
new file mode 100755
index 00000000..88722d15
--- /dev/null
+++ b/app/Util/Lexer/StringUtils.php
@@ -0,0 +1,104 @@
+ $string_length) {
+ $start = $string_length;
+ }
+ if ($length < 0) {
+ $length = max(0, $string_length - $start + $length);
+ } elseif ((is_null($length) === true) || ($length > $string_length)) {
+ $length = $string_length;
+ }
+ if (($start + $length) > $string_length) {
+ $length = $string_length - $start;
+ }
+
+ $suffixOffset = $start + $length;
+ $suffixLength = $string_length - $start - $length;
+ return static::substr($string, 0, $start, $encoding) . $replacement . static::substr($string, $suffixOffset, $suffixLength, $encoding);
+ }
+ return (is_null($length) === true) ? substr_replace($string, $replacement, $start) : substr_replace($string, $replacement, $start, $length);
+ }
+}
diff --git a/app/Util/Lexer/Validator.php b/app/Util/Lexer/Validator.php
new file mode 100755
index 00000000..ddfb2c5f
--- /dev/null
+++ b/app/Util/Lexer/Validator.php
@@ -0,0 +1,388 @@
+
+ * @copyright Copyright © 2010, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+
+namespace App\Util\Lexer;
+
+use App\Util\Lexer\Regex;
+use App\Util\Lexer\Extractor;
+use App\Util\Lexer\StringUtils;
+
+/**
+ * Twitter Validator Class
+ *
+ * Performs "validation" on tweets.
+ *
+ * Originally written by {@link http://github.com/mikenz Mike Cochrane}, this
+ * is based on code by {@link http://github.com/mzsanford Matt Sanford} and
+ * heavily modified by {@link http://github.com/ngnpope Nick Pope}.
+ *
+ * @author Nick Pope
+ * @copyright Copyright © 2010, Nick Pope
+ * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License v2.0
+ * @package Twitter.Text
+ */
+class Validator extends Regex
+{
+
+ /**
+ * The maximum length of a tweet.
+ *
+ * @var int
+ */
+ const MAX_LENGTH = 140;
+
+ /**
+ * The length of a short URL beginning with http:
+ *
+ * @var int
+ */
+ protected $short_url_length = 23;
+
+ /**
+ * The length of a short URL beginning with http:
+ *
+ * @var int
+ */
+ protected $short_url_length_https = 23;
+
+ /**
+ *
+ * @var Extractor
+ */
+ protected $extractor = null;
+
+ /**
+ * Provides fluent method chaining.
+ *
+ * @param string $tweet The tweet to be validated.
+ * @param mixed $config Setup short URL length from Twitter API /help/configuration response.
+ *
+ * @see __construct()
+ *
+ * @return Validator
+ */
+ public static function create($tweet = null, $config = null)
+ {
+ return new self($tweet, $config);
+ }
+
+ /**
+ * Reads in a tweet to be parsed and validates it.
+ *
+ * @param string $tweet The tweet to validate.
+ */
+ public function __construct($tweet = null, $config = null)
+ {
+ parent::__construct($tweet);
+ if (!empty($config)) {
+ $this->setConfiguration($config);
+ }
+ $this->extractor = Extractor::create();
+ }
+
+ /**
+ * Setup short URL length from Twitter API /help/configuration response
+ *
+ * @param mixed $config
+ * @return Validator
+ * @link https://dev.twitter.com/docs/api/1/get/help/configuration
+ */
+ public function setConfiguration($config)
+ {
+ if (is_array($config)) {
+ // setup from array
+ if (isset($config['short_url_length'])) {
+ $this->setShortUrlLength($config['short_url_length']);
+ }
+ if (isset($config['short_url_length_https'])) {
+ $this->setShortUrlLengthHttps($config['short_url_length_https']);
+ }
+ } elseif (is_object($config)) {
+ // setup from object
+ if (isset($config->short_url_length)) {
+ $this->setShortUrlLength($config->short_url_length);
+ }
+ if (isset($config->short_url_length_https)) {
+ $this->setShortUrlLengthHttps($config->short_url_length_https);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Set the length of a short URL beginning with http:
+ *
+ * @param mixed $length
+ * @return Validator
+ */
+ public function setShortUrlLength($length)
+ {
+ $this->short_url_length = intval($length);
+ return $this;
+ }
+
+ /**
+ * Get the length of a short URL beginning with http:
+ *
+ * @return int
+ */
+ public function getShortUrlLength()
+ {
+ return $this->short_url_length;
+ }
+
+ /**
+ * Set the length of a short URL beginning with https:
+ *
+ * @param mixed $length
+ * @return Validator
+ */
+ public function setShortUrlLengthHttps($length)
+ {
+ $this->short_url_length_https = intval($length);
+ return $this;
+ }
+
+ /**
+ * Get the length of a short URL beginning with https:
+ *
+ * @return int
+ */
+ public function getShortUrlLengthHttps()
+ {
+ return $this->short_url_length_https;
+ }
+
+ /**
+ * Check whether a tweet is valid.
+ *
+ * @param string $tweet The tweet to validate.
+ * @return boolean Whether the tweet is valid.
+ */
+ public function isValidTweetText($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $length = $this->getTweetLength($tweet);
+ if (!$tweet || !$length) {
+ return false;
+ }
+ if ($length > self::MAX_LENGTH) {
+ return false;
+ }
+ if (preg_match(self::$patterns['invalid_characters'], $tweet)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a tweet is valid.
+ *
+ * @return boolean Whether the tweet is valid.
+ * @deprecated since version 1.1.0
+ */
+ public function validateTweet()
+ {
+ return $this->isValidTweetText();
+ }
+
+ /**
+ * Check whether a username is valid.
+ *
+ * @param string $username The username to validate.
+ * @return boolean Whether the username is valid.
+ */
+ public function isValidUsername($username = null)
+ {
+ if (is_null($username)) {
+ $username = $this->tweet;
+ }
+ $length = StringUtils::strlen($username);
+ if (empty($username) || !$length) {
+ return false;
+ }
+ $extracted = $this->extractor->extractMentionedScreennames($username);
+ return count($extracted) === 1 && $extracted[0] === substr($username, 1);
+ }
+
+ /**
+ * Check whether a username is valid.
+ *
+ * @return boolean Whether the username is valid.
+ * @deprecated since version 1.1.0
+ */
+ public function validateUsername()
+ {
+ return $this->isValidUsername();
+ }
+
+ /**
+ * Check whether a list is valid.
+ *
+ * @param string $list The list name to validate.
+ * @return boolean Whether the list is valid.
+ */
+ public function isValidList($list = null)
+ {
+ if (is_null($list)) {
+ $list = $this->tweet;
+ }
+ $length = StringUtils::strlen($list);
+ if (empty($list) || !$length) {
+ return false;
+ }
+ preg_match(self::$patterns['valid_mentions_or_lists'], $list, $matches);
+ $matches = array_pad($matches, 5, '');
+ return isset($matches) && $matches[1] === '' && $matches[4] && !empty($matches[4]) && $matches[5] === '';
+ }
+
+ /**
+ * Check whether a list is valid.
+ *
+ * @return boolean Whether the list is valid.
+ * @deprecated since version 1.1.0
+ */
+ public function validateList()
+ {
+ return $this->isValidList();
+ }
+
+ /**
+ * Check whether a hashtag is valid.
+ *
+ * @param string $hashtag The hashtag to validate.
+ * @return boolean Whether the hashtag is valid.
+ */
+ public function isValidHashtag($hashtag = null)
+ {
+ if (is_null($hashtag)) {
+ $hashtag = $this->tweet;
+ }
+ $length = StringUtils::strlen($hashtag);
+ if (empty($hashtag) || !$length) {
+ return false;
+ }
+ $extracted = $this->extractor->extractHashtags($hashtag);
+ return count($extracted) === 1 && $extracted[0] === substr($hashtag, 1);
+ }
+
+ /**
+ * Check whether a hashtag is valid.
+ *
+ * @return boolean Whether the hashtag is valid.
+ * @deprecated since version 1.1.0
+ */
+ public function validateHashtag()
+ {
+ return $this->isValidHashtag();
+ }
+
+ /**
+ * Check whether a URL is valid.
+ *
+ * @param string $url The url to validate.
+ * @param boolean $unicode_domains Consider the domain to be unicode.
+ * @param boolean $require_protocol Require a protocol for valid domain?
+ *
+ * @return boolean Whether the URL is valid.
+ */
+ public function isValidURL($url = null, $unicode_domains = true, $require_protocol = true)
+ {
+ if (is_null($url)) {
+ $url = $this->tweet;
+ }
+ $length = StringUtils::strlen($url);
+ if (empty($url) || !$length) {
+ return false;
+ }
+ preg_match(self::$patterns['validate_url_unencoded'], $url, $matches);
+ $match = array_shift($matches);
+ if (!$matches || $match !== $url) {
+ return false;
+ }
+ list($scheme, $authority, $path, $query, $fragment) = array_pad($matches, 5, '');
+ # Check scheme, path, query, fragment:
+ if (($require_protocol && !(
+ self::isValidMatch($scheme, self::$patterns['validate_url_scheme']) && preg_match('/^https?$/i', $scheme))
+ ) || !self::isValidMatch($path, self::$patterns['validate_url_path']) || !self::isValidMatch($query, self::$patterns['validate_url_query'], true)
+ || !self::isValidMatch($fragment, self::$patterns['validate_url_fragment'], true)) {
+ return false;
+ }
+ # Check authority:
+ $authority_pattern = $unicode_domains ? 'validate_url_unicode_authority' : 'validate_url_authority';
+ return self::isValidMatch($authority, self::$patterns[$authority_pattern]);
+ }
+
+ /**
+ * Check whether a URL is valid.
+ *
+ * @param boolean $unicode_domains Consider the domain to be unicode.
+ * @param boolean $require_protocol Require a protocol for valid domain?
+ *
+ * @return boolean Whether the URL is valid.
+ * @deprecated since version 1.1.0
+ */
+ public function validateURL($unicode_domains = true, $require_protocol = true)
+ {
+ return $this->isValidURL(null, $unicode_domains, $require_protocol);
+ }
+
+ /**
+ * Determines the length of a tweet. Takes shortening of URLs into account.
+ *
+ * @param string $tweet The tweet to validate.
+ * @return int the length of a tweet.
+ */
+ public function getTweetLength($tweet = null)
+ {
+ if (is_null($tweet)) {
+ $tweet = $this->tweet;
+ }
+ $length = StringUtils::strlen($tweet);
+ $urls_with_indices = $this->extractor->extractURLsWithIndices($tweet);
+ foreach ($urls_with_indices as $x) {
+ $length += $x['indices'][0] - $x['indices'][1];
+ $length += stripos($x['url'], 'https://') === 0 ? $this->short_url_length_https : $this->short_url_length;
+ }
+ return $length;
+ }
+
+ /**
+ * Determines the length of a tweet. Takes shortening of URLs into account.
+ *
+ * @return int the length of a tweet.
+ * @deprecated since version 1.1.0
+ */
+ public function getLength()
+ {
+ return $this->getTweetLength();
+ }
+
+ /**
+ * A helper function to check for a valid match. Used in URL validation.
+ *
+ * @param string $string The subject string to test.
+ * @param string $pattern The pattern to match against.
+ * @param boolean $optional Whether a match is compulsory or not.
+ *
+ * @return boolean Whether an exact match was found.
+ */
+ protected static function isValidMatch($string, $pattern, $optional = false)
+ {
+ $found = preg_match($pattern, $string, $matches);
+ if (!$optional) {
+ return (($string || $string === '') && $found && $matches[0] === $string);
+ } else {
+ return !(($string || $string === '') && (!$found || $matches[0] !== $string));
+ }
+ }
+}
diff --git a/app/Util/Media/Image.php b/app/Util/Media/Image.php
index db7641fd..236fc5c4 100644
--- a/app/Util/Media/Image.php
+++ b/app/Util/Media/Image.php
@@ -103,6 +103,10 @@ class Image {
$ratio = $this->getAspectRatio($file, $thumbnail);
$aspect = $ratio['dimensions'];
$orientation = $ratio['orientation'];
+ if($media->mime === 'image/gif' && !$thumbnail)
+ {
+ return;
+ }
try {
$img = Intervention::make($file)->orientate();
@@ -111,8 +115,9 @@ class Image {
});
$converted = $this->setBaseName($path, $thumbnail, $img->extension);
$newPath = storage_path('app/'.$converted['path']);
-
- $img->save($newPath, 75);
+
+ $quality = config('pixelfed.image_quality');
+ $img->save($newPath, $quality);
if(!$thumbnail) {
$media->orientation = $orientation;
diff --git a/app/Util/Webfinger/Webfinger.php b/app/Util/Webfinger/Webfinger.php
index ecb760f1..cae3108a 100644
--- a/app/Util/Webfinger/Webfinger.php
+++ b/app/Util/Webfinger/Webfinger.php
@@ -31,13 +31,9 @@ class Webfinger {
public function generateAliases()
{
- $host = parse_url(config('app.url'), PHP_URL_HOST);
- $username = $this->user->username;
- $url = $this->user->url();
-
$this->aliases = [
- 'acct:'.$username.'@'.$host,
- $url
+ $this->user->url(),
+ $this->user->permalink()
];
return $this;
}
@@ -55,24 +51,12 @@ class Webfinger {
[
'rel' => 'http://schemas.google.com/g/2010#updates-from',
'type' => 'application/atom+xml',
- 'href' => url("/users/{$user->username}.atom")
+ 'href' => $user->permalink('.atom')
],
[
'rel' => 'self',
'type' => 'application/activity+json',
'href' => $user->permalink()
- ],
- [
- 'rel' => 'magic-public-key',
- 'href' => null//$user->public_key
- ],
- [
- 'rel' => 'salmon',
- 'href' => $user->permalink('/salmon')
- ],
- [
- 'rel' => 'http://ostatus.org/schema/1.0/subscribe',
- 'href' => url('/main/ostatussub?profile={uri}')
]
];
return $this;
diff --git a/composer.json b/composer.json
index d81329d8..57910082 100644
--- a/composer.json
+++ b/composer.json
@@ -6,18 +6,23 @@
"type": "project",
"require": {
"php": "^7.1.3",
- "99designs/http-signatures-guzzlehttp": "^2.0",
+ "beyondcode/laravel-self-diagnosis": "^0.4.0",
"bitverse/identicon": "^1.1",
"doctrine/dbal": "^2.7",
"fideloper/proxy": "^4.0",
"greggilbert/recaptcha": "dev-master",
"intervention/image": "^2.4",
- "kitetail/zttp": "^0.3.0",
+ "pixelfed/zttp": "^0.4",
"laravel/framework": "5.6.*",
"laravel/horizon": "^1.2",
+ "laravel/passport": "^6.0",
"laravel/tinker": "^1.0",
- "league/fractal": "^0.17.0",
+ "moontoast/math": "^1.1",
"phpseclib/phpseclib": "~2.0",
+ "pixelfed/dotenv-editor": "^2.0",
+ "pixelfed/fractal": "^0.18.0",
+ "pixelfed/google2fa-laravel": "^2.0",
+ "pixelfed/http-signatures-guzzlehttp": "^4.0",
"predis/predis": "^1.1",
"spatie/laravel-backup": "^5.0.0",
"spatie/laravel-image-optimizer": "^1.1",
@@ -25,6 +30,7 @@
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.1",
+ "beyondcode/laravel-er-diagram-generator": "^0.2.2",
"filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
diff --git a/composer.lock b/composer.lock
index 9056e0a3..ddb5c89d 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,39 +4,44 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "b64eb9ff898e0b4a99b05c054bd55212",
+ "content-hash": "809fc8bb7dad5bf08e689baca3a214cc",
"packages": [
{
- "name": "99designs/http-signatures",
- "version": "4.0.0",
+ "name": "beyondcode/laravel-self-diagnosis",
+ "version": "0.4.1",
"source": {
"type": "git",
- "url": "https://github.com/99designs/http-signatures-php.git",
- "reference": "acb9d2e4f4661de9445fa5930b49a259bfd6175b"
+ "url": "https://github.com/beyondcode/laravel-self-diagnosis.git",
+ "reference": "b330a934bf2fe65b92d9adadc6e7d46313322ec0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/99designs/http-signatures-php/zipball/acb9d2e4f4661de9445fa5930b49a259bfd6175b",
- "reference": "acb9d2e4f4661de9445fa5930b49a259bfd6175b",
+ "url": "https://api.github.com/repos/beyondcode/laravel-self-diagnosis/zipball/b330a934bf2fe65b92d9adadc6e7d46313322ec0",
+ "reference": "b330a934bf2fe65b92d9adadc6e7d46313322ec0",
"shasum": ""
},
"require": {
- "paragonie/random_compat": "^1.0|^2.0",
- "php": ">=5.5",
- "psr/http-message": "^1.0"
+ "illuminate/support": "5.2.*|5.3.*|5.4.*|5.5.*|5.6.*",
+ "php": "^7.1",
+ "vlucas/phpdotenv": "~2.5"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^1.11",
- "guzzlehttp/psr7": "^1.2",
- "phpunit/phpunit": "~4.8",
- "symfony/http-foundation": "~2.8|~3.0",
- "symfony/psr-http-message-bridge": "^1.0",
- "zendframework/zend-diactoros": "^1.1"
+ "larapack/dd": "^1.0",
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "~3.5",
+ "phpunit/phpunit": "^7.0"
},
"type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "BeyondCode\\SelfDiagnosis\\SelfDiagnosisServiceProvider"
+ ]
+ }
+ },
"autoload": {
"psr-4": {
- "HttpSignatures\\": "src/"
+ "BeyondCode\\SelfDiagnosis\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -45,75 +50,19 @@
],
"authors": [
{
- "name": "Paul Annesley",
- "email": "paul@99designs.com"
+ "name": "Marcel Pociot",
+ "email": "marcel@beyondco.de",
+ "homepage": "https://beyondcode.de",
+ "role": "Developer"
}
],
- "description": "Sign and verify HTTP messages",
+ "description": "Perform various self diagnosis tests on your Laravel application.",
+ "homepage": "https://github.com/beyondcode/laravel-self-diagnosis",
"keywords": [
- "hmac",
- "http",
- "https",
- "signature",
- "signed",
- "signing"
+ "beyondcode",
+ "laravel-self-diagnosis"
],
- "time": "2017-05-04T01:36:17+00:00"
- },
- {
- "name": "99designs/http-signatures-guzzlehttp",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/99designs/http-signatures-guzzlehttp.git",
- "reference": "920ddd3cfbfae4c11a0f7c3b44699c01ae8cb203"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/99designs/http-signatures-guzzlehttp/zipball/920ddd3cfbfae4c11a0f7c3b44699c01ae8cb203",
- "reference": "920ddd3cfbfae4c11a0f7c3b44699c01ae8cb203",
- "shasum": ""
- },
- "require": {
- "99designs/http-signatures": ">=3.0.0 <5.0.0",
- "guzzlehttp/guzzle": ">=6.0 <7.0.0",
- "php": ">=5.5.0"
- },
- "require-dev": {
- "phpunit/phpunit": "~4.1"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Adrian Palmer",
- "email": "adrian.palmer@99designs.com"
- },
- {
- "name": "Ruben de Vries",
- "email": "ruben@rubensayshi.com"
- }
- ],
- "description": "Sign and verify HTTP messages with Guzzle 6",
- "homepage": "https://github.com/99designs/http-signatures-guzzlehttp",
- "keywords": [
- "guzzle 6",
- "hmac",
- "http",
- "https",
- "signature",
- "signed",
- "signing"
- ],
- "time": "2017-05-04T02:00:20+00:00"
+ "time": "2018-07-09T12:33:27+00:00"
},
{
"name": "bitverse/identicon",
@@ -156,16 +105,16 @@
},
{
"name": "cakephp/chronos",
- "version": "1.1.4",
+ "version": "1.2.2",
"source": {
"type": "git",
"url": "https://github.com/cakephp/chronos.git",
- "reference": "85bcaea6a832684b32ef54b2487b0c14a172e9e6"
+ "reference": "30f5b26bcf76a5e53ecc274700ad1ec49dc05567"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cakephp/chronos/zipball/85bcaea6a832684b32ef54b2487b0c14a172e9e6",
- "reference": "85bcaea6a832684b32ef54b2487b0c14a172e9e6",
+ "url": "https://api.github.com/repos/cakephp/chronos/zipball/30f5b26bcf76a5e53ecc274700ad1ec49dc05567",
+ "reference": "30f5b26bcf76a5e53ecc274700ad1ec49dc05567",
"shasum": ""
},
"require": {
@@ -173,15 +122,15 @@
},
"require-dev": {
"athletic/athletic": "~0.1",
- "cakephp/cakephp-codesniffer": "~2.3",
+ "cakephp/cakephp-codesniffer": "^3.0",
"phpbench/phpbench": "@dev",
"phpstan/phpstan": "^0.6.4",
- "phpunit/phpunit": "<6.0"
+ "phpunit/phpunit": "<6.0 || ^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Cake\\Chronos\\": "src"
+ "Cake\\Chronos\\": "src/"
},
"files": [
"src/carbon_compat.php"
@@ -209,7 +158,70 @@
"datetime",
"time"
],
- "time": "2018-01-13T12:19:50+00:00"
+ "time": "2018-07-11T18:51:56+00:00"
+ },
+ {
+ "name": "defuse/php-encryption",
+ "version": "v2.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/defuse/php-encryption.git",
+ "reference": "0f407c43b953d571421e0020ba92082ed5fb7620"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620",
+ "reference": "0f407c43b953d571421e0020ba92082ed5fb7620",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "paragonie/random_compat": ">= 2",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^2.0|^3.0|^4.0",
+ "phpunit/phpunit": "^4|^5"
+ },
+ "bin": [
+ "bin/generate-defuse-key"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Defuse\\Crypto\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Hornby",
+ "email": "taylor@defuse.ca",
+ "homepage": "https://defuse.ca/"
+ },
+ {
+ "name": "Scott Arciszewski",
+ "email": "info@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "Secure PHP Encryption Library",
+ "keywords": [
+ "aes",
+ "authenticated encryption",
+ "cipher",
+ "crypto",
+ "cryptography",
+ "encrypt",
+ "encryption",
+ "openssl",
+ "security",
+ "symmetric key cryptography"
+ ],
+ "time": "2018-07-24T23:27:56+00:00"
},
{
"name": "dnoegel/php-xdg-base-dir",
@@ -244,74 +256,6 @@
"description": "implementation of xdg base directory specification for php",
"time": "2014-10-24T07:27:01+00:00"
},
- {
- "name": "doctrine/annotations",
- "version": "v1.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/annotations.git",
- "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/annotations/zipball/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5",
- "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5",
- "shasum": ""
- },
- "require": {
- "doctrine/lexer": "1.*",
- "php": "^7.1"
- },
- "require-dev": {
- "doctrine/cache": "1.*",
- "phpunit/phpunit": "^6.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.6.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
- }
- ],
- "description": "Docblock Annotations Parser",
- "homepage": "http://www.doctrine-project.org",
- "keywords": [
- "annotations",
- "docblock",
- "parser"
- ],
- "time": "2017-12-06T07:11:42+00:00"
- },
{
"name": "doctrine/cache",
"version": "v1.7.1",
@@ -386,170 +330,33 @@
],
"time": "2017-08-25T07:02:50+00:00"
},
- {
- "name": "doctrine/collections",
- "version": "v1.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/collections.git",
- "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/collections/zipball/a01ee38fcd999f34d9bfbcee59dbda5105449cbf",
- "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf",
- "shasum": ""
- },
- "require": {
- "php": "^7.1"
- },
- "require-dev": {
- "doctrine/coding-standard": "~0.1@dev",
- "phpunit/phpunit": "^5.7"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.3.x-dev"
- }
- },
- "autoload": {
- "psr-0": {
- "Doctrine\\Common\\Collections\\": "lib/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
- }
- ],
- "description": "Collections Abstraction library",
- "homepage": "http://www.doctrine-project.org",
- "keywords": [
- "array",
- "collections",
- "iterator"
- ],
- "time": "2017-07-22T10:37:32+00:00"
- },
- {
- "name": "doctrine/common",
- "version": "v2.8.1",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/common.git",
- "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66",
- "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66",
- "shasum": ""
- },
- "require": {
- "doctrine/annotations": "1.*",
- "doctrine/cache": "1.*",
- "doctrine/collections": "1.*",
- "doctrine/inflector": "1.*",
- "doctrine/lexer": "1.*",
- "php": "~7.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^5.7"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Doctrine\\Common\\": "lib/Doctrine/Common"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Roman Borschel",
- "email": "roman@code-factory.org"
- },
- {
- "name": "Benjamin Eberlei",
- "email": "kontakt@beberlei.de"
- },
- {
- "name": "Guilherme Blanco",
- "email": "guilhermeblanco@gmail.com"
- },
- {
- "name": "Jonathan Wage",
- "email": "jonwage@gmail.com"
- },
- {
- "name": "Johannes Schmitt",
- "email": "schmittjoh@gmail.com"
- }
- ],
- "description": "Common Library for Doctrine projects",
- "homepage": "http://www.doctrine-project.org",
- "keywords": [
- "annotations",
- "collections",
- "eventmanager",
- "persistence",
- "spl"
- ],
- "time": "2017-08-31T08:43:38+00:00"
- },
{
"name": "doctrine/dbal",
- "version": "v2.7.1",
+ "version": "v2.8.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "11037b4352c008373561dc6fc836834eed80c3b5"
+ "reference": "5140a64c08b4b607b9bedaae0cedd26f04a0e621"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/11037b4352c008373561dc6fc836834eed80c3b5",
- "reference": "11037b4352c008373561dc6fc836834eed80c3b5",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/5140a64c08b4b607b9bedaae0cedd26f04a0e621",
+ "reference": "5140a64c08b4b607b9bedaae0cedd26f04a0e621",
"shasum": ""
},
"require": {
- "doctrine/common": "^2.7.1",
+ "doctrine/cache": "^1.0",
+ "doctrine/event-manager": "^1.0",
"ext-pdo": "*",
"php": "^7.1"
},
"require-dev": {
"doctrine/coding-standard": "^4.0",
- "phpunit/phpunit": "^7.0",
+ "jetbrains/phpstorm-stubs": "^2018.1.2",
+ "phpstan/phpstan": "^0.10.1",
+ "phpunit/phpunit": "^7.1.2",
"phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5",
- "symfony/console": "^2.0.5||^3.0",
+ "symfony/console": "^2.0.5|^3.0|^4.0",
"symfony/phpunit-bridge": "^3.4.5|^4.0.5"
},
"suggest": {
@@ -561,7 +368,8 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.7.x-dev"
+ "dev-master": "2.8.x-dev",
+ "dev-develop": "3.0.x-dev"
}
},
"autoload": {
@@ -599,7 +407,81 @@
"persistence",
"queryobject"
],
- "time": "2018-04-07T18:44:18+00:00"
+ "time": "2018-07-13T03:16:35+00:00"
+ },
+ {
+ "name": "doctrine/event-manager",
+ "version": "v1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/event-manager.git",
+ "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/a520bc093a0170feeb6b14e9d83f3a14452e64b3",
+ "reference": "a520bc093a0170feeb6b14e9d83f3a14452e64b3",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "conflict": {
+ "doctrine/common": "<2.9@dev"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^4.0",
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\": "lib/Doctrine/Common"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "Doctrine Event Manager component",
+ "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
+ "keywords": [
+ "event",
+ "eventdispatcher",
+ "eventmanager"
+ ],
+ "time": "2018-06-11T11:59:03+00:00"
},
{
"name": "doctrine/inflector",
@@ -724,16 +606,16 @@
},
{
"name": "dragonmantank/cron-expression",
- "version": "v2.1.0",
+ "version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "3f00985deec8df53d4cc1e5c33619bda1ee309a5"
+ "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/3f00985deec8df53d4cc1e5c33619bda1ee309a5",
- "reference": "3f00985deec8df53d4cc1e5c33619bda1ee309a5",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/92a2c3768d50e21a1f26a53cb795ce72806266c5",
+ "reference": "92a2c3768d50e21a1f26a53cb795ce72806266c5",
"shasum": ""
},
"require": {
@@ -769,7 +651,7 @@
"cron",
"schedule"
],
- "time": "2018-04-06T15:51:55+00:00"
+ "time": "2018-06-06T03:12:17+00:00"
},
{
"name": "egulias/email-validator",
@@ -928,6 +810,52 @@
],
"time": "2018-02-07T20:20:57+00:00"
},
+ {
+ "name": "firebase/php-jwt",
+ "version": "v5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+ "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": " 4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "time": "2017-06-27T22:17:23+00:00"
+ },
{
"name": "greggilbert/recaptcha",
"version": "dev-master",
@@ -1318,64 +1246,18 @@
],
"time": "2015-04-20T18:58:01+00:00"
},
- {
- "name": "kitetail/zttp",
- "version": "v0.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/kitetail/zttp.git",
- "reference": "e788ab8fc5c0259f691e2960d17e0ddbab761c6a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/kitetail/zttp/zipball/e788ab8fc5c0259f691e2960d17e0ddbab761c6a",
- "reference": "e788ab8fc5c0259f691e2960d17e0ddbab761c6a",
- "shasum": ""
- },
- "require": {
- "guzzlehttp/guzzle": "^6.0",
- "php": ">=7.0",
- "tightenco/collect": "^5.4"
- },
- "require-dev": {
- "laravel/lumen-framework": "^5.4",
- "phpunit/phpunit": "^6.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/Zttp.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Adam Wathan",
- "email": "adam.wathan@gmail.com"
- }
- ],
- "description": "A developer-experience focused HTTP client, optimized for most common use cases.",
- "keywords": [
- "Guzzle",
- "http"
- ],
- "time": "2017-08-09T15:31:26+00:00"
- },
{
"name": "laravel/framework",
- "version": "v5.6.23",
+ "version": "v5.6.31",
"source": {
"type": "git",
"url": "https://github.com/laravel/framework.git",
- "reference": "f547f0a71a12763d1adb8493237d541c9e3a5d10"
+ "reference": "b11fbad84cd90d109c6d817ff3c9af428746edfd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/f547f0a71a12763d1adb8493237d541c9e3a5d10",
- "reference": "f547f0a71a12763d1adb8493237d541c9e3a5d10",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/b11fbad84cd90d109c6d817ff3c9af428746edfd",
+ "reference": "b11fbad84cd90d109c6d817ff3c9af428746edfd",
"shasum": ""
},
"require": {
@@ -1501,20 +1383,20 @@
"framework",
"laravel"
],
- "time": "2018-05-22T14:55:57+00:00"
+ "time": "2018-08-08T20:56:17+00:00"
},
{
"name": "laravel/horizon",
- "version": "v1.2.3",
+ "version": "v1.3.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/horizon.git",
- "reference": "36ef9e2d6e09e617cf801050326a69e876ff5535"
+ "reference": "342c4ddf6dda7c7ed21e57566f202b96e28afb6b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/horizon/zipball/36ef9e2d6e09e617cf801050326a69e876ff5535",
- "reference": "36ef9e2d6e09e617cf801050326a69e876ff5535",
+ "url": "https://api.github.com/repos/laravel/horizon/zipball/342c4ddf6dda7c7ed21e57566f202b96e28afb6b",
+ "reference": "342c4ddf6dda7c7ed21e57566f202b96e28afb6b",
"shasum": ""
},
"require": {
@@ -1569,7 +1451,76 @@
"laravel",
"queue"
],
- "time": "2018-03-13T18:00:18+00:00"
+ "time": "2018-06-21T09:19:40+00:00"
+ },
+ {
+ "name": "laravel/passport",
+ "version": "v6.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/passport.git",
+ "reference": "83ac18d903c1446be7344464d37fa006fb6957c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/passport/zipball/83ac18d903c1446be7344464d37fa006fb6957c9",
+ "reference": "83ac18d903c1446be7344464d37fa006fb6957c9",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "~3.0|~4.0|~5.0",
+ "guzzlehttp/guzzle": "~6.0",
+ "illuminate/auth": "~5.6",
+ "illuminate/console": "~5.6",
+ "illuminate/container": "~5.6",
+ "illuminate/contracts": "~5.6",
+ "illuminate/database": "~5.6",
+ "illuminate/encryption": "~5.6",
+ "illuminate/http": "~5.6",
+ "illuminate/support": "~5.6",
+ "league/oauth2-server": "^7.0",
+ "php": ">=7.1",
+ "phpseclib/phpseclib": "^2.0",
+ "symfony/psr-http-message-bridge": "~1.0",
+ "zendframework/zend-diactoros": "~1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.0",
+ "phpunit/phpunit": "~6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Passport\\PassportServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Passport\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel Passport provides OAuth2 server support to Laravel.",
+ "keywords": [
+ "laravel",
+ "oauth",
+ "passport"
+ ],
+ "time": "2018-07-17T13:00:32+00:00"
},
{
"name": "laravel/tinker",
@@ -1634,6 +1585,114 @@
],
"time": "2018-05-17T13:42:07+00:00"
},
+ {
+ "name": "lcobucci/jwt",
+ "version": "3.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lcobucci/jwt.git",
+ "reference": "c9704b751315d21735dc98d78d4f37bd73596da7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/c9704b751315d21735dc98d78d4f37bd73596da7",
+ "reference": "c9704b751315d21735dc98d78d4f37bd73596da7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "mdanter/ecc": "~0.3.1",
+ "mikey179/vfsstream": "~1.5",
+ "phpmd/phpmd": "~2.2",
+ "phpunit/php-invoker": "~1.1",
+ "phpunit/phpunit": "~4.5",
+ "squizlabs/php_codesniffer": "~2.3"
+ },
+ "suggest": {
+ "mdanter/ecc": "Required to use Elliptic Curves based algorithms."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Luís Otávio Cobucci Oblonczyk",
+ "email": "lcobucci@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "keywords": [
+ "JWS",
+ "jwt"
+ ],
+ "time": "2018-08-03T11:23:50+00:00"
+ },
+ {
+ "name": "league/event",
+ "version": "2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/event.git",
+ "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/event/zipball/e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd",
+ "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "henrikbjorn/phpspec-code-coverage": "~1.0.1",
+ "phpspec/phpspec": "~2.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Event\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Event package",
+ "keywords": [
+ "emitter",
+ "event",
+ "listener"
+ ],
+ "time": "2015-05-21T12:24:47+00:00"
+ },
{
"name": "league/flysystem",
"version": "1.0.45",
@@ -1719,45 +1778,42 @@
"time": "2018-05-07T08:44:23+00:00"
},
{
- "name": "league/fractal",
- "version": "0.17.0",
+ "name": "league/oauth2-server",
+ "version": "7.2.0",
"source": {
"type": "git",
- "url": "https://github.com/thephpleague/fractal.git",
- "reference": "a0b350824f22fc2fdde2500ce9d6851a3f275b0e"
+ "url": "https://github.com/thephpleague/oauth2-server.git",
+ "reference": "8184f771d43ea7305ddbb893d0daf6f0352ec5fd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/fractal/zipball/a0b350824f22fc2fdde2500ce9d6851a3f275b0e",
- "reference": "a0b350824f22fc2fdde2500ce9d6851a3f275b0e",
+ "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/8184f771d43ea7305ddbb893d0daf6f0352ec5fd",
+ "reference": "8184f771d43ea7305ddbb893d0daf6f0352ec5fd",
"shasum": ""
},
"require": {
- "php": ">=5.4"
+ "defuse/php-encryption": "^2.1",
+ "ext-openssl": "*",
+ "lcobucci/jwt": "^3.2.2",
+ "league/event": "^2.1",
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0.1"
+ },
+ "replace": {
+ "league/oauth2server": "*",
+ "lncd/oauth2": "*"
},
"require-dev": {
- "doctrine/orm": "^2.5",
- "illuminate/contracts": "~5.0",
- "mockery/mockery": "~0.9",
- "pagerfanta/pagerfanta": "~1.0.0",
- "phpunit/phpunit": "~4.0",
- "squizlabs/php_codesniffer": "~1.5",
- "zendframework/zend-paginator": "~2.3"
- },
- "suggest": {
- "illuminate/pagination": "The Illuminate Pagination component.",
- "pagerfanta/pagerfanta": "Pagerfanta Paginator",
- "zendframework/zend-paginator": "Zend Framework Paginator"
+ "phpstan/phpstan": "^0.9.2",
+ "phpstan/phpstan-phpunit": "^0.9.4",
+ "phpstan/phpstan-strict-rules": "^0.9.0",
+ "phpunit/phpunit": "^6.3 || ^7.0",
+ "zendframework/zend-diactoros": "^1.3.2"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "0.13-dev"
- }
- },
"autoload": {
"psr-4": {
- "League\\Fractal\\": "src"
+ "League\\OAuth2\\Server\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1766,21 +1822,30 @@
],
"authors": [
{
- "name": "Phil Sturgeon",
- "email": "me@philsturgeon.uk",
- "homepage": "http://philsturgeon.uk/",
+ "name": "Alex Bilbie",
+ "email": "hello@alexbilbie.com",
+ "homepage": "http://www.alexbilbie.com",
"role": "Developer"
}
],
- "description": "Handle the output of complex data structures ready for API output.",
- "homepage": "http://fractal.thephpleague.com/",
+ "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.",
+ "homepage": "https://oauth2.thephpleague.com/",
"keywords": [
+ "Authentication",
"api",
- "json",
- "league",
- "rest"
+ "auth",
+ "authorisation",
+ "authorization",
+ "oauth",
+ "oauth 2",
+ "oauth 2.0",
+ "oauth2",
+ "protect",
+ "resource",
+ "secure",
+ "server"
],
- "time": "2017-06-12T11:04:56+00:00"
+ "time": "2018-06-23T16:57:59+00:00"
},
{
"name": "monolog/monolog",
@@ -1860,6 +1925,55 @@
],
"time": "2017-06-19T01:22:40+00:00"
},
+ {
+ "name": "moontoast/math",
+ "version": "1.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/moontoast-math.git",
+ "reference": "c2792a25df5cad4ff3d760dd37078fc5b6fccc79"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/moontoast-math/zipball/c2792a25df5cad4ff3d760dd37078fc5b6fccc79",
+ "reference": "c2792a25df5cad4ff3d760dd37078fc5b6fccc79",
+ "shasum": ""
+ },
+ "require": {
+ "ext-bcmath": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "jakub-onderka/php-parallel-lint": "^0.9.0",
+ "phpunit/phpunit": "^4.7|>=5.0 <5.4",
+ "satooshi/php-coveralls": "^0.6.1",
+ "squizlabs/php_codesniffer": "^2.3"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Moontoast\\Math\\": "src/Moontoast/Math/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A mathematics library, providing functionality for large numbers",
+ "homepage": "https://github.com/ramsey/moontoast-math",
+ "keywords": [
+ "bcmath",
+ "math"
+ ],
+ "time": "2017-02-16T16:54:46+00:00"
+ },
{
"name": "nesbot/carbon",
"version": "1.25.0",
@@ -1915,16 +2029,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v4.0.1",
+ "version": "v4.0.3",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3"
+ "reference": "bd088dc940a418f09cda079a9b5c7c478890fb8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3",
- "reference": "e4a54fa90a5cd8e8dd3fb4099942681731c5cdd3",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bd088dc940a418f09cda079a9b5c7c478890fb8d",
+ "reference": "bd088dc940a418f09cda079a9b5c7c478890fb8d",
"shasum": ""
},
"require": {
@@ -1962,20 +2076,82 @@
"parser",
"php"
],
- "time": "2018-03-25T17:35:16+00:00"
+ "time": "2018-07-15T17:25:16+00:00"
},
{
- "name": "paragonie/random_compat",
- "version": "v2.0.12",
+ "name": "paragonie/constant_time_encoding",
+ "version": "v2.2.2",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb"
+ "url": "https://github.com/paragonie/constant_time_encoding.git",
+ "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
- "reference": "258c89a6b97de7dfaf5b8c7607d0478e236b04fb",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/eccf915f45f911bfb189d1d1638d940ec6ee6e33",
+ "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6|^7",
+ "vimeo/psalm": "^1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Steve 'Sc00bz' Thomas",
+ "email": "steve@tobtu.com",
+ "homepage": "https://www.tobtu.com",
+ "role": "Original Developer"
+ }
+ ],
+ "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
+ "keywords": [
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
+ ],
+ "time": "2018-03-10T19:47:49+00:00"
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "v2.0.17",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d",
+ "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d",
"shasum": ""
},
"require": {
@@ -2007,10 +2183,11 @@
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
"keywords": [
"csprng",
+ "polyfill",
"pseudorandom",
"random"
],
- "time": "2018-04-04T21:24:14+00:00"
+ "time": "2018-07-04T16:31:37+00:00"
},
{
"name": "phpseclib/phpseclib",
@@ -2104,6 +2281,406 @@
],
"time": "2018-04-15T16:55:05+00:00"
},
+ {
+ "name": "pixelfed/dotenv-editor",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/Laravel-Dotenv-Editor.git",
+ "reference": "b53cb2707bb856e92cf1a282b4e5ee17a45ccb2c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/Laravel-Dotenv-Editor/zipball/b53cb2707bb856e92cf1a282b4e5ee17a45ccb2c",
+ "reference": "b53cb2707bb856e92cf1a282b4e5ee17a45ccb2c",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/config": ">=5.0",
+ "illuminate/container": ">=5.0",
+ "illuminate/support": ">=5.0",
+ "php": ">=5.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Jackiedo\\DotenvEditor\\": "src/Jackiedo/DotenvEditor"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jackie Do",
+ "email": "anhvudo@gmail.com"
+ }
+ ],
+ "description": "The .env file editor tool for Laravel 5+",
+ "keywords": [
+ "dotenv",
+ "dotenv-editor",
+ "laravel"
+ ],
+ "time": "2018-07-17T19:38:26+00:00"
+ },
+ {
+ "name": "pixelfed/fractal",
+ "version": "0.18.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/fractal.git",
+ "reference": "faff10c9f3e3300b1571ef41926f933a9cce4782"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/fractal/zipball/faff10c9f3e3300b1571ef41926f933a9cce4782",
+ "reference": "faff10c9f3e3300b1571ef41926f933a9cce4782",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4"
+ },
+ "require-dev": {
+ "doctrine/orm": "^2.5",
+ "illuminate/contracts": "~5.0",
+ "mockery/mockery": "~0.9",
+ "pagerfanta/pagerfanta": "~1.0.0",
+ "phpunit/phpunit": "^4.8.35",
+ "squizlabs/php_codesniffer": "~1.5",
+ "zendframework/zend-paginator": "~2.3"
+ },
+ "suggest": {
+ "illuminate/pagination": "The Illuminate Pagination component.",
+ "pagerfanta/pagerfanta": "Pagerfanta Paginator",
+ "zendframework/zend-paginator": "Zend Framework Paginator"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.13-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Fractal\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Phil Sturgeon",
+ "email": "me@philsturgeon.uk",
+ "homepage": "http://philsturgeon.uk/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Handle the output of complex data structures ready for API output.",
+ "homepage": "http://fractal.thephpleague.com/",
+ "keywords": [
+ "api",
+ "json",
+ "league",
+ "rest"
+ ],
+ "time": "2018-07-01T02:30:24+00:00"
+ },
+ {
+ "name": "pixelfed/google2fa",
+ "version": "v4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/google2fa.git",
+ "reference": "919ecec68074a27818451d8653029773a2391fe5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/google2fa/zipball/919ecec68074a27818451d8653029773a2391fe5",
+ "reference": "919ecec68074a27818451d8653029773a2391fe5",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "~1.0|~2.0",
+ "paragonie/random_compat": "~1.4|~2.0",
+ "php": ">=5.4",
+ "symfony/polyfill-php56": "~1.2"
+ },
+ "require-dev": {
+ "bacon/bacon-qr-code": "~1.0",
+ "phpunit/phpunit": "~4|~5|~6"
+ },
+ "suggest": {
+ "bacon/bacon-qr-code": "Required to generate inline QR Codes."
+ },
+ "type": "library",
+ "extra": {
+ "component": "package",
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PragmaRX\\Google2FA\\": "src/",
+ "PragmaRX\\Google2FA\\Tests\\": "tests/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Antonio Carlos Ribeiro",
+ "email": "acr@antoniocarlosribeiro.com",
+ "role": "Creator & Designer"
+ }
+ ],
+ "description": "A One Time Password Authentication package, compatible with Google Authenticator.",
+ "keywords": [
+ "2fa",
+ "Authentication",
+ "Two Factor Authentication",
+ "google2fa",
+ "laravel"
+ ],
+ "time": "2018-07-05T03:38:31+00:00"
+ },
+ {
+ "name": "pixelfed/google2fa-laravel",
+ "version": "v2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/google2fa-laravel.git",
+ "reference": "72cfcbe2c04db1a2702925413b40fdda3743e6b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/google2fa-laravel/zipball/72cfcbe2c04db1a2702925413b40fdda3743e6b5",
+ "reference": "72cfcbe2c04db1a2702925413b40fdda3743e6b5",
+ "shasum": ""
+ },
+ "require": {
+ "laravel/framework": ">=5.2",
+ "php": ">=5.4",
+ "pixelfed/google2fa": "~4.0"
+ },
+ "require-dev": {
+ "orchestra/testbench-browser-kit": "~3.4|~3.5|~3.6",
+ "phpunit/phpunit": "~5|~6|~7"
+ },
+ "suggest": {
+ "bacon/bacon-qr-code": "Required to generate inline QR Codes.",
+ "pragmarx/recovery": "Generate recovery codes."
+ },
+ "type": "library",
+ "extra": {
+ "component": "package",
+ "frameworks": [
+ "Laravel"
+ ],
+ "branch-alias": {
+ "dev-master": "0.2-dev"
+ },
+ "laravel": {
+ "providers": [
+ "PragmaRX\\Google2FALaravel\\ServiceProvider"
+ ],
+ "aliases": {
+ "Google2FA": "PragmaRX\\Google2FALaravel\\Facade"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PragmaRX\\Google2FALaravel\\": "src/",
+ "PragmaRX\\Google2FALaravel\\Tests\\": "tests/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Antonio Carlos Ribeiro",
+ "email": "acr@antoniocarlosribeiro.com",
+ "role": "Creator & Designer"
+ }
+ ],
+ "description": "A One Time Password Authentication package, compatible with Google Authenticator.",
+ "keywords": [
+ "Authentication",
+ "Two Factor Authentication",
+ "google2fa",
+ "laravel"
+ ],
+ "time": "2018-07-05T03:42:05+00:00"
+ },
+ {
+ "name": "pixelfed/http-signatures",
+ "version": "V5.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/http-signatures-php.git",
+ "reference": "0eede979b02b868ef970d08a1cc7cb4d6cf4546a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/http-signatures-php/zipball/0eede979b02b868ef970d08a1cc7cb4d6cf4546a",
+ "reference": "0eede979b02b868ef970d08a1cc7cb4d6cf4546a",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/random_compat": "^1.0|^2.0",
+ "php": ">=5.5",
+ "psr/http-message": "^1.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^1.11",
+ "guzzlehttp/psr7": "^1.2",
+ "phpunit/phpunit": "~4.8",
+ "symfony/http-foundation": "~2.8|~3.0",
+ "symfony/psr-http-message-bridge": "^1.0",
+ "zendframework/zend-diactoros": "^1.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "HttpSignatures\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paul Annesley",
+ "email": "paul@99designs.com"
+ }
+ ],
+ "description": "Sign and verify HTTP messages",
+ "keywords": [
+ "hmac",
+ "http",
+ "https",
+ "signature",
+ "signed",
+ "signing"
+ ],
+ "time": "2018-07-30T19:46:07+00:00"
+ },
+ {
+ "name": "pixelfed/http-signatures-guzzlehttp",
+ "version": "v4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/http-signatures-guzzlehttp.git",
+ "reference": "39e404a79367ade78f4d6d8c7db4999b05a0f83a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/http-signatures-guzzlehttp/zipball/39e404a79367ade78f4d6d8c7db4999b05a0f83a",
+ "reference": "39e404a79367ade78f4d6d8c7db4999b05a0f83a",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": ">=6.0 <7.0.0",
+ "php": ">=5.5.0",
+ "pixelfed/http-signatures": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Adrian Palmer",
+ "email": "adrian.palmer@99designs.com"
+ },
+ {
+ "name": "Ruben de Vries",
+ "email": "ruben@rubensayshi.com"
+ }
+ ],
+ "description": "Sign and verify HTTP messages with Guzzle 6",
+ "homepage": "https://github.com/99designs/http-signatures-guzzlehttp",
+ "keywords": [
+ "guzzle 6",
+ "hmac",
+ "http",
+ "https",
+ "signature",
+ "signed",
+ "signing"
+ ],
+ "time": "2018-07-29T01:59:53+00:00"
+ },
+ {
+ "name": "pixelfed/zttp",
+ "version": "v0.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/pixelfed/zttp.git",
+ "reference": "9a95a42716eb3e71a0a88411805737965bb77c05"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/pixelfed/zttp/zipball/9a95a42716eb3e71a0a88411805737965bb77c05",
+ "reference": "9a95a42716eb3e71a0a88411805737965bb77c05",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.0",
+ "php": ">=7.0",
+ "tightenco/collect": "^5.4"
+ },
+ "require-dev": {
+ "laravel/lumen-framework": "5.5.*",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/Zttp.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Adam Wathan",
+ "email": "adam.wathan@gmail.com"
+ }
+ ],
+ "description": "A developer-experience focused HTTP client, optimized for most common use cases.",
+ "keywords": [
+ "Guzzle",
+ "http"
+ ],
+ "time": "2018-07-30T05:04:42+00:00"
+ },
{
"name": "predis/predis",
"version": "v1.1.1",
@@ -2350,16 +2927,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.9.4",
+ "version": "v0.9.6",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "4d969a0e08e1e05e7207c07cb4207017ecc9a331"
+ "reference": "4a2ce86f199d51b6e2524214dc06835e872f4fce"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4d969a0e08e1e05e7207c07cb4207017ecc9a331",
- "reference": "4d969a0e08e1e05e7207c07cb4207017ecc9a331",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4a2ce86f199d51b6e2524214dc06835e872f4fce",
+ "reference": "4a2ce86f199d51b6e2524214dc06835e872f4fce",
"shasum": ""
},
"require": {
@@ -2418,25 +2995,26 @@
"interactive",
"shell"
],
- "time": "2018-05-22T06:48:07+00:00"
+ "time": "2018-06-10T17:57:20+00:00"
},
{
"name": "ramsey/uuid",
- "version": "3.7.3",
+ "version": "3.8.0",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
- "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76"
+ "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/44abcdad877d9a46685a3a4d221e3b2c4b87cb76",
- "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
+ "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
"shasum": ""
},
"require": {
- "paragonie/random_compat": "^1.0|^2.0",
- "php": "^5.4 || ^7.0"
+ "paragonie/random_compat": "^1.0|^2.0|9.99.99",
+ "php": "^5.4 || ^7.0",
+ "symfony/polyfill-ctype": "^1.8"
},
"replace": {
"rhumsaa/uuid": "self.version"
@@ -2444,16 +3022,17 @@
"require-dev": {
"codeception/aspect-mock": "^1.0 | ~2.0.0",
"doctrine/annotations": "~1.2.0",
- "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1",
+ "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0",
"ircmaxell/random-lib": "^1.1",
"jakub-onderka/php-parallel-lint": "^0.9.0",
"mockery/mockery": "^0.9.9",
"moontoast/math": "^1.1",
"php-mock/php-mock-phpunit": "^0.3|^1.1",
- "phpunit/phpunit": "^4.7|^5.0",
+ "phpunit/phpunit": "^4.7|^5.0|^6.5",
"squizlabs/php_codesniffer": "^2.3"
},
"suggest": {
+ "ext-ctype": "Provides support for PHP Ctype functions",
"ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
"ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
"ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
@@ -2498,7 +3077,7 @@
"identifier",
"uuid"
],
- "time": "2018-01-20T00:28:24+00:00"
+ "time": "2018-07-19T23:38:55+00:00"
},
{
"name": "spatie/db-dumper",
@@ -2552,16 +3131,16 @@
},
{
"name": "spatie/image-optimizer",
- "version": "1.0.14",
+ "version": "1.1.0",
"source": {
"type": "git",
"url": "https://github.com/spatie/image-optimizer.git",
- "reference": "91603599eb29024cc9849a4a511a629ebce97850"
+ "reference": "1530d6cf72070068eecab150ffb73466c3806bdd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/91603599eb29024cc9849a4a511a629ebce97850",
- "reference": "91603599eb29024cc9849a4a511a629ebce97850",
+ "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/1530d6cf72070068eecab150ffb73466c3806bdd",
+ "reference": "1530d6cf72070068eecab150ffb73466c3806bdd",
"shasum": ""
},
"require": {
@@ -2597,20 +3176,20 @@
"image-optimizer",
"spatie"
],
- "time": "2018-03-07T13:42:33+00:00"
+ "time": "2018-06-05T07:36:17+00:00"
},
{
"name": "spatie/laravel-backup",
- "version": "5.7.0",
+ "version": "5.9.3",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-backup.git",
- "reference": "60c6fbc27c9c2cbdf3c7da90b080a63d2599cd2d"
+ "reference": "0c16390c9d37c58a57077129378b8d48f5c214b7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/60c6fbc27c9c2cbdf3c7da90b080a63d2599cd2d",
- "reference": "60c6fbc27c9c2cbdf3c7da90b080a63d2599cd2d",
+ "url": "https://api.github.com/repos/spatie/laravel-backup/zipball/0c16390c9d37c58a57077129378b8d48f5c214b7",
+ "reference": "0c16390c9d37c58a57077129378b8d48f5c214b7",
"shasum": ""
},
"require": {
@@ -2670,26 +3249,26 @@
"laravel-backup",
"spatie"
],
- "time": "2018-05-11T07:06:58+00:00"
+ "time": "2018-08-04T11:52:51+00:00"
},
{
"name": "spatie/laravel-image-optimizer",
- "version": "1.2.0",
+ "version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-image-optimizer.git",
- "reference": "f98d1a8e90851ed0384b46f9b692297d47688a0c"
+ "reference": "b40f5accb41b385dcc62ca17c25283e5db11d9a3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/spatie/laravel-image-optimizer/zipball/f98d1a8e90851ed0384b46f9b692297d47688a0c",
- "reference": "f98d1a8e90851ed0384b46f9b692297d47688a0c",
+ "url": "https://api.github.com/repos/spatie/laravel-image-optimizer/zipball/b40f5accb41b385dcc62ca17c25283e5db11d9a3",
+ "reference": "b40f5accb41b385dcc62ca17c25283e5db11d9a3",
"shasum": ""
},
"require": {
"illuminate/support": "~5.5.0|~5.6.0",
"php": "^7.0",
- "spatie/image-optimizer": "^1.0.4"
+ "spatie/image-optimizer": "^1.1.0"
},
"require-dev": {
"orchestra/testbench": "~3.5.0|~3.6.0",
@@ -2729,7 +3308,7 @@
"laravel-image-optimizer",
"spatie"
],
- "time": "2018-05-16T14:07:07+00:00"
+ "time": "2018-06-05T07:37:24+00:00"
},
{
"name": "spatie/laravel-partialcache",
@@ -2838,16 +3417,16 @@
},
{
"name": "swiftmailer/swiftmailer",
- "version": "v6.0.2",
+ "version": "v6.1.2",
"source": {
"type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc"
+ "reference": "7d760881d266d63c5e7a1155cbcf2ac656a31ca8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/412333372fb6c8ffb65496a2bbd7321af75733fc",
- "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/7d760881d266d63c5e7a1155cbcf2ac656a31ca8",
+ "reference": "7d760881d266d63c5e7a1155cbcf2ac656a31ca8",
"shasum": ""
},
"require": {
@@ -2858,10 +3437,14 @@
"mockery/mockery": "~0.9.1",
"symfony/phpunit-bridge": "~3.3@dev"
},
+ "suggest": {
+ "ext-intl": "Needed to support internationalized email addresses",
+ "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed"
+ },
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "6.0-dev"
+ "dev-master": "6.1-dev"
}
},
"autoload": {
@@ -2883,26 +3466,26 @@
}
],
"description": "Swiftmailer, free feature-rich PHP mailer",
- "homepage": "http://swiftmailer.symfony.com",
+ "homepage": "https://swiftmailer.symfony.com",
"keywords": [
"email",
"mail",
"mailer"
],
- "time": "2017-09-30T22:39:41+00:00"
+ "time": "2018-07-13T07:04:35+00:00"
},
{
"name": "symfony/console",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "2d5d973bf9933d46802b01010bd25c800c87c242"
+ "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/2d5d973bf9933d46802b01010bd25c800c87c242",
- "reference": "2d5d973bf9933d46802b01010bd25c800c87c242",
+ "url": "https://api.github.com/repos/symfony/console/zipball/ca80b8ced97cf07390078b29773dc384c39eee1f",
+ "reference": "ca80b8ced97cf07390078b29773dc384c39eee1f",
"shasum": ""
},
"require": {
@@ -2957,20 +3540,20 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2018-05-30T07:26:09+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "03ac71606ecb0b0ce792faa17d74cc32c2949ef4"
+ "reference": "2a4df7618f869b456f9096781e78c57b509d76c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/03ac71606ecb0b0ce792faa17d74cc32c2949ef4",
- "reference": "03ac71606ecb0b0ce792faa17d74cc32c2949ef4",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/2a4df7618f869b456f9096781e78c57b509d76c7",
+ "reference": "2a4df7618f869b456f9096781e78c57b509d76c7",
"shasum": ""
},
"require": {
@@ -3010,20 +3593,20 @@
],
"description": "Symfony CssSelector Component",
"homepage": "https://symfony.com",
- "time": "2018-05-30T07:26:09+00:00"
+ "time": "2018-07-26T09:10:45+00:00"
},
{
"name": "symfony/debug",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "449f8b00b28ab6e6912c3e6b920406143b27193b"
+ "reference": "9316545571f079c4dd183e674721d9dc783ce196"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/449f8b00b28ab6e6912c3e6b920406143b27193b",
- "reference": "449f8b00b28ab6e6912c3e6b920406143b27193b",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/9316545571f079c4dd183e674721d9dc783ce196",
+ "reference": "9316545571f079c4dd183e674721d9dc783ce196",
"shasum": ""
},
"require": {
@@ -3066,20 +3649,20 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2018-05-16T14:33:22+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "2391ed210a239868e7256eb6921b1bd83f3087b5"
+ "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2391ed210a239868e7256eb6921b1bd83f3087b5",
- "reference": "2391ed210a239868e7256eb6921b1bd83f3087b5",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/bfb30c2ad377615a463ebbc875eba64a99f6aa3e",
+ "reference": "bfb30c2ad377615a463ebbc875eba64a99f6aa3e",
"shasum": ""
},
"require": {
@@ -3129,20 +3712,20 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2018-04-06T07:35:57+00:00"
+ "time": "2018-07-26T09:10:45+00:00"
},
{
"name": "symfony/finder",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "087e2ee0d74464a4c6baac4e90417db7477dc238"
+ "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/087e2ee0d74464a4c6baac4e90417db7477dc238",
- "reference": "087e2ee0d74464a4c6baac4e90417db7477dc238",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/e162f1df3102d0b7472805a5a9d5db9fcf0a8068",
+ "reference": "e162f1df3102d0b7472805a5a9d5db9fcf0a8068",
"shasum": ""
},
"require": {
@@ -3178,20 +3761,20 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
- "time": "2018-05-16T14:33:22+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
"name": "symfony/http-foundation",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
- "reference": "a916c88390fb861ee21f12a92b107d51bb68af99"
+ "reference": "7d93e3547660ec7ee3dad1428ba42e8076a0e5f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a916c88390fb861ee21f12a92b107d51bb68af99",
- "reference": "a916c88390fb861ee21f12a92b107d51bb68af99",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7d93e3547660ec7ee3dad1428ba42e8076a0e5f1",
+ "reference": "7d93e3547660ec7ee3dad1428ba42e8076a0e5f1",
"shasum": ""
},
"require": {
@@ -3232,20 +3815,20 @@
],
"description": "Symfony HttpFoundation Component",
"homepage": "https://symfony.com",
- "time": "2018-05-25T14:55:38+00:00"
+ "time": "2018-08-01T14:07:44+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90"
+ "reference": "6347be5110efb27fe45ea04bf213078b67a05036"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90",
- "reference": "b5ab9d4cdbfd369083744b6b5dfbf454e31e5f90",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6347be5110efb27fe45ea04bf213078b67a05036",
+ "reference": "6347be5110efb27fe45ea04bf213078b67a05036",
"shasum": ""
},
"require": {
@@ -3253,13 +3836,13 @@
"psr/log": "~1.0",
"symfony/debug": "~3.4|~4.0",
"symfony/event-dispatcher": "~4.1",
- "symfony/http-foundation": "~4.1",
+ "symfony/http-foundation": "^4.1.1",
"symfony/polyfill-ctype": "~1.8"
},
"conflict": {
"symfony/config": "<3.4",
"symfony/dependency-injection": "<4.1",
- "symfony/var-dumper": "<4.1",
+ "symfony/var-dumper": "<4.1.1",
"twig/twig": "<1.34|<2.4,>=2"
},
"provide": {
@@ -3280,7 +3863,7 @@
"symfony/stopwatch": "~3.4|~4.0",
"symfony/templating": "~3.4|~4.0",
"symfony/translation": "~3.4|~4.0",
- "symfony/var-dumper": "~4.1"
+ "symfony/var-dumper": "^4.1.1"
},
"suggest": {
"symfony/browser-kit": "",
@@ -3319,29 +3902,32 @@
],
"description": "Symfony HttpKernel Component",
"homepage": "https://symfony.com",
- "time": "2018-05-30T12:52:34+00:00"
+ "time": "2018-08-01T15:30:34+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.8.0",
+ "version": "v1.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae"
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
- "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -3374,20 +3960,20 @@
"polyfill",
"portable"
],
- "time": "2018-04-30T19:57:29+00:00"
+ "time": "2018-08-06T14:22:27+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.8.0",
+ "version": "v1.9.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "3296adf6a6454a050679cde90f95350ad604b171"
+ "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
- "reference": "3296adf6a6454a050679cde90f95350ad604b171",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d0cd638f4634c16d8df4508e847f14e9e43168b8",
+ "reference": "d0cd638f4634c16d8df4508e847f14e9e43168b8",
"shasum": ""
},
"require": {
@@ -3399,7 +3985,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -3433,20 +4019,76 @@
"portable",
"shim"
],
- "time": "2018-04-26T10:06:28+00:00"
+ "time": "2018-08-06T14:22:27+00:00"
},
{
- "name": "symfony/polyfill-php72",
- "version": "v1.8.0",
+ "name": "symfony/polyfill-php56",
+ "version": "v1.9.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46"
+ "url": "https://github.com/symfony/polyfill-php56.git",
+ "reference": "7b4fc009172cc0196535b0328bd1226284a28000"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/a4576e282d782ad82397f3e4ec1df8e0f0cafb46",
- "reference": "a4576e282d782ad82397f3e4ec1df8e0f0cafb46",
+ "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/7b4fc009172cc0196535b0328bd1226284a28000",
+ "reference": "7b4fc009172cc0196535b0328bd1226284a28000",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/polyfill-util": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php56\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2018-08-06T14:22:27+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/95c50420b0baed23852452a7f0c7b527303ed5ae",
+ "reference": "95c50420b0baed23852452a7f0c7b527303ed5ae",
"shasum": ""
},
"require": {
@@ -3455,7 +4097,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -3488,20 +4130,72 @@
"portable",
"shim"
],
- "time": "2018-04-26T10:06:28+00:00"
+ "time": "2018-08-06T14:22:27+00:00"
},
{
- "name": "symfony/process",
- "version": "v4.1.0",
+ "name": "symfony/polyfill-util",
+ "version": "v1.9.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "73445bd33b0d337c060eef9652b94df72b6b3434"
+ "url": "https://github.com/symfony/polyfill-util.git",
+ "reference": "8e15d04ba3440984d23e7964b2ee1d25c8de1581"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/73445bd33b0d337c060eef9652b94df72b6b3434",
- "reference": "73445bd33b0d337c060eef9652b94df72b6b3434",
+ "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/8e15d04ba3440984d23e7964b2ee1d25c8de1581",
+ "reference": "8e15d04ba3440984d23e7964b2ee1d25c8de1581",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Util\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony utilities for portability of PHP codes",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compat",
+ "compatibility",
+ "polyfill",
+ "shim"
+ ],
+ "time": "2018-08-06T14:22:27+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v4.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/f01fc7a4493572f7f506c49dcb50ad01fb3a2f56",
+ "reference": "f01fc7a4493572f7f506c49dcb50ad01fb3a2f56",
"shasum": ""
},
"require": {
@@ -3537,20 +4231,80 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2018-05-30T07:26:09+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
- "name": "symfony/routing",
- "version": "v4.1.0",
+ "name": "symfony/psr-http-message-bridge",
+ "version": "v1.0.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "180b51c66d10f09e562c9ebc395b39aacb2cf8a2"
+ "url": "https://github.com/symfony/psr-http-message-bridge.git",
+ "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/180b51c66d10f09e562c9ebc395b39aacb2cf8a2",
- "reference": "180b51c66d10f09e562c9ebc395b39aacb2cf8a2",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/c2b757934f2d9681a287e662efbc27c41fe8ef86",
+ "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "psr/http-message": "~1.0",
+ "symfony/http-foundation": "~2.3|~3.0|~4.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~3.2|4.0"
+ },
+ "suggest": {
+ "psr/http-message-implementation": "To use the HttpFoundation factory",
+ "zendframework/zend-diactoros": "To use the Zend Diactoros factory"
+ },
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\PsrHttpMessage\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "PSR HTTP message bridge",
+ "homepage": "http://symfony.com",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr-7"
+ ],
+ "time": "2017-12-19T00:31:44+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v4.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b",
+ "reference": "6912cfebc0ea4e7a46fdd15c9bd1f427dd39ff1b",
"shasum": ""
},
"require": {
@@ -3563,7 +4317,6 @@
},
"require-dev": {
"doctrine/annotations": "~1.0",
- "doctrine/common": "~2.2",
"psr/log": "~1.0",
"symfony/config": "~3.4|~4.0",
"symfony/dependency-injection": "~3.4|~4.0",
@@ -3615,20 +4368,20 @@
"uri",
"url"
],
- "time": "2018-05-30T07:26:09+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
"name": "symfony/translation",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a"
+ "reference": "6fcd1bd44fd6d7181e6ea57a6f4e08a09b29ef65"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/16328f5b217cebc8dd4adfe4aeeaa8c377581f5a",
- "reference": "16328f5b217cebc8dd4adfe4aeeaa8c377581f5a",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/6fcd1bd44fd6d7181e6ea57a6f4e08a09b29ef65",
+ "reference": "6fcd1bd44fd6d7181e6ea57a6f4e08a09b29ef65",
"shasum": ""
},
"require": {
@@ -3684,20 +4437,20 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2018-05-30T07:26:09+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v4.1.0",
+ "version": "v4.1.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "bc88ad53e825ebacc7b190bbd360781fce381c64"
+ "reference": "69e174f4c02ec43919380171c6f7550753299316"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/bc88ad53e825ebacc7b190bbd360781fce381c64",
- "reference": "bc88ad53e825ebacc7b190bbd360781fce381c64",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/69e174f4c02ec43919380171c6f7550753299316",
+ "reference": "69e174f4c02ec43919380171c6f7550753299316",
"shasum": ""
},
"require": {
@@ -3759,20 +4512,20 @@
"debug",
"dump"
],
- "time": "2018-04-29T07:56:09+00:00"
+ "time": "2018-07-26T11:24:31+00:00"
},
{
"name": "tightenco/collect",
- "version": "v5.6.23",
+ "version": "v5.6.29",
"source": {
"type": "git",
"url": "https://github.com/tightenco/collect.git",
- "reference": "0954fc3ca147a7d727d807e15113daba4a08c810"
+ "reference": "64f281891ad887451b520ef77574b7a66f7d80e8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/tightenco/collect/zipball/0954fc3ca147a7d727d807e15113daba4a08c810",
- "reference": "0954fc3ca147a7d727d807e15113daba4a08c810",
+ "url": "https://api.github.com/repos/tightenco/collect/zipball/64f281891ad887451b520ef77574b7a66f7d80e8",
+ "reference": "64f281891ad887451b520ef77574b7a66f7d80e8",
"shasum": ""
},
"require": {
@@ -3809,7 +4562,7 @@
"collection",
"laravel"
],
- "time": "2018-05-22T17:57:22+00:00"
+ "time": "2018-07-26T22:33:08+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -3860,28 +4613,28 @@
},
{
"name": "vlucas/phpdotenv",
- "version": "v2.4.0",
+ "version": "v2.5.1",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c"
+ "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
- "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e",
+ "reference": "8abb4f9aa89ddea9d52112c65bbe8d0125e2fa8e",
"shasum": ""
},
"require": {
"php": ">=5.3.9"
},
"require-dev": {
- "phpunit/phpunit": "^4.8 || ^5.0"
+ "phpunit/phpunit": "^4.8.35 || ^5.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.4-dev"
+ "dev-master": "2.5-dev"
}
},
"autoload": {
@@ -3891,7 +4644,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause-Attribution"
+ "BSD-3-Clause"
],
"authors": [
{
@@ -3906,7 +4659,70 @@
"env",
"environment"
],
- "time": "2016-09-01T10:05:43+00:00"
+ "time": "2018-07-29T20:33:41+00:00"
+ },
+ {
+ "name": "zendframework/zend-diactoros",
+ "version": "1.8.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-diactoros.git",
+ "reference": "736ffa7c2bfa4a60e8a10acb316fa2ac456c5fba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/736ffa7c2bfa4a60e8a10acb316fa2ac456c5fba",
+ "reference": "736ffa7c2bfa4a60e8a10acb316fa2ac456c5fba",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "phpunit/phpunit": "^5.7.16 || ^6.0.8 || ^7.2.7",
+ "zendframework/zend-coding-standard": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8.x-dev",
+ "dev-develop": "1.9.x-dev",
+ "dev-release-2.0": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions/create_uploaded_file.php",
+ "src/functions/marshal_headers_from_sapi.php",
+ "src/functions/marshal_method_from_sapi.php",
+ "src/functions/marshal_protocol_version_from_sapi.php",
+ "src/functions/marshal_uri_from_sapi.php",
+ "src/functions/normalize_server.php",
+ "src/functions/normalize_uploaded_files.php",
+ "src/functions/parse_cookie_header.php"
+ ],
+ "psr-4": {
+ "Zend\\Diactoros\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "PSR HTTP Message implementations",
+ "homepage": "https://github.com/zendframework/zend-diactoros",
+ "keywords": [
+ "http",
+ "psr",
+ "psr-7"
+ ],
+ "time": "2018-08-01T13:47:49+00:00"
}
],
"packages-dev": [
@@ -3978,6 +4794,68 @@
],
"time": "2018-05-03T18:27:04+00:00"
},
+ {
+ "name": "beyondcode/laravel-er-diagram-generator",
+ "version": "0.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/beyondcode/laravel-er-diagram-generator.git",
+ "reference": "ff3c9345b679b243ce529a860f6660f1cc8c49c9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/beyondcode/laravel-er-diagram-generator/zipball/ff3c9345b679b243ce529a860f6660f1cc8c49c9",
+ "reference": "ff3c9345b679b243ce529a860f6660f1cc8c49c9",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/dbal": "~2.3",
+ "nikic/php-parser": "^2.0|^3.0|^4.0",
+ "php": "^7.1",
+ "phpdocumentor/graphviz": "^1.0"
+ },
+ "require-dev": {
+ "larapack/dd": "^1.0",
+ "orchestra/testbench": "~3.5",
+ "phpunit/phpunit": "^7.0",
+ "spatie/phpunit-snapshot-assertions": "^1.3"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "BeyondCode\\ErdGenerator\\ErdGeneratorServiceProvider"
+ ],
+ "aliases": {
+ "ErdGenerator": "BeyondCode\\ErdGenerator\\ErdGeneratorFacade"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "BeyondCode\\ErdGenerator\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marcel Pociot",
+ "email": "marcel@beyondco.de",
+ "homepage": "https://beyondcode.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Generate ER diagrams from your Laravel models.",
+ "homepage": "https://github.com/beyondcode/laravel-er-diagram-generator",
+ "keywords": [
+ "beyondcode",
+ "laravel-er-diagram-generator"
+ ],
+ "time": "2018-07-12T08:28:30+00:00"
+ },
{
"name": "doctrine/instantiator",
"version": "1.1.0",
@@ -4034,16 +4912,16 @@
},
{
"name": "filp/whoops",
- "version": "2.1.14",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6"
+ "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/c6081b8838686aa04f1e83ba7e91f78b7b2a23e6",
- "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/181c4502d8f34db7aed7bfe88d4f87875b8e947a",
+ "reference": "181c4502d8f34db7aed7bfe88d4f87875b8e947a",
"shasum": ""
},
"require": {
@@ -4051,9 +4929,9 @@
"psr/log": "^1.0.1"
},
"require-dev": {
- "mockery/mockery": "0.9.*",
+ "mockery/mockery": "^0.9 || ^1.0",
"phpunit/phpunit": "^4.8.35 || ^5.7",
- "symfony/var-dumper": "^2.6 || ^3.0"
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0"
},
"suggest": {
"symfony/var-dumper": "Pretty print complex values better with var-dumper available",
@@ -4062,7 +4940,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-master": "2.1-dev"
}
},
"autoload": {
@@ -4091,20 +4969,20 @@
"throwable",
"whoops"
],
- "time": "2017-11-23T18:22:44+00:00"
+ "time": "2018-03-03T17:56:25+00:00"
},
{
"name": "fzaninotto/faker",
- "version": "v1.7.1",
+ "version": "v1.8.0",
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
- "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d"
+ "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d",
- "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d",
+ "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de",
+ "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de",
"shasum": ""
},
"require": {
@@ -4112,7 +4990,7 @@
},
"require-dev": {
"ext-intl": "*",
- "phpunit/phpunit": "^4.0 || ^5.0",
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
"squizlabs/php_codesniffer": "^1.5"
},
"type": "library",
@@ -4141,7 +5019,7 @@
"faker",
"fixtures"
],
- "time": "2017-08-15T16:48:10+00:00"
+ "time": "2018-07-12T10:23:15+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@@ -4320,16 +5198,16 @@
},
{
"name": "myclabs/deep-copy",
- "version": "1.8.0",
+ "version": "1.8.1",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "478465659fd987669df0bd8a9bf22a8710e5f1b6"
+ "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/478465659fd987669df0bd8a9bf22a8710e5f1b6",
- "reference": "478465659fd987669df0bd8a9bf22a8710e5f1b6",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
+ "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8",
"shasum": ""
},
"require": {
@@ -4364,20 +5242,20 @@
"object",
"object graph"
],
- "time": "2018-05-29T17:25:09+00:00"
+ "time": "2018-06-11T23:09:50+00:00"
},
{
"name": "nunomaduro/collision",
- "version": "v2.0.2",
+ "version": "v2.0.3",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "245958b02c6a9edf24627380f368333ac5413a51"
+ "reference": "b1f606399ae77e9479b5597cd1aa3d8ea0078176"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/245958b02c6a9edf24627380f368333ac5413a51",
- "reference": "245958b02c6a9edf24627380f368333ac5413a51",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/b1f606399ae77e9479b5597cd1aa3d8ea0078176",
+ "reference": "b1f606399ae77e9479b5597cd1aa3d8ea0078176",
"shasum": ""
},
"require": {
@@ -4388,7 +5266,8 @@
},
"require-dev": {
"laravel/framework": "5.6.*",
- "phpunit/phpunit": "~7.0"
+ "phpstan/phpstan": "^0.9.2",
+ "phpunit/phpunit": "~7.2"
},
"type": "library",
"extra": {
@@ -4426,26 +5305,26 @@
"php",
"symfony"
],
- "time": "2018-03-21T20:11:24+00:00"
+ "time": "2018-06-16T22:05:52+00:00"
},
{
"name": "phar-io/manifest",
- "version": "1.0.1",
+ "version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
- "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0",
- "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-phar": "*",
- "phar-io/version": "^1.0.1",
+ "phar-io/version": "^2.0",
"php": "^5.6 || ^7.0"
},
"type": "library",
@@ -4481,20 +5360,20 @@
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
- "time": "2017-03-05T18:14:27+00:00"
+ "time": "2018-07-08T19:23:20+00:00"
},
{
"name": "phar-io/version",
- "version": "1.0.1",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/phar-io/version.git",
- "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df",
- "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+ "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
"shasum": ""
},
"require": {
@@ -4528,7 +5407,48 @@
}
],
"description": "Library for handling version information and constraints",
- "time": "2017-03-05T17:38:23+00:00"
+ "time": "2018-07-08T19:19:57+00:00"
+ },
+ {
+ "name": "phpdocumentor/graphviz",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/GraphViz.git",
+ "reference": "a906a90a9f230535f25ea31caf81b2323956283f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f",
+ "reference": "a906a90a9f230535f25ea31caf81b2323956283f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/",
+ "tests/unit"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ],
+ "time": "2016-02-02T13:00:08+00:00"
},
{
"name": "phpdocumentor/reflection-common",
@@ -4684,16 +5604,16 @@
},
{
"name": "phpspec/prophecy",
- "version": "1.7.6",
+ "version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712"
+ "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
- "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
+ "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
"shasum": ""
},
"require": {
@@ -4705,12 +5625,12 @@
},
"require-dev": {
"phpspec/phpspec": "^2.5|^3.2",
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.7.x-dev"
+ "dev-master": "1.8.x-dev"
}
},
"autoload": {
@@ -4743,7 +5663,7 @@
"spy",
"stub"
],
- "time": "2018-04-18T13:57:24+00:00"
+ "time": "2018-08-05T17:53:17+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -4810,16 +5730,16 @@
},
{
"name": "phpunit/php-file-iterator",
- "version": "2.0.0",
+ "version": "2.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "e20525b0c2945c7c317fff95660698cb3d2a53bc"
+ "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/e20525b0c2945c7c317fff95660698cb3d2a53bc",
- "reference": "e20525b0c2945c7c317fff95660698cb3d2a53bc",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cecbc684605bb0cc288828eb5d65d93d5c676d3c",
+ "reference": "cecbc684605bb0cc288828eb5d65d93d5c676d3c",
"shasum": ""
},
"require": {
@@ -4853,7 +5773,7 @@
"filesystem",
"iterator"
],
- "time": "2018-05-28T12:13:49+00:00"
+ "time": "2018-06-11T11:44:00+00:00"
},
{
"name": "phpunit/php-text-template",
@@ -4996,16 +5916,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "7.2.2",
+ "version": "7.3.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "3cf0836680bf5c365c627e8566d46c9e1f544db9"
+ "reference": "f9b14c17860eccb440a0352a117a81eb754cff5a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3cf0836680bf5c365c627e8566d46c9e1f544db9",
- "reference": "3cf0836680bf5c365c627e8566d46c9e1f544db9",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f9b14c17860eccb440a0352a117a81eb754cff5a",
+ "reference": "f9b14c17860eccb440a0352a117a81eb754cff5a",
"shasum": ""
},
"require": {
@@ -5016,12 +5936,12 @@
"ext-mbstring": "*",
"ext-xml": "*",
"myclabs/deep-copy": "^1.7",
- "phar-io/manifest": "^1.0.1",
- "phar-io/version": "^1.0",
+ "phar-io/manifest": "^1.0.2",
+ "phar-io/version": "^2.0",
"php": "^7.1",
"phpspec/prophecy": "^1.7",
"phpunit/php-code-coverage": "^6.0.7",
- "phpunit/php-file-iterator": "^2.0",
+ "phpunit/php-file-iterator": "^2.0.1",
"phpunit/php-text-template": "^1.2.1",
"phpunit/php-timer": "^2.0",
"sebastian/comparator": "^3.0",
@@ -5050,7 +5970,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "7.2-dev"
+ "dev-master": "7.3-dev"
}
},
"autoload": {
@@ -5076,7 +5996,7 @@
"testing",
"xunit"
],
- "time": "2018-06-01T07:54:27+00:00"
+ "time": "2018-08-07T06:44:28+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
@@ -5125,16 +6045,16 @@
},
{
"name": "sebastian/comparator",
- "version": "3.0.0",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5"
+ "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ed5fd2281113729f1ebcc64d101ad66028aeb3d5",
- "reference": "ed5fd2281113729f1ebcc64d101ad66028aeb3d5",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+ "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
"shasum": ""
},
"require": {
@@ -5185,20 +6105,20 @@
"compare",
"equality"
],
- "time": "2018-04-18T13:33:00+00:00"
+ "time": "2018-07-12T15:12:46+00:00"
},
{
"name": "sebastian/diff",
- "version": "3.0.0",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8"
+ "reference": "366541b989927187c4ca70490a35615d3fef2dce"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e09160918c66281713f1c324c1f4c4c3037ba1e8",
- "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce",
+ "reference": "366541b989927187c4ca70490a35615d3fef2dce",
"shasum": ""
},
"require": {
@@ -5241,7 +6161,7 @@
"unidiff",
"unified diff"
],
- "time": "2018-02-01T13:45:15+00:00"
+ "time": "2018-06-10T07:54:39+00:00"
},
{
"name": "sebastian/environment",
diff --git a/config/app.php b/config/app.php
index 99e219a5..b426fa53 100644
--- a/config/app.php
+++ b/config/app.php
@@ -65,7 +65,7 @@ return [
|
*/
- 'timezone' => 'UTC',
+ 'timezone' => env('APP_TIMEZONE', 'UTC'),
/*
|--------------------------------------------------------------------------
@@ -78,7 +78,7 @@ return [
|
*/
- 'locale' => 'en',
+ 'locale' => env('APP_LOCALE', 'en'),
/*
|--------------------------------------------------------------------------
@@ -91,7 +91,7 @@ return [
|
*/
- 'fallback_locale' => 'en',
+ 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
/*
|--------------------------------------------------------------------------
@@ -151,6 +151,7 @@ return [
* Package Service Providers...
*/
Greggilbert\Recaptcha\RecaptchaServiceProvider::class,
+ Jackiedo\DotenvEditor\DotenvEditorServiceProvider::class,
/*
* Application Service Providers...
@@ -211,6 +212,7 @@ return [
'View' => Illuminate\Support\Facades\View::class,
'Recaptcha' => Greggilbert\Recaptcha\Facades\Recaptcha::class,
+ 'DotenvEditor' => Jackiedo\DotenvEditor\Facades\DotenvEditor::class,
],
];
diff --git a/config/dotenv-editor.php b/config/dotenv-editor.php
new file mode 100644
index 00000000..583039c6
--- /dev/null
+++ b/config/dotenv-editor.php
@@ -0,0 +1,27 @@
+ true,
+
+ /*
+ |----------------------------------------------------------------------
+ | Backup location
+ |----------------------------------------------------------------------
+ |
+ | This value is used when you backup your file. This value is the sub
+ | path from root folder of project application.
+ */
+
+ 'backupPath' => base_path('storage/dotenv-editor/backups/')
+
+);
diff --git a/config/horizon.php b/config/horizon.php
index 0d74e01d..68fbf60b 100644
--- a/config/horizon.php
+++ b/config/horizon.php
@@ -76,7 +76,7 @@ return [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
- 'processes' => 10,
+ 'processes' => 20,
'tries' => 3,
],
],
diff --git a/config/image-optimizer.php b/config/image-optimizer.php
index 241dc199..6e97d8ef 100644
--- a/config/image-optimizer.php
+++ b/config/image-optimizer.php
@@ -49,5 +49,5 @@ return [
* If set to `true` all output of the optimizer binaries will be appended to the default log.
* You can also set this to a class that implements `Psr\Log\LoggerInterface`.
*/
- 'log_optimizer_activity' => true,
+ 'log_optimizer_activity' => false,
];
diff --git a/config/pixelfed.php b/config/pixelfed.php
index fcac7d0e..a62f29c3 100644
--- a/config/pixelfed.php
+++ b/config/pixelfed.php
@@ -23,7 +23,7 @@ return [
| This value is the version of your PixelFed instance.
|
*/
- 'version' => '0.1.0',
+ 'version' => '0.1.7',
/*
|--------------------------------------------------------------------------
@@ -77,6 +77,17 @@ return [
'activitypub_enabled' => env('ACTIVITY_PUB', false),
+ /*
+ |--------------------------------------------------------------------------
+ | Account file size limit
+ |--------------------------------------------------------------------------
+ |
+ | Update the max account size, the per user limit of files in KB.
+ |
+ |
+ */
+ 'max_account_size' => env('MAX_ACCOUNT_SIZE', 1000000),
+
/*
|--------------------------------------------------------------------------
| Photo file size limit
@@ -117,4 +128,34 @@ return [
*/
'max_name_length' => env('MAX_NAME_LENGTH', 30),
+ /*
+ |--------------------------------------------------------------------------
+ | Album size limit
+ |--------------------------------------------------------------------------
+ |
+ | The max number of photos allowed per post.
+ |
+ */
+ 'max_album_length' => env('MAX_ALBUM_LENGTH', 4),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Email Verification
+ |--------------------------------------------------------------------------
+ |
+ | Require email verification before a new user can do anything.
+ |
+ */
+ 'enforce_email_verification' => env('ENFORCE_EMAIL_VERIFICATION', true),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Image Quality
+ |--------------------------------------------------------------------------
+ |
+ | Set the image optimization quality, must be a value between 1-100.
+ |
+ */
+ 'image_quality' => (int) env('IMAGE_QUALITY', 80),
+
];
diff --git a/contrib/nginx.conf b/contrib/nginx.conf
index c39103d5..850d6ed2 100644
--- a/contrib/nginx.conf
+++ b/contrib/nginx.conf
@@ -7,7 +7,7 @@ server {
root /var/www/html/public;
location / {
- try_files $uri $uri/ /index.php;
+ try_files $uri $uri/ /$is_args$args;
}
location ~ \.php$ {
diff --git a/database/migrations/2018_04_22_233721_create_web_subs_table.php b/database/migrations/2018_04_22_233721_create_web_subs_table.php
new file mode 100644
index 00000000..cd91ca4d
--- /dev/null
+++ b/database/migrations/2018_04_22_233721_create_web_subs_table.php
@@ -0,0 +1,36 @@
+bigIncrements('id');
+ $table->bigInteger('follower_id')->unsigned()->index();
+ $table->bigInteger('following_id')->unsigned()->index();
+ $table->string('profile_url')->index();
+ $table->timestamp('approved_at')->nullable();
+ $table->unique(['follower_id', 'following_id', 'profile_url']);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('web_subs');
+ }
+}
diff --git a/database/migrations/2018_04_26_003259_create_import_jobs_table.php b/database/migrations/2018_04_26_003259_create_import_jobs_table.php
new file mode 100644
index 00000000..447deaad
--- /dev/null
+++ b/database/migrations/2018_04_26_003259_create_import_jobs_table.php
@@ -0,0 +1,38 @@
+increments('id');
+ $table->bigInteger('profile_id')->unsigned();
+ $table->string('service')->default('instagram');
+ $table->string('uuid')->nullable();
+ $table->string('storage_path')->nullable();
+ $table->tinyInteger('stage')->unsigned()->default(0);
+ $table->text('media_json')->nullable();
+ $table->timestamp('completed_at')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('import_jobs');
+ }
+}
diff --git a/database/migrations/2018_06_08_003624_create_mentions_table.php b/database/migrations/2018_06_08_003624_create_mentions_table.php
new file mode 100644
index 00000000..2f43d1ba
--- /dev/null
+++ b/database/migrations/2018_06_08_003624_create_mentions_table.php
@@ -0,0 +1,34 @@
+bigIncrements('id');
+ $table->bigInteger('status_id')->unsigned();
+ $table->bigInteger('profile_id')->unsigned();
+ $table->boolean('local')->default(true);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('mentions');
+ }
+}
diff --git a/database/migrations/2018_06_11_030049_add_filters_to_media_table.php b/database/migrations/2018_06_11_030049_add_filters_to_media_table.php
new file mode 100644
index 00000000..5a3dbf73
--- /dev/null
+++ b/database/migrations/2018_06_11_030049_add_filters_to_media_table.php
@@ -0,0 +1,34 @@
+string('filter_name')->nullable()->after('orientation');
+ $table->string('filter_class')->nullable()->after('filter_name');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('media', function (Blueprint $table) {
+ $table->dropColumn('filter_name');
+ $table->dropColumn('filter_class');
+ });
+ }
+}
diff --git a/database/migrations/2018_06_14_001318_add_soft_deletes_to_models.php b/database/migrations/2018_06_14_001318_add_soft_deletes_to_models.php
new file mode 100644
index 00000000..a839ddf7
--- /dev/null
+++ b/database/migrations/2018_06_14_001318_add_soft_deletes_to_models.php
@@ -0,0 +1,58 @@
+softDeletes();
+ });
+
+ Schema::table('likes', function ($table) {
+ $table->softDeletes();
+ });
+
+ Schema::table('media', function ($table) {
+ $table->softDeletes();
+ });
+
+ Schema::table('mentions', function ($table) {
+ $table->softDeletes();
+ });
+
+ Schema::table('notifications', function ($table) {
+ $table->softDeletes();
+ });
+
+ Schema::table('profiles', function ($table) {
+ $table->softDeletes();
+ });
+
+ Schema::table('statuses', function ($table) {
+ $table->softDeletes();
+ });
+
+ Schema::table('users', function ($table) {
+ $table->softDeletes();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ //
+ }
+}
diff --git a/database/migrations/2018_06_14_041422_create_email_verifications_table.php b/database/migrations/2018_06_14_041422_create_email_verifications_table.php
new file mode 100644
index 00000000..cbcc6ae3
--- /dev/null
+++ b/database/migrations/2018_06_14_041422_create_email_verifications_table.php
@@ -0,0 +1,35 @@
+bigIncrements('id');
+ $table->bigInteger('user_id')->unsigned();
+ $table->string('email')->nullable();
+ $table->string('user_token')->index();
+ $table->string('random_token')->index();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('email_verifications');
+ }
+}
diff --git a/database/migrations/2018_06_22_062621_create_report_comments_table.php b/database/migrations/2018_06_22_062621_create_report_comments_table.php
new file mode 100644
index 00000000..51594cc8
--- /dev/null
+++ b/database/migrations/2018_06_22_062621_create_report_comments_table.php
@@ -0,0 +1,35 @@
+increments('id');
+ $table->bigInteger('report_id')->unsigned()->index();
+ $table->bigInteger('profile_id')->unsigned();
+ $table->bigInteger('user_id')->unsigned();
+ $table->text('comment');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('report_comments');
+ }
+}
diff --git a/database/migrations/2018_06_22_062628_create_report_logs_table.php b/database/migrations/2018_06_22_062628_create_report_logs_table.php
new file mode 100644
index 00000000..74551aed
--- /dev/null
+++ b/database/migrations/2018_06_22_062628_create_report_logs_table.php
@@ -0,0 +1,37 @@
+increments('id');
+ $table->bigInteger('profile_id')->unsigned();
+ $table->bigInteger('item_id')->unsigned()->nullable();
+ $table->string('item_type')->nullable();
+ $table->string('action')->nullable();
+ $table->boolean('system_message')->default(false);
+ $table->json('metadata')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('report_logs');
+ }
+}
diff --git a/database/migrations/2018_07_05_010303_create_account_logs_table.php b/database/migrations/2018_07_05_010303_create_account_logs_table.php
new file mode 100644
index 00000000..1d200733
--- /dev/null
+++ b/database/migrations/2018_07_05_010303_create_account_logs_table.php
@@ -0,0 +1,40 @@
+bigIncrements('id');
+ $table->bigInteger('user_id')->unsigned()->index();
+ $table->bigInteger('item_id')->unsigned()->nullable();
+ $table->string('item_type')->nullable();
+ $table->string('action')->nullable();
+ $table->string('message')->nullable();
+ $table->string('link')->nullable();
+ $table->string('ip_address')->nullable();
+ $table->string('user_agent')->nullable();
+ $table->json('metadata')->nullable();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('account_logs');
+ }
+}
diff --git a/database/migrations/2018_07_12_054015_create_user_settings_table.php b/database/migrations/2018_07_12_054015_create_user_settings_table.php
new file mode 100644
index 00000000..21d67200
--- /dev/null
+++ b/database/migrations/2018_07_12_054015_create_user_settings_table.php
@@ -0,0 +1,50 @@
+bigIncrements('id');
+ $table->bigInteger('user_id')->unsigned()->unique();
+ $table->string('role')->default('user');
+ $table->boolean('crawlable')->default(true);
+ $table->boolean('show_guests')->default(true);
+ $table->boolean('show_discover')->default(true);
+ $table->boolean('public_dm')->default(false);
+ $table->boolean('hide_cw_search')->default(true);
+ $table->boolean('hide_blocked_search')->default(true);
+ $table->boolean('always_show_cw')->default(false);
+ $table->boolean('compose_media_descriptions')->default(false);
+ $table->boolean('reduce_motion')->default(false);
+ $table->boolean('optimize_screen_reader')->default(false);
+ $table->boolean('high_contrast_mode')->default(false);
+ $table->boolean('video_autoplay')->default(false);
+ $table->boolean('send_email_new_follower')->default(false);
+ $table->boolean('send_email_new_follower_request')->default(true);
+ $table->boolean('send_email_on_share')->default(false);
+ $table->boolean('send_email_on_like')->default(false);
+ $table->boolean('send_email_on_mention')->default(false);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('user_settings');
+ }
+}
diff --git a/database/migrations/2018_07_15_011916_add_2fa_to_users_table.php b/database/migrations/2018_07_15_011916_add_2fa_to_users_table.php
new file mode 100644
index 00000000..ad77b5c6
--- /dev/null
+++ b/database/migrations/2018_07_15_011916_add_2fa_to_users_table.php
@@ -0,0 +1,38 @@
+boolean('2fa_enabled')->default(false);
+ $table->string('2fa_secret')->nullable();
+ $table->json('2fa_backup_codes')->nullable();
+ $table->timestamp('2fa_setup_at')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropColumn('2fa_enabled');
+ $table->dropColumn('2fa_secret');
+ $table->dropColumn('2fa_backup_codes');
+ $table->dropColumn('2fa_setup_at');
+ });
+ }
+}
diff --git a/database/migrations/2018_07_15_013106_create_user_filters_table.php b/database/migrations/2018_07_15_013106_create_user_filters_table.php
new file mode 100644
index 00000000..ef13bc98
--- /dev/null
+++ b/database/migrations/2018_07_15_013106_create_user_filters_table.php
@@ -0,0 +1,41 @@
+bigIncrements('id');
+ $table->bigInteger('user_id')->unsigned()->index();
+ $table->bigInteger('filterable_id')->unsigned();
+ $table->string('filterable_type');
+ $table->string('filter_type')->default('block')->index();
+ $table->unique([
+ 'user_id',
+ 'filterable_id',
+ 'filterable_type',
+ 'filter_type'
+ ], 'filter_unique');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('user_filters');
+ }
+}
diff --git a/database/migrations/2018_08_12_042648_update_status_table_change_caption_to_text.php b/database/migrations/2018_08_12_042648_update_status_table_change_caption_to_text.php
new file mode 100644
index 00000000..caad9472
--- /dev/null
+++ b/database/migrations/2018_08_12_042648_update_status_table_change_caption_to_text.php
@@ -0,0 +1,38 @@
+getDatabasePlatform()
+ ->registerDoctrineTypeMapping('enum', 'string');
+ }
+
+ /**
+ * Run the migrations.
+ *
+ * @return void
+ */
+ public function up()
+ {
+ Schema::table('statuses', function ($table) {
+ $table->text('caption')->change();
+ $table->text('rendered')->change();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ //
+ }
+}
diff --git a/database/migrations/2018_08_22_022306_update_settings_table.php b/database/migrations/2018_08_22_022306_update_settings_table.php
new file mode 100644
index 00000000..50061290
--- /dev/null
+++ b/database/migrations/2018_08_22_022306_update_settings_table.php
@@ -0,0 +1,36 @@
+boolean('show_profile_followers')->default(true);
+ $table->boolean('show_profile_follower_count')->default(true);
+ $table->boolean('show_profile_following')->default(true);
+ $table->boolean('show_profile_following_count')->default(true);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ $table->dropColumn('show_profile_followers');
+ $table->dropColumn('show_profile_follower_count');
+ $table->dropColumn('show_profile_following');
+ $table->dropColumn('show_profile_following_count');
+ }
+}
diff --git a/docker-compose.yml b/docker-compose.yml
index 8e9ccd4c..861dc0b9 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -46,7 +46,7 @@ services:
- "mysql-data:/var/lib/mysql"
redis:
- image: redis:alpine
+ image: redis:4-alpine
volumes:
- "redis-data:/data"
networks:
diff --git a/public/css/app.css b/public/css/app.css
index b91bdbc2..4114dad8 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -1,11 +1,13 @@
/*!
- * Font Awesome Pro 5.0.13 by @fontawesome - https://fontawesome.com
- * License - https://fontawesome.com/license (Commercial License)
- */.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\F26E"}.fa-accessible-icon:before{content:"\F368"}.fa-accusoft:before{content:"\F369"}.fa-address-book:before{content:"\F2B9"}.fa-address-card:before{content:"\F2BB"}.fa-adjust:before{content:"\F042"}.fa-adn:before{content:"\F170"}.fa-adversal:before{content:"\F36A"}.fa-affiliatetheme:before{content:"\F36B"}.fa-alarm-clock:before{content:"\F34E"}.fa-algolia:before{content:"\F36C"}.fa-align-center:before{content:"\F037"}.fa-align-justify:before{content:"\F039"}.fa-align-left:before{content:"\F036"}.fa-align-right:before{content:"\F038"}.fa-allergies:before{content:"\F461"}.fa-amazon:before{content:"\F270"}.fa-amazon-pay:before{content:"\F42C"}.fa-ambulance:before{content:"\F0F9"}.fa-american-sign-language-interpreting:before{content:"\F2A3"}.fa-amilia:before{content:"\F36D"}.fa-anchor:before{content:"\F13D"}.fa-android:before{content:"\F17B"}.fa-angellist:before{content:"\F209"}.fa-angle-double-down:before{content:"\F103"}.fa-angle-double-left:before{content:"\F100"}.fa-angle-double-right:before{content:"\F101"}.fa-angle-double-up:before{content:"\F102"}.fa-angle-down:before{content:"\F107"}.fa-angle-left:before{content:"\F104"}.fa-angle-right:before{content:"\F105"}.fa-angle-up:before{content:"\F106"}.fa-angrycreative:before{content:"\F36E"}.fa-angular:before{content:"\F420"}.fa-app-store:before{content:"\F36F"}.fa-app-store-ios:before{content:"\F370"}.fa-apper:before{content:"\F371"}.fa-apple:before{content:"\F179"}.fa-apple-pay:before{content:"\F415"}.fa-archive:before{content:"\F187"}.fa-arrow-alt-circle-down:before{content:"\F358"}.fa-arrow-alt-circle-left:before{content:"\F359"}.fa-arrow-alt-circle-right:before{content:"\F35A"}.fa-arrow-alt-circle-up:before{content:"\F35B"}.fa-arrow-alt-down:before{content:"\F354"}.fa-arrow-alt-from-bottom:before{content:"\F346"}.fa-arrow-alt-from-left:before{content:"\F347"}.fa-arrow-alt-from-right:before{content:"\F348"}.fa-arrow-alt-from-top:before{content:"\F349"}.fa-arrow-alt-left:before{content:"\F355"}.fa-arrow-alt-right:before{content:"\F356"}.fa-arrow-alt-square-down:before{content:"\F350"}.fa-arrow-alt-square-left:before{content:"\F351"}.fa-arrow-alt-square-right:before{content:"\F352"}.fa-arrow-alt-square-up:before{content:"\F353"}.fa-arrow-alt-to-bottom:before{content:"\F34A"}.fa-arrow-alt-to-left:before{content:"\F34B"}.fa-arrow-alt-to-right:before{content:"\F34C"}.fa-arrow-alt-to-top:before{content:"\F34D"}.fa-arrow-alt-up:before{content:"\F357"}.fa-arrow-circle-down:before{content:"\F0AB"}.fa-arrow-circle-left:before{content:"\F0A8"}.fa-arrow-circle-right:before{content:"\F0A9"}.fa-arrow-circle-up:before{content:"\F0AA"}.fa-arrow-down:before{content:"\F063"}.fa-arrow-from-bottom:before{content:"\F342"}.fa-arrow-from-left:before{content:"\F343"}.fa-arrow-from-right:before{content:"\F344"}.fa-arrow-from-top:before{content:"\F345"}.fa-arrow-left:before{content:"\F060"}.fa-arrow-right:before{content:"\F061"}.fa-arrow-square-down:before{content:"\F339"}.fa-arrow-square-left:before{content:"\F33A"}.fa-arrow-square-right:before{content:"\F33B"}.fa-arrow-square-up:before{content:"\F33C"}.fa-arrow-to-bottom:before{content:"\F33D"}.fa-arrow-to-left:before{content:"\F33E"}.fa-arrow-to-right:before{content:"\F340"}.fa-arrow-to-top:before{content:"\F341"}.fa-arrow-up:before{content:"\F062"}.fa-arrows:before{content:"\F047"}.fa-arrows-alt:before{content:"\F0B2"}.fa-arrows-alt-h:before{content:"\F337"}.fa-arrows-alt-v:before{content:"\F338"}.fa-arrows-h:before{content:"\F07E"}.fa-arrows-v:before{content:"\F07D"}.fa-assistive-listening-systems:before{content:"\F2A2"}.fa-asterisk:before{content:"\F069"}.fa-asymmetrik:before{content:"\F372"}.fa-at:before{content:"\F1FA"}.fa-audible:before{content:"\F373"}.fa-audio-description:before{content:"\F29E"}.fa-autoprefixer:before{content:"\F41C"}.fa-avianex:before{content:"\F374"}.fa-aviato:before{content:"\F421"}.fa-aws:before{content:"\F375"}.fa-backward:before{content:"\F04A"}.fa-badge:before{content:"\F335"}.fa-badge-check:before{content:"\F336"}.fa-balance-scale:before{content:"\F24E"}.fa-balance-scale-left:before{content:"\F515"}.fa-balance-scale-right:before{content:"\F516"}.fa-ban:before{content:"\F05E"}.fa-band-aid:before{content:"\F462"}.fa-bandcamp:before{content:"\F2D5"}.fa-barcode:before{content:"\F02A"}.fa-barcode-alt:before{content:"\F463"}.fa-barcode-read:before{content:"\F464"}.fa-barcode-scan:before{content:"\F465"}.fa-bars:before{content:"\F0C9"}.fa-baseball:before{content:"\F432"}.fa-baseball-ball:before{content:"\F433"}.fa-basketball-ball:before{content:"\F434"}.fa-basketball-hoop:before{content:"\F435"}.fa-bath:before{content:"\F2CD"}.fa-battery-bolt:before{content:"\F376"}.fa-battery-empty:before{content:"\F244"}.fa-battery-full:before{content:"\F240"}.fa-battery-half:before{content:"\F242"}.fa-battery-quarter:before{content:"\F243"}.fa-battery-slash:before{content:"\F377"}.fa-battery-three-quarters:before{content:"\F241"}.fa-bed:before{content:"\F236"}.fa-beer:before{content:"\F0FC"}.fa-behance:before{content:"\F1B4"}.fa-behance-square:before{content:"\F1B5"}.fa-bell:before{content:"\F0F3"}.fa-bell-slash:before{content:"\F1F6"}.fa-bicycle:before{content:"\F206"}.fa-bimobject:before{content:"\F378"}.fa-binoculars:before{content:"\F1E5"}.fa-birthday-cake:before{content:"\F1FD"}.fa-bitbucket:before{content:"\F171"}.fa-bitcoin:before{content:"\F379"}.fa-bity:before{content:"\F37A"}.fa-black-tie:before{content:"\F27E"}.fa-blackberry:before{content:"\F37B"}.fa-blanket:before{content:"\F498"}.fa-blender:before{content:"\F517"}.fa-blind:before{content:"\F29D"}.fa-blogger:before{content:"\F37C"}.fa-blogger-b:before{content:"\F37D"}.fa-bluetooth:before{content:"\F293"}.fa-bluetooth-b:before{content:"\F294"}.fa-bold:before{content:"\F032"}.fa-bolt:before{content:"\F0E7"}.fa-bomb:before{content:"\F1E2"}.fa-book:before{content:"\F02D"}.fa-book-heart:before{content:"\F499"}.fa-book-open:before{content:"\F518"}.fa-bookmark:before{content:"\F02E"}.fa-bowling-ball:before{content:"\F436"}.fa-bowling-pins:before{content:"\F437"}.fa-box:before{content:"\F466"}.fa-box-alt:before{content:"\F49A"}.fa-box-check:before{content:"\F467"}.fa-box-fragile:before{content:"\F49B"}.fa-box-full:before{content:"\F49C"}.fa-box-heart:before{content:"\F49D"}.fa-box-open:before{content:"\F49E"}.fa-box-up:before{content:"\F49F"}.fa-box-usd:before{content:"\F4A0"}.fa-boxes:before{content:"\F468"}.fa-boxes-alt:before{content:"\F4A1"}.fa-boxing-glove:before{content:"\F438"}.fa-braille:before{content:"\F2A1"}.fa-briefcase:before{content:"\F0B1"}.fa-briefcase-medical:before{content:"\F469"}.fa-broadcast-tower:before{content:"\F519"}.fa-broom:before{content:"\F51A"}.fa-browser:before{content:"\F37E"}.fa-btc:before{content:"\F15A"}.fa-bug:before{content:"\F188"}.fa-building:before{content:"\F1AD"}.fa-bullhorn:before{content:"\F0A1"}.fa-bullseye:before{content:"\F140"}.fa-burn:before{content:"\F46A"}.fa-buromobelexperte:before{content:"\F37F"}.fa-bus:before{content:"\F207"}.fa-buysellads:before{content:"\F20D"}.fa-calculator:before{content:"\F1EC"}.fa-calendar:before{content:"\F133"}.fa-calendar-alt:before{content:"\F073"}.fa-calendar-check:before{content:"\F274"}.fa-calendar-edit:before{content:"\F333"}.fa-calendar-exclamation:before{content:"\F334"}.fa-calendar-minus:before{content:"\F272"}.fa-calendar-plus:before{content:"\F271"}.fa-calendar-times:before{content:"\F273"}.fa-camera:before{content:"\F030"}.fa-camera-alt:before{content:"\F332"}.fa-camera-retro:before{content:"\F083"}.fa-capsules:before{content:"\F46B"}.fa-car:before{content:"\F1B9"}.fa-caret-circle-down:before{content:"\F32D"}.fa-caret-circle-left:before{content:"\F32E"}.fa-caret-circle-right:before{content:"\F330"}.fa-caret-circle-up:before{content:"\F331"}.fa-caret-down:before{content:"\F0D7"}.fa-caret-left:before{content:"\F0D9"}.fa-caret-right:before{content:"\F0DA"}.fa-caret-square-down:before{content:"\F150"}.fa-caret-square-left:before{content:"\F191"}.fa-caret-square-right:before{content:"\F152"}.fa-caret-square-up:before{content:"\F151"}.fa-caret-up:before{content:"\F0D8"}.fa-cart-arrow-down:before{content:"\F218"}.fa-cart-plus:before{content:"\F217"}.fa-cc-amazon-pay:before{content:"\F42D"}.fa-cc-amex:before{content:"\F1F3"}.fa-cc-apple-pay:before{content:"\F416"}.fa-cc-diners-club:before{content:"\F24C"}.fa-cc-discover:before{content:"\F1F2"}.fa-cc-jcb:before{content:"\F24B"}.fa-cc-mastercard:before{content:"\F1F1"}.fa-cc-paypal:before{content:"\F1F4"}.fa-cc-stripe:before{content:"\F1F5"}.fa-cc-visa:before{content:"\F1F0"}.fa-centercode:before{content:"\F380"}.fa-certificate:before{content:"\F0A3"}.fa-chalkboard:before{content:"\F51B"}.fa-chalkboard-teacher:before{content:"\F51C"}.fa-chart-area:before{content:"\F1FE"}.fa-chart-bar:before{content:"\F080"}.fa-chart-line:before{content:"\F201"}.fa-chart-pie:before{content:"\F200"}.fa-check:before{content:"\F00C"}.fa-check-circle:before{content:"\F058"}.fa-check-square:before{content:"\F14A"}.fa-chess:before{content:"\F439"}.fa-chess-bishop:before{content:"\F43A"}.fa-chess-bishop-alt:before{content:"\F43B"}.fa-chess-board:before{content:"\F43C"}.fa-chess-clock:before{content:"\F43D"}.fa-chess-clock-alt:before{content:"\F43E"}.fa-chess-king:before{content:"\F43F"}.fa-chess-king-alt:before{content:"\F440"}.fa-chess-knight:before{content:"\F441"}.fa-chess-knight-alt:before{content:"\F442"}.fa-chess-pawn:before{content:"\F443"}.fa-chess-pawn-alt:before{content:"\F444"}.fa-chess-queen:before{content:"\F445"}.fa-chess-queen-alt:before{content:"\F446"}.fa-chess-rook:before{content:"\F447"}.fa-chess-rook-alt:before{content:"\F448"}.fa-chevron-circle-down:before{content:"\F13A"}.fa-chevron-circle-left:before{content:"\F137"}.fa-chevron-circle-right:before{content:"\F138"}.fa-chevron-circle-up:before{content:"\F139"}.fa-chevron-double-down:before{content:"\F322"}.fa-chevron-double-left:before{content:"\F323"}.fa-chevron-double-right:before{content:"\F324"}.fa-chevron-double-up:before{content:"\F325"}.fa-chevron-down:before{content:"\F078"}.fa-chevron-left:before{content:"\F053"}.fa-chevron-right:before{content:"\F054"}.fa-chevron-square-down:before{content:"\F329"}.fa-chevron-square-left:before{content:"\F32A"}.fa-chevron-square-right:before{content:"\F32B"}.fa-chevron-square-up:before{content:"\F32C"}.fa-chevron-up:before{content:"\F077"}.fa-child:before{content:"\F1AE"}.fa-chrome:before{content:"\F268"}.fa-church:before{content:"\F51D"}.fa-circle:before{content:"\F111"}.fa-circle-notch:before{content:"\F1CE"}.fa-clipboard:before{content:"\F328"}.fa-clipboard-check:before{content:"\F46C"}.fa-clipboard-list:before{content:"\F46D"}.fa-clock:before{content:"\F017"}.fa-clone:before{content:"\F24D"}.fa-closed-captioning:before{content:"\F20A"}.fa-cloud:before{content:"\F0C2"}.fa-cloud-download:before{content:"\F0ED"}.fa-cloud-download-alt:before{content:"\F381"}.fa-cloud-upload:before{content:"\F0EE"}.fa-cloud-upload-alt:before{content:"\F382"}.fa-cloudscale:before{content:"\F383"}.fa-cloudsmith:before{content:"\F384"}.fa-cloudversify:before{content:"\F385"}.fa-club:before{content:"\F327"}.fa-code:before{content:"\F121"}.fa-code-branch:before{content:"\F126"}.fa-code-commit:before{content:"\F386"}.fa-code-merge:before{content:"\F387"}.fa-codepen:before{content:"\F1CB"}.fa-codiepie:before{content:"\F284"}.fa-coffee:before{content:"\F0F4"}.fa-cog:before{content:"\F013"}.fa-cogs:before{content:"\F085"}.fa-coins:before{content:"\F51E"}.fa-columns:before{content:"\F0DB"}.fa-comment:before{content:"\F075"}.fa-comment-alt:before{content:"\F27A"}.fa-comment-alt-check:before{content:"\F4A2"}.fa-comment-alt-dots:before{content:"\F4A3"}.fa-comment-alt-edit:before{content:"\F4A4"}.fa-comment-alt-exclamation:before{content:"\F4A5"}.fa-comment-alt-lines:before{content:"\F4A6"}.fa-comment-alt-minus:before{content:"\F4A7"}.fa-comment-alt-plus:before{content:"\F4A8"}.fa-comment-alt-slash:before{content:"\F4A9"}.fa-comment-alt-smile:before{content:"\F4AA"}.fa-comment-alt-times:before{content:"\F4AB"}.fa-comment-check:before{content:"\F4AC"}.fa-comment-dots:before{content:"\F4AD"}.fa-comment-edit:before{content:"\F4AE"}.fa-comment-exclamation:before{content:"\F4AF"}.fa-comment-lines:before{content:"\F4B0"}.fa-comment-minus:before{content:"\F4B1"}.fa-comment-plus:before{content:"\F4B2"}.fa-comment-slash:before{content:"\F4B3"}.fa-comment-smile:before{content:"\F4B4"}.fa-comment-times:before{content:"\F4B5"}.fa-comments:before{content:"\F086"}.fa-comments-alt:before{content:"\F4B6"}.fa-compact-disc:before{content:"\F51F"}.fa-compass:before{content:"\F14E"}.fa-compress:before{content:"\F066"}.fa-compress-alt:before{content:"\F422"}.fa-compress-wide:before{content:"\F326"}.fa-connectdevelop:before{content:"\F20E"}.fa-container-storage:before{content:"\F4B7"}.fa-contao:before{content:"\F26D"}.fa-conveyor-belt:before{content:"\F46E"}.fa-conveyor-belt-alt:before{content:"\F46F"}.fa-copy:before{content:"\F0C5"}.fa-copyright:before{content:"\F1F9"}.fa-couch:before{content:"\F4B8"}.fa-cpanel:before{content:"\F388"}.fa-creative-commons:before{content:"\F25E"}.fa-creative-commons-by:before{content:"\F4E7"}.fa-creative-commons-nc:before{content:"\F4E8"}.fa-creative-commons-nc-eu:before{content:"\F4E9"}.fa-creative-commons-nc-jp:before{content:"\F4EA"}.fa-creative-commons-nd:before{content:"\F4EB"}.fa-creative-commons-pd:before{content:"\F4EC"}.fa-creative-commons-pd-alt:before{content:"\F4ED"}.fa-creative-commons-remix:before{content:"\F4EE"}.fa-creative-commons-sa:before{content:"\F4EF"}.fa-creative-commons-sampling:before{content:"\F4F0"}.fa-creative-commons-sampling-plus:before{content:"\F4F1"}.fa-creative-commons-share:before{content:"\F4F2"}.fa-creative-commons-zero:before{content:"\F4F3"}.fa-credit-card:before{content:"\F09D"}.fa-credit-card-blank:before{content:"\F389"}.fa-credit-card-front:before{content:"\F38A"}.fa-cricket:before{content:"\F449"}.fa-crop:before{content:"\F125"}.fa-crosshairs:before{content:"\F05B"}.fa-crow:before{content:"\F520"}.fa-crown:before{content:"\F521"}.fa-css3:before{content:"\F13C"}.fa-css3-alt:before{content:"\F38B"}.fa-cube:before{content:"\F1B2"}.fa-cubes:before{content:"\F1B3"}.fa-curling:before{content:"\F44A"}.fa-cut:before{content:"\F0C4"}.fa-cuttlefish:before{content:"\F38C"}.fa-d-and-d:before{content:"\F38D"}.fa-dashcube:before{content:"\F210"}.fa-database:before{content:"\F1C0"}.fa-deaf:before{content:"\F2A4"}.fa-delicious:before{content:"\F1A5"}.fa-deploydog:before{content:"\F38E"}.fa-deskpro:before{content:"\F38F"}.fa-desktop:before{content:"\F108"}.fa-desktop-alt:before{content:"\F390"}.fa-deviantart:before{content:"\F1BD"}.fa-diagnoses:before{content:"\F470"}.fa-diamond:before{content:"\F219"}.fa-dice:before{content:"\F522"}.fa-dice-five:before{content:"\F523"}.fa-dice-four:before{content:"\F524"}.fa-dice-one:before{content:"\F525"}.fa-dice-six:before{content:"\F526"}.fa-dice-three:before{content:"\F527"}.fa-dice-two:before{content:"\F528"}.fa-digg:before{content:"\F1A6"}.fa-digital-ocean:before{content:"\F391"}.fa-discord:before{content:"\F392"}.fa-discourse:before{content:"\F393"}.fa-divide:before{content:"\F529"}.fa-dna:before{content:"\F471"}.fa-dochub:before{content:"\F394"}.fa-docker:before{content:"\F395"}.fa-dollar-sign:before{content:"\F155"}.fa-dolly:before{content:"\F472"}.fa-dolly-empty:before{content:"\F473"}.fa-dolly-flatbed:before{content:"\F474"}.fa-dolly-flatbed-alt:before{content:"\F475"}.fa-dolly-flatbed-empty:before{content:"\F476"}.fa-donate:before{content:"\F4B9"}.fa-door-closed:before{content:"\F52A"}.fa-door-open:before{content:"\F52B"}.fa-dot-circle:before{content:"\F192"}.fa-dove:before{content:"\F4BA"}.fa-download:before{content:"\F019"}.fa-draft2digital:before{content:"\F396"}.fa-dribbble:before{content:"\F17D"}.fa-dribbble-square:before{content:"\F397"}.fa-dropbox:before{content:"\F16B"}.fa-drupal:before{content:"\F1A9"}.fa-dumbbell:before{content:"\F44B"}.fa-dyalog:before{content:"\F399"}.fa-earlybirds:before{content:"\F39A"}.fa-ebay:before{content:"\F4F4"}.fa-edge:before{content:"\F282"}.fa-edit:before{content:"\F044"}.fa-eject:before{content:"\F052"}.fa-elementor:before{content:"\F430"}.fa-ellipsis-h:before{content:"\F141"}.fa-ellipsis-h-alt:before{content:"\F39B"}.fa-ellipsis-v:before{content:"\F142"}.fa-ellipsis-v-alt:before{content:"\F39C"}.fa-ember:before{content:"\F423"}.fa-empire:before{content:"\F1D1"}.fa-envelope:before{content:"\F0E0"}.fa-envelope-open:before{content:"\F2B6"}.fa-envelope-square:before{content:"\F199"}.fa-envira:before{content:"\F299"}.fa-equals:before{content:"\F52C"}.fa-eraser:before{content:"\F12D"}.fa-erlang:before{content:"\F39D"}.fa-ethereum:before{content:"\F42E"}.fa-etsy:before{content:"\F2D7"}.fa-euro-sign:before{content:"\F153"}.fa-exchange:before{content:"\F0EC"}.fa-exchange-alt:before{content:"\F362"}.fa-exclamation:before{content:"\F12A"}.fa-exclamation-circle:before{content:"\F06A"}.fa-exclamation-square:before{content:"\F321"}.fa-exclamation-triangle:before{content:"\F071"}.fa-expand:before{content:"\F065"}.fa-expand-alt:before{content:"\F424"}.fa-expand-arrows:before{content:"\F31D"}.fa-expand-arrows-alt:before{content:"\F31E"}.fa-expand-wide:before{content:"\F320"}.fa-expeditedssl:before{content:"\F23E"}.fa-external-link:before{content:"\F08E"}.fa-external-link-alt:before{content:"\F35D"}.fa-external-link-square:before{content:"\F14C"}.fa-external-link-square-alt:before{content:"\F360"}.fa-eye:before{content:"\F06E"}.fa-eye-dropper:before{content:"\F1FB"}.fa-eye-slash:before{content:"\F070"}.fa-facebook:before{content:"\F09A"}.fa-facebook-f:before{content:"\F39E"}.fa-facebook-messenger:before{content:"\F39F"}.fa-facebook-square:before{content:"\F082"}.fa-fast-backward:before{content:"\F049"}.fa-fast-forward:before{content:"\F050"}.fa-fax:before{content:"\F1AC"}.fa-feather:before{content:"\F52D"}.fa-female:before{content:"\F182"}.fa-field-hockey:before{content:"\F44C"}.fa-fighter-jet:before{content:"\F0FB"}.fa-file:before{content:"\F15B"}.fa-file-alt:before{content:"\F15C"}.fa-file-archive:before{content:"\F1C6"}.fa-file-audio:before{content:"\F1C7"}.fa-file-check:before{content:"\F316"}.fa-file-code:before{content:"\F1C9"}.fa-file-edit:before{content:"\F31C"}.fa-file-excel:before{content:"\F1C3"}.fa-file-exclamation:before{content:"\F31A"}.fa-file-image:before{content:"\F1C5"}.fa-file-medical:before{content:"\F477"}.fa-file-medical-alt:before{content:"\F478"}.fa-file-minus:before{content:"\F318"}.fa-file-pdf:before{content:"\F1C1"}.fa-file-plus:before{content:"\F319"}.fa-file-powerpoint:before{content:"\F1C4"}.fa-file-times:before{content:"\F317"}.fa-file-video:before{content:"\F1C8"}.fa-file-word:before{content:"\F1C2"}.fa-film:before{content:"\F008"}.fa-film-alt:before{content:"\F3A0"}.fa-filter:before{content:"\F0B0"}.fa-fire:before{content:"\F06D"}.fa-fire-extinguisher:before{content:"\F134"}.fa-firefox:before{content:"\F269"}.fa-first-aid:before{content:"\F479"}.fa-first-order:before{content:"\F2B0"}.fa-first-order-alt:before{content:"\F50A"}.fa-firstdraft:before{content:"\F3A1"}.fa-flag:before{content:"\F024"}.fa-flag-checkered:before{content:"\F11E"}.fa-flask:before{content:"\F0C3"}.fa-flickr:before{content:"\F16E"}.fa-flipboard:before{content:"\F44D"}.fa-fly:before{content:"\F417"}.fa-folder:before{content:"\F07B"}.fa-folder-open:before{content:"\F07C"}.fa-font:before{content:"\F031"}.fa-font-awesome:before{content:"\F2B4"}.fa-font-awesome-alt:before{content:"\F35C"}.fa-font-awesome-flag:before{content:"\F425"}.fa-font-awesome-logo-full:before{content:"\F4E6"}.fa-fonticons:before{content:"\F280"}.fa-fonticons-fi:before{content:"\F3A2"}.fa-football-ball:before{content:"\F44E"}.fa-football-helmet:before{content:"\F44F"}.fa-forklift:before{content:"\F47A"}.fa-fort-awesome:before{content:"\F286"}.fa-fort-awesome-alt:before{content:"\F3A3"}.fa-forumbee:before{content:"\F211"}.fa-forward:before{content:"\F04E"}.fa-foursquare:before{content:"\F180"}.fa-fragile:before{content:"\F4BB"}.fa-free-code-camp:before{content:"\F2C5"}.fa-freebsd:before{content:"\F3A4"}.fa-frog:before{content:"\F52E"}.fa-frown:before{content:"\F119"}.fa-fulcrum:before{content:"\F50B"}.fa-futbol:before{content:"\F1E3"}.fa-galactic-republic:before{content:"\F50C"}.fa-galactic-senate:before{content:"\F50D"}.fa-gamepad:before{content:"\F11B"}.fa-gas-pump:before{content:"\F52F"}.fa-gavel:before{content:"\F0E3"}.fa-gem:before{content:"\F3A5"}.fa-genderless:before{content:"\F22D"}.fa-get-pocket:before{content:"\F265"}.fa-gg:before{content:"\F260"}.fa-gg-circle:before{content:"\F261"}.fa-gift:before{content:"\F06B"}.fa-git:before{content:"\F1D3"}.fa-git-square:before{content:"\F1D2"}.fa-github:before{content:"\F09B"}.fa-github-alt:before{content:"\F113"}.fa-github-square:before{content:"\F092"}.fa-gitkraken:before{content:"\F3A6"}.fa-gitlab:before{content:"\F296"}.fa-gitter:before{content:"\F426"}.fa-glass-martini:before{content:"\F000"}.fa-glasses:before{content:"\F530"}.fa-glide:before{content:"\F2A5"}.fa-glide-g:before{content:"\F2A6"}.fa-globe:before{content:"\F0AC"}.fa-gofore:before{content:"\F3A7"}.fa-golf-ball:before{content:"\F450"}.fa-golf-club:before{content:"\F451"}.fa-goodreads:before{content:"\F3A8"}.fa-goodreads-g:before{content:"\F3A9"}.fa-google:before{content:"\F1A0"}.fa-google-drive:before{content:"\F3AA"}.fa-google-play:before{content:"\F3AB"}.fa-google-plus:before{content:"\F2B3"}.fa-google-plus-g:before{content:"\F0D5"}.fa-google-plus-square:before{content:"\F0D4"}.fa-google-wallet:before{content:"\F1EE"}.fa-graduation-cap:before{content:"\F19D"}.fa-gratipay:before{content:"\F184"}.fa-grav:before{content:"\F2D6"}.fa-greater-than:before{content:"\F531"}.fa-greater-than-equal:before{content:"\F532"}.fa-gripfire:before{content:"\F3AC"}.fa-grunt:before{content:"\F3AD"}.fa-gulp:before{content:"\F3AE"}.fa-h-square:before{content:"\F0FD"}.fa-h1:before{content:"\F313"}.fa-h2:before{content:"\F314"}.fa-h3:before{content:"\F315"}.fa-hacker-news:before{content:"\F1D4"}.fa-hacker-news-square:before{content:"\F3AF"}.fa-hand-heart:before{content:"\F4BC"}.fa-hand-holding:before{content:"\F4BD"}.fa-hand-holding-box:before{content:"\F47B"}.fa-hand-holding-heart:before{content:"\F4BE"}.fa-hand-holding-seedling:before{content:"\F4BF"}.fa-hand-holding-usd:before{content:"\F4C0"}.fa-hand-holding-water:before{content:"\F4C1"}.fa-hand-lizard:before{content:"\F258"}.fa-hand-paper:before{content:"\F256"}.fa-hand-peace:before{content:"\F25B"}.fa-hand-point-down:before{content:"\F0A7"}.fa-hand-point-left:before{content:"\F0A5"}.fa-hand-point-right:before{content:"\F0A4"}.fa-hand-point-up:before{content:"\F0A6"}.fa-hand-pointer:before{content:"\F25A"}.fa-hand-receiving:before{content:"\F47C"}.fa-hand-rock:before{content:"\F255"}.fa-hand-scissors:before{content:"\F257"}.fa-hand-spock:before{content:"\F259"}.fa-hands:before{content:"\F4C2"}.fa-hands-heart:before{content:"\F4C3"}.fa-hands-helping:before{content:"\F4C4"}.fa-hands-usd:before{content:"\F4C5"}.fa-handshake:before{content:"\F2B5"}.fa-handshake-alt:before{content:"\F4C6"}.fa-hashtag:before{content:"\F292"}.fa-hdd:before{content:"\F0A0"}.fa-heading:before{content:"\F1DC"}.fa-headphones:before{content:"\F025"}.fa-heart:before{content:"\F004"}.fa-heart-circle:before{content:"\F4C7"}.fa-heart-square:before{content:"\F4C8"}.fa-heartbeat:before{content:"\F21E"}.fa-helicopter:before{content:"\F533"}.fa-hexagon:before{content:"\F312"}.fa-hips:before{content:"\F452"}.fa-hire-a-helper:before{content:"\F3B0"}.fa-history:before{content:"\F1DA"}.fa-hockey-puck:before{content:"\F453"}.fa-hockey-sticks:before{content:"\F454"}.fa-home:before{content:"\F015"}.fa-home-heart:before{content:"\F4C9"}.fa-hooli:before{content:"\F427"}.fa-hospital:before{content:"\F0F8"}.fa-hospital-alt:before{content:"\F47D"}.fa-hospital-symbol:before{content:"\F47E"}.fa-hotjar:before{content:"\F3B1"}.fa-hourglass:before{content:"\F254"}.fa-hourglass-end:before{content:"\F253"}.fa-hourglass-half:before{content:"\F252"}.fa-hourglass-start:before{content:"\F251"}.fa-houzz:before{content:"\F27C"}.fa-html5:before{content:"\F13B"}.fa-hubspot:before{content:"\F3B2"}.fa-i-cursor:before{content:"\F246"}.fa-id-badge:before{content:"\F2C1"}.fa-id-card:before{content:"\F2C2"}.fa-id-card-alt:before{content:"\F47F"}.fa-image:before{content:"\F03E"}.fa-images:before{content:"\F302"}.fa-imdb:before{content:"\F2D8"}.fa-inbox:before{content:"\F01C"}.fa-inbox-in:before{content:"\F310"}.fa-inbox-out:before{content:"\F311"}.fa-indent:before{content:"\F03C"}.fa-industry:before{content:"\F275"}.fa-industry-alt:before{content:"\F3B3"}.fa-infinity:before{content:"\F534"}.fa-info:before{content:"\F129"}.fa-info-circle:before{content:"\F05A"}.fa-info-square:before{content:"\F30F"}.fa-instagram:before{content:"\F16D"}.fa-internet-explorer:before{content:"\F26B"}.fa-inventory:before{content:"\F480"}.fa-ioxhost:before{content:"\F208"}.fa-italic:before{content:"\F033"}.fa-itunes:before{content:"\F3B4"}.fa-itunes-note:before{content:"\F3B5"}.fa-jack-o-lantern:before{content:"\F30E"}.fa-java:before{content:"\F4E4"}.fa-jedi-order:before{content:"\F50E"}.fa-jenkins:before{content:"\F3B6"}.fa-joget:before{content:"\F3B7"}.fa-joomla:before{content:"\F1AA"}.fa-js:before{content:"\F3B8"}.fa-js-square:before{content:"\F3B9"}.fa-jsfiddle:before{content:"\F1CC"}.fa-key:before{content:"\F084"}.fa-keybase:before{content:"\F4F5"}.fa-keyboard:before{content:"\F11C"}.fa-keycdn:before{content:"\F3BA"}.fa-kickstarter:before{content:"\F3BB"}.fa-kickstarter-k:before{content:"\F3BC"}.fa-kiwi-bird:before{content:"\F535"}.fa-korvue:before{content:"\F42F"}.fa-lamp:before{content:"\F4CA"}.fa-language:before{content:"\F1AB"}.fa-laptop:before{content:"\F109"}.fa-laravel:before{content:"\F3BD"}.fa-lastfm:before{content:"\F202"}.fa-lastfm-square:before{content:"\F203"}.fa-leaf:before{content:"\F06C"}.fa-leaf-heart:before{content:"\F4CB"}.fa-leanpub:before{content:"\F212"}.fa-lemon:before{content:"\F094"}.fa-less:before{content:"\F41D"}.fa-less-than:before{content:"\F536"}.fa-less-than-equal:before{content:"\F537"}.fa-level-down:before{content:"\F149"}.fa-level-down-alt:before{content:"\F3BE"}.fa-level-up:before{content:"\F148"}.fa-level-up-alt:before{content:"\F3BF"}.fa-life-ring:before{content:"\F1CD"}.fa-lightbulb:before{content:"\F0EB"}.fa-line:before{content:"\F3C0"}.fa-link:before{content:"\F0C1"}.fa-linkedin:before{content:"\F08C"}.fa-linkedin-in:before{content:"\F0E1"}.fa-linode:before{content:"\F2B8"}.fa-linux:before{content:"\F17C"}.fa-lira-sign:before{content:"\F195"}.fa-list:before{content:"\F03A"}.fa-list-alt:before{content:"\F022"}.fa-list-ol:before{content:"\F0CB"}.fa-list-ul:before{content:"\F0CA"}.fa-location-arrow:before{content:"\F124"}.fa-lock:before{content:"\F023"}.fa-lock-alt:before{content:"\F30D"}.fa-lock-open:before{content:"\F3C1"}.fa-lock-open-alt:before{content:"\F3C2"}.fa-long-arrow-alt-down:before{content:"\F309"}.fa-long-arrow-alt-left:before{content:"\F30A"}.fa-long-arrow-alt-right:before{content:"\F30B"}.fa-long-arrow-alt-up:before{content:"\F30C"}.fa-long-arrow-down:before{content:"\F175"}.fa-long-arrow-left:before{content:"\F177"}.fa-long-arrow-right:before{content:"\F178"}.fa-long-arrow-up:before{content:"\F176"}.fa-loveseat:before{content:"\F4CC"}.fa-low-vision:before{content:"\F2A8"}.fa-luchador:before{content:"\F455"}.fa-lyft:before{content:"\F3C3"}.fa-magento:before{content:"\F3C4"}.fa-magic:before{content:"\F0D0"}.fa-magnet:before{content:"\F076"}.fa-male:before{content:"\F183"}.fa-mandalorian:before{content:"\F50F"}.fa-map:before{content:"\F279"}.fa-map-marker:before{content:"\F041"}.fa-map-marker-alt:before{content:"\F3C5"}.fa-map-pin:before{content:"\F276"}.fa-map-signs:before{content:"\F277"}.fa-mars:before{content:"\F222"}.fa-mars-double:before{content:"\F227"}.fa-mars-stroke:before{content:"\F229"}.fa-mars-stroke-h:before{content:"\F22B"}.fa-mars-stroke-v:before{content:"\F22A"}.fa-mastodon:before{content:"\F4F6"}.fa-maxcdn:before{content:"\F136"}.fa-medapps:before{content:"\F3C6"}.fa-medium:before{content:"\F23A"}.fa-medium-m:before{content:"\F3C7"}.fa-medkit:before{content:"\F0FA"}.fa-medrt:before{content:"\F3C8"}.fa-meetup:before{content:"\F2E0"}.fa-meh:before{content:"\F11A"}.fa-memory:before{content:"\F538"}.fa-mercury:before{content:"\F223"}.fa-microchip:before{content:"\F2DB"}.fa-microphone:before{content:"\F130"}.fa-microphone-alt:before{content:"\F3C9"}.fa-microphone-alt-slash:before{content:"\F539"}.fa-microphone-slash:before{content:"\F131"}.fa-microsoft:before{content:"\F3CA"}.fa-minus:before{content:"\F068"}.fa-minus-circle:before{content:"\F056"}.fa-minus-hexagon:before{content:"\F307"}.fa-minus-octagon:before{content:"\F308"}.fa-minus-square:before{content:"\F146"}.fa-mix:before{content:"\F3CB"}.fa-mixcloud:before{content:"\F289"}.fa-mizuni:before{content:"\F3CC"}.fa-mobile:before{content:"\F10B"}.fa-mobile-alt:before{content:"\F3CD"}.fa-mobile-android:before{content:"\F3CE"}.fa-mobile-android-alt:before{content:"\F3CF"}.fa-modx:before{content:"\F285"}.fa-monero:before{content:"\F3D0"}.fa-money-bill:before{content:"\F0D6"}.fa-money-bill-alt:before{content:"\F3D1"}.fa-money-bill-wave:before{content:"\F53A"}.fa-money-bill-wave-alt:before{content:"\F53B"}.fa-money-check:before{content:"\F53C"}.fa-money-check-alt:before{content:"\F53D"}.fa-moon:before{content:"\F186"}.fa-motorcycle:before{content:"\F21C"}.fa-mouse-pointer:before{content:"\F245"}.fa-music:before{content:"\F001"}.fa-napster:before{content:"\F3D2"}.fa-neuter:before{content:"\F22C"}.fa-newspaper:before{content:"\F1EA"}.fa-nintendo-switch:before{content:"\F418"}.fa-node:before{content:"\F419"}.fa-node-js:before{content:"\F3D3"}.fa-not-equal:before{content:"\F53E"}.fa-notes-medical:before{content:"\F481"}.fa-npm:before{content:"\F3D4"}.fa-ns8:before{content:"\F3D5"}.fa-nutritionix:before{content:"\F3D6"}.fa-object-group:before{content:"\F247"}.fa-object-ungroup:before{content:"\F248"}.fa-octagon:before{content:"\F306"}.fa-odnoklassniki:before{content:"\F263"}.fa-odnoklassniki-square:before{content:"\F264"}.fa-old-republic:before{content:"\F510"}.fa-opencart:before{content:"\F23D"}.fa-openid:before{content:"\F19B"}.fa-opera:before{content:"\F26A"}.fa-optin-monster:before{content:"\F23C"}.fa-osi:before{content:"\F41A"}.fa-outdent:before{content:"\F03B"}.fa-page4:before{content:"\F3D7"}.fa-pagelines:before{content:"\F18C"}.fa-paint-brush:before{content:"\F1FC"}.fa-palette:before{content:"\F53F"}.fa-palfed:before{content:"\F3D8"}.fa-pallet:before{content:"\F482"}.fa-pallet-alt:before{content:"\F483"}.fa-paper-plane:before{content:"\F1D8"}.fa-paperclip:before{content:"\F0C6"}.fa-parachute-box:before{content:"\F4CD"}.fa-paragraph:before{content:"\F1DD"}.fa-parking:before{content:"\F540"}.fa-paste:before{content:"\F0EA"}.fa-patreon:before{content:"\F3D9"}.fa-pause:before{content:"\F04C"}.fa-pause-circle:before{content:"\F28B"}.fa-paw:before{content:"\F1B0"}.fa-paypal:before{content:"\F1ED"}.fa-pen:before{content:"\F304"}.fa-pen-alt:before{content:"\F305"}.fa-pen-square:before{content:"\F14B"}.fa-pencil:before{content:"\F040"}.fa-pencil-alt:before{content:"\F303"}.fa-pennant:before{content:"\F456"}.fa-people-carry:before{content:"\F4CE"}.fa-percent:before{content:"\F295"}.fa-percentage:before{content:"\F541"}.fa-periscope:before{content:"\F3DA"}.fa-person-carry:before{content:"\F4CF"}.fa-person-dolly:before{content:"\F4D0"}.fa-person-dolly-empty:before{content:"\F4D1"}.fa-phabricator:before{content:"\F3DB"}.fa-phoenix-framework:before{content:"\F3DC"}.fa-phoenix-squadron:before{content:"\F511"}.fa-phone:before{content:"\F095"}.fa-phone-plus:before{content:"\F4D2"}.fa-phone-slash:before{content:"\F3DD"}.fa-phone-square:before{content:"\F098"}.fa-phone-volume:before{content:"\F2A0"}.fa-php:before{content:"\F457"}.fa-pied-piper:before{content:"\F2AE"}.fa-pied-piper-alt:before{content:"\F1A8"}.fa-pied-piper-hat:before{content:"\F4E5"}.fa-pied-piper-pp:before{content:"\F1A7"}.fa-piggy-bank:before{content:"\F4D3"}.fa-pills:before{content:"\F484"}.fa-pinterest:before{content:"\F0D2"}.fa-pinterest-p:before{content:"\F231"}.fa-pinterest-square:before{content:"\F0D3"}.fa-plane:before{content:"\F072"}.fa-plane-alt:before{content:"\F3DE"}.fa-play:before{content:"\F04B"}.fa-play-circle:before{content:"\F144"}.fa-playstation:before{content:"\F3DF"}.fa-plug:before{content:"\F1E6"}.fa-plus:before{content:"\F067"}.fa-plus-circle:before{content:"\F055"}.fa-plus-hexagon:before{content:"\F300"}.fa-plus-octagon:before{content:"\F301"}.fa-plus-square:before{content:"\F0FE"}.fa-podcast:before{content:"\F2CE"}.fa-poo:before{content:"\F2FE"}.fa-portrait:before{content:"\F3E0"}.fa-pound-sign:before{content:"\F154"}.fa-power-off:before{content:"\F011"}.fa-prescription-bottle:before{content:"\F485"}.fa-prescription-bottle-alt:before{content:"\F486"}.fa-print:before{content:"\F02F"}.fa-procedures:before{content:"\F487"}.fa-product-hunt:before{content:"\F288"}.fa-project-diagram:before{content:"\F542"}.fa-pushed:before{content:"\F3E1"}.fa-puzzle-piece:before{content:"\F12E"}.fa-python:before{content:"\F3E2"}.fa-qq:before{content:"\F1D6"}.fa-qrcode:before{content:"\F029"}.fa-question:before{content:"\F128"}.fa-question-circle:before{content:"\F059"}.fa-question-square:before{content:"\F2FD"}.fa-quidditch:before{content:"\F458"}.fa-quinscape:before{content:"\F459"}.fa-quora:before{content:"\F2C4"}.fa-quote-left:before{content:"\F10D"}.fa-quote-right:before{content:"\F10E"}.fa-r-project:before{content:"\F4F7"}.fa-racquet:before{content:"\F45A"}.fa-ramp-loading:before{content:"\F4D4"}.fa-random:before{content:"\F074"}.fa-ravelry:before{content:"\F2D9"}.fa-react:before{content:"\F41B"}.fa-readme:before{content:"\F4D5"}.fa-rebel:before{content:"\F1D0"}.fa-receipt:before{content:"\F543"}.fa-rectangle-landscape:before{content:"\F2FA"}.fa-rectangle-portrait:before{content:"\F2FB"}.fa-rectangle-wide:before{content:"\F2FC"}.fa-recycle:before{content:"\F1B8"}.fa-red-river:before{content:"\F3E3"}.fa-reddit:before{content:"\F1A1"}.fa-reddit-alien:before{content:"\F281"}.fa-reddit-square:before{content:"\F1A2"}.fa-redo:before{content:"\F01E"}.fa-redo-alt:before{content:"\F2F9"}.fa-registered:before{content:"\F25D"}.fa-rendact:before{content:"\F3E4"}.fa-renren:before{content:"\F18B"}.fa-repeat:before{content:"\F363"}.fa-repeat-1:before{content:"\F365"}.fa-repeat-1-alt:before{content:"\F366"}.fa-repeat-alt:before{content:"\F364"}.fa-reply:before{content:"\F3E5"}.fa-reply-all:before{content:"\F122"}.fa-replyd:before{content:"\F3E6"}.fa-researchgate:before{content:"\F4F8"}.fa-resolving:before{content:"\F3E7"}.fa-retweet:before{content:"\F079"}.fa-retweet-alt:before{content:"\F361"}.fa-ribbon:before{content:"\F4D6"}.fa-road:before{content:"\F018"}.fa-robot:before{content:"\F544"}.fa-rocket:before{content:"\F135"}.fa-rocketchat:before{content:"\F3E8"}.fa-rockrms:before{content:"\F3E9"}.fa-route:before{content:"\F4D7"}.fa-rss:before{content:"\F09E"}.fa-rss-square:before{content:"\F143"}.fa-ruble-sign:before{content:"\F158"}.fa-ruler:before{content:"\F545"}.fa-ruler-combined:before{content:"\F546"}.fa-ruler-horizontal:before{content:"\F547"}.fa-ruler-vertical:before{content:"\F548"}.fa-rupee-sign:before{content:"\F156"}.fa-safari:before{content:"\F267"}.fa-sass:before{content:"\F41E"}.fa-save:before{content:"\F0C7"}.fa-scanner:before{content:"\F488"}.fa-scanner-keyboard:before{content:"\F489"}.fa-scanner-touchscreen:before{content:"\F48A"}.fa-schlix:before{content:"\F3EA"}.fa-school:before{content:"\F549"}.fa-screwdriver:before{content:"\F54A"}.fa-scribd:before{content:"\F28A"}.fa-scrubber:before{content:"\F2F8"}.fa-search:before{content:"\F002"}.fa-search-minus:before{content:"\F010"}.fa-search-plus:before{content:"\F00E"}.fa-searchengin:before{content:"\F3EB"}.fa-seedling:before{content:"\F4D8"}.fa-sellcast:before{content:"\F2DA"}.fa-sellsy:before{content:"\F213"}.fa-server:before{content:"\F233"}.fa-servicestack:before{content:"\F3EC"}.fa-share:before{content:"\F064"}.fa-share-all:before{content:"\F367"}.fa-share-alt:before{content:"\F1E0"}.fa-share-alt-square:before{content:"\F1E1"}.fa-share-square:before{content:"\F14D"}.fa-shekel-sign:before{content:"\F20B"}.fa-shield:before{content:"\F132"}.fa-shield-alt:before{content:"\F3ED"}.fa-shield-check:before{content:"\F2F7"}.fa-ship:before{content:"\F21A"}.fa-shipping-fast:before{content:"\F48B"}.fa-shipping-timed:before{content:"\F48C"}.fa-shirtsinbulk:before{content:"\F214"}.fa-shoe-prints:before{content:"\F54B"}.fa-shopping-bag:before{content:"\F290"}.fa-shopping-basket:before{content:"\F291"}.fa-shopping-cart:before{content:"\F07A"}.fa-shower:before{content:"\F2CC"}.fa-shuttlecock:before{content:"\F45B"}.fa-sign:before{content:"\F4D9"}.fa-sign-in:before{content:"\F090"}.fa-sign-in-alt:before{content:"\F2F6"}.fa-sign-language:before{content:"\F2A7"}.fa-sign-out:before{content:"\F08B"}.fa-sign-out-alt:before{content:"\F2F5"}.fa-signal:before{content:"\F012"}.fa-simplybuilt:before{content:"\F215"}.fa-sistrix:before{content:"\F3EE"}.fa-sitemap:before{content:"\F0E8"}.fa-sith:before{content:"\F512"}.fa-skull:before{content:"\F54C"}.fa-skyatlas:before{content:"\F216"}.fa-skype:before{content:"\F17E"}.fa-slack:before{content:"\F198"}.fa-slack-hash:before{content:"\F3EF"}.fa-sliders-h:before{content:"\F1DE"}.fa-sliders-h-square:before{content:"\F3F0"}.fa-sliders-v:before{content:"\F3F1"}.fa-sliders-v-square:before{content:"\F3F2"}.fa-slideshare:before{content:"\F1E7"}.fa-smile:before{content:"\F118"}.fa-smile-plus:before{content:"\F4DA"}.fa-smoking:before{content:"\F48D"}.fa-smoking-ban:before{content:"\F54D"}.fa-snapchat:before{content:"\F2AB"}.fa-snapchat-ghost:before{content:"\F2AC"}.fa-snapchat-square:before{content:"\F2AD"}.fa-snowflake:before{content:"\F2DC"}.fa-sort:before{content:"\F0DC"}.fa-sort-alpha-down:before{content:"\F15D"}.fa-sort-alpha-up:before{content:"\F15E"}.fa-sort-amount-down:before{content:"\F160"}.fa-sort-amount-up:before{content:"\F161"}.fa-sort-down:before{content:"\F0DD"}.fa-sort-numeric-down:before{content:"\F162"}.fa-sort-numeric-up:before{content:"\F163"}.fa-sort-up:before{content:"\F0DE"}.fa-soundcloud:before{content:"\F1BE"}.fa-space-shuttle:before{content:"\F197"}.fa-spade:before{content:"\F2F4"}.fa-speakap:before{content:"\F3F3"}.fa-spinner:before{content:"\F110"}.fa-spinner-third:before{content:"\F3F4"}.fa-spotify:before{content:"\F1BC"}.fa-square:before{content:"\F0C8"}.fa-square-full:before{content:"\F45C"}.fa-stack-exchange:before{content:"\F18D"}.fa-stack-overflow:before{content:"\F16C"}.fa-star:before{content:"\F005"}.fa-star-exclamation:before{content:"\F2F3"}.fa-star-half:before{content:"\F089"}.fa-staylinked:before{content:"\F3F5"}.fa-steam:before{content:"\F1B6"}.fa-steam-square:before{content:"\F1B7"}.fa-steam-symbol:before{content:"\F3F6"}.fa-step-backward:before{content:"\F048"}.fa-step-forward:before{content:"\F051"}.fa-stethoscope:before{content:"\F0F1"}.fa-sticker-mule:before{content:"\F3F7"}.fa-sticky-note:before{content:"\F249"}.fa-stop:before{content:"\F04D"}.fa-stop-circle:before{content:"\F28D"}.fa-stopwatch:before{content:"\F2F2"}.fa-store:before{content:"\F54E"}.fa-store-alt:before{content:"\F54F"}.fa-strava:before{content:"\F428"}.fa-stream:before{content:"\F550"}.fa-street-view:before{content:"\F21D"}.fa-strikethrough:before{content:"\F0CC"}.fa-stripe:before{content:"\F429"}.fa-stripe-s:before{content:"\F42A"}.fa-stroopwafel:before{content:"\F551"}.fa-studiovinari:before{content:"\F3F8"}.fa-stumbleupon:before{content:"\F1A4"}.fa-stumbleupon-circle:before{content:"\F1A3"}.fa-subscript:before{content:"\F12C"}.fa-subway:before{content:"\F239"}.fa-suitcase:before{content:"\F0F2"}.fa-sun:before{content:"\F185"}.fa-superpowers:before{content:"\F2DD"}.fa-superscript:before{content:"\F12B"}.fa-supple:before{content:"\F3F9"}.fa-sync:before{content:"\F021"}.fa-sync-alt:before{content:"\F2F1"}.fa-syringe:before{content:"\F48E"}.fa-table:before{content:"\F0CE"}.fa-table-tennis:before{content:"\F45D"}.fa-tablet:before{content:"\F10A"}.fa-tablet-alt:before{content:"\F3FA"}.fa-tablet-android:before{content:"\F3FB"}.fa-tablet-android-alt:before{content:"\F3FC"}.fa-tablet-rugged:before{content:"\F48F"}.fa-tablets:before{content:"\F490"}.fa-tachometer:before{content:"\F0E4"}.fa-tachometer-alt:before{content:"\F3FD"}.fa-tag:before{content:"\F02B"}.fa-tags:before{content:"\F02C"}.fa-tape:before{content:"\F4DB"}.fa-tasks:before{content:"\F0AE"}.fa-taxi:before{content:"\F1BA"}.fa-teamspeak:before{content:"\F4F9"}.fa-telegram:before{content:"\F2C6"}.fa-telegram-plane:before{content:"\F3FE"}.fa-tencent-weibo:before{content:"\F1D5"}.fa-tennis-ball:before{content:"\F45E"}.fa-terminal:before{content:"\F120"}.fa-text-height:before{content:"\F034"}.fa-text-width:before{content:"\F035"}.fa-th:before{content:"\F00A"}.fa-th-large:before{content:"\F009"}.fa-th-list:before{content:"\F00B"}.fa-themeisle:before{content:"\F2B2"}.fa-thermometer:before{content:"\F491"}.fa-thermometer-empty:before{content:"\F2CB"}.fa-thermometer-full:before{content:"\F2C7"}.fa-thermometer-half:before{content:"\F2C9"}.fa-thermometer-quarter:before{content:"\F2CA"}.fa-thermometer-three-quarters:before{content:"\F2C8"}.fa-thumbs-down:before{content:"\F165"}.fa-thumbs-up:before{content:"\F164"}.fa-thumbtack:before{content:"\F08D"}.fa-ticket:before{content:"\F145"}.fa-ticket-alt:before{content:"\F3FF"}.fa-times:before{content:"\F00D"}.fa-times-circle:before{content:"\F057"}.fa-times-hexagon:before{content:"\F2EE"}.fa-times-octagon:before{content:"\F2F0"}.fa-times-square:before{content:"\F2D3"}.fa-tint:before{content:"\F043"}.fa-toggle-off:before{content:"\F204"}.fa-toggle-on:before{content:"\F205"}.fa-toolbox:before{content:"\F552"}.fa-trade-federation:before{content:"\F513"}.fa-trademark:before{content:"\F25C"}.fa-train:before{content:"\F238"}.fa-transgender:before{content:"\F224"}.fa-transgender-alt:before{content:"\F225"}.fa-trash:before{content:"\F1F8"}.fa-trash-alt:before{content:"\F2ED"}.fa-tree:before{content:"\F1BB"}.fa-tree-alt:before{content:"\F400"}.fa-trello:before{content:"\F181"}.fa-triangle:before{content:"\F2EC"}.fa-tripadvisor:before{content:"\F262"}.fa-trophy:before{content:"\F091"}.fa-trophy-alt:before{content:"\F2EB"}.fa-truck:before{content:"\F0D1"}.fa-truck-container:before{content:"\F4DC"}.fa-truck-couch:before{content:"\F4DD"}.fa-truck-loading:before{content:"\F4DE"}.fa-truck-moving:before{content:"\F4DF"}.fa-truck-ramp:before{content:"\F4E0"}.fa-tshirt:before{content:"\F553"}.fa-tty:before{content:"\F1E4"}.fa-tumblr:before{content:"\F173"}.fa-tumblr-square:before{content:"\F174"}.fa-tv:before{content:"\F26C"}.fa-tv-retro:before{content:"\F401"}.fa-twitch:before{content:"\F1E8"}.fa-twitter:before{content:"\F099"}.fa-twitter-square:before{content:"\F081"}.fa-typo3:before{content:"\F42B"}.fa-uber:before{content:"\F402"}.fa-uikit:before{content:"\F403"}.fa-umbrella:before{content:"\F0E9"}.fa-underline:before{content:"\F0CD"}.fa-undo:before{content:"\F0E2"}.fa-undo-alt:before{content:"\F2EA"}.fa-uniregistry:before{content:"\F404"}.fa-universal-access:before{content:"\F29A"}.fa-university:before{content:"\F19C"}.fa-unlink:before{content:"\F127"}.fa-unlock:before{content:"\F09C"}.fa-unlock-alt:before{content:"\F13E"}.fa-untappd:before{content:"\F405"}.fa-upload:before{content:"\F093"}.fa-usb:before{content:"\F287"}.fa-usd-circle:before{content:"\F2E8"}.fa-usd-square:before{content:"\F2E9"}.fa-user:before{content:"\F007"}.fa-user-alt:before{content:"\F406"}.fa-user-alt-slash:before{content:"\F4FA"}.fa-user-astronaut:before{content:"\F4FB"}.fa-user-check:before{content:"\F4FC"}.fa-user-circle:before{content:"\F2BD"}.fa-user-clock:before{content:"\F4FD"}.fa-user-cog:before{content:"\F4FE"}.fa-user-edit:before{content:"\F4FF"}.fa-user-friends:before{content:"\F500"}.fa-user-graduate:before{content:"\F501"}.fa-user-lock:before{content:"\F502"}.fa-user-md:before{content:"\F0F0"}.fa-user-minus:before{content:"\F503"}.fa-user-ninja:before{content:"\F504"}.fa-user-plus:before{content:"\F234"}.fa-user-secret:before{content:"\F21B"}.fa-user-shield:before{content:"\F505"}.fa-user-slash:before{content:"\F506"}.fa-user-tag:before{content:"\F507"}.fa-user-tie:before{content:"\F508"}.fa-user-times:before{content:"\F235"}.fa-users:before{content:"\F0C0"}.fa-users-cog:before{content:"\F509"}.fa-ussunnah:before{content:"\F407"}.fa-utensil-fork:before{content:"\F2E3"}.fa-utensil-knife:before{content:"\F2E4"}.fa-utensil-spoon:before{content:"\F2E5"}.fa-utensils:before{content:"\F2E7"}.fa-utensils-alt:before{content:"\F2E6"}.fa-vaadin:before{content:"\F408"}.fa-venus:before{content:"\F221"}.fa-venus-double:before{content:"\F226"}.fa-venus-mars:before{content:"\F228"}.fa-viacoin:before{content:"\F237"}.fa-viadeo:before{content:"\F2A9"}.fa-viadeo-square:before{content:"\F2AA"}.fa-vial:before{content:"\F492"}.fa-vials:before{content:"\F493"}.fa-viber:before{content:"\F409"}.fa-video:before{content:"\F03D"}.fa-video-plus:before{content:"\F4E1"}.fa-video-slash:before{content:"\F4E2"}.fa-vimeo:before{content:"\F40A"}.fa-vimeo-square:before{content:"\F194"}.fa-vimeo-v:before{content:"\F27D"}.fa-vine:before{content:"\F1CA"}.fa-vk:before{content:"\F189"}.fa-vnv:before{content:"\F40B"}.fa-volleyball-ball:before{content:"\F45F"}.fa-volume-down:before{content:"\F027"}.fa-volume-mute:before{content:"\F2E2"}.fa-volume-off:before{content:"\F026"}.fa-volume-up:before{content:"\F028"}.fa-vuejs:before{content:"\F41F"}.fa-walking:before{content:"\F554"}.fa-wallet:before{content:"\F555"}.fa-warehouse:before{content:"\F494"}.fa-warehouse-alt:before{content:"\F495"}.fa-watch:before{content:"\F2E1"}.fa-weibo:before{content:"\F18A"}.fa-weight:before{content:"\F496"}.fa-weixin:before{content:"\F1D7"}.fa-whatsapp:before{content:"\F232"}.fa-whatsapp-square:before{content:"\F40C"}.fa-wheelchair:before{content:"\F193"}.fa-whistle:before{content:"\F460"}.fa-whmcs:before{content:"\F40D"}.fa-wifi:before{content:"\F1EB"}.fa-wikipedia-w:before{content:"\F266"}.fa-window:before{content:"\F40E"}.fa-window-alt:before{content:"\F40F"}.fa-window-close:before{content:"\F410"}.fa-window-maximize:before{content:"\F2D0"}.fa-window-minimize:before{content:"\F2D1"}.fa-window-restore:before{content:"\F2D2"}.fa-windows:before{content:"\F17A"}.fa-wine-glass:before{content:"\F4E3"}.fa-wolf-pack-battalion:before{content:"\F514"}.fa-won-sign:before{content:"\F159"}.fa-wordpress:before{content:"\F19A"}.fa-wordpress-simple:before{content:"\F411"}.fa-wpbeginner:before{content:"\F297"}.fa-wpexplorer:before{content:"\F2DE"}.fa-wpforms:before{content:"\F298"}.fa-wrench:before{content:"\F0AD"}.fa-x-ray:before{content:"\F497"}.fa-xbox:before{content:"\F412"}.fa-xing:before{content:"\F168"}.fa-xing-square:before{content:"\F169"}.fa-y-combinator:before{content:"\F23B"}.fa-yahoo:before{content:"\F19E"}.fa-yandex:before{content:"\F413"}.fa-yandex-international:before{content:"\F414"}.fa-yelp:before{content:"\F1E9"}.fa-yen-sign:before{content:"\F157"}.fa-yoast:before{content:"\F2B1"}.fa-youtube:before{content:"\F167"}.fa-youtube-square:before{content:"\F431"}.sr-only{margin:-1px}.sr-only-focusable:active,.sr-only-focusable:focus{margin:0}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url("/fonts/fa-brands-400.eot");src:url("/fonts/fa-brands-400.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-brands-400.woff2") format("woff2"),url("/fonts/fa-brands-400.woff") format("woff"),url("/fonts/fa-brands-400.ttf") format("truetype"),url("/fonts/fa-brands-400.svg#fontawesome") format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Pro;font-style:normal;font-weight:300;src:url("/fonts/fa-light-300.eot");src:url("/fonts/fa-light-300.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-light-300.woff2") format("woff2"),url("/fonts/fa-light-300.woff") format("woff"),url("/fonts/fa-light-300.ttf") format("truetype"),url("/fonts/fa-light-300.svg#fontawesome") format("svg")}.fal{font-weight:300}@font-face{font-family:Font Awesome\ 5 Pro;font-style:normal;font-weight:400;src:url("/fonts/fa-regular-400.eot");src:url("/fonts/fa-regular-400.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-regular-400.woff2") format("woff2"),url("/fonts/fa-regular-400.woff") format("woff"),url("/fonts/fa-regular-400.ttf") format("truetype"),url("/fonts/fa-regular-400.svg#fontawesome") format("svg")}.fal,.far{font-family:Font Awesome\ 5 Pro}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Pro;font-style:normal;font-weight:900;src:url("/fonts/fa-solid-900.eot");src:url("/fonts/fa-solid-900.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-solid-900.woff2") format("woff2"),url("/fonts/fa-solid-900.woff") format("woff"),url("/fonts/fa-solid-900.ttf") format("truetype"),url("/fonts/fa-solid-900.svg#fontawesome") format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Pro;font-weight:900}
+ * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
+ */.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\F26E"}.fa-accessible-icon:before{content:"\F368"}.fa-accusoft:before{content:"\F369"}.fa-address-book:before{content:"\F2B9"}.fa-address-card:before{content:"\F2BB"}.fa-adjust:before{content:"\F042"}.fa-adn:before{content:"\F170"}.fa-adversal:before{content:"\F36A"}.fa-affiliatetheme:before{content:"\F36B"}.fa-algolia:before{content:"\F36C"}.fa-align-center:before{content:"\F037"}.fa-align-justify:before{content:"\F039"}.fa-align-left:before{content:"\F036"}.fa-align-right:before{content:"\F038"}.fa-allergies:before{content:"\F461"}.fa-amazon:before{content:"\F270"}.fa-amazon-pay:before{content:"\F42C"}.fa-ambulance:before{content:"\F0F9"}.fa-american-sign-language-interpreting:before{content:"\F2A3"}.fa-amilia:before{content:"\F36D"}.fa-anchor:before{content:"\F13D"}.fa-android:before{content:"\F17B"}.fa-angellist:before{content:"\F209"}.fa-angle-double-down:before{content:"\F103"}.fa-angle-double-left:before{content:"\F100"}.fa-angle-double-right:before{content:"\F101"}.fa-angle-double-up:before{content:"\F102"}.fa-angle-down:before{content:"\F107"}.fa-angle-left:before{content:"\F104"}.fa-angle-right:before{content:"\F105"}.fa-angle-up:before{content:"\F106"}.fa-angrycreative:before{content:"\F36E"}.fa-angular:before{content:"\F420"}.fa-app-store:before{content:"\F36F"}.fa-app-store-ios:before{content:"\F370"}.fa-apper:before{content:"\F371"}.fa-apple:before{content:"\F179"}.fa-apple-pay:before{content:"\F415"}.fa-archive:before{content:"\F187"}.fa-arrow-alt-circle-down:before{content:"\F358"}.fa-arrow-alt-circle-left:before{content:"\F359"}.fa-arrow-alt-circle-right:before{content:"\F35A"}.fa-arrow-alt-circle-up:before{content:"\F35B"}.fa-arrow-circle-down:before{content:"\F0AB"}.fa-arrow-circle-left:before{content:"\F0A8"}.fa-arrow-circle-right:before{content:"\F0A9"}.fa-arrow-circle-up:before{content:"\F0AA"}.fa-arrow-down:before{content:"\F063"}.fa-arrow-left:before{content:"\F060"}.fa-arrow-right:before{content:"\F061"}.fa-arrow-up:before{content:"\F062"}.fa-arrows-alt:before{content:"\F0B2"}.fa-arrows-alt-h:before{content:"\F337"}.fa-arrows-alt-v:before{content:"\F338"}.fa-assistive-listening-systems:before{content:"\F2A2"}.fa-asterisk:before{content:"\F069"}.fa-asymmetrik:before{content:"\F372"}.fa-at:before{content:"\F1FA"}.fa-audible:before{content:"\F373"}.fa-audio-description:before{content:"\F29E"}.fa-autoprefixer:before{content:"\F41C"}.fa-avianex:before{content:"\F374"}.fa-aviato:before{content:"\F421"}.fa-aws:before{content:"\F375"}.fa-backward:before{content:"\F04A"}.fa-balance-scale:before{content:"\F24E"}.fa-ban:before{content:"\F05E"}.fa-band-aid:before{content:"\F462"}.fa-bandcamp:before{content:"\F2D5"}.fa-barcode:before{content:"\F02A"}.fa-bars:before{content:"\F0C9"}.fa-baseball-ball:before{content:"\F433"}.fa-basketball-ball:before{content:"\F434"}.fa-bath:before{content:"\F2CD"}.fa-battery-empty:before{content:"\F244"}.fa-battery-full:before{content:"\F240"}.fa-battery-half:before{content:"\F242"}.fa-battery-quarter:before{content:"\F243"}.fa-battery-three-quarters:before{content:"\F241"}.fa-bed:before{content:"\F236"}.fa-beer:before{content:"\F0FC"}.fa-behance:before{content:"\F1B4"}.fa-behance-square:before{content:"\F1B5"}.fa-bell:before{content:"\F0F3"}.fa-bell-slash:before{content:"\F1F6"}.fa-bicycle:before{content:"\F206"}.fa-bimobject:before{content:"\F378"}.fa-binoculars:before{content:"\F1E5"}.fa-birthday-cake:before{content:"\F1FD"}.fa-bitbucket:before{content:"\F171"}.fa-bitcoin:before{content:"\F379"}.fa-bity:before{content:"\F37A"}.fa-black-tie:before{content:"\F27E"}.fa-blackberry:before{content:"\F37B"}.fa-blender:before{content:"\F517"}.fa-blind:before{content:"\F29D"}.fa-blogger:before{content:"\F37C"}.fa-blogger-b:before{content:"\F37D"}.fa-bluetooth:before{content:"\F293"}.fa-bluetooth-b:before{content:"\F294"}.fa-bold:before{content:"\F032"}.fa-bolt:before{content:"\F0E7"}.fa-bomb:before{content:"\F1E2"}.fa-book:before{content:"\F02D"}.fa-book-open:before{content:"\F518"}.fa-bookmark:before{content:"\F02E"}.fa-bowling-ball:before{content:"\F436"}.fa-box:before{content:"\F466"}.fa-box-open:before{content:"\F49E"}.fa-boxes:before{content:"\F468"}.fa-braille:before{content:"\F2A1"}.fa-briefcase:before{content:"\F0B1"}.fa-briefcase-medical:before{content:"\F469"}.fa-broadcast-tower:before{content:"\F519"}.fa-broom:before{content:"\F51A"}.fa-btc:before{content:"\F15A"}.fa-bug:before{content:"\F188"}.fa-building:before{content:"\F1AD"}.fa-bullhorn:before{content:"\F0A1"}.fa-bullseye:before{content:"\F140"}.fa-burn:before{content:"\F46A"}.fa-buromobelexperte:before{content:"\F37F"}.fa-bus:before{content:"\F207"}.fa-buysellads:before{content:"\F20D"}.fa-calculator:before{content:"\F1EC"}.fa-calendar:before{content:"\F133"}.fa-calendar-alt:before{content:"\F073"}.fa-calendar-check:before{content:"\F274"}.fa-calendar-minus:before{content:"\F272"}.fa-calendar-plus:before{content:"\F271"}.fa-calendar-times:before{content:"\F273"}.fa-camera:before{content:"\F030"}.fa-camera-retro:before{content:"\F083"}.fa-capsules:before{content:"\F46B"}.fa-car:before{content:"\F1B9"}.fa-caret-down:before{content:"\F0D7"}.fa-caret-left:before{content:"\F0D9"}.fa-caret-right:before{content:"\F0DA"}.fa-caret-square-down:before{content:"\F150"}.fa-caret-square-left:before{content:"\F191"}.fa-caret-square-right:before{content:"\F152"}.fa-caret-square-up:before{content:"\F151"}.fa-caret-up:before{content:"\F0D8"}.fa-cart-arrow-down:before{content:"\F218"}.fa-cart-plus:before{content:"\F217"}.fa-cc-amazon-pay:before{content:"\F42D"}.fa-cc-amex:before{content:"\F1F3"}.fa-cc-apple-pay:before{content:"\F416"}.fa-cc-diners-club:before{content:"\F24C"}.fa-cc-discover:before{content:"\F1F2"}.fa-cc-jcb:before{content:"\F24B"}.fa-cc-mastercard:before{content:"\F1F1"}.fa-cc-paypal:before{content:"\F1F4"}.fa-cc-stripe:before{content:"\F1F5"}.fa-cc-visa:before{content:"\F1F0"}.fa-centercode:before{content:"\F380"}.fa-certificate:before{content:"\F0A3"}.fa-chalkboard:before{content:"\F51B"}.fa-chalkboard-teacher:before{content:"\F51C"}.fa-chart-area:before{content:"\F1FE"}.fa-chart-bar:before{content:"\F080"}.fa-chart-line:before{content:"\F201"}.fa-chart-pie:before{content:"\F200"}.fa-check:before{content:"\F00C"}.fa-check-circle:before{content:"\F058"}.fa-check-square:before{content:"\F14A"}.fa-chess:before{content:"\F439"}.fa-chess-bishop:before{content:"\F43A"}.fa-chess-board:before{content:"\F43C"}.fa-chess-king:before{content:"\F43F"}.fa-chess-knight:before{content:"\F441"}.fa-chess-pawn:before{content:"\F443"}.fa-chess-queen:before{content:"\F445"}.fa-chess-rook:before{content:"\F447"}.fa-chevron-circle-down:before{content:"\F13A"}.fa-chevron-circle-left:before{content:"\F137"}.fa-chevron-circle-right:before{content:"\F138"}.fa-chevron-circle-up:before{content:"\F139"}.fa-chevron-down:before{content:"\F078"}.fa-chevron-left:before{content:"\F053"}.fa-chevron-right:before{content:"\F054"}.fa-chevron-up:before{content:"\F077"}.fa-child:before{content:"\F1AE"}.fa-chrome:before{content:"\F268"}.fa-church:before{content:"\F51D"}.fa-circle:before{content:"\F111"}.fa-circle-notch:before{content:"\F1CE"}.fa-clipboard:before{content:"\F328"}.fa-clipboard-check:before{content:"\F46C"}.fa-clipboard-list:before{content:"\F46D"}.fa-clock:before{content:"\F017"}.fa-clone:before{content:"\F24D"}.fa-closed-captioning:before{content:"\F20A"}.fa-cloud:before{content:"\F0C2"}.fa-cloud-download-alt:before{content:"\F381"}.fa-cloud-upload-alt:before{content:"\F382"}.fa-cloudscale:before{content:"\F383"}.fa-cloudsmith:before{content:"\F384"}.fa-cloudversify:before{content:"\F385"}.fa-code:before{content:"\F121"}.fa-code-branch:before{content:"\F126"}.fa-codepen:before{content:"\F1CB"}.fa-codiepie:before{content:"\F284"}.fa-coffee:before{content:"\F0F4"}.fa-cog:before{content:"\F013"}.fa-cogs:before{content:"\F085"}.fa-coins:before{content:"\F51E"}.fa-columns:before{content:"\F0DB"}.fa-comment:before{content:"\F075"}.fa-comment-alt:before{content:"\F27A"}.fa-comment-dots:before{content:"\F4AD"}.fa-comment-slash:before{content:"\F4B3"}.fa-comments:before{content:"\F086"}.fa-compact-disc:before{content:"\F51F"}.fa-compass:before{content:"\F14E"}.fa-compress:before{content:"\F066"}.fa-connectdevelop:before{content:"\F20E"}.fa-contao:before{content:"\F26D"}.fa-copy:before{content:"\F0C5"}.fa-copyright:before{content:"\F1F9"}.fa-couch:before{content:"\F4B8"}.fa-cpanel:before{content:"\F388"}.fa-creative-commons:before{content:"\F25E"}.fa-creative-commons-by:before{content:"\F4E7"}.fa-creative-commons-nc:before{content:"\F4E8"}.fa-creative-commons-nc-eu:before{content:"\F4E9"}.fa-creative-commons-nc-jp:before{content:"\F4EA"}.fa-creative-commons-nd:before{content:"\F4EB"}.fa-creative-commons-pd:before{content:"\F4EC"}.fa-creative-commons-pd-alt:before{content:"\F4ED"}.fa-creative-commons-remix:before{content:"\F4EE"}.fa-creative-commons-sa:before{content:"\F4EF"}.fa-creative-commons-sampling:before{content:"\F4F0"}.fa-creative-commons-sampling-plus:before{content:"\F4F1"}.fa-creative-commons-share:before{content:"\F4F2"}.fa-credit-card:before{content:"\F09D"}.fa-crop:before{content:"\F125"}.fa-crosshairs:before{content:"\F05B"}.fa-crow:before{content:"\F520"}.fa-crown:before{content:"\F521"}.fa-css3:before{content:"\F13C"}.fa-css3-alt:before{content:"\F38B"}.fa-cube:before{content:"\F1B2"}.fa-cubes:before{content:"\F1B3"}.fa-cut:before{content:"\F0C4"}.fa-cuttlefish:before{content:"\F38C"}.fa-d-and-d:before{content:"\F38D"}.fa-dashcube:before{content:"\F210"}.fa-database:before{content:"\F1C0"}.fa-deaf:before{content:"\F2A4"}.fa-delicious:before{content:"\F1A5"}.fa-deploydog:before{content:"\F38E"}.fa-deskpro:before{content:"\F38F"}.fa-desktop:before{content:"\F108"}.fa-deviantart:before{content:"\F1BD"}.fa-diagnoses:before{content:"\F470"}.fa-dice:before{content:"\F522"}.fa-dice-five:before{content:"\F523"}.fa-dice-four:before{content:"\F524"}.fa-dice-one:before{content:"\F525"}.fa-dice-six:before{content:"\F526"}.fa-dice-three:before{content:"\F527"}.fa-dice-two:before{content:"\F528"}.fa-digg:before{content:"\F1A6"}.fa-digital-ocean:before{content:"\F391"}.fa-discord:before{content:"\F392"}.fa-discourse:before{content:"\F393"}.fa-divide:before{content:"\F529"}.fa-dna:before{content:"\F471"}.fa-dochub:before{content:"\F394"}.fa-docker:before{content:"\F395"}.fa-dollar-sign:before{content:"\F155"}.fa-dolly:before{content:"\F472"}.fa-dolly-flatbed:before{content:"\F474"}.fa-donate:before{content:"\F4B9"}.fa-door-closed:before{content:"\F52A"}.fa-door-open:before{content:"\F52B"}.fa-dot-circle:before{content:"\F192"}.fa-dove:before{content:"\F4BA"}.fa-download:before{content:"\F019"}.fa-draft2digital:before{content:"\F396"}.fa-dribbble:before{content:"\F17D"}.fa-dribbble-square:before{content:"\F397"}.fa-dropbox:before{content:"\F16B"}.fa-drupal:before{content:"\F1A9"}.fa-dumbbell:before{content:"\F44B"}.fa-dyalog:before{content:"\F399"}.fa-earlybirds:before{content:"\F39A"}.fa-ebay:before{content:"\F4F4"}.fa-edge:before{content:"\F282"}.fa-edit:before{content:"\F044"}.fa-eject:before{content:"\F052"}.fa-elementor:before{content:"\F430"}.fa-ellipsis-h:before{content:"\F141"}.fa-ellipsis-v:before{content:"\F142"}.fa-ember:before{content:"\F423"}.fa-empire:before{content:"\F1D1"}.fa-envelope:before{content:"\F0E0"}.fa-envelope-open:before{content:"\F2B6"}.fa-envelope-square:before{content:"\F199"}.fa-envira:before{content:"\F299"}.fa-equals:before{content:"\F52C"}.fa-eraser:before{content:"\F12D"}.fa-erlang:before{content:"\F39D"}.fa-ethereum:before{content:"\F42E"}.fa-etsy:before{content:"\F2D7"}.fa-euro-sign:before{content:"\F153"}.fa-exchange-alt:before{content:"\F362"}.fa-exclamation:before{content:"\F12A"}.fa-exclamation-circle:before{content:"\F06A"}.fa-exclamation-triangle:before{content:"\F071"}.fa-expand:before{content:"\F065"}.fa-expand-arrows-alt:before{content:"\F31E"}.fa-expeditedssl:before{content:"\F23E"}.fa-external-link-alt:before{content:"\F35D"}.fa-external-link-square-alt:before{content:"\F360"}.fa-eye:before{content:"\F06E"}.fa-eye-dropper:before{content:"\F1FB"}.fa-eye-slash:before{content:"\F070"}.fa-facebook:before{content:"\F09A"}.fa-facebook-f:before{content:"\F39E"}.fa-facebook-messenger:before{content:"\F39F"}.fa-facebook-square:before{content:"\F082"}.fa-fast-backward:before{content:"\F049"}.fa-fast-forward:before{content:"\F050"}.fa-fax:before{content:"\F1AC"}.fa-feather:before{content:"\F52D"}.fa-female:before{content:"\F182"}.fa-fighter-jet:before{content:"\F0FB"}.fa-file:before{content:"\F15B"}.fa-file-alt:before{content:"\F15C"}.fa-file-archive:before{content:"\F1C6"}.fa-file-audio:before{content:"\F1C7"}.fa-file-code:before{content:"\F1C9"}.fa-file-excel:before{content:"\F1C3"}.fa-file-image:before{content:"\F1C5"}.fa-file-medical:before{content:"\F477"}.fa-file-medical-alt:before{content:"\F478"}.fa-file-pdf:before{content:"\F1C1"}.fa-file-powerpoint:before{content:"\F1C4"}.fa-file-video:before{content:"\F1C8"}.fa-file-word:before{content:"\F1C2"}.fa-film:before{content:"\F008"}.fa-filter:before{content:"\F0B0"}.fa-fire:before{content:"\F06D"}.fa-fire-extinguisher:before{content:"\F134"}.fa-firefox:before{content:"\F269"}.fa-first-aid:before{content:"\F479"}.fa-first-order:before{content:"\F2B0"}.fa-first-order-alt:before{content:"\F50A"}.fa-firstdraft:before{content:"\F3A1"}.fa-flag:before{content:"\F024"}.fa-flag-checkered:before{content:"\F11E"}.fa-flask:before{content:"\F0C3"}.fa-flickr:before{content:"\F16E"}.fa-flipboard:before{content:"\F44D"}.fa-fly:before{content:"\F417"}.fa-folder:before{content:"\F07B"}.fa-folder-open:before{content:"\F07C"}.fa-font:before{content:"\F031"}.fa-font-awesome:before{content:"\F2B4"}.fa-font-awesome-alt:before{content:"\F35C"}.fa-font-awesome-flag:before{content:"\F425"}.fa-font-awesome-logo-full:before{content:"\F4E6"}.fa-fonticons:before{content:"\F280"}.fa-fonticons-fi:before{content:"\F3A2"}.fa-football-ball:before{content:"\F44E"}.fa-fort-awesome:before{content:"\F286"}.fa-fort-awesome-alt:before{content:"\F3A3"}.fa-forumbee:before{content:"\F211"}.fa-forward:before{content:"\F04E"}.fa-foursquare:before{content:"\F180"}.fa-free-code-camp:before{content:"\F2C5"}.fa-freebsd:before{content:"\F3A4"}.fa-frog:before{content:"\F52E"}.fa-frown:before{content:"\F119"}.fa-fulcrum:before{content:"\F50B"}.fa-futbol:before{content:"\F1E3"}.fa-galactic-republic:before{content:"\F50C"}.fa-galactic-senate:before{content:"\F50D"}.fa-gamepad:before{content:"\F11B"}.fa-gas-pump:before{content:"\F52F"}.fa-gavel:before{content:"\F0E3"}.fa-gem:before{content:"\F3A5"}.fa-genderless:before{content:"\F22D"}.fa-get-pocket:before{content:"\F265"}.fa-gg:before{content:"\F260"}.fa-gg-circle:before{content:"\F261"}.fa-gift:before{content:"\F06B"}.fa-git:before{content:"\F1D3"}.fa-git-square:before{content:"\F1D2"}.fa-github:before{content:"\F09B"}.fa-github-alt:before{content:"\F113"}.fa-github-square:before{content:"\F092"}.fa-gitkraken:before{content:"\F3A6"}.fa-gitlab:before{content:"\F296"}.fa-gitter:before{content:"\F426"}.fa-glass-martini:before{content:"\F000"}.fa-glasses:before{content:"\F530"}.fa-glide:before{content:"\F2A5"}.fa-glide-g:before{content:"\F2A6"}.fa-globe:before{content:"\F0AC"}.fa-gofore:before{content:"\F3A7"}.fa-golf-ball:before{content:"\F450"}.fa-goodreads:before{content:"\F3A8"}.fa-goodreads-g:before{content:"\F3A9"}.fa-google:before{content:"\F1A0"}.fa-google-drive:before{content:"\F3AA"}.fa-google-play:before{content:"\F3AB"}.fa-google-plus:before{content:"\F2B3"}.fa-google-plus-g:before{content:"\F0D5"}.fa-google-plus-square:before{content:"\F0D4"}.fa-google-wallet:before{content:"\F1EE"}.fa-graduation-cap:before{content:"\F19D"}.fa-gratipay:before{content:"\F184"}.fa-grav:before{content:"\F2D6"}.fa-greater-than:before{content:"\F531"}.fa-greater-than-equal:before{content:"\F532"}.fa-gripfire:before{content:"\F3AC"}.fa-grunt:before{content:"\F3AD"}.fa-gulp:before{content:"\F3AE"}.fa-h-square:before{content:"\F0FD"}.fa-hacker-news:before{content:"\F1D4"}.fa-hacker-news-square:before{content:"\F3AF"}.fa-hand-holding:before{content:"\F4BD"}.fa-hand-holding-heart:before{content:"\F4BE"}.fa-hand-holding-usd:before{content:"\F4C0"}.fa-hand-lizard:before{content:"\F258"}.fa-hand-paper:before{content:"\F256"}.fa-hand-peace:before{content:"\F25B"}.fa-hand-point-down:before{content:"\F0A7"}.fa-hand-point-left:before{content:"\F0A5"}.fa-hand-point-right:before{content:"\F0A4"}.fa-hand-point-up:before{content:"\F0A6"}.fa-hand-pointer:before{content:"\F25A"}.fa-hand-rock:before{content:"\F255"}.fa-hand-scissors:before{content:"\F257"}.fa-hand-spock:before{content:"\F259"}.fa-hands:before{content:"\F4C2"}.fa-hands-helping:before{content:"\F4C4"}.fa-handshake:before{content:"\F2B5"}.fa-hashtag:before{content:"\F292"}.fa-hdd:before{content:"\F0A0"}.fa-heading:before{content:"\F1DC"}.fa-headphones:before{content:"\F025"}.fa-heart:before{content:"\F004"}.fa-heartbeat:before{content:"\F21E"}.fa-helicopter:before{content:"\F533"}.fa-hips:before{content:"\F452"}.fa-hire-a-helper:before{content:"\F3B0"}.fa-history:before{content:"\F1DA"}.fa-hockey-puck:before{content:"\F453"}.fa-home:before{content:"\F015"}.fa-hooli:before{content:"\F427"}.fa-hospital:before{content:"\F0F8"}.fa-hospital-alt:before{content:"\F47D"}.fa-hospital-symbol:before{content:"\F47E"}.fa-hotjar:before{content:"\F3B1"}.fa-hourglass:before{content:"\F254"}.fa-hourglass-end:before{content:"\F253"}.fa-hourglass-half:before{content:"\F252"}.fa-hourglass-start:before{content:"\F251"}.fa-houzz:before{content:"\F27C"}.fa-html5:before{content:"\F13B"}.fa-hubspot:before{content:"\F3B2"}.fa-i-cursor:before{content:"\F246"}.fa-id-badge:before{content:"\F2C1"}.fa-id-card:before{content:"\F2C2"}.fa-id-card-alt:before{content:"\F47F"}.fa-image:before{content:"\F03E"}.fa-images:before{content:"\F302"}.fa-imdb:before{content:"\F2D8"}.fa-inbox:before{content:"\F01C"}.fa-indent:before{content:"\F03C"}.fa-industry:before{content:"\F275"}.fa-infinity:before{content:"\F534"}.fa-info:before{content:"\F129"}.fa-info-circle:before{content:"\F05A"}.fa-instagram:before{content:"\F16D"}.fa-internet-explorer:before{content:"\F26B"}.fa-ioxhost:before{content:"\F208"}.fa-italic:before{content:"\F033"}.fa-itunes:before{content:"\F3B4"}.fa-itunes-note:before{content:"\F3B5"}.fa-java:before{content:"\F4E4"}.fa-jedi-order:before{content:"\F50E"}.fa-jenkins:before{content:"\F3B6"}.fa-joget:before{content:"\F3B7"}.fa-joomla:before{content:"\F1AA"}.fa-js:before{content:"\F3B8"}.fa-js-square:before{content:"\F3B9"}.fa-jsfiddle:before{content:"\F1CC"}.fa-key:before{content:"\F084"}.fa-keybase:before{content:"\F4F5"}.fa-keyboard:before{content:"\F11C"}.fa-keycdn:before{content:"\F3BA"}.fa-kickstarter:before{content:"\F3BB"}.fa-kickstarter-k:before{content:"\F3BC"}.fa-kiwi-bird:before{content:"\F535"}.fa-korvue:before{content:"\F42F"}.fa-language:before{content:"\F1AB"}.fa-laptop:before{content:"\F109"}.fa-laravel:before{content:"\F3BD"}.fa-lastfm:before{content:"\F202"}.fa-lastfm-square:before{content:"\F203"}.fa-leaf:before{content:"\F06C"}.fa-leanpub:before{content:"\F212"}.fa-lemon:before{content:"\F094"}.fa-less:before{content:"\F41D"}.fa-less-than:before{content:"\F536"}.fa-less-than-equal:before{content:"\F537"}.fa-level-down-alt:before{content:"\F3BE"}.fa-level-up-alt:before{content:"\F3BF"}.fa-life-ring:before{content:"\F1CD"}.fa-lightbulb:before{content:"\F0EB"}.fa-line:before{content:"\F3C0"}.fa-link:before{content:"\F0C1"}.fa-linkedin:before{content:"\F08C"}.fa-linkedin-in:before{content:"\F0E1"}.fa-linode:before{content:"\F2B8"}.fa-linux:before{content:"\F17C"}.fa-lira-sign:before{content:"\F195"}.fa-list:before{content:"\F03A"}.fa-list-alt:before{content:"\F022"}.fa-list-ol:before{content:"\F0CB"}.fa-list-ul:before{content:"\F0CA"}.fa-location-arrow:before{content:"\F124"}.fa-lock:before{content:"\F023"}.fa-lock-open:before{content:"\F3C1"}.fa-long-arrow-alt-down:before{content:"\F309"}.fa-long-arrow-alt-left:before{content:"\F30A"}.fa-long-arrow-alt-right:before{content:"\F30B"}.fa-long-arrow-alt-up:before{content:"\F30C"}.fa-low-vision:before{content:"\F2A8"}.fa-lyft:before{content:"\F3C3"}.fa-magento:before{content:"\F3C4"}.fa-magic:before{content:"\F0D0"}.fa-magnet:before{content:"\F076"}.fa-male:before{content:"\F183"}.fa-mandalorian:before{content:"\F50F"}.fa-map:before{content:"\F279"}.fa-map-marker:before{content:"\F041"}.fa-map-marker-alt:before{content:"\F3C5"}.fa-map-pin:before{content:"\F276"}.fa-map-signs:before{content:"\F277"}.fa-mars:before{content:"\F222"}.fa-mars-double:before{content:"\F227"}.fa-mars-stroke:before{content:"\F229"}.fa-mars-stroke-h:before{content:"\F22B"}.fa-mars-stroke-v:before{content:"\F22A"}.fa-mastodon:before{content:"\F4F6"}.fa-maxcdn:before{content:"\F136"}.fa-medapps:before{content:"\F3C6"}.fa-medium:before{content:"\F23A"}.fa-medium-m:before{content:"\F3C7"}.fa-medkit:before{content:"\F0FA"}.fa-medrt:before{content:"\F3C8"}.fa-meetup:before{content:"\F2E0"}.fa-meh:before{content:"\F11A"}.fa-memory:before{content:"\F538"}.fa-mercury:before{content:"\F223"}.fa-microchip:before{content:"\F2DB"}.fa-microphone:before{content:"\F130"}.fa-microphone-alt:before{content:"\F3C9"}.fa-microphone-alt-slash:before{content:"\F539"}.fa-microphone-slash:before{content:"\F131"}.fa-microsoft:before{content:"\F3CA"}.fa-minus:before{content:"\F068"}.fa-minus-circle:before{content:"\F056"}.fa-minus-square:before{content:"\F146"}.fa-mix:before{content:"\F3CB"}.fa-mixcloud:before{content:"\F289"}.fa-mizuni:before{content:"\F3CC"}.fa-mobile:before{content:"\F10B"}.fa-mobile-alt:before{content:"\F3CD"}.fa-modx:before{content:"\F285"}.fa-monero:before{content:"\F3D0"}.fa-money-bill:before{content:"\F0D6"}.fa-money-bill-alt:before{content:"\F3D1"}.fa-money-bill-wave:before{content:"\F53A"}.fa-money-bill-wave-alt:before{content:"\F53B"}.fa-money-check:before{content:"\F53C"}.fa-money-check-alt:before{content:"\F53D"}.fa-moon:before{content:"\F186"}.fa-motorcycle:before{content:"\F21C"}.fa-mouse-pointer:before{content:"\F245"}.fa-music:before{content:"\F001"}.fa-napster:before{content:"\F3D2"}.fa-neuter:before{content:"\F22C"}.fa-newspaper:before{content:"\F1EA"}.fa-nintendo-switch:before{content:"\F418"}.fa-node:before{content:"\F419"}.fa-node-js:before{content:"\F3D3"}.fa-not-equal:before{content:"\F53E"}.fa-notes-medical:before{content:"\F481"}.fa-npm:before{content:"\F3D4"}.fa-ns8:before{content:"\F3D5"}.fa-nutritionix:before{content:"\F3D6"}.fa-object-group:before{content:"\F247"}.fa-object-ungroup:before{content:"\F248"}.fa-odnoklassniki:before{content:"\F263"}.fa-odnoklassniki-square:before{content:"\F264"}.fa-old-republic:before{content:"\F510"}.fa-opencart:before{content:"\F23D"}.fa-openid:before{content:"\F19B"}.fa-opera:before{content:"\F26A"}.fa-optin-monster:before{content:"\F23C"}.fa-osi:before{content:"\F41A"}.fa-outdent:before{content:"\F03B"}.fa-page4:before{content:"\F3D7"}.fa-pagelines:before{content:"\F18C"}.fa-paint-brush:before{content:"\F1FC"}.fa-palette:before{content:"\F53F"}.fa-palfed:before{content:"\F3D8"}.fa-pallet:before{content:"\F482"}.fa-paper-plane:before{content:"\F1D8"}.fa-paperclip:before{content:"\F0C6"}.fa-parachute-box:before{content:"\F4CD"}.fa-paragraph:before{content:"\F1DD"}.fa-parking:before{content:"\F540"}.fa-paste:before{content:"\F0EA"}.fa-patreon:before{content:"\F3D9"}.fa-pause:before{content:"\F04C"}.fa-pause-circle:before{content:"\F28B"}.fa-paw:before{content:"\F1B0"}.fa-paypal:before{content:"\F1ED"}.fa-pen-square:before{content:"\F14B"}.fa-pencil-alt:before{content:"\F303"}.fa-people-carry:before{content:"\F4CE"}.fa-percent:before{content:"\F295"}.fa-percentage:before{content:"\F541"}.fa-periscope:before{content:"\F3DA"}.fa-phabricator:before{content:"\F3DB"}.fa-phoenix-framework:before{content:"\F3DC"}.fa-phoenix-squadron:before{content:"\F511"}.fa-phone:before{content:"\F095"}.fa-phone-slash:before{content:"\F3DD"}.fa-phone-square:before{content:"\F098"}.fa-phone-volume:before{content:"\F2A0"}.fa-php:before{content:"\F457"}.fa-pied-piper:before{content:"\F2AE"}.fa-pied-piper-alt:before{content:"\F1A8"}.fa-pied-piper-hat:before{content:"\F4E5"}.fa-pied-piper-pp:before{content:"\F1A7"}.fa-piggy-bank:before{content:"\F4D3"}.fa-pills:before{content:"\F484"}.fa-pinterest:before{content:"\F0D2"}.fa-pinterest-p:before{content:"\F231"}.fa-pinterest-square:before{content:"\F0D3"}.fa-plane:before{content:"\F072"}.fa-play:before{content:"\F04B"}.fa-play-circle:before{content:"\F144"}.fa-playstation:before{content:"\F3DF"}.fa-plug:before{content:"\F1E6"}.fa-plus:before{content:"\F067"}.fa-plus-circle:before{content:"\F055"}.fa-plus-square:before{content:"\F0FE"}.fa-podcast:before{content:"\F2CE"}.fa-poo:before{content:"\F2FE"}.fa-portrait:before{content:"\F3E0"}.fa-pound-sign:before{content:"\F154"}.fa-power-off:before{content:"\F011"}.fa-prescription-bottle:before{content:"\F485"}.fa-prescription-bottle-alt:before{content:"\F486"}.fa-print:before{content:"\F02F"}.fa-procedures:before{content:"\F487"}.fa-product-hunt:before{content:"\F288"}.fa-project-diagram:before{content:"\F542"}.fa-pushed:before{content:"\F3E1"}.fa-puzzle-piece:before{content:"\F12E"}.fa-python:before{content:"\F3E2"}.fa-qq:before{content:"\F1D6"}.fa-qrcode:before{content:"\F029"}.fa-question:before{content:"\F128"}.fa-question-circle:before{content:"\F059"}.fa-quidditch:before{content:"\F458"}.fa-quinscape:before{content:"\F459"}.fa-quora:before{content:"\F2C4"}.fa-quote-left:before{content:"\F10D"}.fa-quote-right:before{content:"\F10E"}.fa-r-project:before{content:"\F4F7"}.fa-random:before{content:"\F074"}.fa-ravelry:before{content:"\F2D9"}.fa-react:before{content:"\F41B"}.fa-readme:before{content:"\F4D5"}.fa-rebel:before{content:"\F1D0"}.fa-receipt:before{content:"\F543"}.fa-recycle:before{content:"\F1B8"}.fa-red-river:before{content:"\F3E3"}.fa-reddit:before{content:"\F1A1"}.fa-reddit-alien:before{content:"\F281"}.fa-reddit-square:before{content:"\F1A2"}.fa-redo:before{content:"\F01E"}.fa-redo-alt:before{content:"\F2F9"}.fa-registered:before{content:"\F25D"}.fa-rendact:before{content:"\F3E4"}.fa-renren:before{content:"\F18B"}.fa-reply:before{content:"\F3E5"}.fa-reply-all:before{content:"\F122"}.fa-replyd:before{content:"\F3E6"}.fa-researchgate:before{content:"\F4F8"}.fa-resolving:before{content:"\F3E7"}.fa-retweet:before{content:"\F079"}.fa-ribbon:before{content:"\F4D6"}.fa-road:before{content:"\F018"}.fa-robot:before{content:"\F544"}.fa-rocket:before{content:"\F135"}.fa-rocketchat:before{content:"\F3E8"}.fa-rockrms:before{content:"\F3E9"}.fa-rss:before{content:"\F09E"}.fa-rss-square:before{content:"\F143"}.fa-ruble-sign:before{content:"\F158"}.fa-ruler:before{content:"\F545"}.fa-ruler-combined:before{content:"\F546"}.fa-ruler-horizontal:before{content:"\F547"}.fa-ruler-vertical:before{content:"\F548"}.fa-rupee-sign:before{content:"\F156"}.fa-safari:before{content:"\F267"}.fa-sass:before{content:"\F41E"}.fa-save:before{content:"\F0C7"}.fa-schlix:before{content:"\F3EA"}.fa-school:before{content:"\F549"}.fa-screwdriver:before{content:"\F54A"}.fa-scribd:before{content:"\F28A"}.fa-search:before{content:"\F002"}.fa-search-minus:before{content:"\F010"}.fa-search-plus:before{content:"\F00E"}.fa-searchengin:before{content:"\F3EB"}.fa-seedling:before{content:"\F4D8"}.fa-sellcast:before{content:"\F2DA"}.fa-sellsy:before{content:"\F213"}.fa-server:before{content:"\F233"}.fa-servicestack:before{content:"\F3EC"}.fa-share:before{content:"\F064"}.fa-share-alt:before{content:"\F1E0"}.fa-share-alt-square:before{content:"\F1E1"}.fa-share-square:before{content:"\F14D"}.fa-shekel-sign:before{content:"\F20B"}.fa-shield-alt:before{content:"\F3ED"}.fa-ship:before{content:"\F21A"}.fa-shipping-fast:before{content:"\F48B"}.fa-shirtsinbulk:before{content:"\F214"}.fa-shoe-prints:before{content:"\F54B"}.fa-shopping-bag:before{content:"\F290"}.fa-shopping-basket:before{content:"\F291"}.fa-shopping-cart:before{content:"\F07A"}.fa-shower:before{content:"\F2CC"}.fa-sign:before{content:"\F4D9"}.fa-sign-in-alt:before{content:"\F2F6"}.fa-sign-language:before{content:"\F2A7"}.fa-sign-out-alt:before{content:"\F2F5"}.fa-signal:before{content:"\F012"}.fa-simplybuilt:before{content:"\F215"}.fa-sistrix:before{content:"\F3EE"}.fa-sitemap:before{content:"\F0E8"}.fa-sith:before{content:"\F512"}.fa-skull:before{content:"\F54C"}.fa-skyatlas:before{content:"\F216"}.fa-skype:before{content:"\F17E"}.fa-slack:before{content:"\F198"}.fa-slack-hash:before{content:"\F3EF"}.fa-sliders-h:before{content:"\F1DE"}.fa-slideshare:before{content:"\F1E7"}.fa-smile:before{content:"\F118"}.fa-smoking:before{content:"\F48D"}.fa-smoking-ban:before{content:"\F54D"}.fa-snapchat:before{content:"\F2AB"}.fa-snapchat-ghost:before{content:"\F2AC"}.fa-snapchat-square:before{content:"\F2AD"}.fa-snowflake:before{content:"\F2DC"}.fa-sort:before{content:"\F0DC"}.fa-sort-alpha-down:before{content:"\F15D"}.fa-sort-alpha-up:before{content:"\F15E"}.fa-sort-amount-down:before{content:"\F160"}.fa-sort-amount-up:before{content:"\F161"}.fa-sort-down:before{content:"\F0DD"}.fa-sort-numeric-down:before{content:"\F162"}.fa-sort-numeric-up:before{content:"\F163"}.fa-sort-up:before{content:"\F0DE"}.fa-soundcloud:before{content:"\F1BE"}.fa-space-shuttle:before{content:"\F197"}.fa-speakap:before{content:"\F3F3"}.fa-spinner:before{content:"\F110"}.fa-spotify:before{content:"\F1BC"}.fa-square:before{content:"\F0C8"}.fa-square-full:before{content:"\F45C"}.fa-stack-exchange:before{content:"\F18D"}.fa-stack-overflow:before{content:"\F16C"}.fa-star:before{content:"\F005"}.fa-star-half:before{content:"\F089"}.fa-staylinked:before{content:"\F3F5"}.fa-steam:before{content:"\F1B6"}.fa-steam-square:before{content:"\F1B7"}.fa-steam-symbol:before{content:"\F3F6"}.fa-step-backward:before{content:"\F048"}.fa-step-forward:before{content:"\F051"}.fa-stethoscope:before{content:"\F0F1"}.fa-sticker-mule:before{content:"\F3F7"}.fa-sticky-note:before{content:"\F249"}.fa-stop:before{content:"\F04D"}.fa-stop-circle:before{content:"\F28D"}.fa-stopwatch:before{content:"\F2F2"}.fa-store:before{content:"\F54E"}.fa-store-alt:before{content:"\F54F"}.fa-strava:before{content:"\F428"}.fa-stream:before{content:"\F550"}.fa-street-view:before{content:"\F21D"}.fa-strikethrough:before{content:"\F0CC"}.fa-stripe:before{content:"\F429"}.fa-stripe-s:before{content:"\F42A"}.fa-stroopwafel:before{content:"\F551"}.fa-studiovinari:before{content:"\F3F8"}.fa-stumbleupon:before{content:"\F1A4"}.fa-stumbleupon-circle:before{content:"\F1A3"}.fa-subscript:before{content:"\F12C"}.fa-subway:before{content:"\F239"}.fa-suitcase:before{content:"\F0F2"}.fa-sun:before{content:"\F185"}.fa-superpowers:before{content:"\F2DD"}.fa-superscript:before{content:"\F12B"}.fa-supple:before{content:"\F3F9"}.fa-sync:before{content:"\F021"}.fa-sync-alt:before{content:"\F2F1"}.fa-syringe:before{content:"\F48E"}.fa-table:before{content:"\F0CE"}.fa-table-tennis:before{content:"\F45D"}.fa-tablet:before{content:"\F10A"}.fa-tablet-alt:before{content:"\F3FA"}.fa-tablets:before{content:"\F490"}.fa-tachometer-alt:before{content:"\F3FD"}.fa-tag:before{content:"\F02B"}.fa-tags:before{content:"\F02C"}.fa-tape:before{content:"\F4DB"}.fa-tasks:before{content:"\F0AE"}.fa-taxi:before{content:"\F1BA"}.fa-teamspeak:before{content:"\F4F9"}.fa-telegram:before{content:"\F2C6"}.fa-telegram-plane:before{content:"\F3FE"}.fa-tencent-weibo:before{content:"\F1D5"}.fa-terminal:before{content:"\F120"}.fa-text-height:before{content:"\F034"}.fa-text-width:before{content:"\F035"}.fa-th:before{content:"\F00A"}.fa-th-large:before{content:"\F009"}.fa-th-list:before{content:"\F00B"}.fa-themeisle:before{content:"\F2B2"}.fa-thermometer:before{content:"\F491"}.fa-thermometer-empty:before{content:"\F2CB"}.fa-thermometer-full:before{content:"\F2C7"}.fa-thermometer-half:before{content:"\F2C9"}.fa-thermometer-quarter:before{content:"\F2CA"}.fa-thermometer-three-quarters:before{content:"\F2C8"}.fa-thumbs-down:before{content:"\F165"}.fa-thumbs-up:before{content:"\F164"}.fa-thumbtack:before{content:"\F08D"}.fa-ticket-alt:before{content:"\F3FF"}.fa-times:before{content:"\F00D"}.fa-times-circle:before{content:"\F057"}.fa-tint:before{content:"\F043"}.fa-toggle-off:before{content:"\F204"}.fa-toggle-on:before{content:"\F205"}.fa-toolbox:before{content:"\F552"}.fa-trade-federation:before{content:"\F513"}.fa-trademark:before{content:"\F25C"}.fa-train:before{content:"\F238"}.fa-transgender:before{content:"\F224"}.fa-transgender-alt:before{content:"\F225"}.fa-trash:before{content:"\F1F8"}.fa-trash-alt:before{content:"\F2ED"}.fa-tree:before{content:"\F1BB"}.fa-trello:before{content:"\F181"}.fa-tripadvisor:before{content:"\F262"}.fa-trophy:before{content:"\F091"}.fa-truck:before{content:"\F0D1"}.fa-truck-loading:before{content:"\F4DE"}.fa-truck-moving:before{content:"\F4DF"}.fa-tshirt:before{content:"\F553"}.fa-tty:before{content:"\F1E4"}.fa-tumblr:before{content:"\F173"}.fa-tumblr-square:before{content:"\F174"}.fa-tv:before{content:"\F26C"}.fa-twitch:before{content:"\F1E8"}.fa-twitter:before{content:"\F099"}.fa-twitter-square:before{content:"\F081"}.fa-typo3:before{content:"\F42B"}.fa-uber:before{content:"\F402"}.fa-uikit:before{content:"\F403"}.fa-umbrella:before{content:"\F0E9"}.fa-underline:before{content:"\F0CD"}.fa-undo:before{content:"\F0E2"}.fa-undo-alt:before{content:"\F2EA"}.fa-uniregistry:before{content:"\F404"}.fa-universal-access:before{content:"\F29A"}.fa-university:before{content:"\F19C"}.fa-unlink:before{content:"\F127"}.fa-unlock:before{content:"\F09C"}.fa-unlock-alt:before{content:"\F13E"}.fa-untappd:before{content:"\F405"}.fa-upload:before{content:"\F093"}.fa-usb:before{content:"\F287"}.fa-user:before{content:"\F007"}.fa-user-alt:before{content:"\F406"}.fa-user-alt-slash:before{content:"\F4FA"}.fa-user-astronaut:before{content:"\F4FB"}.fa-user-check:before{content:"\F4FC"}.fa-user-circle:before{content:"\F2BD"}.fa-user-clock:before{content:"\F4FD"}.fa-user-cog:before{content:"\F4FE"}.fa-user-edit:before{content:"\F4FF"}.fa-user-friends:before{content:"\F500"}.fa-user-graduate:before{content:"\F501"}.fa-user-lock:before{content:"\F502"}.fa-user-md:before{content:"\F0F0"}.fa-user-minus:before{content:"\F503"}.fa-user-ninja:before{content:"\F504"}.fa-user-plus:before{content:"\F234"}.fa-user-secret:before{content:"\F21B"}.fa-user-shield:before{content:"\F505"}.fa-user-slash:before{content:"\F506"}.fa-user-tag:before{content:"\F507"}.fa-user-tie:before{content:"\F508"}.fa-user-times:before{content:"\F235"}.fa-users:before{content:"\F0C0"}.fa-users-cog:before{content:"\F509"}.fa-ussunnah:before{content:"\F407"}.fa-utensil-spoon:before{content:"\F2E5"}.fa-utensils:before{content:"\F2E7"}.fa-vaadin:before{content:"\F408"}.fa-venus:before{content:"\F221"}.fa-venus-double:before{content:"\F226"}.fa-venus-mars:before{content:"\F228"}.fa-viacoin:before{content:"\F237"}.fa-viadeo:before{content:"\F2A9"}.fa-viadeo-square:before{content:"\F2AA"}.fa-vial:before{content:"\F492"}.fa-vials:before{content:"\F493"}.fa-viber:before{content:"\F409"}.fa-video:before{content:"\F03D"}.fa-video-slash:before{content:"\F4E2"}.fa-vimeo:before{content:"\F40A"}.fa-vimeo-square:before{content:"\F194"}.fa-vimeo-v:before{content:"\F27D"}.fa-vine:before{content:"\F1CA"}.fa-vk:before{content:"\F189"}.fa-vnv:before{content:"\F40B"}.fa-volleyball-ball:before{content:"\F45F"}.fa-volume-down:before{content:"\F027"}.fa-volume-off:before{content:"\F026"}.fa-volume-up:before{content:"\F028"}.fa-vuejs:before{content:"\F41F"}.fa-walking:before{content:"\F554"}.fa-wallet:before{content:"\F555"}.fa-warehouse:before{content:"\F494"}.fa-weibo:before{content:"\F18A"}.fa-weight:before{content:"\F496"}.fa-weixin:before{content:"\F1D7"}.fa-whatsapp:before{content:"\F232"}.fa-whatsapp-square:before{content:"\F40C"}.fa-wheelchair:before{content:"\F193"}.fa-whmcs:before{content:"\F40D"}.fa-wifi:before{content:"\F1EB"}.fa-wikipedia-w:before{content:"\F266"}.fa-window-close:before{content:"\F410"}.fa-window-maximize:before{content:"\F2D0"}.fa-window-minimize:before{content:"\F2D1"}.fa-window-restore:before{content:"\F2D2"}.fa-windows:before{content:"\F17A"}.fa-wine-glass:before{content:"\F4E3"}.fa-wolf-pack-battalion:before{content:"\F514"}.fa-won-sign:before{content:"\F159"}.fa-wordpress:before{content:"\F19A"}.fa-wordpress-simple:before{content:"\F411"}.fa-wpbeginner:before{content:"\F297"}.fa-wpexplorer:before{content:"\F2DE"}.fa-wpforms:before{content:"\F298"}.fa-wrench:before{content:"\F0AD"}.fa-x-ray:before{content:"\F497"}.fa-xbox:before{content:"\F412"}.fa-xing:before{content:"\F168"}.fa-xing-square:before{content:"\F169"}.fa-y-combinator:before{content:"\F23B"}.fa-yahoo:before{content:"\F19E"}.fa-yandex:before{content:"\F413"}.fa-yandex-international:before{content:"\F414"}.fa-yelp:before{content:"\F1E9"}.fa-yen-sign:before{content:"\F157"}.fa-yoast:before{content:"\F2B1"}.fa-youtube:before{content:"\F167"}.fa-youtube-square:before{content:"\F431"}.sr-only{margin:-1px}.sr-only-focusable:active,.sr-only-focusable:focus{margin:0}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url("/fonts/fa-brands-400.eot");src:url("/fonts/fa-brands-400.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-brands-400.woff2") format("woff2"),url("/fonts/fa-brands-400.woff") format("woff"),url("/fonts/fa-brands-400.ttf") format("truetype"),url("/fonts/fa-brands-400.svg#fontawesome") format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url("/fonts/fa-regular-400.eot");src:url("/fonts/fa-regular-400.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-regular-400.woff2") format("woff2"),url("/fonts/fa-regular-400.woff") format("woff"),url("/fonts/fa-regular-400.ttf") format("truetype"),url("/fonts/fa-regular-400.svg#fontawesome") format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url("/fonts/fa-solid-900.eot");src:url("/fonts/fa-solid-900.eot?#iefix") format("embedded-opentype"),url("/fonts/fa-solid-900.woff2") format("woff2"),url("/fonts/fa-solid-900.woff") format("woff"),url("/fonts/fa-solid-900.ttf") format("truetype"),url("/fonts/fa-solid-900.svg#fontawesome") format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900}
/*!
- * Bootstrap v4.1.0 (https://getbootstrap.com/)
+ * Bootstrap v4.1.2 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#007bff;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:.9rem;font-weight:400;line-height:1.6;color:#212529;text-align:left;background-color:#f5f8fa}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.8rem}.h3,h3{font-size:1.575rem}.h4,h4{font-size:1.35rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:.9rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.125rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014 \A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f5f8fa;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#f5f8fa}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#f5f8fa;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#f5f8fa;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.25);box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder,.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.19rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.6}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.7875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.6;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.68125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.6875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label:before,.was-validated .custom-file-input:valid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.25);box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(220,53,69,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label:before,.was-validated .custom-file-input:invalid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.25);box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.25);box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.5);box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.5);box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.5);box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.5);box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;background-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline;border-color:transparent}.btn-link.focus,.btn-link:focus{-webkit-box-shadow:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu,span.twitter-typeahead .tt-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.9rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu,.dropup span.twitter-typeahead .tt-menu,span.twitter-typeahead .dropup .tt-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu,.dropright span.twitter-typeahead .tt-menu,span.twitter-typeahead .dropright .tt-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu,.dropleft span.twitter-typeahead .tt-menu,span.twitter-typeahead .dropleft .tt-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top],span.twitter-typeahead .tt-menu[x-placement^=bottom],span.twitter-typeahead .tt-menu[x-placement^=left],span.twitter-typeahead .tt-menu[x-placement^=right],span.twitter-typeahead .tt-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item,span.twitter-typeahead .tt-suggestion{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover,span.twitter-typeahead .tt-suggestion:focus,span.twitter-typeahead .tt-suggestion:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active,span.twitter-typeahead .active.tt-suggestion,span.twitter-typeahead .tt-suggestion:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled,span.twitter-typeahead .disabled.tt-suggestion,span.twitter-typeahead .tt-suggestion:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show,span.twitter-typeahead .show.tt-menu{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.7875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group,.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label:after{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.9rem;font-weight:400;line-height:1.6;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.6rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,123,255,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label:before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label:before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.3rem;left:0;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background-repeat:no-repeat;background-position:50%;background-size:50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.19rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.6;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5);box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.68125rem + 2px);font-size:75%}.custom-select-lg,.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem}.custom-select-lg{height:calc(2.6875rem + 2px);font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:calc(2.19rem + 2px)}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#80bdff;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.25);box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-label:after{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-label{left:0;z-index:1;height:calc(2.19rem + 2px);background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.6;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:calc((2.19rem + 2px) - 1px * 2);content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#007bff;border:0;border-radius:1rem;-webkit-appearance:none;appearance:none}.custom-range::-webkit-slider-thumb:focus{outline:none;-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,123,255,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#b3d7ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;-moz-appearance:none;appearance:none}.custom-range::-moz-range-thumb:focus{outline:none;box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-moz-range-thumb:active{background-color:#b3d7ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#007bff;border:0;border-radius:1rem;appearance:none}.custom-range::-ms-thumb:focus{outline:none;box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,123,255,.25)}.custom-range::-ms-thumb:active{background-color:#b3d7ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#f5f8fa;border-color:#dee2e6 #dee2e6 #f5f8fa}.nav-tabs .dropdown-menu,.nav-tabs span.twitter-typeahead .tt-menu,span.twitter-typeahead .nav-tabs .tt-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.32rem;padding-bottom:.32rem;margin-right:1rem;font-size:1.125rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu,.navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-nav .tt-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.125rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu,.navbar-expand-sm .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-sm .navbar-nav .tt-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu,.navbar-expand-md .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-md .navbar-nav .tt-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu,.navbar-expand-lg .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-lg .navbar-nav .tt-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu,.navbar-expand-xl .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-xl .navbar-nav .tt-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu,.navbar-expand .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand .navbar-nav .tt-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck,.card-deck .card{-webkit-box-direction:normal}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,123,255,.25);box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.125rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.85rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;overflow:hidden;font-size:.675rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;-webkit-transition:width .6s ease;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.35rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal,.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-25%);transform:translateY(-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0);transform:translate(0)}.modal-dialog-centered{-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-content,.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex}.modal-content{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.6}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:after,.bs-popover-top .arrow:before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-top .arrow:after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:after,.bs-popover-right .arrow:before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-right .arrow:after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:after,.bs-popover-bottom .arrow:before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-bottom .arrow:after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:after,.bs-popover-left .arrow:before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-left .arrow:after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.9rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}@media screen and (prefers-reduced-motion:reduce){.carousel-item{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateZ(0);transform:translateZ(0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-property:opacity;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateZ(0);transform:translateZ(0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:hsla(0,0%,100%,.5)}.carousel-indicators li:before{top:-10px}.carousel-indicators li:after,.carousel-indicators li:before{position:absolute;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li:after{bottom:-10px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}}body,html{min-height:100vh}body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}#content{margin-bottom:auto!important}body,button,input,textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.navbar-laravel{background-color:#fff;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.04)}.bg-pixelfed{background:#10c5f8;background:-webkit-gradient(linear,left top,right bottom,from(#6736dd),to(#10c5f8));background:linear-gradient(to bottom right,#6736dd,#10c5f8)}@media (min-width:1200px){.container{max-width:935px}}.text-dark{color:#212529!important}.search-form{min-width:125px;width:265px}.search-form .form-control,.search-form .form-inline,.search-form input{width:100%}.settings-nav .active{border-left:2px solid #6c757d!important}.settings-nav .active .nav-link{font-weight:700}.card-disabled{background-color:#f5f5f5;opacity:.4}.card-img-top{height:auto}.card.status-container .status-photo{margin:auto!important}@media (min-width:768px){.card.status-container .status-comments{overflow-y:scroll;border-bottom:1px solid rgba(0,0,0,.1);height:200px}}.no-caret.dropdown-toggle{text-decoration:none!important}.no-caret.dropdown-toggle:after{display:none}.notification-page .profile-link{color:#212529;font-weight:700}.notification-page .list-group-item:first-child{border-top:none}.nav-topbar{border-top:1px solid #dee2e6}.nav-topbar .nav-item{margin:-1px 1.5rem 0}.nav-topbar .nav-link{border:1px solid transparent;color:#dee2e6;padding:.75rem 0}.nav-topbar .nav-link:focus,.nav-topbar .nav-link:hover{border-top-color:#dee2e6}.nav-topbar .nav-link.disabled{color:#dee2e6;background-color:transparent;border-color:transparent}.nav-topbar .nav-item.show .nav-link,.nav-topbar .nav-link.active{color:#6c757d;border-top-color:#6c757d}.nav-topbar .dropdown-menu,.nav-topbar span.twitter-typeahead .tt-menu,span.twitter-typeahead .nav-topbar .tt-menu{margin-top:-1px}.info-overlay{position:relative}.info-overlay .info-overlay-text{display:none;position:absolute}.info-overlay:hover .info-overlay-text{display:-webkit-box;display:-ms-flexbox;display:flex}.info-overlay-text{width:100%;height:100%;background-color:rgba(0,0,0,.5)}.font-weight-ultralight{font-weight:200!important}.square{position:relative;width:100%}.square:after{content:"";display:block;padding-bottom:100%}.square-content{position:absolute;width:100%;height:100%;background-repeat:no-repeat;background-size:cover;background-position:50%}@media (max-width:768px){.border-md-left-0{border-left:0!important}}.fas.fa-heart{color:#f70ec4!important}@media (max-width:768px){.border-md-left-0{border-left:0!important}.card.status-container .status-comments{border-top:1px solid rgba(0,0,0,.1)}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@-webkit-keyframes loading-bar{0%{background-position:0 0}to{background-position:100vw 0}}@keyframes loading-bar{0%{background-position:0 0}to{background-position:100vw 0}}.loading-page{background-image:-webkit-gradient(linear,left top,right top,from(#6736dd),color-stop(#10c5f8),color-stop(#10c5f8),to(#6736dd));background-image:linear-gradient(90deg,#6736dd,#10c5f8,#10c5f8,#6736dd);width:100vw;height:.25rem;-webkit-animation:loading-bar 3s linear infinite;animation:loading-bar 3s linear infinite}span.twitter-typeahead{width:100%}span.twitter-typeahead .tt-menu{width:100%;max-height:365px;overflow-y:auto}span.twitter-typeahead .tt-suggestion.tt-cursor,span.twitter-typeahead .tt-suggestion:active{color:#212529;background:#fafafa}.input-group span.twitter-typeahead{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%}.input-group span.twitter-typeahead .tt-hint,.input-group span.twitter-typeahead .tt-input,.input-group span.twitter-typeahead .tt-menu{width:100%}.notification-page .list-group-item{border-left:0!important;border-right:0!important;border-bottom:0!important;background:transparent;padding-top:1rem;padding-bottom:1rem}
\ No newline at end of file
+ */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#6c757d;--gray-dark:#343a40;--primary:#08d;--secondary:#6c757d;--success:#28a745;--info:#17a2b8;--warning:#ffc107;--danger:#dc3545;--light:#f8f9fa;--dark:#343a40;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}@-ms-viewport{width:device-width}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:.9rem;font-weight:400;line-height:1.6;color:#212529;text-align:left;background-color:#f5f8fa}[tabindex="-1"]:focus{outline:0!important}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#08d;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#005991;text-decoration:underline}a:not([href]):not([tabindex]),a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{border-style:none}img,svg:not(:root){vertical-align:middle}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.2;color:inherit}.h1,h1{font-size:2.25rem}.h2,h2{font-size:1.8rem}.h3,h3{font-size:1.575rem}.h4,h4{font-size:1.35rem}.h5,h5{font-size:1.125rem}.h6,h6{font-size:.9rem}.lead{font-size:1.125rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.125rem}.blockquote-footer{display:block;font-size:80%;color:#6c757d}.blockquote-footer:before{content:"\2014 \A0"}.img-fluid,.img-thumbnail{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#f5f8fa;border:1px solid #dee2e6;border-radius:.25rem}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#6c757d}code{font-size:87.5%;color:#e83e8c;word-break:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1,.col-auto{-webkit-box-flex:0}.col-1{-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-2,.col-3{-webkit-box-flex:0}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-4,.col-5{-webkit-box-flex:0}.col-5{-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-6,.col-7{-webkit-box-flex:0}.col-7{-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-8,.col-9{-webkit-box-flex:0}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-10,.col-11{-webkit-box-flex:0}.col-11{-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.33333333%;flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.66666667%;flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.33333333%;flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.66666667%;flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.33333333%;flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.66666667%;flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.33333333%;flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.66666667%;flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#f5f8fa}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8def5}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#a2d4f2}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th,.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#f5f8fa;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#f5f8fa;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;-webkit-transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.form-control{-webkit-transition:none;transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#5ec1ff;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 .2rem rgba(0,136,221,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder,.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:2.375rem}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.6}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.125rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.7875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.6;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:1.9375rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:3rem}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control-file.is-valid~.valid-feedback,.form-control-file.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control-file:valid~.valid-feedback,.was-validated .form-control-file:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label:before,.was-validated .custom-file-input:valid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.25);box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.25);box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control-file.is-invalid~.invalid-feedback,.form-control-file.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control-file:invalid~.invalid-feedback,.was-validated .form-control-file:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(220,53,69,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label:before,.was-validated .custom-file-input:invalid~.custom-file-label:before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.25);box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .form-group,.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:0}.form-inline .form-group{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:.9rem;line-height:1.6;border-radius:.25rem;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.btn{-webkit-transition:none;transition:none}}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 .2rem rgba(0,136,221,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#08d;border-color:#08d}.btn-primary:hover{color:#fff;background-color:#0070b7;border-color:#0069aa}.btn-primary.focus,.btn-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.5);box-shadow:0 0 0 .2rem rgba(0,136,221,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#08d;border-color:#08d}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0069aa;border-color:#00619d}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.5);box-shadow:0 0 0 .2rem rgba(0,136,221,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#08d;background-color:transparent;background-image:none;border-color:#08d}.btn-outline-primary:hover{color:#fff;background-color:#08d;border-color:#08d}.btn-outline-primary.focus,.btn-outline-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.5);box-shadow:0 0 0 .2rem rgba(0,136,221,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#08d;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#08d;border-color:#08d}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.5);box-shadow:0 0 0 .2rem rgba(0,136,221,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5);box-shadow:0 0 0 .2rem hsla(208,7%,46%,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(40,167,69,.5);box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(23,162,184,.5);box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(255,193,7,.5);box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(220,53,69,.5);box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(248,249,250,.5);box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{-webkit-box-shadow:0 0 0 .2rem rgba(52,58,64,.5);box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#08d;background-color:transparent}.btn-link:hover{color:#005991;background-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline;border-color:transparent}.btn-link.focus,.btn-link:focus{-webkit-box-shadow:none;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d;pointer-events:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.125rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}@media screen and (prefers-reduced-motion:reduce){.fade{-webkit-transition:none;transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@media screen and (prefers-reduced-motion:reduce){.collapsing{-webkit-transition:none;transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu,span.twitter-typeahead .tt-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:.9rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu-right{right:0;left:auto}.dropup .dropdown-menu,.dropup span.twitter-typeahead .tt-menu,span.twitter-typeahead .dropup .tt-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu,.dropright span.twitter-typeahead .tt-menu,span.twitter-typeahead .dropright .tt-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu,.dropleft span.twitter-typeahead .tt-menu,span.twitter-typeahead .dropleft .tt-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle:after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";display:none}.dropleft .dropdown-toggle:before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top],span.twitter-typeahead .tt-menu[x-placement^=bottom],span.twitter-typeahead .tt-menu[x-placement^=left],span.twitter-typeahead .tt-menu[x-placement^=right],span.twitter-typeahead .tt-menu[x-placement^=top]{right:auto;bottom:auto}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item,span.twitter-typeahead .tt-suggestion{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover,span.twitter-typeahead .tt-suggestion:focus,span.twitter-typeahead .tt-suggestion:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active,span.twitter-typeahead .active.tt-suggestion,span.twitter-typeahead .tt-suggestion:active{color:#fff;text-decoration:none;background-color:#08d}.dropdown-item.disabled,.dropdown-item:disabled,span.twitter-typeahead .disabled.tt-suggestion,span.twitter-typeahead .tt-suggestion:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show,span.twitter-typeahead .show.tt-menu{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.7875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#212529}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group,.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio],.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:.9rem;font-weight:400;line-height:1.6;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.6rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label:before{color:#fff;background-color:#08d}.custom-control-input:focus~.custom-control-label:before{-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,136,221,.25)}.custom-control-input:active~.custom-control-label:before{color:#fff;background-color:#91d5ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label:before{background-color:#e9ecef}.custom-control-label{position:relative;margin-bottom:0}.custom-control-label:before{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label:after,.custom-control-label:before{position:absolute;top:.3rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:""}.custom-control-label:after{background-repeat:no-repeat;background-position:50%;background-size:50% 50%}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:before{background-color:#08d}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='white' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#08d}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='white' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,136,221,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(0,136,221,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:before{background-color:#08d}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='white'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(0,136,221,.5)}.custom-select{display:inline-block;width:100%;height:2.375rem;padding:.375rem 1.75rem .375rem .75rem;line-height:1.6;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#5ec1ff;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(94,193,255,.5);box-shadow:0 0 0 .2rem rgba(94,193,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:1.9375rem;font-size:75%}.custom-select-lg,.custom-select-sm{padding-top:.375rem;padding-bottom:.375rem}.custom-select-lg{height:3rem;font-size:125%}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{position:relative;width:100%;height:2.375rem}.custom-file-input{z-index:2;margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#5ec1ff;-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 .2rem rgba(0,136,221,.25)}.custom-file-input:focus~.custom-file-label:after{border-color:#5ec1ff}.custom-file-input:disabled~.custom-file-label{background-color:#e9ecef}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-label{left:0;z-index:1;height:2.375rem;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label,.custom-file-label:after{position:absolute;top:0;right:0;padding:.375rem .75rem;line-height:1.6;color:#495057}.custom-file-label:after{bottom:0;z-index:3;display:block;height:2.19rem;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;padding-left:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#08d;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:focus{outline:none;-webkit-box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,136,221,.25)}.custom-range::-webkit-slider-thumb:active{background-color:#91d5ff}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#08d;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-webkit-transition:none;transition:none}}.custom-range::-moz-range-thumb:focus{outline:none;box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,136,221,.25)}.custom-range::-moz-range-thumb:active{background-color:#91d5ff}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.custom-range::-ms-thumb{width:1rem;height:1rem;background-color:#08d;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;appearance:none}@media screen and (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-webkit-transition:none;transition:none}}.custom-range::-ms-thumb:focus{outline:none;box-shadow:0 0 0 1px #f5f8fa,0 0 0 .2rem rgba(0,136,221,.25)}.custom-range::-ms-thumb:active{background-color:#91d5ff}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:transparent;border-color:transparent;border-width:.5rem}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#dee2e6;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,-webkit-box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,-webkit-box-shadow .15s ease-in-out}@media screen and (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{-webkit-transition:none;transition:none}}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#f5f8fa;border-color:#dee2e6 #dee2e6 #f5f8fa}.nav-tabs .dropdown-menu,.nav-tabs span.twitter-typeahead .tt-menu,span.twitter-typeahead .nav-tabs .tt-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#08d}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;padding:.5rem 1rem}.navbar,.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.32rem;padding-bottom:.32rem;margin-right:1rem;font-size:1.125rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu,.navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-nav .tt-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.125rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat 50%;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm,.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu,.navbar-expand-sm .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-sm .navbar-nav .tt-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md,.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu,.navbar-expand-md .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-md .navbar-nav .tt-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg,.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu,.navbar-expand-lg .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-lg .navbar-nav .tt-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl,.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu,.navbar-expand-xl .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand-xl .navbar-nav .tt-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu,.navbar-expand .navbar-nav span.twitter-typeahead .tt-menu,span.twitter-typeahead .navbar-expand .navbar-nav .tt-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:hsla(0,0%,100%,.5);border-color:hsla(0,0%,100%,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck,.card-deck .card{-webkit-box-direction:normal}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child),.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion .card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion .card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion .card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion .card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{display:inline-block;padding-right:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#08d;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{z-index:2;color:#005991;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 .2rem rgba(0,136,221,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:1;color:#fff;background-color:#08d;border-color:#08d}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.125rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.7875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#08d}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0069aa}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3.85rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004773;background-color:#cce7f8;border-color:#b8def5}.alert-primary hr{border-top-color:#a2d4f2}.alert-primary .alert-link{color:#002840}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{height:1rem;overflow:hidden;font-size:.675rem;background-color:#e9ecef;border-radius:.25rem}.progress,.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex}.progress-bar{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#08d;-webkit-transition:width .6s ease;transition:width .6s ease}@media screen and (prefers-reduced-motion:reduce){.progress-bar{-webkit-transition:none;transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#08d;border-color:#08d}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004773;background-color:#b8def5}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004773;background-color:#a2d4f2}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004773;border-color:#004773}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.35rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:not(:disabled):not(.disabled){cursor:pointer}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal,.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translateY(-25%);transform:translateY(-25%)}@media screen and (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{-webkit-transition:none;transition:none}}.modal.show .modal-dialog{-webkit-transform:translate(0);transform:translate(0)}.modal-dialog-centered{-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - 1rem)}.modal-content,.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex}.modal-content{position:relative;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.6}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow:before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{top:0;left:0;z-index:1060;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.6;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.7875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover,.popover .arrow{position:absolute;display:block}.popover .arrow{width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow:after,.popover .arrow:before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:after,.bs-popover-top .arrow:before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow:before,.bs-popover-top .arrow:before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow:after,.bs-popover-top .arrow:after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:after,.bs-popover-right .arrow:before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow:before,.bs-popover-right .arrow:before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow:after,.bs-popover-right .arrow:after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:after,.bs-popover-bottom .arrow:before{border-width:0 .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow:before,.bs-popover-bottom .arrow:before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow:after,.bs-popover-bottom .arrow:after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:after,.bs-popover-left .arrow:before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow:before,.bs-popover-left .arrow:before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow:after,.bs-popover-left .arrow:after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:.9rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block;-webkit-transition:-webkit-transform .6s ease;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease}@media screen and (prefers-reduced-motion:reduce){.carousel-item-next,.carousel-item-prev,.carousel-item.active{-webkit-transition:none;transition:none}}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateZ(0);transform:translateZ(0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-fade .carousel-item{opacity:0;-webkit-transition-duration:.6s;transition-duration:.6s;-webkit-transition-property:opacity;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-prev,.carousel-fade .carousel-item-next,.carousel-fade .carousel-item-prev,.carousel-fade .carousel-item.active{-webkit-transform:translateZ(0);transform:translateZ(0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat 50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='white' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='white' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:hsla(0,0%,100%,.5)}.carousel-indicators li:before{top:-10px}.carousel-indicators li:after,.carousel-indicators li:before{position:absolute;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li:after{bottom:-10px}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#08d!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0069aa!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#08d!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix:after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive:before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column,.flex-row{-webkit-box-direction:normal!important}.flex-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse,.flex-row-reverse{-webkit-box-direction:reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column,.flex-sm-row{-webkit-box-direction:normal!important}.flex-sm-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-sm-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-sm-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-sm-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-sm-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-sm-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column,.flex-md-row{-webkit-box-direction:normal!important}.flex-md-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-md-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-md-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-md-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-md-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-md-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column,.flex-lg-row{-webkit-box-direction:normal!important}.flex-lg-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-lg-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-lg-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-lg-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-lg-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-lg-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column,.flex-xl-row{-webkit-box-direction:normal!important}.flex-xl-column{-webkit-box-orient:vertical!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.flex-xl-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-xl-grow-0{-webkit-box-flex:0!important;-ms-flex-positive:0!important;flex-grow:0!important}.flex-xl-grow-1{-webkit-box-flex:1!important;-ms-flex-positive:1!important;flex-grow:1!important}.flex-xl-shrink-0{-ms-flex-negative:0!important;flex-shrink:0!important}.flex-xl-shrink-1{-ms-flex-negative:1!important;flex-shrink:1!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{position:fixed;right:0;left:0;z-index:1030}.fixed-bottom{bottom:0}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{-webkit-box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important;box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{-webkit-box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important;box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#08d!important}a.text-primary:focus,a.text-primary:hover{color:#0069aa!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #adb5bd;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #dee2e6!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#dee2e6}.table .thead-dark th{color:inherit;border-color:#dee2e6}}body,html{min-height:100vh}body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}#content{margin-bottom:auto!important}body,button,input,textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.navbar-laravel{background-color:#fff;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.04);box-shadow:0 2px 4px rgba(0,0,0,.04)}.bg-pixelfed{background:#10c5f8;background:-webkit-gradient(linear,left top,right bottom,from(#6736dd),to(#10c5f8));background:linear-gradient(to bottom right,#6736dd,#10c5f8)}@media (min-width:1200px){.container{max-width:935px}}.text-dark{color:#212529!important}.search-form{min-width:125px;width:265px}.search-form .form-control,.search-form .form-inline,.search-form input{width:100%}.settings-nav .active{border-left:2px solid #6c757d!important}.settings-nav .active .nav-link{font-weight:700}.card-disabled{background-color:#f5f5f5;opacity:.4}.card-img-top{height:auto}.card.status-container .status-photo{margin:auto!important}@media (min-width:768px){.card.status-container .status-comments{overflow-y:scroll;border-bottom:1px solid rgba(0,0,0,.1);height:200px}}.no-caret.dropdown-toggle{text-decoration:none!important}.no-caret.dropdown-toggle:after{display:none}.notification-page .profile-link{color:#212529;font-weight:700}.notification-page .list-group-item:first-child{border-top:none}.nav-topbar{border-top:1px solid #dee2e6}.nav-topbar .nav-item{margin:-1px 1.5rem 0}.nav-topbar .nav-link{border:1px solid transparent;color:#dee2e6;padding:.75rem 0}.nav-topbar .nav-link:focus,.nav-topbar .nav-link:hover{border-top-color:#dee2e6}.nav-topbar .nav-link.disabled{color:#dee2e6;background-color:transparent;border-color:transparent}.nav-topbar .nav-item.show .nav-link,.nav-topbar .nav-link.active{color:#6c757d;border-top-color:#6c757d}.nav-topbar .dropdown-menu,.nav-topbar span.twitter-typeahead .tt-menu,span.twitter-typeahead .nav-topbar .tt-menu{margin-top:-1px}.info-overlay{position:relative}.info-overlay .info-overlay-text{display:none;position:absolute}.info-overlay:hover .info-overlay-text{display:-webkit-box;display:-ms-flexbox;display:flex}.info-overlay-text{width:100%;height:100%;background-color:rgba(0,0,0,.5)}.font-weight-ultralight{font-weight:200!important}.square{position:relative;width:100%}.square:after{content:"";display:block;padding-bottom:100%}.square-content{position:absolute;width:100%;height:100%;background-repeat:no-repeat;background-size:cover;background-position:50%}@media (max-width:768px){.border-md-left-0{border-left:0!important}.card.status-container .status-comments{border-top:1px solid rgba(0,0,0,.1)}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (max-width:576px){.card-md-rounded-0{border-width:1px 0;border-radius:0!important}}@-webkit-keyframes loading-bar{0%{background-position:0 0}to{background-position:100vw 0}}@keyframes loading-bar{0%{background-position:0 0}to{background-position:100vw 0}}.loading-page{background-image:-webkit-gradient(linear,left top,right top,from(#6736dd),color-stop(#10c5f8),color-stop(#10c5f8),to(#6736dd));background-image:linear-gradient(90deg,#6736dd,#10c5f8,#10c5f8,#6736dd);width:100vw;height:.25rem;-webkit-animation:loading-bar 3s linear infinite;animation:loading-bar 3s linear infinite}.max-hide-overflow{max-height:500px;overflow-y:hidden}@media (min-width:0){.max-hide-overflow{max-height:600px!important}}@media (min-width:768px){.max-hide-overflow{max-height:800px!important}}@media (min-width:1200px){.max-hide-overflow{max-height:1000px!important}}.notification-image{background-size:cover;width:32px;height:32px;background-position:50%}.status-photo img{-o-object-fit:contain;object-fit:contain;max-height:calc(100vh - 6rem)}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-1.25em);transform:translateY(-1.25em)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-1.25em);transform:translateY(-1.25em)}to{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.details-animated[open]{-webkit-animation-name:fadeInDown;animation-name:fadeInDown;-webkit-animation-duration:.5s;animation-duration:.5s}.card{border:none}.box-shadow,.card{-webkit-box-shadow:0 2px 6px 0 rgba(0,0,0,.2);box-shadow:0 2px 6px 0 rgba(0,0,0,.2)}.border-left-primary{border-left:3px solid #007bff}.settings-nav .nav-item.active .nav-link{font-weight:700!important}details summary::-webkit-details-marker{display:none!important}.details-animated>summary{display:block;background-color:#ecf0f1;padding-top:50px;padding-bottom:50px;text-align:center}.details-animated[open]>summary{display:none!important}
+
+/*! Instagram.css v0.1.3 | MIT License | github.com/picturepan2/instagram.css */[class*=filter]{position:relative}[class*=filter]:before{display:block;height:100%;left:0;position:absolute;top:0;width:100%;z-index:1}.filter-1977{-webkit-filter:sepia(.5) hue-rotate(-30deg) saturate(1.4);filter:sepia(.5) hue-rotate(-30deg) saturate(1.4)}.filter-aden{-webkit-filter:sepia(.2) brightness(1.15) saturate(1.4);filter:sepia(.2) brightness(1.15) saturate(1.4)}.filter-aden:before{background:rgba(125,105,24,.1);content:"";mix-blend-mode:multiply}.filter-amaro{-webkit-filter:sepia(.35) contrast(1.1) brightness(1.2) saturate(1.3);filter:sepia(.35) contrast(1.1) brightness(1.2) saturate(1.3)}.filter-amaro:before{background:rgba(125,105,24,.2);content:"";mix-blend-mode:overlay}.filter-ashby{-webkit-filter:sepia(.5) contrast(1.2) saturate(1.8);filter:sepia(.5) contrast(1.2) saturate(1.8)}.filter-ashby:before{background:rgba(125,105,24,.35);content:"";mix-blend-mode:lighten}.filter-brannan{-webkit-filter:sepia(.4) contrast(1.25) brightness(1.1) saturate(.9) hue-rotate(-2deg);filter:sepia(.4) contrast(1.25) brightness(1.1) saturate(.9) hue-rotate(-2deg)}.filter-brooklyn{-webkit-filter:sepia(.25) contrast(1.25) brightness(1.25) hue-rotate(5deg);filter:sepia(.25) contrast(1.25) brightness(1.25) hue-rotate(5deg)}.filter-brooklyn:before{background:rgba(127,187,227,.2);content:"";mix-blend-mode:overlay}.filter-charmes{-webkit-filter:sepia(.25) contrast(1.25) brightness(1.25) saturate(1.35) hue-rotate(-5deg);filter:sepia(.25) contrast(1.25) brightness(1.25) saturate(1.35) hue-rotate(-5deg)}.filter-charmes:before{background:rgba(125,105,24,.25);content:"";mix-blend-mode:darken}.filter-clarendon{-webkit-filter:sepia(.15) contrast(1.25) brightness(1.25) hue-rotate(5deg);filter:sepia(.15) contrast(1.25) brightness(1.25) hue-rotate(5deg)}.filter-clarendon:before{background:rgba(127,187,227,.4);content:"";mix-blend-mode:overlay}.filter-crema{-webkit-filter:sepia(.5) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-2deg);filter:sepia(.5) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-2deg)}.filter-crema:before{background:rgba(125,105,24,.2);content:"";mix-blend-mode:multiply}.filter-dogpatch{-webkit-filter:sepia(.35) saturate(1.1) contrast(1.5);filter:sepia(.35) saturate(1.1) contrast(1.5)}.filter-earlybird{-webkit-filter:sepia(.25) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-5deg);filter:sepia(.25) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-5deg)}.filter-earlybird:before{background:radial-gradient(circle closest-corner,transparent 0,rgba(125,105,24,.2) 100%);background:-webkit-radial-gradient(circle closest-corner,transparent 0,rgba(125,105,24,.2) 100%);content:"";mix-blend-mode:multiply}.filter-gingham{-webkit-filter:contrast(1.1) brightness(1.1);filter:contrast(1.1) brightness(1.1)}.filter-gingham:before{background:#e6e6e6;content:"";mix-blend-mode:soft-light}.filter-ginza{-webkit-filter:sepia(.25) contrast(1.15) brightness(1.2) saturate(1.35) hue-rotate(-5deg);filter:sepia(.25) contrast(1.15) brightness(1.2) saturate(1.35) hue-rotate(-5deg)}.filter-ginza:before{background:rgba(125,105,24,.15);content:"";mix-blend-mode:darken}.filter-hefe{-webkit-filter:sepia(.4) contrast(1.5) brightness(1.2) saturate(1.4) hue-rotate(-10deg);filter:sepia(.4) contrast(1.5) brightness(1.2) saturate(1.4) hue-rotate(-10deg)}.filter-hefe:before{background:radial-gradient(circle closest-corner,transparent 0,rgba(0,0,0,.25) 100%);background:-webkit-radial-gradient(circle closest-corner,transparent 0,rgba(0,0,0,.25) 100%);content:"";mix-blend-mode:multiply}.filter-helena{-webkit-filter:sepia(.5) contrast(1.05) brightness(1.05) saturate(1.35);filter:sepia(.5) contrast(1.05) brightness(1.05) saturate(1.35)}.filter-helena:before{background:rgba(158,175,30,.25);content:"";mix-blend-mode:overlay}.filter-hudson{-webkit-filter:sepia(.25) contrast(1.2) brightness(1.2) saturate(1.05) hue-rotate(-15deg);filter:sepia(.25) contrast(1.2) brightness(1.2) saturate(1.05) hue-rotate(-15deg)}.filter-hudson:before{background:radial-gradient(circle closest-corner,transparent 25%,rgba(25,62,167,.25) 100%);background:-webkit-radial-gradient(circle closest-corner,transparent 25%,rgba(25,62,167,.25) 100%);content:"";mix-blend-mode:multiply}.filter-inkwell{-webkit-filter:brightness(1.25) contrast(.85) grayscale(1);filter:brightness(1.25) contrast(.85) grayscale(1)}.filter-juno{-webkit-filter:sepia(.35) contrast(1.15) brightness(1.15) saturate(1.8);filter:sepia(.35) contrast(1.15) brightness(1.15) saturate(1.8)}.filter-juno:before{background:rgba(127,187,227,.2);content:"";mix-blend-mode:overlay}.filter-kelvin{-webkit-filter:sepia(.15) contrast(1.5) brightness(1.1) hue-rotate(-10deg);filter:sepia(.15) contrast(1.5) brightness(1.1) hue-rotate(-10deg)}.filter-kelvin:before{background:radial-gradient(circle closest-corner,rgba(128,78,15,.25) 0,rgba(128,78,15,.5) 100%);background:-webkit-radial-gradient(circle closest-corner,rgba(128,78,15,.25) 0,rgba(128,78,15,.5) 100%);content:"";mix-blend-mode:overlay}.filter-lark{-webkit-filter:sepia(.25) contrast(1.2) brightness(1.3) saturate(1.25);filter:sepia(.25) contrast(1.2) brightness(1.3) saturate(1.25)}.filter-lofi{-webkit-filter:saturate(1.1) contrast(1.5);filter:saturate(1.1) contrast(1.5)}.filter-ludwig{-webkit-filter:sepia(.25) contrast(1.05) brightness(1.05) saturate(2);filter:sepia(.25) contrast(1.05) brightness(1.05) saturate(2)}.filter-ludwig:before{background:rgba(125,105,24,.1);content:"";mix-blend-mode:overlay}.filter-maven{-webkit-filter:sepia(.35) contrast(1.05) brightness(1.05) saturate(1.75);filter:sepia(.35) contrast(1.05) brightness(1.05) saturate(1.75)}.filter-maven:before{background:rgba(158,175,30,.25);content:"";mix-blend-mode:darken}.filter-mayfair{-webkit-filter:contrast(1.1) brightness(1.15) saturate(1.1);filter:contrast(1.1) brightness(1.15) saturate(1.1)}.filter-mayfair:before{background:radial-gradient(circle closest-corner,transparent 0,rgba(175,105,24,.4) 100%);background:-webkit-radial-gradient(circle closest-corner,transparent 0,rgba(175,105,24,.4) 100%);content:"";mix-blend-mode:multiply}.filter-moon{-webkit-filter:brightness(1.4) contrast(.95) saturate(0) sepia(.35);filter:brightness(1.4) contrast(.95) saturate(0) sepia(.35)}.filter-nashville{-webkit-filter:sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg);filter:sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg)}.filter-nashville:before{background:radial-gradient(circle closest-corner,rgba(128,78,15,.5) 0,rgba(128,78,15,.65) 100%);background:-webkit-radial-gradient(circle closest-corner,rgba(128,78,15,.5) 0,rgba(128,78,15,.65) 100%);content:"";mix-blend-mode:screen}.filter-perpetua{-webkit-filter:contrast(1.1) brightness(1.25) saturate(1.1);filter:contrast(1.1) brightness(1.25) saturate(1.1)}.filter-perpetua:before{background:linear-gradient(180deg,rgba(0,91,154,.25),rgba(230,193,61,.25));background:-webkit-linear-gradient(top,rgba(0,91,154,.25),rgba(230,193,61,.25));background:-webkit-gradient(linear,left top,left bottom,from(rgba(0,91,154,.25)),to(rgba(230,193,61,.25)));content:"";mix-blend-mode:multiply}.filter-poprocket{-webkit-filter:sepia(.15) brightness(1.2);filter:sepia(.15) brightness(1.2)}.filter-poprocket:before{background:radial-gradient(circle closest-corner,rgba(206,39,70,.75) 40%,#000 80%);background:-webkit-radial-gradient(circle closest-corner,rgba(206,39,70,.75) 40%,#000 80%);content:"";mix-blend-mode:screen}.filter-reyes{-webkit-filter:sepia(.75) contrast(.75) brightness(1.25) saturate(1.4);filter:sepia(.75) contrast(.75) brightness(1.25) saturate(1.4)}.filter-rise{-webkit-filter:sepia(.25) contrast(1.25) brightness(1.2) saturate(.9);filter:sepia(.25) contrast(1.25) brightness(1.2) saturate(.9)}.filter-rise:before{background:radial-gradient(circle closest-corner,transparent 0,rgba(230,193,61,.25) 100%);background:-webkit-radial-gradient(circle closest-corner,transparent 0,rgba(230,193,61,.25) 100%);content:"";mix-blend-mode:lighten}.filter-sierra{-webkit-filter:sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg);filter:sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg)}.filter-sierra:before{background:radial-gradient(circle closest-corner,rgba(128,78,15,.5) 0,rgba(0,0,0,.65) 100%);background:-webkit-radial-gradient(circle closest-corner,rgba(128,78,15,.5) 0,rgba(0,0,0,.65) 100%);content:"";mix-blend-mode:screen}.filter-skyline{-webkit-filter:sepia(.15) contrast(1.25) brightness(1.25) saturate(1.2);filter:sepia(.15) contrast(1.25) brightness(1.25) saturate(1.2)}.filter-slumber{-webkit-filter:sepia(.35) contrast(1.25) saturate(1.25);filter:sepia(.35) contrast(1.25) saturate(1.25)}.filter-slumber:before{background:rgba(125,105,24,.2);content:"";mix-blend-mode:darken}.filter-stinson{-webkit-filter:sepia(.35) contrast(1.25) brightness(1.1) saturate(1.25);filter:sepia(.35) contrast(1.25) brightness(1.1) saturate(1.25)}.filter-stinson:before{background:rgba(125,105,24,.45);content:"";mix-blend-mode:lighten}.filter-sutro{-webkit-filter:sepia(.4) contrast(1.2) brightness(.9) saturate(1.4) hue-rotate(-10deg);filter:sepia(.4) contrast(1.2) brightness(.9) saturate(1.4) hue-rotate(-10deg)}.filter-sutro:before{background:radial-gradient(circle closest-corner,transparent 50%,rgba(0,0,0,.5) 90%);background:-webkit-radial-gradient(circle closest-corner,transparent 50%,rgba(0,0,0,.5) 90%);content:"";mix-blend-mode:darken}.filter-toaster{-webkit-filter:sepia(.25) contrast(1.5) brightness(.95) hue-rotate(-15deg);filter:sepia(.25) contrast(1.5) brightness(.95) hue-rotate(-15deg)}.filter-toaster:before{background:radial-gradient(circle,#804e0f,rgba(0,0,0,.25));background:-webkit-radial-gradient(circle,#804e0f,rgba(0,0,0,.25));content:"";mix-blend-mode:screen}.filter-valencia{-webkit-filter:sepia(.25) contrast(1.1) brightness(1.1);filter:sepia(.25) contrast(1.1) brightness(1.1)}.filter-valencia:before{background:rgba(230,193,61,.1);content:"";mix-blend-mode:lighten}.filter-vesper{-webkit-filter:sepia(.35) contrast(1.15) brightness(1.2) saturate(1.3);filter:sepia(.35) contrast(1.15) brightness(1.2) saturate(1.3)}.filter-vesper:before{background:rgba(125,105,24,.25);content:"";mix-blend-mode:overlay}.filter-walden{-webkit-filter:sepia(.35) contrast(.8) brightness(1.25) saturate(1.4);filter:sepia(.35) contrast(.8) brightness(1.25) saturate(1.4)}.filter-walden:before{background:hsla(66,79%,72%,.5);content:"";mix-blend-mode:darken}.filter-willow{-webkit-filter:brightness(1.2) contrast(.85) saturate(.05) sepia(.2);filter:brightness(1.2) contrast(.85) saturate(.05) sepia(.2)}.filter-xpro-ii{-webkit-filter:sepia(.45) contrast(1.25) brightness(1.75) saturate(1.3) hue-rotate(-5deg);filter:sepia(.45) contrast(1.25) brightness(1.75) saturate(1.3) hue-rotate(-5deg)}.filter-xpro-ii:before{background:radial-gradient(circle closest-corner,rgba(0,91,154,.35) 0,rgba(0,0,0,.65) 100%);background:-webkit-radial-gradient(circle closest-corner,rgba(0,91,154,.35) 0,rgba(0,0,0,.65) 100%);content:"";mix-blend-mode:multiply}span.twitter-typeahead{width:100%}span.twitter-typeahead .tt-menu{width:100%;max-height:365px;overflow-y:auto}span.twitter-typeahead .tt-suggestion.tt-cursor,span.twitter-typeahead .tt-suggestion:active{color:#212529;background:#fafafa}.input-group span.twitter-typeahead{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%}.input-group span.twitter-typeahead .tt-hint,.input-group span.twitter-typeahead .tt-input,.input-group span.twitter-typeahead .tt-menu{width:100%}.notification-page .list-group-item{border-left:0!important;border-right:0!important;border-bottom:0!important;background:transparent;padding-top:1rem;padding-bottom:1rem}.switch{font-size:.9rem;position:relative}.switch input{position:absolute;height:1px;width:1px;background:none;border:0;clip:rect(0 0 0 0);-webkit-clip-path:inset(50%);clip-path:inset(50%);overflow:hidden;padding:0}.switch input+label{position:relative;min-width:3.8rem;border-radius:1.9rem;height:1.9rem;line-height:1.9rem;display:inline-block;cursor:pointer;outline:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;text-indent:4.3rem}.switch input+label:after,.switch input+label:before{content:"";position:absolute;top:0;left:0;width:3.8rem;bottom:0;display:block}.switch input+label:before{right:0;background-color:#dee2e6;border-radius:1.9rem;-webkit-transition:all .2s;transition:all .2s}.switch input+label:after{top:2px;left:2px;width:calc(1.9rem - 4px);height:calc(1.9rem - 4px);border-radius:50%;background-color:#fff;-webkit-transition:all .2s;transition:all .2s}.switch input:checked+label:before{background-color:#dc3545}.switch input:checked+label:after{margin-left:1.9rem}.switch input:focus+label:before{outline:none;-webkit-box-shadow:0 0 0 .2rem rgba(0,136,221,.25);box-shadow:0 0 0 .2rem rgba(0,136,221,.25)}.switch input:disabled+label{color:#868e96;cursor:not-allowed}.switch input:disabled+label:before{background-color:#e9ecef}.switch.switch-sm{font-size:.7875rem}.switch.switch-sm input+label{min-width:3.1rem;height:1.55rem;line-height:1.55rem;text-indent:3.6rem}.switch.switch-sm input+label:before{width:3.1rem}.switch.switch-sm input+label:after{width:calc(1.55rem - 4px);height:calc(1.55rem - 4px)}.switch.switch-sm input:checked+label:after{margin-left:1.55rem}.switch.switch-lg{font-size:1.125rem}.switch.switch-lg input+label{min-width:4.8rem;height:2.4rem;line-height:2.4rem;text-indent:5.3rem}.switch.switch-lg input+label:before{width:4.8rem}.switch.switch-lg input+label:after{width:calc(2.4rem - 4px);height:calc(2.4rem - 4px)}.switch.switch-lg input:checked+label:after{margin-left:2.4rem}.switch+.switch{margin-left:1rem}
\ No newline at end of file
diff --git a/public/img/favicon.png b/public/img/favicon.png
new file mode 100644
index 00000000..ef5ab6f6
Binary files /dev/null and b/public/img/favicon.png differ
diff --git a/public/img/fred1.gif b/public/img/fred1.gif
new file mode 100644
index 00000000..b3a7e325
Binary files /dev/null and b/public/img/fred1.gif differ
diff --git a/public/img/online_world.svg b/public/img/online_world.svg
new file mode 100644
index 00000000..ec99d371
--- /dev/null
+++ b/public/img/online_world.svg
@@ -0,0 +1,448 @@
+
+
+
+
+
+ image/svg+xml
+
+ online world
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ online world
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/img/pixelfed-icon-black.svg b/public/img/pixelfed-icon-black.svg
new file mode 100644
index 00000000..ec26b5a3
--- /dev/null
+++ b/public/img/pixelfed-icon-black.svg
@@ -0,0 +1,12 @@
+
+
+
+ 04/icon/black/svg/pixelfed-icon-black
+ Created with Sketch.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/img/pixelfed-icon-color.svg b/public/img/pixelfed-icon-color.svg
new file mode 100644
index 00000000..67eba7d8
--- /dev/null
+++ b/public/img/pixelfed-icon-color.svg
@@ -0,0 +1,26 @@
+
+
+
+ 04/icon/color/svg/pixelfed-icon-color
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/img/sample-post.jpeg b/public/img/sample-post.jpeg
new file mode 100644
index 00000000..ecc2aae7
Binary files /dev/null and b/public/img/sample-post.jpeg differ
diff --git a/public/js/activity.js b/public/js/activity.js
new file mode 100644
index 00000000..be031f9a
--- /dev/null
+++ b/public/js/activity.js
@@ -0,0 +1 @@
+!function(t){var n={};function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}e.m=t,e.c=n,e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.p="/",e(e.s=1)}({1:function(t,n,e){t.exports=e("nr3X")},nr3X:function(t,n){$(document).ready(function(){$(".pagination").hide();var t=document.querySelector(".notification-page .list-group");new InfiniteScroll(t,{path:".pagination__next",append:".notification-page .list-group",status:".page-load-status",history:!0})})}});
\ No newline at end of file
diff --git a/public/js/app.js b/public/js/app.js
index 4dd9e901..65c2a63a 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -1 +1 @@
-!function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="/",n(n.s=0)}({"/7en":function(t,e,n){var r,i;"undefined"!=typeof window&&window,void 0===(i="function"==typeof(r=function(){"use strict";function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var n=this._events=this._events||{},r=n[t]=n[t]||[];return-1==r.indexOf(e)&&r.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var n=this._onceEvents=this._onceEvents||{};return(n[t]=n[t]||{})[e]=!0,this}},e.off=function(t,e){var n=this._events&&this._events[t];if(n&&n.length){var r=n.indexOf(e);return-1!=r&&n.splice(r,1),this}},e.emitEvent=function(t,e){var n=this._events&&this._events[t];if(n&&n.length){n=n.slice(0),e=e||[];for(var r=this._onceEvents&&this._onceEvents[t],i=0;i=0&&(t._idleTimeoutId=setTimeout(function(){t._onTimeout&&t._onTimeout()},e))},n("mypn"),e.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==t&&t.setImmediate||this&&this.setImmediate,e.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==t&&t.clearImmediate||this&&this.clearImmediate}).call(e,n("DuR2"))},"21It":function(t,e,n){"use strict";var r=n("FtD3");t.exports=function(t,e,n){var i=n.config.validateStatus;n.status&&i&&!i(n.status)?e(r("Request failed with status code "+n.status,n.config,null,n.request,n)):t(n)}},"3H+/":function(t,e,n){var r,i;!function(o,s){r=[n("/7en"),n("h803")],void 0===(i=function(t,e){return s(o,t,e)}.apply(e,r))||(t.exports=i)}(window,function(t,e,n){var r=t.jQuery,i={};function o(t,e){var s=n.getQueryElement(t);if(s){if((t=s).infiniteScrollGUID){var a=i[t.infiniteScrollGUID];return a.option(e),a}this.element=t,this.options=n.extend({},o.defaults),this.option(e),r&&(this.$element=r(this.element)),this.create()}else console.error("Bad element for InfiniteScroll: "+(s||t))}o.defaults={},o.create={},o.destroy={};var s=o.prototype;n.extend(s,e.prototype);var a=0;s.create=function(){var t=this.guid=++a;if(this.element.infiniteScrollGUID=t,i[t]=this,this.pageIndex=1,this.loadCount=0,this.updateGetPath(),this.getPath&&this.getPath())for(var e in this.updateGetAbsolutePath(),this.log("initialized",[this.element.className]),this.callOnInit(),o.create)o.create[e].call(this);else console.error("Disabling InfiniteScroll")},s.option=function(t){n.extend(this.options,t)},s.callOnInit=function(){var t=this.options.onInit;t&&t.call(this,this)},s.dispatchEvent=function(t,e,n){this.log(t,n);var i=e?[e].concat(n):n;if(this.emitEvent(t,i),r&&this.$element){var o=t+=".infiniteScroll";if(e){var s=r.Event(e);s.type=t,o=s}this.$element.trigger(o,n)}};var u={initialized:function(t){return"on "+t},request:function(t){return"URL: "+t},load:function(t,e){return(t.title||"")+". URL: "+e},error:function(t,e){return t+". URL: "+e},append:function(t,e,n){return n.length+" items. URL: "+e},last:function(t,e){return"URL: "+e},history:function(t,e){return"URL: "+e},pageIndex:function(t,e){return"current page determined to be: "+t+" from "+e}};s.log=function(t,e){if(this.options.debug){var n="[InfiniteScroll] "+t,r=u[t];r&&(n+=". "+r.apply(this,e)),console.log(n)}},s.updateMeasurements=function(){this.windowHeight=t.innerHeight;var e=this.element.getBoundingClientRect();this.top=e.top+t.pageYOffset},s.updateScroller=function(){var e=this.options.elementScroll;if(e){if(this.scroller=!0===e?this.element:n.getQueryElement(e),!this.scroller)throw"Unable to find elementScroll: "+e}else this.scroller=t},s.updateGetPath=function(){var t=this.options.path;if(t){var e=typeof t;if("function"!=e)"string"==e&&t.match("{{#}}")?this.updateGetPathTemplate(t):this.updateGetPathSelector(t);else this.getPath=t}else console.error("InfiniteScroll path option required. Set as: "+t)},s.updateGetPathTemplate=function(t){this.getPath=function(){var e=this.pageIndex+1;return t.replace("{{#}}",e)}.bind(this);var e=t.replace("{{#}}","(\\d\\d?\\d?)"),n=new RegExp(e),r=location.href.match(n);r&&(this.pageIndex=parseInt(r[1],10),this.log("pageIndex",[this.pageIndex,"template string"]))};var c=[/^(.*?\/?page\/?)(\d\d?\d?)(.*?$)/,/^(.*?\/?\?page=)(\d\d?\d?)(.*?$)/,/(.*?)(\d\d?\d?)(?!.*\d)(.*?$)/];return s.updateGetPathSelector=function(t){var e=document.querySelector(t);if(e){for(var n,r,i=e.getAttribute("href"),o=0;i&&o',menu:''}),selectors:function(t){var n={};return e.each(t,function(t,e){n[e]="."+t}),n}(i)}).css,html:r.html,classes:r.classes,selectors:r.selectors,mixin:function(t){e.mixin(t,r)}};var o;var s}}(),i=function(){"use strict";var n;function r(e){e&&e.el||t.error("EventBus initialized without el"),this.$el=t(e.el)}return"typeahead:",n={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},e.mixin(r.prototype,{_trigger:function(e,n){var r;return r=t.Event("typeahead:"+e),(n=n||[]).unshift(r),this.$el.trigger.apply(this.$el,n),r},before:function(t){var e;return e=[].slice.call(arguments,1),this._trigger("before"+t,e).isDefaultPrevented()},trigger:function(t){var e;this._trigger(t,[].slice.call(arguments,1)),(e=n[t])&&this._trigger(e,[].slice.call(arguments,1))}}),r}(),o=function(){"use strict";var t=/\s+/,e=function(){var t;t=window.setImmediate?function(t){r(function(){t()})}:function(t){setTimeout(function(){t()},0)};return t}();return{onSync:function(t,e,r){return n.call(this,"sync",t,e,r)},onAsync:function(t,e,r){return n.call(this,"async",t,e,r)},off:function(e){var n;if(!this._callbacks)return this;e=e.split(t);for(;n=e.shift();)delete this._callbacks[n];return this},trigger:function(n){var r,o,s,a,u;if(!this._callbacks)return this;n=n.split(t),s=[].slice.call(arguments,1);for(;(r=n.shift())&&(o=this._callbacks[r]);)a=i(o.sync,this,[r].concat(s)),u=i(o.async,this,[r].concat(s)),a()&&e(u);return this}};function n(e,n,r,i){var o;if(!r)return this;for(n=n.split(t),r=i?function(t,e){return t.bind?t.bind(e):function(){t.apply(e,[].slice.call(arguments,0))}}(r,i):r,this._callbacks=this._callbacks||{};o=n.shift();)this._callbacks[o]=this._callbacks[o]||{sync:[],async:[]},this._callbacks[o][e].push(r);return this}function i(t,e,n){return function(){for(var r,i=0,o=t.length;!r&&i').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:i.css("font-family"),fontSize:i.css("font-size"),fontStyle:i.css("font-style"),fontVariant:i.css("font-variant"),fontWeight:i.css("font-weight"),wordSpacing:i.css("word-spacing"),letterSpacing:i.css("letter-spacing"),textIndent:i.css("text-indent"),textRendering:i.css("text-rendering"),textTransform:i.css("text-transform")}).insertAfter(i)),this._checkLanguageDirection(),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=e.noop)}return n={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},r.normalizeQuery=function(t){return e.toStr(t).replace(/^\s*/g,"").replace(/\s{2,}/g," ")},e.mixin(r.prototype,o,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.queryWhenFocused=this.query,this.trigger("focused")},_onKeydown:function(t){var e=n[t.which||t.keyCode];this._managePreventDefault(e,t),e&&this._shouldTrigger(e,t)&&this.trigger(e+"Keyed",t)},_onInput:function(){this._setQuery(this.getInputValue()),this.clearHintIfInvalid(),this._checkLanguageDirection()},_managePreventDefault:function(t,e){var n;switch(t){case"up":case"down":n=!i(e);break;default:n=!1}n&&e.preventDefault()},_shouldTrigger:function(t,e){var n;switch(t){case"tab":n=!i(e);break;default:n=!0}return n},_checkLanguageDirection:function(){var t=(this.$input.css("direction")||"ltr").toLowerCase();this.dir!==t&&(this.dir=t,this.$hint.attr("dir",t),this.trigger("langDirChanged",t))},_setQuery:function(t,e){var n,i,o,s;o=t,s=this.query,i=!!(n=r.normalizeQuery(o)===r.normalizeQuery(s))&&this.query.length!==t.length,this.query=t,e||n?!e&&i&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},bind:function(){var t,r,i,o,s=this;return t=e.bind(this._onBlur,this),r=e.bind(this._onFocus,this),i=e.bind(this._onKeydown,this),o=e.bind(this._onInput,this),this.$input.on("blur.tt",t).on("focus.tt",r).on("keydown.tt",i),!e.isMsie()||e.isMsie()>9?this.$input.on("input.tt",o):this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(t){n[t.which||t.keyCode]||e.defer(e.bind(s._onInput,s,t))}),this},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getLangDir:function(){return this.dir},getQuery:function(){return this.query||""},setQuery:function(t,e){this.setInputValue(t),this._setQuery(t,e)},hasQueryChangedSinceLastFocus:function(){return this.query!==this.queryWhenFocused},getInputValue:function(){return this.$input.val()},setInputValue:function(t){this.$input.val(t),this.clearHintIfInvalid(),this._checkLanguageDirection()},resetInputValue:function(){this.setInputValue(this.query)},getHint:function(){return this.$hint.val()},setHint:function(t){this.$hint.val(t)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var t,e,n;n=(t=this.getInputValue())!==(e=this.getHint())&&0===e.indexOf(t),!(""!==t&&n&&!this.hasOverflow())&&this.clearHint()},hasFocus:function(){return this.$input.is(":focus")},hasOverflow:function(){var t=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=t},isCursorAtEnd:function(){var t,n,r;return t=this.$input.val().length,n=this.$input[0].selectionStart,e.isNumber(n)?n===t:!document.selection||((r=document.selection.createRange()).moveStart("character",-t),t===r.text.length)},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$overflowHelper.remove(),this.$hint=this.$input=this.$overflowHelper=t("")}}),r;function i(t){return t.altKey||t.ctrlKey||t.metaKey||t.shiftKey}}(),u=function(){"use strict";var n,r;function i(n,i){var o;(n=n||{}).templates=n.templates||{},n.templates.notFound=n.templates.notFound||n.templates.empty,n.source||t.error("missing source"),n.node||t.error("missing node"),n.name&&(o=n.name,!/^[_a-zA-Z0-9-]+$/.test(o))&&t.error("invalid dataset name: "+n.name),i.mixin(this),this.highlight=!!n.highlight,this.name=n.name||r(),this.limit=n.limit||5,this.displayFn=function(t){return t=t||e.stringify,e.isFunction(t)?t:function(e){return e[t]}}(n.display||n.displayKey),this.templates=function(n,r){return{notFound:n.notFound&&e.templatify(n.notFound),pending:n.pending&&e.templatify(n.pending),header:n.header&&e.templatify(n.header),footer:n.footer&&e.templatify(n.footer),suggestion:n.suggestion||function(e){return t("
").text(r(e))}}}(n.templates,this.displayFn),this.source=n.source.__ttAdapter?n.source.__ttAdapter():n.source,this.async=e.isUndefined(n.async)?this.source.length>2:!!n.async,this._resetLastSuggestion(),this.$el=t(n.node).addClass(this.classes.dataset).addClass(this.classes.dataset+"-"+this.name)}return n={val:"tt-selectable-display",obj:"tt-selectable-object"},r=e.getIdGenerator(),i.extractData=function(e){var r=t(e);return r.data(n.obj)?{val:r.data(n.val)||"",obj:r.data(n.obj)||null}:null},e.mixin(i.prototype,o,{_overwrite:function(t,e){(e=e||[]).length?this._renderSuggestions(t,e):this.async&&this.templates.pending?this._renderPending(t):!this.async&&this.templates.notFound?this._renderNotFound(t):this._empty(),this.trigger("rendered",this.name,e,!1)},_append:function(t,e){(e=e||[]).length&&this.$lastSuggestion.length?this._appendSuggestions(t,e):e.length?this._renderSuggestions(t,e):!this.$lastSuggestion.length&&this.templates.notFound&&this._renderNotFound(t),this.trigger("rendered",this.name,e,!0)},_renderSuggestions:function(t,e){var n;n=this._getSuggestionsFragment(t,e),this.$lastSuggestion=n.children().last(),this.$el.html(n).prepend(this._getHeader(t,e)).append(this._getFooter(t,e))},_appendSuggestions:function(t,e){var n,r;r=(n=this._getSuggestionsFragment(t,e)).children().last(),this.$lastSuggestion.after(n),this.$lastSuggestion=r},_renderPending:function(t){var e=this.templates.pending;this._resetLastSuggestion(),e&&this.$el.html(e({query:t,dataset:this.name}))},_renderNotFound:function(t){var e=this.templates.notFound;this._resetLastSuggestion(),e&&this.$el.html(e({query:t,dataset:this.name}))},_empty:function(){this.$el.empty(),this._resetLastSuggestion()},_getSuggestionsFragment:function(r,i){var o,a=this;return o=document.createDocumentFragment(),e.each(i,function(e){var i,s;s=a._injectQuery(r,e),i=t(a.templates.suggestion(s)).data(n.obj,e).data(n.val,a.displayFn(e)).addClass(a.classes.suggestion+" "+a.classes.selectable),o.appendChild(i[0])}),this.highlight&&s({className:this.classes.highlight,node:o,pattern:r}),t(o)},_getFooter:function(t,e){return this.templates.footer?this.templates.footer({query:t,suggestions:e,dataset:this.name}):null},_getHeader:function(t,e){return this.templates.header?this.templates.header({query:t,suggestions:e,dataset:this.name}):null},_resetLastSuggestion:function(){this.$lastSuggestion=t()},_injectQuery:function(t,n){return e.isObject(n)?e.mixin({_query:t},n):n},update:function(e){var n=this,r=!1,i=!1,o=0;function s(t){i||(i=!0,t=(t||[]).slice(0,n.limit),o=t.length,n._overwrite(e,t),o
")}}),i}(),c=function(){"use strict";function n(n,r){var i=this;(n=n||{}).node||t.error("node is required"),r.mixin(this),this.$node=t(n.node),this.query=null,this.datasets=e.map(n.datasets,function(e){var n=i.$node.find(e.node).first();return e.node=n.length?n:t("").appendTo(i.$node),new u(e,r)})}return e.mixin(n.prototype,o,{_onSelectableClick:function(e){this.trigger("selectableClicked",t(e.currentTarget))},_onRendered:function(t,e,n,r){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetRendered",e,n,r)},_onCleared:function(){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetCleared")},_propagate:function(){this.trigger.apply(this,arguments)},_allDatasetsEmpty:function(){return e.every(this.datasets,function(t){return t.isEmpty()})},_getSelectables:function(){return this.$node.find(this.selectors.selectable)},_removeCursor:function(){var t=this.getActiveSelectable();t&&t.removeClass(this.classes.cursor)},_ensureVisible:function(t){var e,n,r,i;n=(e=t.position().top)+t.outerHeight(!0),r=this.$node.scrollTop(),i=this.$node.height()+parseInt(this.$node.css("paddingTop"),10)+parseInt(this.$node.css("paddingBottom"),10),e<0?this.$node.scrollTop(r+e):i
"),e.each(this.datasets,function(t){t.destroy()})}}),n}(),l=function(){"use strict";var t=c.prototype;function n(){c.apply(this,[].slice.call(arguments,0))}return e.mixin(n.prototype,c.prototype,{open:function(){return!this._allDatasetsEmpty()&&this._show(),t.open.apply(this,[].slice.call(arguments,0))},close:function(){return this._hide(),t.close.apply(this,[].slice.call(arguments,0))},_onRendered:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),t._onRendered.apply(this,[].slice.call(arguments,0))},_onCleared:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),t._onCleared.apply(this,[].slice.call(arguments,0))},setLanguageDirection:function(e){return this.$node.css("ltr"===e?this.css.ltr:this.css.rtl),t.setLanguageDirection.apply(this,[].slice.call(arguments,0))},_hide:function(){this.$node.hide()},_show:function(){this.$node.css("display","block")}}),n}(),f=function(){"use strict";function n(n,i){var o,s,a,u,c,l,f,h,p,d,g;(n=n||{}).input||t.error("missing input"),n.menu||t.error("missing menu"),n.eventBus||t.error("missing event bus"),i.mixin(this),this.eventBus=n.eventBus,this.minLength=e.isNumber(n.minLength)?n.minLength:1,this.input=n.input,this.menu=n.menu,this.enabled=!0,this.active=!1,this.input.hasFocus()&&this.activate(),this.dir=this.input.getLangDir(),this._hacks(),this.menu.bind().onSync("selectableClicked",this._onSelectableClicked,this).onSync("asyncRequested",this._onAsyncRequested,this).onSync("asyncCanceled",this._onAsyncCanceled,this).onSync("asyncReceived",this._onAsyncReceived,this).onSync("datasetRendered",this._onDatasetRendered,this).onSync("datasetCleared",this._onDatasetCleared,this),o=r(this,"activate","open","_onFocused"),s=r(this,"deactivate","_onBlurred"),a=r(this,"isActive","isOpen","_onEnterKeyed"),u=r(this,"isActive","isOpen","_onTabKeyed"),c=r(this,"isActive","_onEscKeyed"),l=r(this,"isActive","open","_onUpKeyed"),f=r(this,"isActive","open","_onDownKeyed"),h=r(this,"isActive","isOpen","_onLeftKeyed"),p=r(this,"isActive","isOpen","_onRightKeyed"),d=r(this,"_openIfActive","_onQueryChanged"),g=r(this,"_openIfActive","_onWhitespaceChanged"),this.input.bind().onSync("focused",o,this).onSync("blurred",s,this).onSync("enterKeyed",a,this).onSync("tabKeyed",u,this).onSync("escKeyed",c,this).onSync("upKeyed",l,this).onSync("downKeyed",f,this).onSync("leftKeyed",h,this).onSync("rightKeyed",p,this).onSync("queryChanged",d,this).onSync("whitespaceChanged",g,this).onSync("langDirChanged",this._onLangDirChanged,this)}return e.mixin(n.prototype,{_hacks:function(){var n,r;n=this.input.$input||t(""),r=this.menu.$node||t("
"),n.on("blur.tt",function(t){var i,o,s;i=document.activeElement,o=r.is(i),s=r.has(i).length>0,e.isMsie()&&(o||s)&&(t.preventDefault(),t.stopImmediatePropagation(),e.defer(function(){n.focus()}))}),r.on("mousedown.tt",function(t){t.preventDefault()})},_onSelectableClicked:function(t,e){this.select(e)},_onDatasetCleared:function(){this._updateHint()},_onDatasetRendered:function(t,e,n,r){this._updateHint(),this.eventBus.trigger("render",n,r,e)},_onAsyncRequested:function(t,e,n){this.eventBus.trigger("asyncrequest",n,e)},_onAsyncCanceled:function(t,e,n){this.eventBus.trigger("asynccancel",n,e)},_onAsyncReceived:function(t,e,n){this.eventBus.trigger("asyncreceive",n,e)},_onFocused:function(){this._minLengthMet()&&this.menu.update(this.input.getQuery())},_onBlurred:function(){this.input.hasQueryChangedSinceLastFocus()&&this.eventBus.trigger("change",this.input.getQuery())},_onEnterKeyed:function(t,e){var n;(n=this.menu.getActiveSelectable())&&this.select(n)&&e.preventDefault()},_onTabKeyed:function(t,e){var n;(n=this.menu.getActiveSelectable())?this.select(n)&&e.preventDefault():(n=this.menu.getTopSelectable())&&this.autocomplete(n)&&e.preventDefault()},_onEscKeyed:function(){this.close()},_onUpKeyed:function(){this.moveCursor(-1)},_onDownKeyed:function(){this.moveCursor(1)},_onLeftKeyed:function(){"rtl"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onRightKeyed:function(){"ltr"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onQueryChanged:function(t,e){this._minLengthMet(e)?this.menu.update(e):this.menu.empty()},_onWhitespaceChanged:function(){this._updateHint()},_onLangDirChanged:function(t,e){this.dir!==e&&(this.dir=e,this.menu.setLanguageDirection(e))},_openIfActive:function(){this.isActive()&&this.open()},_minLengthMet:function(t){return(t=e.isString(t)?t:this.input.getQuery()||"").length>=this.minLength},_updateHint:function(){var t,n,r,i,o,s;t=this.menu.getTopSelectable(),n=this.menu.getSelectableData(t),r=this.input.getInputValue(),!n||e.isBlankString(r)||this.input.hasOverflow()?this.input.clearHint():(i=a.normalizeQuery(r),o=e.escapeRegExChars(i),(s=new RegExp("^(?:"+o+")(.+$)","i").exec(n.val))&&this.input.setHint(r+s[1]))},isEnabled:function(){return this.enabled},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},isActive:function(){return this.active},activate:function(){return!!this.isActive()||!(!this.isEnabled()||this.eventBus.before("active"))&&(this.active=!0,this.eventBus.trigger("active"),!0)},deactivate:function(){return!this.isActive()||!this.eventBus.before("idle")&&(this.active=!1,this.close(),this.eventBus.trigger("idle"),!0)},isOpen:function(){return this.menu.isOpen()},open:function(){return this.isOpen()||this.eventBus.before("open")||(this.menu.open(),this._updateHint(),this.eventBus.trigger("open")),this.isOpen()},close:function(){return this.isOpen()&&!this.eventBus.before("close")&&(this.menu.close(),this.input.clearHint(),this.input.resetInputValue(),this.eventBus.trigger("close")),!this.isOpen()},setVal:function(t){this.input.setQuery(e.toStr(t))},getVal:function(){return this.input.getQuery()},select:function(t){var e=this.menu.getSelectableData(t);return!(!e||this.eventBus.before("select",e.obj))&&(this.input.setQuery(e.val,!0),this.eventBus.trigger("select",e.obj),this.close(),!0)},autocomplete:function(t){var e,n;return e=this.input.getQuery(),!(!((n=this.menu.getSelectableData(t))&&e!==n.val)||this.eventBus.before("autocomplete",n.obj))&&(this.input.setQuery(n.val),this.eventBus.trigger("autocomplete",n.obj),!0)},moveCursor:function(t){var e,n,r,i;return e=this.input.getQuery(),n=this.menu.selectableRelativeToCursor(t),i=(r=this.menu.getSelectableData(n))?r.obj:null,!(this._minLengthMet()&&this.menu.update(e))&&!this.eventBus.before("cursorchange",i)&&(this.menu.setCursor(n),r?this.input.setInputValue(r.val):(this.input.resetInputValue(),this._updateHint()),this.eventBus.trigger("cursorchange",i),!0)},destroy:function(){this.input.destroy(),this.menu.destroy()}}),n;function r(t){var n=[].slice.call(arguments,1);return function(){var r=[].slice.call(arguments);e.each(n,function(e){return t[e].apply(t,r)})}}}();!function(){"use strict";var r,o,s;function u(e,n){e.each(function(){var e,r=t(this);(e=r.data(o.typeahead))&&n(e,r)})}function h(n){var r;return(r=e.isJQuery(n)||e.isElement(n)?t(n).first():[]).length?r:null}r=t.fn.typeahead,o={www:"tt-www",attrs:"tt-attrs",typeahead:"tt-typeahead"},s={initialize:function(r,s){var u;return s=e.isArray(s)?s:[].slice.call(arguments,1),u=n((r=r||{}).classNames),this.each(function(){var n,p,d,g,v,m,y,_,b,w,x;e.each(s,function(t){t.highlight=!!r.highlight}),n=t(this),p=t(u.html.wrapper),d=h(r.hint),g=h(r.menu),v=!1!==r.hint&&!d,m=!1!==r.menu&&!g,v&&(d=function(t,e){return t.clone().addClass(e.classes.hint).removeData().css(e.css.hint).css((n=t,{backgroundAttachment:n.css("background-attachment"),backgroundClip:n.css("background-clip"),backgroundColor:n.css("background-color"),backgroundImage:n.css("background-image"),backgroundOrigin:n.css("background-origin"),backgroundPosition:n.css("background-position"),backgroundRepeat:n.css("background-repeat"),backgroundSize:n.css("background-size")})).prop("readonly",!0).removeAttr("id name placeholder required").attr({autocomplete:"off",spellcheck:"false",tabindex:-1});var n}(n,u)),m&&(g=t(u.html.menu).css(u.css.menu)),d&&d.val(""),n=function(t,e){t.data(o.attrs,{dir:t.attr("dir"),autocomplete:t.attr("autocomplete"),spellcheck:t.attr("spellcheck"),style:t.attr("style")}),t.addClass(e.classes.input).attr({autocomplete:"off",spellcheck:!1});try{!t.attr("dir")&&t.attr("dir","auto")}catch(t){}return t}(n,u),(v||m)&&(p.css(u.css.wrapper),n.css(v?u.css.input:u.css.inputWithNoHint),n.wrap(p).parent().prepend(v?d:null).append(m?g:null));x=m?l:c,y=new i({el:n}),_=new a({hint:d,input:n},u),b=new x({node:g,datasets:s},u),w=new f({input:_,menu:b,eventBus:y,minLength:r.minLength},u),n.data(o.www,u),n.data(o.typeahead,w)})},isEnabled:function(){var t;return u(this.first(),function(e){t=e.isEnabled()}),t},enable:function(){return u(this,function(t){t.enable()}),this},disable:function(){return u(this,function(t){t.disable()}),this},isActive:function(){var t;return u(this.first(),function(e){t=e.isActive()}),t},activate:function(){return u(this,function(t){t.activate()}),this},deactivate:function(){return u(this,function(t){t.deactivate()}),this},isOpen:function(){var t;return u(this.first(),function(e){t=e.isOpen()}),t},open:function(){return u(this,function(t){t.open()}),this},close:function(){return u(this,function(t){t.close()}),this},select:function(e){var n=!1,r=t(e);return u(this.first(),function(t){n=t.select(r)}),n},autocomplete:function(e){var n=!1,r=t(e);return u(this.first(),function(t){n=t.autocomplete(r)}),n},moveCursor:function(t){var e=!1;return u(this.first(),function(n){e=n.moveCursor(t)}),e},val:function(t){var e;return arguments.length?(u(this,function(e){e.setVal(t)}),this):(u(this.first(),function(t){e=t.getVal()}),e)},destroy:function(){return u(this,function(t,n){!function(t){var n,r;n=t.data(o.www),r=t.parent().filter(n.selectors.wrapper),e.each(t.data(o.attrs),function(n,r){e.isUndefined(n)?t.removeAttr(r):t.attr(r,n)}),t.removeData(o.typeahead).removeData(o.www).removeData(o.attr).removeClass(n.classes.input),r.length&&(t.detach().insertAfter(r),r.remove())}(n),t.destroy()}),this}},t.fn.typeahead=function(t){return s[t]?s[t].apply(this,[].slice.call(arguments,1)):s.initialize.apply(this,arguments)},t.fn.typeahead.noConflict=function(){return t.fn.typeahead=r,this}}()},i=[n("7t+N")],void 0===(o=function(t){return s(t)}.apply(e,i))||(t.exports=o)}).call(e,n("162o").setImmediate)},"7t+N":function(t,e,n){var r;!function(e,n){"use strict";"object"==typeof t&&"object"==typeof t.exports?t.exports=e.document?n(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return n(t)}:n(e)}("undefined"!=typeof window?window:this,function(n,i){"use strict";var o=[],s=n.document,a=Object.getPrototypeOf,u=o.slice,c=o.concat,l=o.push,f=o.indexOf,h={},p=h.toString,d=h.hasOwnProperty,g=d.toString,v=g.call(Object),m={},y=function(t){return"function"==typeof t&&"number"!=typeof t.nodeType},_=function(t){return null!=t&&t===t.window},b={type:!0,src:!0,noModule:!0};function w(t,e,n){var r,i=(e=e||s).createElement("script");if(i.text=t,n)for(r in b)n[r]&&(i[r]=n[r]);e.head.appendChild(i).parentNode.removeChild(i)}function x(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?h[p.call(t)]||"object":typeof t}var E=function(t,e){return new E.fn.init(t,e)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function S(t){var e=!!t&&"length"in t&&t.length,n=x(t);return!y(t)&&!_(t)&&("array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t)}E.fn=E.prototype={jquery:"3.3.1",constructor:E,length:0,toArray:function(){return u.call(this)},get:function(t){return null==t?u.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=E.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return E.each(this,t)},map:function(t){return this.pushStack(E.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return this.pushStack(u.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n
+~]|"+R+")"+R+"*"),U=new RegExp("="+R+"*([^\\]'\"]*?)"+R+"*\\]","g"),z=new RegExp(B),K=new RegExp("^"+H+"$"),G={ID:new RegExp("^#("+H+")"),CLASS:new RegExp("^\\.("+H+")"),TAG:new RegExp("^("+H+"|[*])"),ATTR:new RegExp("^"+q),PSEUDO:new RegExp("^"+B),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+R+"*(even|odd|(([+-]|)(\\d*)n|)"+R+"*(?:([+-]|)"+R+"*(\\d+)|))"+R+"*\\)|)","i"),bool:new RegExp("^(?:"+P+")$","i"),needsContext:new RegExp("^"+R+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+R+"*((?:-\\d)?\\d*)"+R+"*\\)|)(?=[^-]|$)","i")},V=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,X=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,J=/[+~]/,Z=new RegExp("\\\\([\\da-f]{1,6}"+R+"?|("+R+")|.)","ig"),tt=function(t,e,n){var r="0x"+e-65536;return r!=r||n?e:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},et=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,nt=function(t,e){return e?"\0"===t?"�":t.slice(0,-1)+"\\"+t.charCodeAt(t.length-1).toString(16)+" ":"\\"+t},rt=function(){h()},it=yt(function(t){return!0===t.disabled&&("form"in t||"label"in t)},{dir:"parentNode",next:"legend"});try{O.apply(k=L.call(w.childNodes),w.childNodes),k[w.childNodes.length].nodeType}catch(t){O={apply:k.length?function(t,e){N.apply(t,L.call(e))}:function(t,e){for(var n=t.length,r=0;t[n++]=e[r++];);t.length=n-1}}}function ot(t,e,r,i){var o,a,c,l,f,d,m,y=e&&e.ownerDocument,x=e?e.nodeType:9;if(r=r||[],"string"!=typeof t||!t||1!==x&&9!==x&&11!==x)return r;if(!i&&((e?e.ownerDocument||e:w)!==p&&h(e),e=e||p,g)){if(11!==x&&(f=X.exec(t)))if(o=f[1]){if(9===x){if(!(c=e.getElementById(o)))return r;if(c.id===o)return r.push(c),r}else if(y&&(c=y.getElementById(o))&&_(e,c)&&c.id===o)return r.push(c),r}else{if(f[2])return O.apply(r,e.getElementsByTagName(t)),r;if((o=f[3])&&n.getElementsByClassName&&e.getElementsByClassName)return O.apply(r,e.getElementsByClassName(o)),r}if(n.qsa&&!C[t+" "]&&(!v||!v.test(t))){if(1!==x)y=e,m=t;else if("object"!==e.nodeName.toLowerCase()){for((l=e.getAttribute("id"))?l=l.replace(et,nt):e.setAttribute("id",l=b),a=(d=s(t)).length;a--;)d[a]="#"+l+" "+mt(d[a]);m=d.join(","),y=J.test(t)&>(e.parentNode)||e}if(m)try{return O.apply(r,y.querySelectorAll(m)),r}catch(t){}finally{l===b&&e.removeAttribute("id")}}}return u(t.replace(F,"$1"),e,r,i)}function st(){var t=[];return function e(n,i){return t.push(n+" ")>r.cacheLength&&delete e[t.shift()],e[n+" "]=i}}function at(t){return t[b]=!0,t}function ut(t){var e=p.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ct(t,e){for(var n=t.split("|"),i=n.length;i--;)r.attrHandle[n[i]]=e}function lt(t,e){var n=e&&t,r=n&&1===t.nodeType&&1===e.nodeType&&t.sourceIndex-e.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===e)return-1;return t?1:-1}function ft(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function ht(t){return function(e){var n=e.nodeName.toLowerCase();return("input"===n||"button"===n)&&e.type===t}}function pt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&it(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function dt(t){return at(function(e){return e=+e,at(function(n,r){for(var i,o=t([],n.length,e),s=o.length;s--;)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}function gt(t){return t&&void 0!==t.getElementsByTagName&&t}for(e in n=ot.support={},o=ot.isXML=function(t){var e=t&&(t.ownerDocument||t).documentElement;return!!e&&"HTML"!==e.nodeName},h=ot.setDocument=function(t){var e,i,s=t?t.ownerDocument||t:w;return s!==p&&9===s.nodeType&&s.documentElement?(d=(p=s).documentElement,g=!o(p),w!==p&&(i=p.defaultView)&&i.top!==i&&(i.addEventListener?i.addEventListener("unload",rt,!1):i.attachEvent&&i.attachEvent("onunload",rt)),n.attributes=ut(function(t){return t.className="i",!t.getAttribute("className")}),n.getElementsByTagName=ut(function(t){return t.appendChild(p.createComment("")),!t.getElementsByTagName("*").length}),n.getElementsByClassName=Y.test(p.getElementsByClassName),n.getById=ut(function(t){return d.appendChild(t).id=b,!p.getElementsByName||!p.getElementsByName(b).length}),n.getById?(r.filter.ID=function(t){var e=t.replace(Z,tt);return function(t){return t.getAttribute("id")===e}},r.find.ID=function(t,e){if(void 0!==e.getElementById&&g){var n=e.getElementById(t);return n?[n]:[]}}):(r.filter.ID=function(t){var e=t.replace(Z,tt);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},r.find.ID=function(t,e){if(void 0!==e.getElementById&&g){var n,r,i,o=e.getElementById(t);if(o){if((n=o.getAttributeNode("id"))&&n.value===t)return[o];for(i=e.getElementsByName(t),r=0;o=i[r++];)if((n=o.getAttributeNode("id"))&&n.value===t)return[o]}return[]}}),r.find.TAG=n.getElementsByTagName?function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):n.qsa?e.querySelectorAll(t):void 0}:function(t,e){var n,r=[],i=0,o=e.getElementsByTagName(t);if("*"===t){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},r.find.CLASS=n.getElementsByClassName&&function(t,e){if(void 0!==e.getElementsByClassName&&g)return e.getElementsByClassName(t)},m=[],v=[],(n.qsa=Y.test(p.querySelectorAll))&&(ut(function(t){d.appendChild(t).innerHTML=" ",t.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+R+"*(?:''|\"\")"),t.querySelectorAll("[selected]").length||v.push("\\["+R+"*(?:value|"+P+")"),t.querySelectorAll("[id~="+b+"-]").length||v.push("~="),t.querySelectorAll(":checked").length||v.push(":checked"),t.querySelectorAll("a#"+b+"+*").length||v.push(".#.+[+~]")}),ut(function(t){t.innerHTML=" ";var e=p.createElement("input");e.setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),t.querySelectorAll("[name=d]").length&&v.push("name"+R+"*[*^$|!~]?="),2!==t.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),d.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),t.querySelectorAll("*,:x"),v.push(",.*:")})),(n.matchesSelector=Y.test(y=d.matches||d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(t){n.disconnectedMatch=y.call(t,"*"),y.call(t,"[s!='']:x"),m.push("!=",B)}),v=v.length&&new RegExp(v.join("|")),m=m.length&&new RegExp(m.join("|")),e=Y.test(d.compareDocumentPosition),_=e||Y.test(d.contains)?function(t,e){var n=9===t.nodeType?t.documentElement:t,r=e&&e.parentNode;return t===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):t.compareDocumentPosition&&16&t.compareDocumentPosition(r)))}:function(t,e){if(e)for(;e=e.parentNode;)if(e===t)return!0;return!1},A=e?function(t,e){if(t===e)return f=!0,0;var r=!t.compareDocumentPosition-!e.compareDocumentPosition;return r||(1&(r=(t.ownerDocument||t)===(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!n.sortDetached&&e.compareDocumentPosition(t)===r?t===p||t.ownerDocument===w&&_(w,t)?-1:e===p||e.ownerDocument===w&&_(w,e)?1:l?j(l,t)-j(l,e):0:4&r?-1:1)}:function(t,e){if(t===e)return f=!0,0;var n,r=0,i=t.parentNode,o=e.parentNode,s=[t],a=[e];if(!i||!o)return t===p?-1:e===p?1:i?-1:o?1:l?j(l,t)-j(l,e):0;if(i===o)return lt(t,e);for(n=t;n=n.parentNode;)s.unshift(n);for(n=e;n=n.parentNode;)a.unshift(n);for(;s[r]===a[r];)r++;return r?lt(s[r],a[r]):s[r]===w?-1:a[r]===w?1:0},p):p},ot.matches=function(t,e){return ot(t,null,null,e)},ot.matchesSelector=function(t,e){if((t.ownerDocument||t)!==p&&h(t),e=e.replace(U,"='$1']"),n.matchesSelector&&g&&!C[e+" "]&&(!m||!m.test(e))&&(!v||!v.test(e)))try{var r=y.call(t,e);if(r||n.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(t){}return ot(e,p,null,[t]).length>0},ot.contains=function(t,e){return(t.ownerDocument||t)!==p&&h(t),_(t,e)},ot.attr=function(t,e){(t.ownerDocument||t)!==p&&h(t);var i=r.attrHandle[e.toLowerCase()],o=i&&D.call(r.attrHandle,e.toLowerCase())?i(t,e,!g):void 0;return void 0!==o?o:n.attributes||!g?t.getAttribute(e):(o=t.getAttributeNode(e))&&o.specified?o.value:null},ot.escape=function(t){return(t+"").replace(et,nt)},ot.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},ot.uniqueSort=function(t){var e,r=[],i=0,o=0;if(f=!n.detectDuplicates,l=!n.sortStable&&t.slice(0),t.sort(A),f){for(;e=t[o++];)e===t[o]&&(i=r.push(o));for(;i--;)t.splice(r[i],1)}return l=null,t},i=ot.getText=function(t){var e,n="",r=0,o=t.nodeType;if(o){if(1===o||9===o||11===o){if("string"==typeof t.textContent)return t.textContent;for(t=t.firstChild;t;t=t.nextSibling)n+=i(t)}else if(3===o||4===o)return t.nodeValue}else for(;e=t[r++];)n+=i(e);return n},(r=ot.selectors={cacheLength:50,createPseudo:at,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(Z,tt),t[3]=(t[3]||t[4]||t[5]||"").replace(Z,tt),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||ot.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&ot.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return G.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&z.test(n)&&(e=s(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(Z,tt).toLowerCase();return"*"===t?function(){return!0}:function(t){return t.nodeName&&t.nodeName.toLowerCase()===e}},CLASS:function(t){var e=T[t+" "];return e||(e=new RegExp("(^|"+R+")"+t+"("+R+"|$)"))&&T(t,function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")})},ATTR:function(t,e,n){return function(r){var i=ot.attr(r,t);return null==i?"!="===e:!e||(i+="","="===e?i===n:"!="===e?i!==n:"^="===e?n&&0===i.indexOf(n):"*="===e?n&&i.indexOf(n)>-1:"$="===e?n&&i.slice(-n.length)===n:"~="===e?(" "+i.replace(M," ")+" ").indexOf(n)>-1:"|="===e&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,r,i){var o="nth"!==t.slice(0,3),s="last"!==t.slice(-4),a="of-type"===e;return 1===r&&0===i?function(t){return!!t.parentNode}:function(e,n,u){var c,l,f,h,p,d,g=o!==s?"nextSibling":"previousSibling",v=e.parentNode,m=a&&e.nodeName.toLowerCase(),y=!u&&!a,_=!1;if(v){if(o){for(;g;){for(h=e;h=h[g];)if(a?h.nodeName.toLowerCase()===m:1===h.nodeType)return!1;d=g="only"===t&&!d&&"nextSibling"}return!0}if(d=[s?v.firstChild:v.lastChild],s&&y){for(_=(p=(c=(l=(f=(h=v)[b]||(h[b]={}))[h.uniqueID]||(f[h.uniqueID]={}))[t]||[])[0]===x&&c[1])&&c[2],h=p&&v.childNodes[p];h=++p&&h&&h[g]||(_=p=0)||d.pop();)if(1===h.nodeType&&++_&&h===e){l[t]=[x,p,_];break}}else if(y&&(_=p=(c=(l=(f=(h=e)[b]||(h[b]={}))[h.uniqueID]||(f[h.uniqueID]={}))[t]||[])[0]===x&&c[1]),!1===_)for(;(h=++p&&h&&h[g]||(_=p=0)||d.pop())&&((a?h.nodeName.toLowerCase()!==m:1!==h.nodeType)||!++_||(y&&((l=(f=h[b]||(h[b]={}))[h.uniqueID]||(f[h.uniqueID]={}))[t]=[x,_]),h!==e)););return(_-=i)===r||_%r==0&&_/r>=0}}},PSEUDO:function(t,e){var n,i=r.pseudos[t]||r.setFilters[t.toLowerCase()]||ot.error("unsupported pseudo: "+t);return i[b]?i(e):i.length>1?(n=[t,t,"",e],r.setFilters.hasOwnProperty(t.toLowerCase())?at(function(t,n){for(var r,o=i(t,e),s=o.length;s--;)t[r=j(t,o[s])]=!(n[r]=o[s])}):function(t){return i(t,0,n)}):i}},pseudos:{not:at(function(t){var e=[],n=[],r=a(t.replace(F,"$1"));return r[b]?at(function(t,e,n,i){for(var o,s=r(t,null,i,[]),a=t.length;a--;)(o=s[a])&&(t[a]=!(e[a]=o))}):function(t,i,o){return e[0]=t,r(e,null,o,n),e[0]=null,!n.pop()}}),has:at(function(t){return function(e){return ot(t,e).length>0}}),contains:at(function(t){return t=t.replace(Z,tt),function(e){return(e.textContent||e.innerText||i(e)).indexOf(t)>-1}}),lang:at(function(t){return K.test(t||"")||ot.error("unsupported lang: "+t),t=t.replace(Z,tt).toLowerCase(),function(e){var n;do{if(n=g?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var n=t.location&&t.location.hash;return n&&n.slice(1)===e.id},root:function(t){return t===d},focus:function(t){return t===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(t.type||t.href||~t.tabIndex)},enabled:pt(!1),disabled:pt(!0),checked:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&!!t.checked||"option"===e&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!r.pseudos.empty(t)},header:function(t){return Q.test(t.nodeName)},input:function(t){return V.test(t.nodeName)},button:function(t){var e=t.nodeName.toLowerCase();return"input"===e&&"button"===t.type||"button"===e},text:function(t){var e;return"input"===t.nodeName.toLowerCase()&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:dt(function(){return[0]}),last:dt(function(t,e){return[e-1]}),eq:dt(function(t,e,n){return[n<0?n+e:n]}),even:dt(function(t,e){for(var n=0;n=0;)t.push(r);return t}),gt:dt(function(t,e,n){for(var r=n<0?n+e:n;++r1?function(e,n,r){for(var i=t.length;i--;)if(!t[i](e,n,r))return!1;return!0}:t[0]}function bt(t,e,n,r,i){for(var o,s=[],a=0,u=t.length,c=null!=e;a-1&&(o[c]=!(s[c]=f))}}else m=bt(m===s?m.splice(d,m.length):m),i?i(null,s,m,u):O.apply(s,m)})}function xt(t){for(var e,n,i,o=t.length,s=r.relative[t[0].type],a=s||r.relative[" "],u=s?1:0,l=yt(function(t){return t===e},a,!0),f=yt(function(t){return j(e,t)>-1},a,!0),h=[function(t,n,r){var i=!s&&(r||n!==c)||((e=n).nodeType?l(t,n,r):f(t,n,r));return e=null,i}];u1&&_t(h),u>1&&mt(t.slice(0,u-1).concat({value:" "===t[u-2].type?"*":""})).replace(F,"$1"),n,u0,i=t.length>0,o=function(o,s,a,u,l){var f,d,v,m=0,y="0",_=o&&[],b=[],w=c,E=o||i&&r.find.TAG("*",l),T=x+=null==w?1:Math.random()||.1,S=E.length;for(l&&(c=s===p||s||l);y!==S&&null!=(f=E[y]);y++){if(i&&f){for(d=0,s||f.ownerDocument===p||(h(f),a=!g);v=t[d++];)if(v(f,s||p,a)){u.push(f);break}l&&(x=T)}n&&((f=!v&&f)&&m--,o&&_.push(f))}if(m+=y,n&&y!==m){for(d=0;v=e[d++];)v(_,b,s,a);if(o){if(m>0)for(;y--;)_[y]||b[y]||(b[y]=I.call(u));b=bt(b)}O.apply(u,b),l&&!o&&b.length>0&&m+e.length>1&&ot.uniqueSort(u)}return l&&(x=T,c=w),_};return n?at(o):o}(o,i))).selector=t}return a},u=ot.select=function(t,e,n,i){var o,u,c,l,f,h="function"==typeof t&&t,p=!i&&s(t=h.selector||t);if(n=n||[],1===p.length){if((u=p[0]=p[0].slice(0)).length>2&&"ID"===(c=u[0]).type&&9===e.nodeType&&g&&r.relative[u[1].type]){if(!(e=(r.find.ID(c.matches[0].replace(Z,tt),e)||[])[0]))return n;h&&(e=e.parentNode),t=t.slice(u.shift().value.length)}for(o=G.needsContext.test(t)?0:u.length;o--&&(c=u[o],!r.relative[l=c.type]);)if((f=r.find[l])&&(i=f(c.matches[0].replace(Z,tt),J.test(u[0].type)&>(e.parentNode)||e))){if(u.splice(o,1),!(t=i.length&&mt(u)))return O.apply(n,i),n;break}}return(h||a(t,p))(i,e,!g,n,!e||J.test(t)&>(e.parentNode)||e),n},n.sortStable=b.split("").sort(A).join("")===b,n.detectDuplicates=!!f,h(),n.sortDetached=ut(function(t){return 1&t.compareDocumentPosition(p.createElement("fieldset"))}),ut(function(t){return t.innerHTML=" ","#"===t.firstChild.getAttribute("href")})||ct("type|href|height|width",function(t,e,n){if(!n)return t.getAttribute(e,"type"===e.toLowerCase()?1:2)}),n.attributes&&ut(function(t){return t.innerHTML=" ",t.firstChild.setAttribute("value",""),""===t.firstChild.getAttribute("value")})||ct("value",function(t,e,n){if(!n&&"input"===t.nodeName.toLowerCase())return t.defaultValue}),ut(function(t){return null==t.getAttribute("disabled")})||ct(P,function(t,e,n){var r;if(!n)return!0===t[e]?e.toLowerCase():(r=t.getAttributeNode(e))&&r.specified?r.value:null}),ot}(n);E.find=C,E.expr=C.selectors,E.expr[":"]=E.expr.pseudos,E.uniqueSort=E.unique=C.uniqueSort,E.text=C.getText,E.isXMLDoc=C.isXML,E.contains=C.contains,E.escapeSelector=C.escape;var A=function(t,e,n){for(var r=[],i=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(i&&E(t).is(n))break;r.push(t)}return r},D=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},k=E.expr.match.needsContext;function I(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function O(t,e,n){return y(e)?E.grep(t,function(t,r){return!!e.call(t,r,t)!==n}):e.nodeType?E.grep(t,function(t){return t===e!==n}):"string"!=typeof e?E.grep(t,function(t){return f.call(e,t)>-1!==n}):E.filter(e,t,n)}E.filter=function(t,e,n){var r=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===r.nodeType?E.find.matchesSelector(r,t)?[r]:[]:E.find.matches(t,E.grep(e,function(t){return 1===t.nodeType}))},E.fn.extend({find:function(t){var e,n,r=this.length,i=this;if("string"!=typeof t)return this.pushStack(E(t).filter(function(){for(e=0;e1?E.uniqueSort(n):n},filter:function(t){return this.pushStack(O(this,t||[],!1))},not:function(t){return this.pushStack(O(this,t||[],!0))},is:function(t){return!!O(this,"string"==typeof t&&k.test(t)?E(t):t||[],!1).length}});var L,j=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(E.fn.init=function(t,e,n){var r,i;if(!t)return this;if(n=n||L,"string"==typeof t){if(!(r="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:j.exec(t))||!r[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(r[1]){if(e=e instanceof E?e[0]:e,E.merge(this,E.parseHTML(r[1],e&&e.nodeType?e.ownerDocument||e:s,!0)),N.test(r[1])&&E.isPlainObject(e))for(r in e)y(this[r])?this[r](e[r]):this.attr(r,e[r]);return this}return(i=s.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):y(t)?void 0!==n.ready?n.ready(t):t(E):E.makeArray(t,this)}).prototype=E.fn,L=E(s);var P=/^(?:parents|prev(?:Until|All))/,R={children:!0,contents:!0,next:!0,prev:!0};function H(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}E.fn.extend({has:function(t){var e=E(t,this),n=e.length;return this.filter(function(){for(var t=0;t-1:1===n.nodeType&&E.find.matchesSelector(n,t))){o.push(n);break}return this.pushStack(o.length>1?E.uniqueSort(o):o)},index:function(t){return t?"string"==typeof t?f.call(E(t),this[0]):f.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(E.uniqueSort(E.merge(this.get(),E(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),E.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return A(t,"parentNode")},parentsUntil:function(t,e,n){return A(t,"parentNode",n)},next:function(t){return H(t,"nextSibling")},prev:function(t){return H(t,"previousSibling")},nextAll:function(t){return A(t,"nextSibling")},prevAll:function(t){return A(t,"previousSibling")},nextUntil:function(t,e,n){return A(t,"nextSibling",n)},prevUntil:function(t,e,n){return A(t,"previousSibling",n)},siblings:function(t){return D((t.parentNode||{}).firstChild,t)},children:function(t){return D(t.firstChild)},contents:function(t){return I(t,"iframe")?t.contentDocument:(I(t,"template")&&(t=t.content||t),E.merge([],t.childNodes))}},function(t,e){E.fn[t]=function(n,r){var i=E.map(this,e,n);return"Until"!==t.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=E.filter(r,i)),this.length>1&&(R[t]||E.uniqueSort(i),P.test(t)&&i.reverse()),this.pushStack(i)}});var q=/[^\x20\t\r\n\f]+/g;function B(t){return t}function M(t){throw t}function F(t,e,n,r){var i;try{t&&y(i=t.promise)?i.call(t).done(e).fail(n):t&&y(i=t.then)?i.call(t,e,n):e.apply(void 0,[t].slice(r))}catch(t){n.apply(void 0,[t])}}E.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return E.each(t.match(q)||[],function(t,n){e[n]=!0}),e}(t):E.extend({},t);var e,n,r,i,o=[],s=[],a=-1,u=function(){for(i=i||t.once,r=e=!0;s.length;a=-1)for(n=s.shift();++a-1;)o.splice(n,1),n<=a&&a--}),this},has:function(t){return t?E.inArray(t,o)>-1:o.length>0},empty:function(){return o&&(o=[]),this},disable:function(){return i=s=[],o=n="",this},disabled:function(){return!o},lock:function(){return i=s=[],n||e||(o=n=""),this},locked:function(){return!!i},fireWith:function(t,n){return i||(n=[t,(n=n||[]).slice?n.slice():n],s.push(n),e||u()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},E.extend({Deferred:function(t){var e=[["notify","progress",E.Callbacks("memory"),E.Callbacks("memory"),2],["resolve","done",E.Callbacks("once memory"),E.Callbacks("once memory"),0,"resolved"],["reject","fail",E.Callbacks("once memory"),E.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(t){return i.then(null,t)},pipe:function(){var t=arguments;return E.Deferred(function(n){E.each(e,function(e,r){var i=y(t[r[4]])&&t[r[4]];o[r[1]](function(){var t=i&&i.apply(this,arguments);t&&y(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[r[0]+"With"](this,i?[t]:arguments)})}),t=null}).promise()},then:function(t,r,i){var o=0;function s(t,e,r,i){return function(){var a=this,u=arguments,c=function(){var n,c;if(!(t=o&&(r!==M&&(a=void 0,u=[n]),e.rejectWith(a,u))}};t?l():(E.Deferred.getStackHook&&(l.stackTrace=E.Deferred.getStackHook()),n.setTimeout(l))}}return E.Deferred(function(n){e[0][3].add(s(0,n,y(i)?i:B,n.notifyWith)),e[1][3].add(s(0,n,y(t)?t:B)),e[2][3].add(s(0,n,y(r)?r:M))}).promise()},promise:function(t){return null!=t?E.extend(t,i):i}},o={};return E.each(e,function(t,n){var s=n[2],a=n[5];i[n[1]]=s.add,a&&s.add(function(){r=a},e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),s.add(n[3].fire),o[n[0]]=function(){return o[n[0]+"With"](this===o?void 0:this,arguments),this},o[n[0]+"With"]=s.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(t){var e=arguments.length,n=e,r=Array(n),i=u.call(arguments),o=E.Deferred(),s=function(t){return function(n){r[t]=this,i[t]=arguments.length>1?u.call(arguments):n,--e||o.resolveWith(r,i)}};if(e<=1&&(F(t,o.done(s(n)).resolve,o.reject,!e),"pending"===o.state()||y(i[n]&&i[n].then)))return o.then();for(;n--;)F(i[n],s(n),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;E.Deferred.exceptionHook=function(t,e){n.console&&n.console.warn&&t&&W.test(t.name)&&n.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},E.readyException=function(t){n.setTimeout(function(){throw t})};var $=E.Deferred();function U(){s.removeEventListener("DOMContentLoaded",U),n.removeEventListener("load",U),E.ready()}E.fn.ready=function(t){return $.then(t).catch(function(t){E.readyException(t)}),this},E.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--E.readyWait:E.isReady)||(E.isReady=!0,!0!==t&&--E.readyWait>0||$.resolveWith(s,[E]))}}),E.ready.then=$.then,"complete"===s.readyState||"loading"!==s.readyState&&!s.documentElement.doScroll?n.setTimeout(E.ready):(s.addEventListener("DOMContentLoaded",U),n.addEventListener("load",U));var z=function(t,e,n,r,i,o,s){var a=0,u=t.length,c=null==n;if("object"===x(n))for(a in i=!0,n)z(t,e,a,n[a],!0,o,s);else if(void 0!==r&&(i=!0,y(r)||(s=!0),c&&(s?(e.call(t,r),e=null):(c=e,e=function(t,e,n){return c.call(E(t),n)})),e))for(;a1,null,!0)},removeData:function(t){return this.each(function(){Z.remove(this,t)})}}),E.extend({queue:function(t,e,n){var r;if(t)return e=(e||"fx")+"queue",r=J.get(t,e),n&&(!r||Array.isArray(n)?r=J.access(t,e,E.makeArray(n)):r.push(n)),r||[]},dequeue:function(t,e){e=e||"fx";var n=E.queue(t,e),r=n.length,i=n.shift(),o=E._queueHooks(t,e);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===e&&n.unshift("inprogress"),delete o.stop,i.call(t,function(){E.dequeue(t,e)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return J.get(t,n)||J.access(t,n,{empty:E.Callbacks("once memory").add(function(){J.remove(t,[e+"queue",n])})})}}),E.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]+)/i,dt=/^$|^module$|\/(?:java|ecma)script/i,gt={option:[1,""," "],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function vt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&I(t,e)?E.merge([t],n):n}function mt(t,e){for(var n=0,r=t.length;n-1)i&&i.push(o);else if(c=E.contains(o.ownerDocument,o),s=vt(f.appendChild(o),"script"),c&&mt(s),n)for(l=0;o=s[l++];)dt.test(o.type||"")&&n.push(o);return f}yt=s.createDocumentFragment().appendChild(s.createElement("div")),(_t=s.createElement("input")).setAttribute("type","radio"),_t.setAttribute("checked","checked"),_t.setAttribute("name","t"),yt.appendChild(_t),m.checkClone=yt.cloneNode(!0).cloneNode(!0).lastChild.checked,yt.innerHTML="",m.noCloneChecked=!!yt.cloneNode(!0).lastChild.defaultValue;var xt=s.documentElement,Et=/^key/,Tt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,St=/^([^.]*)(?:\.(.+)|)/;function Ct(){return!0}function At(){return!1}function Dt(){try{return s.activeElement}catch(t){}}function kt(t,e,n,r,i,o){var s,a;if("object"==typeof e){for(a in"string"!=typeof n&&(r=r||n,n=void 0),e)kt(t,a,n,r,e[a],o);return t}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=At;else if(!i)return t;return 1===o&&(s=i,(i=function(t){return E().off(t),s.apply(this,arguments)}).guid=s.guid||(s.guid=E.guid++)),t.each(function(){E.event.add(this,e,i,r,n)})}E.event={global:{},add:function(t,e,n,r,i){var o,s,a,u,c,l,f,h,p,d,g,v=J.get(t);if(v)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&E.find.matchesSelector(xt,i),n.guid||(n.guid=E.guid++),(u=v.events)||(u=v.events={}),(s=v.handle)||(s=v.handle=function(e){return void 0!==E&&E.event.triggered!==e.type?E.event.dispatch.apply(t,arguments):void 0}),c=(e=(e||"").match(q)||[""]).length;c--;)p=g=(a=St.exec(e[c])||[])[1],d=(a[2]||"").split(".").sort(),p&&(f=E.event.special[p]||{},p=(i?f.delegateType:f.bindType)||p,f=E.event.special[p]||{},l=E.extend({type:p,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&E.expr.match.needsContext.test(i),namespace:d.join(".")},o),(h=u[p])||((h=u[p]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,d,s)||t.addEventListener&&t.addEventListener(p,s)),f.add&&(f.add.call(t,l),l.handler.guid||(l.handler.guid=n.guid)),i?h.splice(h.delegateCount++,0,l):h.push(l),E.event.global[p]=!0)},remove:function(t,e,n,r,i){var o,s,a,u,c,l,f,h,p,d,g,v=J.hasData(t)&&J.get(t);if(v&&(u=v.events)){for(c=(e=(e||"").match(q)||[""]).length;c--;)if(p=g=(a=St.exec(e[c])||[])[1],d=(a[2]||"").split(".").sort(),p){for(f=E.event.special[p]||{},h=u[p=(r?f.delegateType:f.bindType)||p]||[],a=a[2]&&new RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=h.length;o--;)l=h[o],!i&&g!==l.origType||n&&n.guid!==l.guid||a&&!a.test(l.namespace)||r&&r!==l.selector&&("**"!==r||!l.selector)||(h.splice(o,1),l.selector&&h.delegateCount--,f.remove&&f.remove.call(t,l));s&&!h.length&&(f.teardown&&!1!==f.teardown.call(t,d,v.handle)||E.removeEvent(t,p,v.handle),delete u[p])}else for(p in u)E.event.remove(t,p+e[c],n,r,!0);E.isEmptyObject(u)&&J.remove(t,"handle events")}},dispatch:function(t){var e,n,r,i,o,s,a=E.event.fix(t),u=new Array(arguments.length),c=(J.get(this,"events")||{})[a.type]||[],l=E.event.special[a.type]||{};for(u[0]=a,e=1;e=1))for(;c!==this;c=c.parentNode||this)if(1===c.nodeType&&("click"!==t.type||!0!==c.disabled)){for(o=[],s={},n=0;n-1:E.find(i,this,null,[c]).length),s[i]&&o.push(r);o.length&&a.push({elem:c,handlers:o})}return c=this,u\x20\t\r\n\f]*)[^>]*)\/>/gi,Nt=/
\ No newline at end of file
diff --git a/resources/assets/js/components/commentform.js b/resources/assets/js/components/commentform.js
index a0b56332..c9d4f947 100644
--- a/resources/assets/js/components/commentform.js
+++ b/resources/assets/js/components/commentform.js
@@ -1,6 +1,12 @@
$(document).ready(function() {
- $('.status-comment-focus').on('click', function(el) {
+ $('.status-card > .card-footer').each(function() {
+ $(this).addClass('d-none');
+ });
+
+ $(document).on('click', '.status-comment-focus', function(el) {
+ var form = $(this).parents().eq(2).find('.card-footer');
+ form.removeClass('d-none');
var el = $(this).parents().eq(2).find('input[name="comment"]');
el.focus();
});
@@ -14,12 +20,14 @@ $(document).ready(function() {
let commenttext = commentform.val();
let item = {item: id, comment: commenttext};
+ commentform.prop('disabled', true);
axios.post('/i/comment', item)
.then(function (res) {
var username = res.data.username;
var permalink = res.data.url;
var profile = res.data.profile;
+ var reply = res.data.comment;
if($('.status-container').length == 1) {
var comments = el.parents().eq(3).find('.comments');
@@ -27,18 +35,17 @@ $(document).ready(function() {
var comments = el.parents().eq(1).find('.comments');
}
- var comment = '' + username + ' 1s
';
+ var comment = '' + username + ' 1s
';
- comments.prepend(comment);
+ comments.append(comment);
commentform.val('');
commentform.blur();
+ commentform.prop('disabled', false);
})
.catch(function (res) {
});
-
});
-
});
\ No newline at end of file
diff --git a/resources/assets/js/components/likebutton.js b/resources/assets/js/components/likebutton.js
index 650f880e..9e720644 100644
--- a/resources/assets/js/components/likebutton.js
+++ b/resources/assets/js/components/likebutton.js
@@ -1,18 +1,17 @@
$(document).ready(function() {
- if(!ls.get('likes')) {
- axios.get('/api/v1/likes')
- .then(function (res) {
- ls.set('likes', res.data);
- console.log(res);
- })
- .catch(function (res) {
- ls.set('likes', []);
- })
+ pixelfed.fetchLikes = () => {
+ axios.get('/api/v1/likes')
+ .then(function (res) {
+ ls.set('likes', res.data);
+ })
+ .catch(function (res) {
+ ls.set('likes', []);
+ })
}
- pixelfed.hydrateLikes = function() {
+ pixelfed.hydrateLikes = () => {
var likes = ls.get('likes');
$('.like-form').each(function(i, el) {
var el = $(el);
@@ -20,11 +19,14 @@ $(document).ready(function() {
var heart = el.find('.status-heart');
if(likes.indexOf(id) != -1) {
- heart.removeClass('far fa-heart').addClass('fas fa-heart');
+ heart.removeClass('text-dark').addClass('text-primary');
+ } else {
+ heart.removeClass('text-primary').addClass('text-dark');
}
});
};
+ pixelfed.fetchLikes();
pixelfed.hydrateLikes();
$(document).on('submit', '.like-form', function(e) {
@@ -33,6 +35,8 @@ $(document).ready(function() {
var id = el.data('id');
axios.post('/i/like', {item: id})
.then(function (res) {
+ pixelfed.fetchLikes();
+ pixelfed.hydrateLikes();
var likes = ls.get('likes');
var action = false;
var counter = el.parents().eq(1).find('.like-count');
@@ -40,14 +44,14 @@ $(document).ready(function() {
var heart = el.find('.status-heart');
if(likes.indexOf(id) > -1) {
- heart.removeClass('fas fa-heart').addClass('far fa-heart');
+ heart.removeClass('text-primary').addClass('text-dark');
likes = likes.filter(function(item) {
return item !== id
});
counter.text(count);
action = 'unlike';
} else {
- heart.removeClass('far fa-heart').addClass('fas fa-heart');
+ heart.removeClass('text-dark').addClass('text-primary');
likes.push(id);
counter.text(count);
action = 'like';
diff --git a/resources/assets/js/components/passport/AuthorizedClients.vue b/resources/assets/js/components/passport/AuthorizedClients.vue
new file mode 100644
index 00000000..11a06892
--- /dev/null
+++ b/resources/assets/js/components/passport/AuthorizedClients.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Name
+ Scopes
+
+
+
+
+
+
+
+
+ {{ token.client.name }}
+
+
+
+
+
+ {{ token.scopes.join(', ') }}
+
+
+
+
+
+
+ Revoke
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/js/components/passport/Clients.vue b/resources/assets/js/components/passport/Clients.vue
new file mode 100644
index 00000000..5cd68f26
--- /dev/null
+++ b/resources/assets/js/components/passport/Clients.vue
@@ -0,0 +1,350 @@
+
+
+
+
+
+
+
+
+
+
+ You have not created any OAuth clients.
+
+
+
+
+
+ Client ID
+ Name
+ Secret
+
+
+
+
+
+
+
+
+
+ {{ client.id }}
+
+
+
+
+ {{ client.name }}
+
+
+
+
+ {{ client.secret }}
+
+
+
+
+
+ Edit
+
+
+
+
+
+
+ Delete
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Whoops! Something went wrong!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Whoops! Something went wrong!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/js/components/passport/PersonalAccessTokens.vue b/resources/assets/js/components/passport/PersonalAccessTokens.vue
new file mode 100644
index 00000000..14541a29
--- /dev/null
+++ b/resources/assets/js/components/passport/PersonalAccessTokens.vue
@@ -0,0 +1,298 @@
+
+
+
+
+
+
+
+
+
+
+
+ You have not created any personal access tokens.
+
+
+
+
+
+
+ Name
+
+
+
+
+
+
+
+
+ {{ token.name }}
+
+
+
+
+
+ Delete
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Whoops! Something went wrong!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Here is your new personal access token. This is the only time it will be shown so don't lose it!
+ You may now use this token to make API requests.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/assets/js/components/statusform.js b/resources/assets/js/components/statusform.js
new file mode 100644
index 00000000..9aa1e9e9
--- /dev/null
+++ b/resources/assets/js/components/statusform.js
@@ -0,0 +1,126 @@
+$(document).ready(function() {
+
+ pixelfed.create = {};
+ pixelfed.filters = {};
+ pixelfed.create.hasGeneratedSelect = false;
+ pixelfed.create.selectedFilter = false;
+ pixelfed.create.currentFilterName = false;
+ pixelfed.create.currentFilterClass = false;
+
+ pixelfed.filters.list = [
+ ['1977','filter-1977'],
+ ['Aden','filter-aden'],
+ ['Amaro','filter-amaro'],
+ ['Ashby','filter-ashby'],
+ ['Brannan','filter-brannan'],
+ ['Brooklyn','filter-brooklyn'],
+ ['Charmes','filter-charmes'],
+ ['Clarendon','filter-clarendon'],
+ ['Crema','filter-crema'],
+ ['Dogpatch','filter-dogpatch'],
+ ['Earlybird','filter-earlybird'],
+ ['Gingham','filter-gingham'],
+ ['Ginza','filter-ginza'],
+ ['Hefe','filter-hefe'],
+ ['Helena','filter-helena'],
+ ['Hudson','filter-hudson'],
+ ['Inkwell','filter-inkwell'],
+ ['Kelvin','filter-kelvin'],
+ ['Kuno','filter-juno'],
+ ['Lark','filter-lark'],
+ ['Lo-Fi','filter-lofi'],
+ ['Ludwig','filter-ludwig'],
+ ['Maven','filter-maven'],
+ ['Mayfair','filter-mayfair'],
+ ['Moon','filter-moon'],
+ ['Nashville','filter-nashville'],
+ ['Perpetua','filter-perpetua'],
+ ['Poprocket','filter-poprocket'],
+ ['Reyes','filter-reyes'],
+ ['Rise','filter-rise'],
+ ['Sierra','filter-sierra'],
+ ['Skyline','filter-skyline'],
+ ['Slumber','filter-slumber'],
+ ['Stinson','filter-stinson'],
+ ['Sutro','filter-sutro'],
+ ['Toaster','filter-toaster'],
+ ['Valencia','filter-valencia'],
+ ['Vesper','filter-vesper'],
+ ['Walden','filter-walden'],
+ ['Willow','filter-willow'],
+ ['X-Pro II','filter-xpro-ii']
+ ];
+
+ function previewImage(input) {
+ if (input.files && input.files[0]) {
+ var reader = new FileReader();
+ reader.onload = function(e) {
+ $('.filterPreview').attr('src', e.target.result);
+ }
+ reader.readAsDataURL(input.files[0]);
+ }
+ }
+
+ function generateFilterSelect() {
+ let filters = pixelfed.filters.list;
+ for(var i = 0, len = filters.length; i < len; i++) {
+ let filter = filters[i];
+ let name = filter[0];
+ let className = filter[1];
+ let select = $('#filterSelectDropdown');
+ var template = '' + name + ' ';
+ select.append(template);
+ }
+ pixelfed.create.hasGeneratedSelect = true;
+ }
+
+ $(document).on('change', '#fileInput', function() {
+ previewImage(this);
+ $('#statusForm .form-filters.d-none').removeClass('d-none');
+ $('#statusForm .form-preview.d-none').removeClass('d-none');
+ $('#statusForm #collapsePreview').collapse('show');
+ if(!pixelfed.create.hasGeneratedSelect) {
+ generateFilterSelect();
+ }
+ });
+
+ $(document).on('change', '#filterSelectDropdown', function() {
+ let el = $(this);
+ let filter = el.val();
+ let oldFilter = pixelfed.create.currentFilterClass;
+ if(filter == 'none') {
+ $('input[name=filter_class]').val('');
+ $('input[name=filter_name]').val('');
+ $('.filterContainer').removeClass(oldFilter);
+ pixelfed.create.currentFilterClass = false;
+ pixelfed.create.currentFilterName = 'None';
+ $('.form-group.form-preview .form-text').text('Current Filter: No filter selected');
+ return;
+ } else {
+ $('.filterContainer').removeClass(oldFilter).addClass(filter);
+ pixelfed.create.currentFilterClass = filter;
+ pixelfed.create.currentFilterName = el.find(':selected').text();
+ $('.form-group.form-preview .form-text').text('Current Filter: ' + pixelfed.create.currentFilterName);
+ $('input[name=filter_class]').val(pixelfed.create.currentFilterClass);
+ $('input[name=filter_name]').val(pixelfed.create.currentFilterName);
+ return;
+ }
+ });
+
+ $(document).on('keyup keydown', '#statusForm textarea[name=caption]', function() {
+ const el = $(this);
+ const len = el.val().length;
+ const limit = el.data('limit');
+ if(len > limit) {
+ const diff = limit - len;
+ $('#statusForm .caption-counter').text(diff).addClass('text-danger');
+ } else {
+ $('#statusForm .caption-counter').text(len).removeClass('text-danger');
+ }
+ });
+
+ $(document).on('focus', '#statusForm textarea[name=caption]', function() {
+ const el = $(this);
+ el.attr('rows', '3');
+ });
+});
\ No newline at end of file
diff --git a/resources/assets/js/lib/bloodhound.js b/resources/assets/js/lib/bloodhound.js
old mode 100644
new mode 100755
index 6095f291..3cb1c4e5
--- a/resources/assets/js/lib/bloodhound.js
+++ b/resources/assets/js/lib/bloodhound.js
@@ -1,18 +1,18 @@
/*!
- * typeahead.js 0.11.1
+ * typeahead.js 1.2.0
* https://github.com/twitter/typeahead.js
- * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ * Copyright 2013-2017 Twitter, Inc. and other contributors; Licensed MIT
*/
(function(root, factory) {
if (typeof define === "function" && define.amd) {
- define("bloodhound", [ "jquery" ], function(a0) {
+ define([ "jquery" ], function(a0) {
return root["Bloodhound"] = factory(a0);
});
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"));
} else {
- root["Bloodhound"] = factory(jQuery);
+ root["Bloodhound"] = factory(root["jQuery"]);
}
})(this, function($) {
var _ = function() {
@@ -148,18 +148,27 @@
stringify: function(val) {
return _.isString(val) ? val : JSON.stringify(val);
},
+ guid: function() {
+ function _p8(s) {
+ var p = (Math.random().toString(16) + "000000000").substr(2, 8);
+ return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p;
+ }
+ return "tt-" + _p8() + _p8(true) + _p8(true) + _p8();
+ },
noop: function() {}
};
}();
- var VERSION = "0.11.1";
+ var VERSION = "1.2.0";
var tokenizers = function() {
"use strict";
return {
nonword: nonword,
whitespace: whitespace,
+ ngram: ngram,
obj: {
nonword: getObjTokenizer(nonword),
- whitespace: getObjTokenizer(whitespace)
+ whitespace: getObjTokenizer(whitespace),
+ ngram: getObjTokenizer(ngram)
}
};
function whitespace(str) {
@@ -170,6 +179,19 @@
str = _.toStr(str);
return str ? str.split(/\W+/) : [];
}
+ function ngram(str) {
+ str = _.toStr(str);
+ var tokens = [], word = "";
+ _.each(str.split(""), function(char) {
+ if (char.match(/\s+/)) {
+ word = "";
+ } else {
+ tokens.push(word + char);
+ word += char;
+ }
+ });
+ return tokens;
+ }
function getObjTokenizer(tokenizer) {
return function setKey(keys) {
keys = _.isArray(keys) ? keys : [].slice.call(arguments, 0);
@@ -341,9 +363,10 @@
}();
var Transport = function() {
"use strict";
- var pendingRequestsCount = 0, pendingRequests = {}, maxPendingRequests = 6, sharedCache = new LruCache(10);
+ var pendingRequestsCount = 0, pendingRequests = {}, sharedCache = new LruCache(10);
function Transport(o) {
o = o || {};
+ this.maxPendingRequests = o.maxPendingRequests || 6;
this.cancelled = false;
this.lastReq = null;
this._send = o.transport;
@@ -351,7 +374,7 @@
this._cache = o.cache === false ? new LruCache(0) : sharedCache;
}
Transport.setMaxPendingRequests = function setMaxPendingRequests(num) {
- maxPendingRequests = num;
+ this.maxPendingRequests = num;
};
Transport.resetCache = function resetCache() {
sharedCache.reset();
@@ -369,7 +392,7 @@
}
if (jqXhr = pendingRequests[fingerprint]) {
jqXhr.done(done).fail(fail);
- } else if (pendingRequestsCount < maxPendingRequests) {
+ } else if (pendingRequestsCount < this.maxPendingRequests) {
pendingRequestsCount++;
pendingRequests[fingerprint] = this._send(o).done(done).fail(fail).always(always);
} else {
@@ -423,6 +446,7 @@
this.identify = o.identify || _.stringify;
this.datumTokenizer = o.datumTokenizer;
this.queryTokenizer = o.queryTokenizer;
+ this.matchAnyQueryToken = o.matchAnyQueryToken;
this.reset();
}
_.mixin(SearchIndex.prototype, {
@@ -459,7 +483,7 @@
tokens = normalizeTokens(this.queryTokenizer(query));
_.each(tokens, function(token) {
var node, chars, ch, ids;
- if (matches && matches.length === 0) {
+ if (matches && matches.length === 0 && !that.matchAnyQueryToken) {
return false;
}
node = that.trie;
@@ -471,8 +495,10 @@
ids = node[IDS].slice(0);
matches = matches ? getIntersection(matches, ids) : ids;
} else {
- matches = [];
- return false;
+ if (!that.matchAnyQueryToken) {
+ matches = [];
+ return false;
+ }
}
});
return matches ? _.map(unique(matches), function(id) {
@@ -614,10 +640,12 @@
this.url = o.url;
this.prepare = o.prepare;
this.transform = o.transform;
+ this.indexResponse = o.indexResponse;
this.transport = new Transport({
cache: o.cache,
limiter: o.limiter,
- transport: o.transport
+ transport: o.transport,
+ maxPendingRequests: o.maxPendingRequests
});
}
_.mixin(Remote.prototype, {
@@ -655,7 +683,9 @@
identify: _.stringify,
datumTokenizer: null,
queryTokenizer: null,
+ matchAnyQueryToken: false,
sufficient: 5,
+ indexRemote: false,
sorter: null,
local: [],
prefetch: null,
@@ -744,7 +774,7 @@
} else if (o.wildcard) {
prepare = prepareByWildcard;
} else {
- prepare = idenityPrepare;
+ prepare = identityPrepare;
}
return prepare;
function prepareByReplace(query, settings) {
@@ -755,7 +785,7 @@
settings.url = settings.url.replace(wildcard, encodeURIComponent(query));
return settings;
}
- function idenityPrepare(query, settings) {
+ function identityPrepare(query, settings) {
return settings;
}
}
@@ -806,6 +836,7 @@
this.sorter = o.sorter;
this.identify = o.identify;
this.sufficient = o.sufficient;
+ this.indexRemote = o.indexRemote;
this.local = o.local;
this.remote = o.remote ? new Remote(o.remote) : null;
this.prefetch = o.prefetch ? new Prefetch(o.prefetch) : null;
@@ -875,6 +906,8 @@
},
search: function search(query, sync, async) {
var that = this, local;
+ sync = sync || _.noop;
+ async = async || _.noop;
local = this.sorter(this.index.search(query));
sync(this.remote ? local.slice() : local);
if (this.remote && local.length < this.sufficient) {
@@ -890,7 +923,8 @@
return that.identify(r) === that.identify(l);
}) && nonDuplicates.push(r);
});
- async && async(nonDuplicates);
+ that.indexRemote && that.add(nonDuplicates);
+ async(nonDuplicates);
}
},
all: function all() {
diff --git a/resources/assets/js/lib/typeahead.js b/resources/assets/js/lib/typeahead.js
old mode 100644
new mode 100755
index 2b089289..f80bb192
--- a/resources/assets/js/lib/typeahead.js
+++ b/resources/assets/js/lib/typeahead.js
@@ -1,18 +1,18 @@
/*!
- * typeahead.js 0.11.1
+ * typeahead.js 1.2.0
* https://github.com/twitter/typeahead.js
- * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ * Copyright 2013-2017 Twitter, Inc. and other contributors; Licensed MIT
*/
(function(root, factory) {
if (typeof define === "function" && define.amd) {
- define("typeahead.js", [ "jquery" ], function(a0) {
+ define([ "jquery" ], function(a0) {
return factory(a0);
});
} else if (typeof exports === "object") {
module.exports = factory(require("jquery"));
} else {
- factory(jQuery);
+ factory(root["jQuery"]);
}
})(this, function($) {
var _ = function() {
@@ -148,6 +148,13 @@
stringify: function(val) {
return _.isString(val) ? val : JSON.stringify(val);
},
+ guid: function() {
+ function _p8(s) {
+ var p = (Math.random().toString(16) + "000000000").substr(2, 8);
+ return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p;
+ }
+ return "tt-" + _p8() + _p8(true) + _p8(true) + _p8();
+ },
noop: function() {}
};
}();
@@ -189,7 +196,7 @@
function buildHtml(c) {
return {
wrapper: ' ',
- menu: ''
+ menu: ''
};
}
function buildSelectors(classes) {
@@ -264,10 +271,8 @@
}
_.mixin(EventBus.prototype, {
_trigger: function(type, args) {
- var $e;
- $e = $.Event(namespace + type);
- (args = args || []).unshift($e);
- this.$el.trigger.apply(this.$el, args);
+ var $e = $.Event(namespace + type);
+ this.$el.trigger.call(this.$el, $e, args || []);
return $e;
},
before: function(type) {
@@ -384,7 +389,36 @@
tagName: "strong",
className: null,
wordsOnly: false,
- caseSensitive: false
+ caseSensitive: false,
+ diacriticInsensitive: false
+ };
+ var accented = {
+ A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]",
+ B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]",
+ C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]",
+ D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]",
+ E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]",
+ F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]",
+ G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]",
+ H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]",
+ I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]",
+ J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]",
+ K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]",
+ L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]",
+ M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]",
+ N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]",
+ O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]",
+ P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]",
+ Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]",
+ R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]",
+ S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]",
+ T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]",
+ U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]",
+ V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]",
+ W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]",
+ X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]",
+ Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]",
+ Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]"
};
return function hightlight(o) {
var regex;
@@ -393,7 +427,7 @@
return;
}
o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
- regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
+ regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive);
traverse(o.node, hightlightTextNode);
function hightlightTextNode(textNode) {
var match, patternNode, wrapperNode;
@@ -419,10 +453,17 @@
}
}
};
- function getRegex(patterns, caseSensitive, wordsOnly) {
+ function accent_replacer(chr) {
+ return accented[chr.toUpperCase()] || chr;
+ }
+ function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) {
var escapedPatterns = [], regexStr;
for (var i = 0, len = patterns.length; i < len; i++) {
- escapedPatterns.push(_.escapeRegExChars(patterns[i]));
+ var escapedWord = _.escapeRegExChars(patterns[i]);
+ if (diacriticInsensitive) {
+ escapedWord = escapedWord.replace(/\S/g, accent_replacer);
+ }
+ escapedPatterns.push(escapedWord);
}
regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
@@ -448,6 +489,14 @@
www.mixin(this);
this.$hint = $(o.hint);
this.$input = $(o.input);
+ this.$input.attr({
+ "aria-activedescendant": "",
+ "aria-owns": this.$input.attr("id") + "_listbox",
+ role: "combobox",
+ "aria-readonly": "true",
+ "aria-autocomplete": "list"
+ });
+ $(www.menu).attr("id", this.$input.attr("id") + "_listbox");
this.query = this.$input.val();
this.queryWhenFocused = this.hasFocus() ? this.query : null;
this.$overflowHelper = buildOverflowHelper(this.$input);
@@ -455,6 +504,7 @@
if (this.$hint.length === 0) {
this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
}
+ this.onSync("cursorchange", this._updateDescendent);
}
Input.normalizeQuery = function(str) {
return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " ");
@@ -524,6 +574,9 @@
this.trigger("whitespaceChanged", this.query);
}
},
+ _updateDescendent: function updateDescendent(event, id) {
+ this.$input.attr("aria-activedescendant", id);
+ },
bind: function() {
var that = this, onBlur, onFocus, onKeydown, onInput;
onBlur = _.bind(this._onBlur, this);
@@ -647,6 +700,7 @@
"use strict";
var keys, nameGenerator;
keys = {
+ dataset: "tt-selectable-dataset",
val: "tt-selectable-display",
obj: "tt-selectable-object"
};
@@ -666,19 +720,20 @@
}
www.mixin(this);
this.highlight = !!o.highlight;
- this.name = o.name || nameGenerator();
+ this.name = _.toStr(o.name || nameGenerator());
this.limit = o.limit || 5;
this.displayFn = getDisplayFn(o.display || o.displayKey);
this.templates = getTemplates(o.templates, this.displayFn);
this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
this._resetLastSuggestion();
- this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);
+ this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);
}
Dataset.extractData = function extractData(el) {
var $el = $(el);
if ($el.data(keys.obj)) {
return {
+ dataset: $el.data(keys.dataset) || "",
val: $el.data(keys.val) || "",
obj: $el.data(keys.obj) || null
};
@@ -697,7 +752,7 @@
} else {
this._empty();
}
- this.trigger("rendered", this.name, suggestions, false);
+ this.trigger("rendered", suggestions, false, this.name);
},
_append: function append(query, suggestions) {
suggestions = suggestions || [];
@@ -708,7 +763,7 @@
} else if (!this.$lastSuggestion.length && this.templates.notFound) {
this._renderNotFound(query);
}
- this.trigger("rendered", this.name, suggestions, true);
+ this.trigger("rendered", suggestions, true, this.name);
},
_renderSuggestions: function renderSuggestions(query, suggestions) {
var $fragment;
@@ -749,7 +804,7 @@
_.each(suggestions, function getSuggestionNode(suggestion) {
var $el, context;
context = that._injectQuery(query, suggestion);
- $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);
+ $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);
fragment.appendChild($el[0]);
});
this.highlight && highlight({
@@ -787,7 +842,7 @@
this.cancel = function cancel() {
canceled = true;
that.cancel = $.noop;
- that.async && that.trigger("asyncCanceled", query);
+ that.async && that.trigger("asyncCanceled", query, that.name);
};
this.source(query, sync, async);
!syncCalled && sync([]);
@@ -800,16 +855,17 @@
rendered = suggestions.length;
that._overwrite(query, suggestions);
if (rendered < that.limit && that.async) {
- that.trigger("asyncRequested", query);
+ that.trigger("asyncRequested", query, that.name);
}
}
function async(suggestions) {
suggestions = suggestions || [];
if (!canceled && rendered < that.limit) {
that.cancel = $.noop;
- rendered += suggestions.length;
- that._append(query, suggestions.slice(0, that.limit - rendered));
- that.async && that.trigger("asyncReceived", query);
+ var idx = Math.abs(rendered - that.limit);
+ rendered += idx;
+ that._append(query, suggestions.slice(0, idx));
+ that.async && that.trigger("asyncReceived", query, that.name);
}
}
},
@@ -843,7 +899,7 @@
suggestion: templates.suggestion || suggestionTemplate
};
function suggestionTemplate(context) {
- return $("").text(displayFn(context));
+ return $('
').attr("id", _.guid()).text(displayFn(context));
}
}
function isValidName(str) {
@@ -884,10 +940,11 @@
this.trigger.apply(this, arguments);
},
_allDatasetsEmpty: function allDatasetsEmpty() {
- return _.every(this.datasets, isDatasetEmpty);
- function isDatasetEmpty(dataset) {
- return dataset.isEmpty();
- }
+ return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) {
+ var isEmpty = dataset.isEmpty();
+ this.$node.attr("aria-expanded", !isEmpty);
+ return isEmpty;
+ }, this));
},
_getSelectables: function getSelectables() {
return this.$node.find(this.selectors.selectable);
@@ -912,6 +969,12 @@
var that = this, onSelectableClick;
onSelectableClick = _.bind(this._onSelectableClick, this);
this.$node.on("click.tt", this.selectors.selectable, onSelectableClick);
+ this.$node.on("mouseover", this.selectors.selectable, function() {
+ that.setCursor($(this));
+ });
+ this.$node.on("mouseleave", function() {
+ that._removeCursor();
+ });
_.each(this.datasets, function(dataset) {
dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that);
});
@@ -921,9 +984,11 @@
return this.$node.hasClass(this.classes.open);
},
open: function open() {
+ this.$node.scrollTop(0);
this.$node.addClass(this.classes.open);
},
close: function close() {
+ this.$node.attr("aria-expanded", false);
this.$node.removeClass(this.classes.open);
this._removeCursor();
},
@@ -988,6 +1053,55 @@
});
return Menu;
}();
+ var Status = function() {
+ "use strict";
+ function Status(options) {
+ this.$el = $("
", {
+ role: "status",
+ "aria-live": "polite"
+ }).css({
+ position: "absolute",
+ padding: "0",
+ border: "0",
+ height: "1px",
+ width: "1px",
+ "margin-bottom": "-1px",
+ "margin-right": "-1px",
+ overflow: "hidden",
+ clip: "rect(0 0 0 0)",
+ "white-space": "nowrap"
+ });
+ options.$input.after(this.$el);
+ _.each(options.menu.datasets, _.bind(function(dataset) {
+ if (dataset.onSync) {
+ dataset.onSync("rendered", _.bind(this.update, this));
+ dataset.onSync("cleared", _.bind(this.cleared, this));
+ }
+ }, this));
+ }
+ _.mixin(Status.prototype, {
+ update: function update(event, suggestions) {
+ var length = suggestions.length;
+ var words;
+ if (length === 1) {
+ words = {
+ result: "result",
+ is: "is"
+ };
+ } else {
+ words = {
+ result: "results",
+ is: "are"
+ };
+ }
+ this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate.");
+ },
+ cleared: function() {
+ this.$el.text("");
+ }
+ });
+ return Status;
+ }();
var DefaultMenu = function() {
"use strict";
var s = Menu.prototype;
@@ -1052,6 +1166,7 @@
this.input = o.input;
this.menu = o.menu;
this.enabled = true;
+ this.autoselect = !!o.autoselect;
this.active = false;
this.input.hasFocus() && this.activate();
this.dir = this.input.getLangDir();
@@ -1098,8 +1213,12 @@
_onDatasetCleared: function onDatasetCleared() {
this._updateHint();
},
- _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {
+ _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {
this._updateHint();
+ if (this.autoselect) {
+ var cursorClass = this.selectors.cursor.substr(1);
+ this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);
+ }
this.eventBus.trigger("render", suggestions, async, dataset);
},
_onAsyncRequested: function onAsyncRequested(type, dataset, query) {
@@ -1122,7 +1241,15 @@
_onEnterKeyed: function onEnterKeyed(type, $e) {
var $selectable;
if ($selectable = this.menu.getActiveSelectable()) {
- this.select($selectable) && $e.preventDefault();
+ if (this.select($selectable)) {
+ $e.preventDefault();
+ $e.stopPropagation();
+ }
+ } else if (this.autoselect) {
+ if (this.select(this.menu.getTopSelectable())) {
+ $e.preventDefault();
+ $e.stopPropagation();
+ }
}
},
_onTabKeyed: function onTabKeyed(type, $e) {
@@ -1144,12 +1271,12 @@
},
_onLeftKeyed: function onLeftKeyed() {
if (this.dir === "rtl" && this.input.isCursorAtEnd()) {
- this.autocomplete(this.menu.getTopSelectable());
+ this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
}
},
_onRightKeyed: function onRightKeyed() {
if (this.dir === "ltr" && this.input.isCursorAtEnd()) {
- this.autocomplete(this.menu.getTopSelectable());
+ this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
}
},
_onQueryChanged: function onQueryChanged(e, query) {
@@ -1249,9 +1376,9 @@
},
select: function select($selectable) {
var data = this.menu.getSelectableData($selectable);
- if (data && !this.eventBus.before("select", data.obj)) {
+ if (data && !this.eventBus.before("select", data.obj, data.dataset)) {
this.input.setQuery(data.val, true);
- this.eventBus.trigger("select", data.obj);
+ this.eventBus.trigger("select", data.obj, data.dataset);
this.close();
return true;
}
@@ -1262,21 +1389,24 @@
query = this.input.getQuery();
data = this.menu.getSelectableData($selectable);
isValid = data && query !== data.val;
- if (isValid && !this.eventBus.before("autocomplete", data.obj)) {
+ if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) {
this.input.setQuery(data.val);
- this.eventBus.trigger("autocomplete", data.obj);
+ this.eventBus.trigger("autocomplete", data.obj, data.dataset);
return true;
}
return false;
},
moveCursor: function moveCursor(delta) {
- var query, $candidate, data, payload, cancelMove;
+ var query, $candidate, data, suggestion, datasetName, cancelMove, id;
query = this.input.getQuery();
$candidate = this.menu.selectableRelativeToCursor(delta);
data = this.menu.getSelectableData($candidate);
- payload = data ? data.obj : null;
+ suggestion = data ? data.obj : null;
+ datasetName = data ? data.dataset : null;
+ id = $candidate ? $candidate.attr("id") : null;
+ this.input.trigger("cursorchange", id);
cancelMove = this._minLengthMet() && this.menu.update(query);
- if (!cancelMove && !this.eventBus.before("cursorchange", payload)) {
+ if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) {
this.menu.setCursor($candidate);
if (data) {
this.input.setInputValue(data.val);
@@ -1284,7 +1414,7 @@
this.input.resetInputValue();
this._updateHint();
}
- this.eventBus.trigger("cursorchange", payload);
+ this.eventBus.trigger("cursorchange", suggestion, datasetName);
return true;
}
return false;
@@ -1322,7 +1452,7 @@
www = WWW(o.classNames);
return this.each(attach);
function attach() {
- var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor;
+ var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;
_.each(datasets, function(d) {
d.highlight = !!o.highlight;
});
@@ -1353,11 +1483,16 @@
node: $menu,
datasets: datasets
}, www);
+ status = new Status({
+ $input: $input,
+ menu: menu
+ });
typeahead = new Typeahead({
input: input,
menu: menu,
eventBus: eventBus,
- minLength: o.minLength
+ minLength: o.minLength,
+ autoselect: o.autoselect
}, www);
$input.data(keys.www, www);
$input.data(keys.typeahead, typeahead);
@@ -1450,7 +1585,7 @@
return query;
} else {
ttEach(this, function(t) {
- t.setVal(newVal);
+ t.setVal(_.toStr(newVal));
});
return this;
}
@@ -1481,8 +1616,10 @@
});
}
function buildHintFromInput($input, www) {
- return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({
- autocomplete: "off",
+ return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({
+ readonly: true,
+ required: false
+ }).removeAttr("id name placeholder").removeClass("required").attr({
spellcheck: "false",
tabindex: -1
});
@@ -1495,7 +1632,6 @@
style: $input.attr("style")
});
$input.addClass(www.classes.input).attr({
- autocomplete: "off",
spellcheck: false
});
try {
diff --git a/resources/assets/js/timeline.js b/resources/assets/js/timeline.js
index 69eec9af..bae14058 100644
--- a/resources/assets/js/timeline.js
+++ b/resources/assets/js/timeline.js
@@ -1,13 +1,54 @@
$(document).ready(function() {
$('.pagination').hide();
+ $('.container.timeline-container').removeClass('d-none');
let elem = document.querySelector('.timeline-feed');
+ pixelfed.fetchLikes();
+
let infScroll = new InfiniteScroll( elem, {
path: '.pagination__next',
append: '.timeline-feed',
status: '.page-load-status',
history: false,
});
+
infScroll.on( 'append', function( response, path, items ) {
pixelfed.hydrateLikes();
+ $('.status-card > .card-footer').each(function() {
+ var el = $(this);
+ if(!el.hasClass('d-none') && !el.find('input[name="comment"]').val()) {
+ $(this).addClass('d-none');
+ }
+ });
});
+
+
+});
+
+$(document).on("DOMContentLoaded", function() {
+
+ var active = false;
+
+ var lazyLoad = function() {
+ if (active === false) {
+ active = true;
+
+ var lazyImages = [].slice.call(document.querySelectorAll("img.lazy"));
+ lazyImages.forEach(function(lazyImage) {
+ if ((lazyImage.getBoundingClientRect().top <= window.innerHeight && lazyImage.getBoundingClientRect().bottom >= 0) && getComputedStyle(lazyImage).display !== "none") {
+ lazyImage.src = lazyImage.dataset.src;
+ lazyImage.srcset = lazyImage.dataset.srcset;
+ lazyImage.classList.remove("lazy");
+
+ lazyImages = lazyImages.filter(function(image) {
+ return image !== lazyImage;
+ });
+ }
+ });
+
+ active = false;
+ };
+ }
+ document.addEventListener("scroll", lazyLoad);
+ window.addEventListener("resize", lazyLoad);
+ window.addEventListener("orientationchange", lazyLoad);
});
diff --git a/resources/assets/sass/_variables.scss b/resources/assets/sass/_variables.scss
index f4a958a7..46639fe6 100644
--- a/resources/assets/sass/_variables.scss
+++ b/resources/assets/sass/_variables.scss
@@ -6,3 +6,17 @@ $body-bg: #f5f8fa;
$font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
$font-size-base: 0.9rem;
$line-height-base: 1.6;
+
+$font-size-lg: ($font-size-base * 1.25);
+$font-size-sm: ($font-size-base * .875);
+$input-height: 2.375rem;
+$input-height-sm: 1.9375rem;
+$input-height-lg: 3rem;
+$input-btn-focus-width: .2rem;
+$custom-control-indicator-bg: #dee2e6;
+$custom-control-indicator-disabled-bg: #e9ecef;
+$custom-control-description-disabled-color: #868e96;
+$white: white;
+$theme-colors: (
+ 'primary': #08d
+);
\ No newline at end of file
diff --git a/resources/assets/sass/app.scss b/resources/assets/sass/app.scss
index 235957bc..88a18d47 100644
--- a/resources/assets/sass/app.scss
+++ b/resources/assets/sass/app.scss
@@ -11,6 +11,10 @@
@import "custom";
+@import "components/filters";
+
@import "components/typeahead";
-@import "components/notifications";
\ No newline at end of file
+@import "components/notifications";
+
+@import "components/switch";
\ No newline at end of file
diff --git a/resources/assets/sass/components/filters.scss b/resources/assets/sass/components/filters.scss
new file mode 100644
index 00000000..99d026a4
--- /dev/null
+++ b/resources/assets/sass/components/filters.scss
@@ -0,0 +1,445 @@
+/*! Instagram.css v0.1.3 | MIT License | github.com/picturepan2/instagram.css */
+[class*="filter"] {
+ position: relative;
+}
+
+[class*="filter"]::before {
+ display: block;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ z-index: 1;
+}
+
+.filter-1977 {
+ -webkit-filter: sepia(.5) hue-rotate(-30deg) saturate(1.4);
+ filter: sepia(.5) hue-rotate(-30deg) saturate(1.4);
+}
+
+.filter-aden {
+ -webkit-filter: sepia(.2) brightness(1.15) saturate(1.4);
+ filter: sepia(.2) brightness(1.15) saturate(1.4);
+}
+
+.filter-aden::before {
+ background: rgba(125, 105, 24, .1);
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-amaro {
+ -webkit-filter: sepia(.35) contrast(1.1) brightness(1.2) saturate(1.3);
+ filter: sepia(.35) contrast(1.1) brightness(1.2) saturate(1.3);
+}
+
+.filter-amaro::before {
+ background: rgba(125, 105, 24, .2);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-ashby {
+ -webkit-filter: sepia(.5) contrast(1.2) saturate(1.8);
+ filter: sepia(.5) contrast(1.2) saturate(1.8);
+}
+
+.filter-ashby::before {
+ background: rgba(125, 105, 24, .35);
+ content: "";
+ mix-blend-mode: lighten;
+}
+
+.filter-brannan {
+ -webkit-filter: sepia(.4) contrast(1.25) brightness(1.1) saturate(.9) hue-rotate(-2deg);
+ filter: sepia(.4) contrast(1.25) brightness(1.1) saturate(.9) hue-rotate(-2deg);
+}
+
+.filter-brooklyn {
+ -webkit-filter: sepia(.25) contrast(1.25) brightness(1.25) hue-rotate(5deg);
+ filter: sepia(.25) contrast(1.25) brightness(1.25) hue-rotate(5deg);
+}
+
+.filter-brooklyn::before {
+ background: rgba(127, 187, 227, .2);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-charmes {
+ -webkit-filter: sepia(.25) contrast(1.25) brightness(1.25) saturate(1.35) hue-rotate(-5deg);
+ filter: sepia(.25) contrast(1.25) brightness(1.25) saturate(1.35) hue-rotate(-5deg);
+}
+
+.filter-charmes::before {
+ background: rgba(125, 105, 24, .25);
+ content: "";
+ mix-blend-mode: darken;
+}
+
+.filter-clarendon {
+ -webkit-filter: sepia(.15) contrast(1.25) brightness(1.25) hue-rotate(5deg);
+ filter: sepia(.15) contrast(1.25) brightness(1.25) hue-rotate(5deg);
+}
+
+.filter-clarendon::before {
+ background: rgba(127, 187, 227, .4);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-crema {
+ -webkit-filter: sepia(.5) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-2deg);
+ filter: sepia(.5) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-2deg);
+}
+
+.filter-crema::before {
+ background: rgba(125, 105, 24, .2);
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-dogpatch {
+ -webkit-filter: sepia(.35) saturate(1.1) contrast(1.5);
+ filter: sepia(.35) saturate(1.1) contrast(1.5);
+}
+
+.filter-earlybird {
+ -webkit-filter: sepia(.25) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-5deg);
+ filter: sepia(.25) contrast(1.25) brightness(1.15) saturate(.9) hue-rotate(-5deg);
+}
+
+.filter-earlybird::before {
+ background: radial-gradient(circle closest-corner, transparent 0, rgba(125, 105, 24, .2) 100%);
+ background: -o-radial-gradient(circle closest-corner, transparent 0, rgba(125, 105, 24, .2) 100%);
+ background: -moz-radial-gradient(circle closest-corner, transparent 0, rgba(125, 105, 24, .2) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, transparent 0, rgba(125, 105, 24, .2) 100%);
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-gingham {
+ -webkit-filter: contrast(1.1) brightness(1.1);
+ filter: contrast(1.1) brightness(1.1);
+}
+
+.filter-gingham::before {
+ background: #e6e6e6;
+ content: "";
+ mix-blend-mode: soft-light;
+}
+
+.filter-ginza {
+ -webkit-filter: sepia(.25) contrast(1.15) brightness(1.2) saturate(1.35) hue-rotate(-5deg);
+ filter: sepia(.25) contrast(1.15) brightness(1.2) saturate(1.35) hue-rotate(-5deg);
+}
+
+.filter-ginza::before {
+ background: rgba(125, 105, 24, .15);
+ content: "";
+ mix-blend-mode: darken;
+}
+
+.filter-hefe {
+ -webkit-filter: sepia(.4) contrast(1.5) brightness(1.2) saturate(1.4) hue-rotate(-10deg);
+ filter: sepia(.4) contrast(1.5) brightness(1.2) saturate(1.4) hue-rotate(-10deg);
+}
+
+.filter-hefe::before {
+ background: radial-gradient(circle closest-corner, transparent 0, rgba(0, 0, 0, .25) 100%);
+ background: -o-radial-gradient(circle closest-corner, transparent 0, rgba(0, 0, 0, .25) 100%);
+ background: -moz-radial-gradient(circle closest-corner, transparent 0, rgba(0, 0, 0, .25) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, transparent 0, rgba(0, 0, 0, .25) 100%);
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-helena {
+ -webkit-filter: sepia(.5) contrast(1.05) brightness(1.05) saturate(1.35);
+ filter: sepia(.5) contrast(1.05) brightness(1.05) saturate(1.35);
+}
+
+.filter-helena::before {
+ background: rgba(158, 175, 30, .25);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-hudson {
+ -webkit-filter: sepia(.25) contrast(1.2) brightness(1.2) saturate(1.05) hue-rotate(-15deg);
+ filter: sepia(.25) contrast(1.2) brightness(1.2) saturate(1.05) hue-rotate(-15deg);
+}
+
+.filter-hudson::before {
+ background: radial-gradient(circle closest-corner, transparent 25%, rgba(25, 62, 167, .25) 100%);
+ background: -o-radial-gradient(circle closest-corner, transparent 25%, rgba(25, 62, 167, .25) 100%);
+ background: -moz-radial-gradient(circle closest-corner, transparent 25%, rgba(25, 62, 167, .25) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, transparent 25%, rgba(25, 62, 167, .25) 100%);
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-inkwell {
+ -webkit-filter: brightness(1.25) contrast(.85) grayscale(1);
+ filter: brightness(1.25) contrast(.85) grayscale(1);
+}
+
+.filter-juno {
+ -webkit-filter: sepia(.35) contrast(1.15) brightness(1.15) saturate(1.8);
+ filter: sepia(.35) contrast(1.15) brightness(1.15) saturate(1.8);
+}
+
+.filter-juno::before {
+ background: rgba(127, 187, 227, .2);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-kelvin {
+ -webkit-filter: sepia(.15) contrast(1.5) brightness(1.1) hue-rotate(-10deg);
+ filter: sepia(.15) contrast(1.5) brightness(1.1) hue-rotate(-10deg);
+}
+
+.filter-kelvin::before {
+ background: radial-gradient(circle closest-corner, rgba(128, 78, 15, .25) 0, rgba(128, 78, 15, .5) 100%);
+ background: -o-radial-gradient(circle closest-corner, rgba(128, 78, 15, .25) 0, rgba(128, 78, 15, .5) 100%);
+ background: -moz-radial-gradient(circle closest-corner, rgba(128, 78, 15, .25) 0, rgba(128, 78, 15, .5) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, rgba(128, 78, 15, .25) 0, rgba(128, 78, 15, .5) 100%);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-lark {
+ -webkit-filter: sepia(.25) contrast(1.2) brightness(1.3) saturate(1.25);
+ filter: sepia(.25) contrast(1.2) brightness(1.3) saturate(1.25);
+}
+
+.filter-lofi {
+ -webkit-filter: saturate(1.1) contrast(1.5);
+ filter: saturate(1.1) contrast(1.5);
+}
+
+.filter-ludwig {
+ -webkit-filter: sepia(.25) contrast(1.05) brightness(1.05) saturate(2);
+ filter: sepia(.25) contrast(1.05) brightness(1.05) saturate(2);
+}
+
+.filter-ludwig::before {
+ background: rgba(125, 105, 24, .1);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-maven {
+ -webkit-filter: sepia(.35) contrast(1.05) brightness(1.05) saturate(1.75);
+ filter: sepia(.35) contrast(1.05) brightness(1.05) saturate(1.75);
+}
+
+.filter-maven::before {
+ background: rgba(158, 175, 30, .25);
+ content: "";
+ mix-blend-mode: darken;
+}
+
+.filter-mayfair {
+ -webkit-filter: contrast(1.1) brightness(1.15) saturate(1.1);
+ filter: contrast(1.1) brightness(1.15) saturate(1.1);
+}
+
+.filter-mayfair::before {
+ background: radial-gradient(circle closest-corner, transparent 0, rgba(175, 105, 24, .4) 100%);
+ background: -o-radial-gradient(circle closest-corner, transparent 0, rgba(175, 105, 24, .4) 100%);
+ background: -moz-radial-gradient(circle closest-corner, transparent 0, rgba(175, 105, 24, .4) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, transparent 0, rgba(175, 105, 24, .4) 100%);
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-moon {
+ -webkit-filter: brightness(1.4) contrast(.95) saturate(0) sepia(.35);
+ filter: brightness(1.4) contrast(.95) saturate(0) sepia(.35);
+}
+
+.filter-nashville {
+ -webkit-filter: sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg);
+ filter: sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg);
+}
+
+.filter-nashville::before {
+ background: radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(128, 78, 15, .65) 100%);
+ background: -o-radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(128, 78, 15, .65) 100%);
+ background: -moz-radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(128, 78, 15, .65) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(128, 78, 15, .65) 100%);
+ content: "";
+ mix-blend-mode: screen;
+}
+
+.filter-perpetua {
+ -webkit-filter: contrast(1.1) brightness(1.25) saturate(1.1);
+ filter: contrast(1.1) brightness(1.25) saturate(1.1);
+}
+
+.filter-perpetua::before {
+ background: linear-gradient(to bottom, rgba(0, 91, 154, .25), rgba(230, 193, 61, .25));
+ background: -o-linear-gradient(top, rgba(0, 91, 154, .25), rgba(230, 193, 61, .25));
+ background: -moz-linear-gradient(top, rgba(0, 91, 154, .25), rgba(230, 193, 61, .25));
+ background: -webkit-linear-gradient(top, rgba(0, 91, 154, .25), rgba(230, 193, 61, .25));
+ background: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 91, 154, .25)), to(rgba(230, 193, 61, .25)));
+ content: "";
+ mix-blend-mode: multiply;
+}
+
+.filter-poprocket {
+ -webkit-filter: sepia(.15) brightness(1.2);
+ filter: sepia(.15) brightness(1.2);
+}
+
+.filter-poprocket::before {
+ background: radial-gradient(circle closest-corner, rgba(206, 39, 70, .75) 40%, black 80%);
+ background: -o-radial-gradient(circle closest-corner, rgba(206, 39, 70, .75) 40%, black 80%);
+ background: -moz-radial-gradient(circle closest-corner, rgba(206, 39, 70, .75) 40%, black 80%);
+ background: -webkit-radial-gradient(circle closest-corner, rgba(206, 39, 70, .75) 40%, black 80%);
+ content: "";
+ mix-blend-mode: screen;
+}
+
+.filter-reyes {
+ -webkit-filter: sepia(.75) contrast(.75) brightness(1.25) saturate(1.4);
+ filter: sepia(.75) contrast(.75) brightness(1.25) saturate(1.4);
+}
+
+.filter-rise {
+ -webkit-filter: sepia(.25) contrast(1.25) brightness(1.2) saturate(.9);
+ filter: sepia(.25) contrast(1.25) brightness(1.2) saturate(.9);
+}
+
+.filter-rise::before {
+ background: radial-gradient(circle closest-corner, transparent 0, rgba(230, 193, 61, .25) 100%);
+ background: -o-radial-gradient(circle closest-corner, transparent 0, rgba(230, 193, 61, .25) 100%);
+ background: -moz-radial-gradient(circle closest-corner, transparent 0, rgba(230, 193, 61, .25) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, transparent 0, rgba(230, 193, 61, .25) 100%);
+ content: "";
+ mix-blend-mode: lighten;
+}
+
+.filter-sierra {
+ -webkit-filter: sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg);
+ filter: sepia(.25) contrast(1.5) brightness(.9) hue-rotate(-15deg);
+}
+
+.filter-sierra::before {
+ background: radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(0, 0, 0, .65) 100%);
+ background: -o-radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(0, 0, 0, .65) 100%);
+ background: -moz-radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(0, 0, 0, .65) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, rgba(128, 78, 15, .5) 0, rgba(0, 0, 0, .65) 100%);
+ content: "";
+ mix-blend-mode: screen;
+}
+
+.filter-skyline {
+ -webkit-filter: sepia(.15) contrast(1.25) brightness(1.25) saturate(1.2);
+ filter: sepia(.15) contrast(1.25) brightness(1.25) saturate(1.2);
+}
+
+.filter-slumber {
+ -webkit-filter: sepia(.35) contrast(1.25) saturate(1.25);
+ filter: sepia(.35) contrast(1.25) saturate(1.25);
+}
+
+.filter-slumber::before {
+ background: rgba(125, 105, 24, .2);
+ content: "";
+ mix-blend-mode: darken;
+}
+
+.filter-stinson {
+ -webkit-filter: sepia(.35) contrast(1.25) brightness(1.1) saturate(1.25);
+ filter: sepia(.35) contrast(1.25) brightness(1.1) saturate(1.25);
+}
+
+.filter-stinson::before {
+ background: rgba(125, 105, 24, .45);
+ content: "";
+ mix-blend-mode: lighten;
+}
+
+.filter-sutro {
+ -webkit-filter: sepia(.4) contrast(1.2) brightness(.9) saturate(1.4) hue-rotate(-10deg);
+ filter: sepia(.4) contrast(1.2) brightness(.9) saturate(1.4) hue-rotate(-10deg);
+}
+
+.filter-sutro::before {
+ background: radial-gradient(circle closest-corner, transparent 50%, rgba(0, 0, 0, .5) 90%);
+ background: -o-radial-gradient(circle closest-corner, transparent 50%, rgba(0, 0, 0, .5) 90%);
+ background: -moz-radial-gradient(circle closest-corner, transparent 50%, rgba(0, 0, 0, .5) 90%);
+ background: -webkit-radial-gradient(circle closest-corner, transparent 50%, rgba(0, 0, 0, .5) 90%);
+ content: "";
+ mix-blend-mode: darken;
+}
+
+.filter-toaster {
+ -webkit-filter: sepia(.25) contrast(1.5) brightness(.95) hue-rotate(-15deg);
+ filter: sepia(.25) contrast(1.5) brightness(.95) hue-rotate(-15deg);
+}
+
+.filter-toaster::before {
+ background: radial-gradient(circle, #804e0f, rgba(0, 0, 0, .25));
+ background: -o-radial-gradient(circle, #804e0f, rgba(0, 0, 0, .25));
+ background: -moz-radial-gradient(circle, #804e0f, rgba(0, 0, 0, .25));
+ background: -webkit-radial-gradient(circle, #804e0f, rgba(0, 0, 0, .25));
+ content: "";
+ mix-blend-mode: screen;
+}
+
+.filter-valencia {
+ -webkit-filter: sepia(.25) contrast(1.1) brightness(1.1);
+ filter: sepia(.25) contrast(1.1) brightness(1.1);
+}
+
+.filter-valencia::before {
+ background: rgba(230, 193, 61, .1);
+ content: "";
+ mix-blend-mode: lighten;
+}
+
+.filter-vesper {
+ -webkit-filter: sepia(.35) contrast(1.15) brightness(1.2) saturate(1.3);
+ filter: sepia(.35) contrast(1.15) brightness(1.2) saturate(1.3);
+}
+
+.filter-vesper::before {
+ background: rgba(125, 105, 24, .25);
+ content: "";
+ mix-blend-mode: overlay;
+}
+
+.filter-walden {
+ -webkit-filter: sepia(.35) contrast(.8) brightness(1.25) saturate(1.4);
+ filter: sepia(.35) contrast(.8) brightness(1.25) saturate(1.4);
+}
+
+.filter-walden::before {
+ background: rgba(229, 240, 128, .5);
+ content: "";
+ mix-blend-mode: darken;
+}
+
+.filter-willow {
+ -webkit-filter: brightness(1.2) contrast(.85) saturate(.05) sepia(.2);
+ filter: brightness(1.2) contrast(.85) saturate(.05) sepia(.2);
+}
+
+.filter-xpro-ii {
+ -webkit-filter: sepia(.45) contrast(1.25) brightness(1.75) saturate(1.3) hue-rotate(-5deg);
+ filter: sepia(.45) contrast(1.25) brightness(1.75) saturate(1.3) hue-rotate(-5deg);
+}
+
+.filter-xpro-ii::before {
+ background: radial-gradient(circle closest-corner, rgba(0, 91, 154, .35) 0, rgba(0, 0, 0, .65) 100%);
+ background: -o-radial-gradient(circle closest-corner, rgba(0, 91, 154, .35) 0, rgba(0, 0, 0, .65) 100%);
+ background: -moz-radial-gradient(circle closest-corner, rgba(0, 91, 154, .35) 0, rgba(0, 0, 0, .65) 100%);
+ background: -webkit-radial-gradient(circle closest-corner, rgba(0, 91, 154, .35) 0, rgba(0, 0, 0, .65) 100%);
+ content: "";
+ mix-blend-mode: multiply;
+}
\ No newline at end of file
diff --git a/resources/assets/sass/components/switch.scss b/resources/assets/sass/components/switch.scss
new file mode 100644
index 00000000..6ddb4724
--- /dev/null
+++ b/resources/assets/sass/components/switch.scss
@@ -0,0 +1,152 @@
+$switch-height: calc(#{$input-height} * .8) !default;
+$switch-height-sm: calc(#{$input-height-sm} * .8) !default;
+$switch-height-lg: calc(#{$input-height-lg} * .8) !default;
+$switch-border-radius: $switch-height !default;
+$switch-bg: $custom-control-indicator-bg !default;
+$switch-checked-bg: map-get($theme-colors, 'danger') !default;
+$switch-disabled-bg: $custom-control-indicator-disabled-bg !default;
+$switch-disabled-color: $custom-control-description-disabled-color !default;
+$switch-thumb-bg: $white !default;
+$switch-thumb-border-radius: 50% !default;
+$switch-thumb-padding: 2px !default;
+$switch-focus-box-shadow: 0 0 0 $input-btn-focus-width rgba(map-get($theme-colors, 'primary'), .25);
+$switch-transition: .2s all !default;
+
+.switch {
+ font-size: $font-size-base;
+ position: relative;
+
+ input {
+ position: absolute;
+ height: 1px;
+ width: 1px;
+ background: none;
+ border: 0;
+ clip: rect(0 0 0 0);
+ clip-path: inset(50%);
+ overflow: hidden;
+ padding: 0;
+
+ + label {
+ position: relative;
+ min-width: calc(#{$switch-height} * 2);
+ border-radius: $switch-border-radius;
+ height: $switch-height;
+ line-height: $switch-height;
+ display: inline-block;
+ cursor: pointer;
+ outline: none;
+ user-select: none;
+ vertical-align: middle;
+ text-indent: calc(calc(#{$switch-height} * 2) + .5rem);
+ }
+
+ + label::before,
+ + label::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: calc(#{$switch-height} * 2);
+ bottom: 0;
+ display: block;
+ }
+
+ + label::before {
+ right: 0;
+ background-color: $switch-bg;
+ border-radius: $switch-border-radius;
+ transition: $switch-transition;
+ }
+
+ + label::after {
+ top: $switch-thumb-padding;
+ left: $switch-thumb-padding;
+ width: calc(#{$switch-height} - calc(#{$switch-thumb-padding} * 2));
+ height: calc(#{$switch-height} - calc(#{$switch-thumb-padding} * 2));
+ border-radius: $switch-thumb-border-radius;
+ background-color: $switch-thumb-bg;
+ transition: $switch-transition;
+ }
+
+ &:checked + label::before {
+ background-color: $switch-checked-bg;
+ }
+
+ &:checked + label::after {
+ margin-left: $switch-height;
+ }
+
+ &:focus + label::before {
+ outline: none;
+ box-shadow: $switch-focus-box-shadow;
+ }
+
+ &:disabled + label {
+ color: $switch-disabled-color;
+ cursor: not-allowed;
+ }
+
+ &:disabled + label::before {
+ background-color: $switch-disabled-bg;
+ }
+ }
+
+ // Small variation
+ &.switch-sm {
+ font-size: $font-size-sm;
+
+ input {
+ + label {
+ min-width: calc(#{$switch-height-sm} * 2);
+ height: $switch-height-sm;
+ line-height: $switch-height-sm;
+ text-indent: calc(calc(#{$switch-height-sm} * 2) + .5rem);
+ }
+
+ + label::before {
+ width: calc(#{$switch-height-sm} * 2);
+ }
+
+ + label::after {
+ width: calc(#{$switch-height-sm} - calc(#{$switch-thumb-padding} * 2));
+ height: calc(#{$switch-height-sm} - calc(#{$switch-thumb-padding} * 2));
+ }
+
+ &:checked + label::after {
+ margin-left: $switch-height-sm;
+ }
+ }
+ }
+
+ // Large variation
+ &.switch-lg {
+ font-size: $font-size-lg;
+
+ input {
+ + label {
+ min-width: calc(#{$switch-height-lg} * 2);
+ height: $switch-height-lg;
+ line-height: $switch-height-lg;
+ text-indent: calc(calc(#{$switch-height-lg} * 2) + .5rem);
+ }
+
+ + label::before {
+ width: calc(#{$switch-height-lg} * 2);
+ }
+
+ + label::after {
+ width: calc(#{$switch-height-lg} - calc(#{$switch-thumb-padding} * 2));
+ height: calc(#{$switch-height-lg} - calc(#{$switch-thumb-padding} * 2));
+ }
+
+ &:checked + label::after {
+ margin-left: $switch-height-lg;
+ }
+ }
+ }
+
+ + .switch {
+ margin-left: 1rem;
+ }
+}
diff --git a/resources/assets/sass/custom.scss b/resources/assets/sass/custom.scss
index 33a15a99..5aa67fb4 100644
--- a/resources/assets/sass/custom.scss
+++ b/resources/assets/sass/custom.scss
@@ -10,6 +10,7 @@ body {
#content {
margin-bottom: auto !important;
}
+
body, button, input, textarea {
font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",
Roboto,Helvetica,Arial,sans-serif;
@@ -172,11 +173,6 @@ body, button, input, textarea {
}
}
-.fas.fa-heart {
- color: #f70ec4!important;
-}
-
-
@media (max-width: map-get($grid-breakpoints, "md")) {
.border-md-left-0 {
border-left:0!important
@@ -192,6 +188,17 @@ body, button, input, textarea {
}
}
+@media (max-width: map-get($grid-breakpoints, "sm")) {
+ .card-md-border-0 {
+ border-width: 0!important;
+ border-radius: 0!important;
+ }
+ .card-md-rounded-0 {
+ border-width: 1px 0;
+ border-radius:0 !important;
+ }
+}
+
@keyframes loading-bar {
from { background-position: 0 0; }
to { background-position: 100vw 0; }
@@ -203,3 +210,91 @@ body, button, input, textarea {
height: .25rem;
animation: loading-bar 3s linear infinite;
}
+
+.max-hide-overflow {
+ max-height: 500px;
+ overflow-y: hidden;
+}
+
+@media (min-width: map-get($grid-breakpoints, "xs")) {
+ .max-hide-overflow {
+ max-height: 600px!important;
+ }
+}
+
+@media (min-width: map-get($grid-breakpoints, "md")) {
+ .max-hide-overflow {
+ max-height: 800px!important;
+ }
+}
+
+@media (min-width: map-get($grid-breakpoints, "xl")) {
+ .max-hide-overflow {
+ max-height: 1000px!important;
+ }
+}
+
+.notification-image {
+ background-size: cover;
+ width: 32px;
+ height: 32px;
+ background-position: 50%;
+}
+
+
+.status-photo img {
+ object-fit: contain;
+ max-height: calc(100vh - (6rem));
+}
+
+@keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ transform: translateY(-1.25em);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+.details-animated[open] {
+ animation-name: fadeInDown;
+ animation-duration: 0.5s;
+}
+
+.card {
+ box-shadow: 0 2px 6px 0 hsla(0, 0%, 0%, 0.2);
+ border: none;
+}
+
+.box-shadow {
+ box-shadow: 0 2px 6px 0 hsla(0, 0%, 0%, 0.2);
+}
+
+.border-left-primary {
+ border-left: 3px solid $primary;
+}
+
+.settings-nav .nav-item.active .nav-link {
+ font-weight: bold !important;
+}
+
+details summary::-webkit-details-marker {
+ display: none!important;
+}
+
+.details-animated > summary {
+ display: block;
+ background-color: #ECF0F1;
+ padding-top: 50px;
+ padding-bottom: 50px;
+ text-align: center;
+}
+
+.details-animated[open] > summary {
+ display: none!important;
+}
+
+.profile-avatar img {
+ object-fit: cover;
+}
diff --git a/resources/lang/de/navmenu.php b/resources/lang/de/navmenu.php
new file mode 100644
index 00000000..7b983aa4
--- /dev/null
+++ b/resources/lang/de/navmenu.php
@@ -0,0 +1,14 @@
+ 'Mein Profil anschauen',
+ 'myTimeline' => 'Meine Timeline',
+ 'publicTimeline' => 'Öffentliche Timeline',
+ 'remoteFollow' => 'Aus der Ferne folgen',
+ 'settings' => 'Einstellungen',
+ 'admin' => 'Administration',
+ 'logout' => 'Abmelden',
+ 'directMessages' => 'Privatnachrichten',
+
+];
\ No newline at end of file
diff --git a/resources/lang/de/notification.php b/resources/lang/de/notification.php
index d393089f..4f204055 100644
--- a/resources/lang/de/notification.php
+++ b/resources/lang/de/notification.php
@@ -5,5 +5,6 @@ return [
'likedPhoto' => 'gefällt dein Foto.',
'startedFollowingYou' => 'folgt dir nun.',
'commented' => 'hat deinen Post kommentiert.',
+ 'mentionedYou' => 'hat dich erwähnt.'
];
\ No newline at end of file
diff --git a/resources/lang/de/profile.php b/resources/lang/de/profile.php
index 294a90c8..db3a3c26 100644
--- a/resources/lang/de/profile.php
+++ b/resources/lang/de/profile.php
@@ -5,4 +5,4 @@ return [
'emptyFollowers' => 'Diesem Benutzer folgt noch niemand!',
'emptyFollowing' => 'Dieser Benutzer folgt noch niemanden!',
'savedWarning' => 'Nur du kannst sehen was du gespeichert hast',
-];
\ No newline at end of file
+];
diff --git a/resources/lang/en/navmenu.php b/resources/lang/en/navmenu.php
new file mode 100644
index 00000000..3c6d2ebb
--- /dev/null
+++ b/resources/lang/en/navmenu.php
@@ -0,0 +1,14 @@
+ 'View my profile',
+ 'myTimeline' => 'My Timeline',
+ 'publicTimeline' => 'Public Timeline',
+ 'remoteFollow' => 'Remote Follow',
+ 'settings' => 'Settings',
+ 'admin' => 'Admin',
+ 'logout' => 'Logout',
+ 'directMessages' => 'Direct Messages',
+
+];
\ No newline at end of file
diff --git a/resources/lang/en/notification.php b/resources/lang/en/notification.php
index 2f85c438..71d87a13 100644
--- a/resources/lang/en/notification.php
+++ b/resources/lang/en/notification.php
@@ -5,5 +5,6 @@ return [
'likedPhoto' => 'liked your photo.',
'startedFollowingYou' => 'started following you.',
'commented' => 'commented on your post.',
+ 'mentionedYou' => 'mentioned you.'
];
\ No newline at end of file
diff --git a/resources/lang/en/profile.php b/resources/lang/en/profile.php
index 50b6f242..9fb9d10d 100644
--- a/resources/lang/en/profile.php
+++ b/resources/lang/en/profile.php
@@ -4,5 +4,6 @@ return [
'emptyTimeline' => 'This user has no posts yet!',
'emptyFollowers' => 'This user has no followers yet!',
'emptyFollowing' => 'This user is not following anyone yet!',
- 'savedWarning' => 'Only you can see what you\'ve saved',
-];
\ No newline at end of file
+ 'emptySaved' => 'You haven’t saved any post yet!',
+ 'savedWarning' => 'Only you can see what you’ve saved',
+];
diff --git a/resources/lang/fr/navmenu.php b/resources/lang/fr/navmenu.php
new file mode 100644
index 00000000..b6ab1f60
--- /dev/null
+++ b/resources/lang/fr/navmenu.php
@@ -0,0 +1,10 @@
+ 'Voir mon profil',
+ 'myTimeline' => 'Ma chronologie',
+ 'publicTimeline' => 'Chronologie publique',
+ 'remoteFollow' => 'Suivre à distance',
+ 'settings' => 'Paramètres',
+ 'admin' => 'Admin',
+ 'logout' => ' Se déconnecter',
+];
diff --git a/resources/lang/fr/notification.php b/resources/lang/fr/notification.php
index 96d3164d..b8945685 100644
--- a/resources/lang/fr/notification.php
+++ b/resources/lang/fr/notification.php
@@ -2,4 +2,6 @@
return [
'likedPhoto' => 'a aimé votre photo.',
'startedFollowingYou' => 'a commencé à vous suivre.',
+ 'commented' => 'commenté sur votre post.',
+ 'mentionedYou' => 'vous à mentionné.'
];
diff --git a/resources/lang/gl/navmenu.php b/resources/lang/gl/navmenu.php
new file mode 100644
index 00000000..1e427d5c
--- /dev/null
+++ b/resources/lang/gl/navmenu.php
@@ -0,0 +1,13 @@
+ 'Ver perfil',
+ 'myTimeline' => 'A miña liña temporal',
+ 'publicTimeline' => 'Liña temporal pública',
+ 'remoteFollow' => 'Seguimento remoto',
+ 'settings' => 'Axustes',
+ 'admin' => 'Admin',
+ 'logout' => 'Saír',
+
+];
diff --git a/resources/lang/he/navmenu.php b/resources/lang/he/navmenu.php
new file mode 100644
index 00000000..87c0f12a
--- /dev/null
+++ b/resources/lang/he/navmenu.php
@@ -0,0 +1,14 @@
+ 'צפה בפרופיל שלי',
+ 'myTimeline' => 'ציר הזמן שלי',
+ 'publicTimeline' => 'ציר הזמן הציבורי',
+ 'remoteFollow' => 'עקיבה מרחוק',
+ 'settings' => 'הגדרות',
+ 'admin' => 'מנהל',
+ 'logout' => 'התנתק',
+ 'directMessages' => 'הודעות ישירות',
+
+];
diff --git a/resources/lang/he/notification.php b/resources/lang/he/notification.php
index b529138d..40b51127 100644
--- a/resources/lang/he/notification.php
+++ b/resources/lang/he/notification.php
@@ -5,5 +5,6 @@ return [
'likedPhoto' => 'אהבו את התמונה שלך.',
'startedFollowingYou' => 'התחיל לעקוב אחריך.',
'commented' => 'הגיב על הפוסט שלך.',
+ 'mentionedYou' => 'הזכיר אותך.'
];
diff --git a/resources/lang/he/profile.php b/resources/lang/he/profile.php
index 5c76cbd9..6211907e 100644
--- a/resources/lang/he/profile.php
+++ b/resources/lang/he/profile.php
@@ -3,6 +3,7 @@
return [
'emptyTimeline' => 'למשתמש זה עדיין אין פוסטים!',
'emptyFollowers' => 'למשתמש זה עדיין אין עוקבים!',
- 'emptyFollowing' => 'משתמש זה עדיין אינו עוקב אחרי אף אחד!',
+ 'emptyFollowing' => 'משתמש זה עדיין אינו עוקב אחרי אף אחד!',
+ 'emptySaved' => 'עדיין לא שמרת שום פוסט!',
'savedWarning' => 'רק אתם יכולים לראות את מה ששמרתם',
];
diff --git a/resources/lang/oc/navmenu.php b/resources/lang/oc/navmenu.php
new file mode 100644
index 00000000..ccfe0f70
--- /dev/null
+++ b/resources/lang/oc/navmenu.php
@@ -0,0 +1,14 @@
+ 'Veire mon perfil',
+ 'myTimeline' => 'Ma cronologia',
+ 'publicTimeline' => 'Cronologia publica',
+ 'remoteFollow' => 'Seguir a distància',
+ 'settings' => 'Paramètres',
+ 'admin' => 'Admin',
+ 'logout' => 'Desconnexion',
+ 'directMessages' => 'Messatges dirèctes',
+
+];
diff --git a/resources/lang/oc/notification.php b/resources/lang/oc/notification.php
index 38676b25..acffb33e 100644
--- a/resources/lang/oc/notification.php
+++ b/resources/lang/oc/notification.php
@@ -4,5 +4,7 @@ return [
'likedPhoto' => 'a aimat vòstra fòto.',
'startedFollowingYou' => 'a començat de vos seguir.',
+ 'commented' => 'a comentat vòstra publicacion.',
+ 'mentionedYou' => 'vos a mencionat.'
];
diff --git a/resources/lang/oc/profile.php b/resources/lang/oc/profile.php
index ee70a7b0..a6d2ec8d 100644
--- a/resources/lang/oc/profile.php
+++ b/resources/lang/oc/profile.php
@@ -1,5 +1,9 @@
'Aqueste utilizaire a pas encara de publicacion !',
+ 'emptyTimeline' => 'Aqueste utilizaire a pas encara de publicacion !',
+ 'emptyFollowers' => 'Aqueste utilizaire a pas encara pas seguidors !',
+ 'emptyFollowing' => 'Aqueste utilizaire sèc degun pel moment !',
+ 'emptySaved' => 'Avètz cap de publicacion salvagardas pel moment !',
+ 'savedWarning' => 'Solament vos vesètz çò que salvagardatz',
];
diff --git a/resources/lang/oc/timeline.php b/resources/lang/oc/timeline.php
new file mode 100644
index 00000000..dee3660c
--- /dev/null
+++ b/resources/lang/oc/timeline.php
@@ -0,0 +1,7 @@
+ 'Vòstre cronologia es voida.'
+
+];
diff --git a/resources/lang/pl/navmenu.php b/resources/lang/pl/navmenu.php
new file mode 100644
index 00000000..dda1fbdd
--- /dev/null
+++ b/resources/lang/pl/navmenu.php
@@ -0,0 +1,14 @@
+ 'Pokaż mój profil',
+ 'myTimeline' => 'Moja oś czasu',
+ 'publicTimeline' => 'Publiczna oś czasu',
+ 'remoteFollow' => 'Zdalne śledzenie',
+ 'settings' => 'Ustawienia',
+ 'admin' => 'Administrator',
+ 'logout' => 'Wyloguj się',
+ 'directMessages' => 'Wiadomości bezpośrednie',
+
+];
diff --git a/resources/lang/pl/notification.php b/resources/lang/pl/notification.php
index d9d2e412..d24e0b9e 100644
--- a/resources/lang/pl/notification.php
+++ b/resources/lang/pl/notification.php
@@ -2,7 +2,9 @@
return [
- 'likedPhoto' => 'polubił Twoje zdjęcie.',
- 'startedFollowingYou' => 'zaczął Cię obserwować.',
+ 'likedPhoto' => 'polubił(a) Twoje zdjęcie.',
+ 'startedFollowingYou' => 'zaczął(-ęła) Cię obserwować.',
+ 'commented' => 'skomentował(a) Twój wpis',
+ 'mentionedYou' => 'wspomniał(a) o Tobie.'
];
diff --git a/resources/lang/pl/profile.php b/resources/lang/pl/profile.php
index cdd0d56a..74dd75da 100644
--- a/resources/lang/pl/profile.php
+++ b/resources/lang/pl/profile.php
@@ -4,5 +4,6 @@ return [
'emptyTimeline' => 'Ten użytkownik nie opublikował jeszcze niczego!',
'emptyFollowers' => 'Nikt nie obserwuje tego użytkownika!',
'emptyFollowing' => 'Ten użytkownik nie obserwuje nikogo!',
- 'savedWarning' => 'Tylko Ty widzisz to, co zapisałeś',
+ 'emptySaved' => 'Nie zapisałeś(-aś) jeszcze niczego!',
+ 'savedWarning' => 'Tylko Ty widzisz to, co zapisałeś(-aś)',
];
diff --git a/resources/lang/vendor/backup/gl/notifications.php b/resources/lang/vendor/backup/gl/notifications.php
new file mode 100644
index 00000000..8ab623b0
--- /dev/null
+++ b/resources/lang/vendor/backup/gl/notifications.php
@@ -0,0 +1,35 @@
+ 'Mensaxe da exepción: :message',
+ 'exception_trace' => 'Traza da excepción: :trace',
+ 'exception_message_title' => 'Mensaxe da excepción',
+ 'exception_trace_title' => 'Traza da excepción',
+
+ 'backup_failed_subject' => 'Erro no respaldo de :application_name',
+ 'backup_failed_body' => 'Importante: Algo fallou ao respaldar :application_name',
+
+ 'backup_successful_subject' => 'Respaldo realizado correctamente :application_name',
+ 'backup_successful_subject_title' => 'Novo respaldo correcto!',
+ 'backup_successful_body' => 'Parabéns, un novo respaldo de :application_name foi realizado correctamente no disco con nome :disk_name.',
+
+ 'cleanup_failed_subject' => 'Limpando os respaldos de :application_name failed.',
+ 'cleanup_failed_body' => 'Algo fallou mentras se limpaban os respaldos de :application_name',
+
+ 'cleanup_successful_subject' => 'Limpeza correcta nos respaldos de :application_name',
+ 'cleanup_successful_subject_title' => 'Limpeza dos respaldos correcta!',
+ 'cleanup_successful_body' => 'Realizouse correctamente a limpeza dos respaldos de :application_name no disco con nome :disk_name.',
+
+ 'healthy_backup_found_subject' => 'Os respaldos de :application_name no disco :disk_name están en bo estado',
+ 'healthy_backup_found_subject_title' => 'Os respaldos de :application_name están ben!',
+ 'healthy_backup_found_body' => 'Os respaldos de :application_name están en bo estado. Bo traballo!',
+
+ 'unhealthy_backup_found_subject' => 'Importante: Os respaldos de :application_name non están en bo estado',
+ 'unhealthy_backup_found_subject_title' => 'Importante: Os respaldos de :application_name non están ben. :problem',
+ 'unhealthy_backup_found_body' => 'Os respaldos para :application_name no disco :disk_name non están ben.',
+ 'unhealthy_backup_found_not_reachable' => 'Non se puido alcanzar o disco de destino. :error',
+ 'unhealthy_backup_found_empty' => 'Non existen copias de respaldo para esta aplicación.',
+ 'unhealthy_backup_found_old' => 'O último respaldo realizouse en :date e considerase demasiado antigo.',
+ 'unhealthy_backup_found_unknown' => 'Lamentámolo, non se puido determinar unha causa concreta.',
+ 'unhealthy_backup_found_full' => 'Os respaldos están a utilizar demasiado espazo. A utilización actual de :disk_usage é maior que o límite establecido de :disk_limit.',
+];
diff --git a/resources/views/account/activity.blade.php b/resources/views/account/activity.blade.php
index 1b46263a..2354b7ef 100644
--- a/resources/views/account/activity.blade.php
+++ b/resources/views/account/activity.blade.php
@@ -3,23 +3,60 @@
@section('content')
+
+
@if($notifications->count() > 0)
@foreach($notifications as $notification)
-
+
@switch($notification->action)
@case('like')
-
+
{!! $notification->rendered !!}
{{$notification->created_at->diffForHumans(null, true, true, true)}}
- @if($notification->item_id)
+ @if($notification->item_id && $notification->item_type == 'App\Status')
@endif
@@ -54,7 +91,32 @@
@if($notification->item_id)
-
+
+
+
+ @endif
+
+ @break
+
+ @case('mention')
+
+
+
+
+ {!! $notification->rendered !!}
+ {{$notification->created_at->diffForHumans(null, true, true, true)}}
+
+
+ @if($notification->item_id && $notification->item_type === 'App\Status')
+ @if(is_null($notification->status->in_reply_to_id))
+
+
+
+ @else
+
+
+
+ @endif
@endif
@break
@@ -62,12 +124,20 @@
@endswitch
@endforeach
+
+
+
+ {{$notifications->links()}}
+
@else
No unread notifications found.
@endif
-
@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/account/following.blade.php b/resources/views/account/following.blade.php
new file mode 100644
index 00000000..8cb3dbf9
--- /dev/null
+++ b/resources/views/account/following.blade.php
@@ -0,0 +1,96 @@
+@extends('layouts.app')
+
+@section('content')
+
+
+
+
+{{-- --}}
+
+
+
+ @if($notifications->count() > 0)
+ @foreach($notifications as $notification)
+ @php
+ if(!in_array($notification->action, ['like', 'follow'])) {
+ continue;
+ }
+ @endphp
+
+ @switch($notification->action)
+
+ @case('like')
+
+
+
+
+ {{$notification->actor->username}}
+
+ {{__('liked a post by')}}
+
+ {{$notification->item->profile->username}}
+
+ {{$notification->created_at->diffForHumans(null, true, true, true)}}
+
+
+ @if($notification->item_id && $notification->item_type == 'App\Status')
+
+ @endif
+
+ @break
+
+ @case('follow')
+
+
+
+
+ {{$notification->actor->username}}
+
+ {{__('started following')}}
+
+ {{$notification->item->username}}
+
+ {{$notification->created_at->diffForHumans(null, true, true, true)}}
+
+ @break
+
+ @endswitch
+
+ @endforeach
+
+
+
+ {{$notifications->links()}}
+
+ @else
+
+
No unread notifications found.
+
+ @endif
+
+
+@endsection
+
+@push('scripts')
+
+@endpush
diff --git a/resources/views/account/verify_email.blade.php b/resources/views/account/verify_email.blade.php
new file mode 100644
index 00000000..99ae26f3
--- /dev/null
+++ b/resources/views/account/verify_email.blade.php
@@ -0,0 +1,24 @@
+@extends('layouts.app')
+
+@section('content')
+
+
+ @if (session('status'))
+
+ {{ session('status') }}
+
+ @endif
+
+
+
+
You need to confirm your email address ({{Auth::user()->email}} ) before you can proceed.
+
+
+
+
+
+
+@endsection
\ No newline at end of file
diff --git a/resources/views/atom/user.blade.php b/resources/views/atom/user.blade.php
index dd639dd3..c27ebcd8 100644
--- a/resources/views/atom/user.blade.php
+++ b/resources/views/atom/user.blade.php
@@ -26,16 +26,16 @@
@foreach($items as $item)
- caption }}]]>
+ {{ $item->caption }}
{{ url($item->id) }}
profile->username }}]]>
- caption !!}]]>
+ {{ $item->caption }}
{{ $item->updated_at->toAtomString() }}
@endforeach
-
\ No newline at end of file
+
diff --git a/resources/views/discover/home.blade.php b/resources/views/discover/home.blade.php
index 5bd9e3c3..1995e2b5 100644
--- a/resources/views/discover/home.blade.php
+++ b/resources/views/discover/home.blade.php
@@ -6,16 +6,16 @@
Discover People
@foreach($people as $profile)
-