Showing preview only (7,458K chars total). Download the full file or copy to clipboard to get everything.
Repository: hakanersu/iwatched
Branch: master
Commit: ef3be424fb5c
Files: 190
Total size: 56.6 MB
Directory structure:
gitextract_mpu2o96m/
├── .cloud/
│ ├── docker/
│ │ ├── Dockerfile
│ │ └── Dockerfile.prod
│ ├── nginx/
│ │ └── nginx.conf
│ ├── php/
│ │ └── local.ini
│ └── scripts/
│ └── entrypoint.sh
├── .editorconfig
├── .eslintrc
├── .gitattributes
├── .gitignore
├── .styleci.yml
├── README.md
├── app/
│ ├── Console/
│ │ ├── Commands/
│ │ │ ├── ImportTitles.php
│ │ │ └── toElastic.php
│ │ └── Kernel.php
│ ├── Crew.php
│ ├── Episode.php
│ ├── Exceptions/
│ │ └── Handler.php
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── Auth/
│ │ │ │ ├── ConfirmPasswordController.php
│ │ │ │ ├── EmailVerificationController.php
│ │ │ │ ├── ForgotPasswordController.php
│ │ │ │ ├── LoginController.php
│ │ │ │ ├── LogoutController.php
│ │ │ │ ├── PasswordResetController.php
│ │ │ │ ├── RegisterController.php
│ │ │ │ ├── ResetPasswordController.php
│ │ │ │ └── VerificationController.php
│ │ │ ├── Controller.php
│ │ │ ├── DashboardController.php
│ │ │ ├── HomeController.php
│ │ │ ├── MovieController.php
│ │ │ ├── SearchController.php
│ │ │ ├── SeriesController.php
│ │ │ ├── WatchListController.php
│ │ │ └── WatchedController.php
│ │ ├── Kernel.php
│ │ └── Middleware/
│ │ ├── Authenticate.php
│ │ ├── CheckForMaintenanceMode.php
│ │ ├── EncryptCookies.php
│ │ ├── RedirectIfAuthenticated.php
│ │ ├── TrimStrings.php
│ │ ├── TrustProxies.php
│ │ └── VerifyCsrfToken.php
│ ├── Jobs/
│ │ └── FetchPosterJob.php
│ ├── Models/
│ │ └── WatchList.php
│ ├── Name.php
│ ├── Poster.php
│ ├── Principal.php
│ ├── Providers/
│ │ ├── AppServiceProvider.php
│ │ ├── AuthServiceProvider.php
│ │ ├── BroadcastServiceProvider.php
│ │ ├── EventServiceProvider.php
│ │ ├── HorizonServiceProvider.php
│ │ └── RouteServiceProvider.php
│ ├── Rating.php
│ ├── Title.php
│ ├── User.php
│ ├── Watched/
│ │ ├── Importers/
│ │ │ ├── AkaImporter.php
│ │ │ ├── CrewImporter.php
│ │ │ ├── EpisodeImporter.php
│ │ │ ├── Importer.php
│ │ │ ├── ImporterInterface.php
│ │ │ ├── NameImporter.php
│ │ │ ├── PrincipalImporter.php
│ │ │ ├── RatingImporter.php
│ │ │ └── TitleImporter.php
│ │ └── Traits/
│ │ └── TitleFilter.php
│ └── Watched.php
├── artisan
├── bin/
│ └── abc
├── bootstrap/
│ ├── app.php
│ └── cache/
│ └── .gitignore
├── clear.sh
├── composer.json
├── config/
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── cors.php
│ ├── database.php
│ ├── filesystems.php
│ ├── hashing.php
│ ├── horizon.php
│ ├── logging.php
│ ├── mail.php
│ ├── movie.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database/
│ ├── .gitignore
│ ├── factories/
│ │ └── UserFactory.php
│ ├── migrations/
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ │ ├── 2020_06_03_231708_create_watched_table.php
│ │ ├── 2020_06_03_231837_create_posters_table.php
│ │ ├── 2020_06_19_095538_create_watch_lists_table.php
│ │ └── imdb/
│ │ ├── 2020_06_01_231011_create_titles_table.php
│ │ ├── 2020_06_01_231940_create_episodes_table.php
│ │ ├── 2020_06_01_232132_create_ratings_table.php
│ │ ├── 2020_06_01_232423_create_principals_table.php
│ │ ├── 2020_06_01_232702_create_names_table.php
│ │ ├── 2020_06_01_232924_create_crews_table.php
│ │ └── 2020_06_03_135647_create_akas_table.php
│ └── seeds/
│ └── DatabaseSeeder.php
├── docker-compose.yml
├── package.json
├── phpunit.xml
├── public/
│ ├── .htaccess
│ ├── css/
│ │ └── app.css
│ ├── index.php
│ ├── js/
│ │ └── app.js
│ ├── mix-manifest.json
│ ├── robots.txt
│ ├── vendor/
│ │ └── horizon/
│ │ ├── app-dark.css
│ │ ├── app.css
│ │ ├── app.js
│ │ └── mix-manifest.json
│ └── web.config
├── resources/
│ ├── js/
│ │ ├── app.js
│ │ ├── bootstrap.js
│ │ └── components/
│ │ ├── CheckboxComponent.vue
│ │ ├── MovieComponent.vue
│ │ ├── SearchComponent.vue
│ │ └── SeriesComponent.vue
│ ├── lang/
│ │ └── en/
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ ├── sass/
│ │ └── app.scss
│ └── views/
│ ├── auth/
│ │ ├── login.blade.php
│ │ ├── passwords/
│ │ │ ├── confirm.blade.php
│ │ │ ├── email.blade.php
│ │ │ └── reset.blade.php
│ │ ├── register.blade.php
│ │ └── verify.blade.php
│ ├── components/
│ │ ├── app.blade.php
│ │ ├── filter.blade.php
│ │ └── logo.blade.php
│ ├── dashboard.blade.php
│ ├── home.blade.php
│ ├── layouts/
│ │ ├── app.blade.php
│ │ ├── auth.blade.php
│ │ └── base.blade.php
│ ├── livewire/
│ │ ├── auth/
│ │ │ ├── login.blade.php
│ │ │ ├── passwords/
│ │ │ │ ├── confirm.blade.php
│ │ │ │ ├── email.blade.php
│ │ │ │ └── reset.blade.php
│ │ │ ├── register.blade.php
│ │ │ └── verify.blade.php
│ │ ├── checkbox.blade.php
│ │ ├── movie.blade.php
│ │ ├── movies.blade.php
│ │ └── paginate.blade.php
│ ├── movies.blade.php
│ ├── queries/
│ │ └── elasticsearch.blade.php
│ ├── series/
│ │ ├── index.blade.php
│ │ └── show.blade.php
│ ├── show.blade.php
│ ├── vendor/
│ │ ├── livewire/
│ │ │ └── pagination-links.blade.php
│ │ └── pagination/
│ │ ├── default.blade.php
│ │ └── simple-default.blade.php
│ ├── watched.blade.php
│ └── welcome.blade.php
├── routes/
│ ├── api.php
│ ├── channels.php
│ ├── console.php
│ └── web.php
├── server.php
├── storage/
│ ├── app/
│ │ └── .gitignore
│ ├── debugbar/
│ │ └── .gitignore
│ ├── framework/
│ │ ├── .gitignore
│ │ ├── cache/
│ │ │ └── .gitignore
│ │ ├── sessions/
│ │ │ └── .gitignore
│ │ ├── testing/
│ │ │ └── .gitignore
│ │ └── views/
│ │ └── .gitignore
│ └── logs/
│ └── .gitignore
├── tailwind.config.js
├── tests/
│ ├── CreatesApplication.php
│ ├── Feature/
│ │ ├── Auth/
│ │ │ ├── LoginTest.php
│ │ │ ├── LogoutTest.php
│ │ │ ├── Passwords/
│ │ │ │ ├── ConfirmTest.php
│ │ │ │ ├── EmailTest.php
│ │ │ │ └── ResetTest.php
│ │ │ ├── RegisterTest.php
│ │ │ └── VerifyTest.php
│ │ └── ExampleTest.php
│ ├── TestCase.php
│ └── Unit/
│ └── ExampleTest.php
└── webpack.mix.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .cloud/docker/Dockerfile
================================================
FROM php:7.4-fpm
LABEL maintainer="hakanersu@gmail.com"
# Installing dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpng-dev \
libpq-dev \
libonig-dev \
libzip-dev \
locales \
zip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Installing extensions
RUN docker-php-ext-install pdo_pgsql mbstring zip exif pcntl bcmath opcache
#Installing redis
RUN pecl install redis && docker-php-ext-enable redis
# Installing composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Changing Workdir
WORKDIR /application
================================================
FILE: .cloud/docker/Dockerfile.prod
================================================
FROM composer:1.10 as vendor
COPY composer.json composer.json
COPY composer.lock composer.lock
COPY database/ database/
RUN composer install \
--ignore-platform-reqs \
--no-interaction \
--no-plugins \
--no-scripts \
--prefer-dist
FROM node:latest as yarn
RUN mkdir -p /app/public
COPY *.json *.yarn *.js /app/
COPY resources /app/resources
WORKDIR /app
RUN yarn install && yarn prod
FROM php:7.4-fpm
LABEL maintainer="hakanersu@gmail.com"
# Installing dependencies
RUN apt-get update --allow-releaseinfo-change && apt-get install -y --no-install-recommends \
build-essential \
libpng-dev \
libpq-dev \
libonig-dev \
libzip-dev \
locales \
zip \
nginx
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Installing extensions
RUN pecl install -o -f redis && docker-php-ext-enable redis
RUN docker-php-ext-install pdo_pgsql mbstring zip exif pcntl bcmath opcache
# Changing Workdir
WORKDIR /var/www
COPY --from=vendor /app/vendor/ /var/www/vendor/
COPY --from=yarn /app/public/dist/ /var/www/public/dist/
COPY --from=yarn /app/public/mix-manifest.json /var/www/public/mix-manifest.json
COPY . /var/www
COPY .cloud/nginx/nginx.conf.prod /etc/nginx/sites-enabled/default
COPY .cloud/scripts/entrypoint.sh /etc/entrypoint.sh
RUN mkdir -p storage/framework/sessions
RUN mkdir -p storage/framework/views
RUN mkdir -p storage/framework/cache
RUN chown -R www-data:www-data /var/www
RUN chmod +x /etc/entrypoint.sh
ENTRYPOINT ["sh", "/etc/entrypoint.sh"]
================================================
FILE: .cloud/nginx/nginx.conf
================================================
server {
listen 8000;
index index.php index.html index.htm;
root /application/public; # default Laravel's entry point for all requests
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
client_max_body_size 200M;
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php?$args;
}
location ~ \.php$ {
fastcgi_index index.php;
fastcgi_pass iwatched-server:9000; # address of a fastCGI server
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
include fastcgi_params;
}
}
================================================
FILE: .cloud/php/local.ini
================================================
upload_max_filesize=40M
post_max_size=40M
memory_limit=-1
================================================
FILE: .cloud/scripts/entrypoint.sh
================================================
#!/bin/sh
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
================================================
FILE: .eslintrc
================================================
{
"extends": [
"eslint:recommended",
"plugin:vue/recommended"
],
"rules": {
"import/no-unresolved": 0,
"import/no-unassigned-import": 0,
"semi": [
"error",
"never"
],
"no-console": "off",
"space-before-function-paren": [
"error",
{
"anonymous": "always",
"named": "always",
"asyncArrow": "always"
}
]
},
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"jquery": true
},
"globals": {
"process": true
},
"parser": "vue-eslint-parser",
"parserOptions": {
"parser": "babel-eslint",
"ecmaVersion": 8,
"sourceType": "module"
},
"overrides": [
{
"files": [
"**/resources/js/__tests__/*.{j,t}s?(x)",
"**/resources/js/tests/unit/**/*.spec.{j,t}s?(x)"
],
"env": {
"jest": true
}
}
]
}
================================================
FILE: .gitattributes
================================================
* text=auto
*.css linguist-vendored
*.scss linguist-vendored
*.js linguist-vendored
CHANGELOG.md export-ignore
================================================
FILE: .gitignore
================================================
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
.env
.env.backup
.phpunit.result.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.idea
.vscode
pipeline_*
================================================
FILE: .styleci.yml
================================================
php:
preset: laravel
disabled:
- unused_use
finder:
not-name:
- index.php
- server.php
js:
finder:
not-name:
- webpack.mix.js
css: true
================================================
FILE: README.md
================================================
### iWatched
I am currently working on a new version which you can find in pull requests. Also here is a [demo](https://xuma.dev)
iWatched is movie, tv series tracker for personal usage. iWatched uses [imdb dataset](https://datasets.imdbws.com/). By a command it downloads all required datasets, unzips and imports to PostgreSQL database.
Import part is done by native PostgreSql command copy with Eloquent query builder. Part of the importing process also added weight column which will help ranking more accurately. You can find more information about imdb ranking algorithm [here](https://en.wikipedia.org/wiki/IMDb#Rankings).
### Searching
By default search is done by elasticsearch if you wish to search directly from database add `ELASTICSEARCH=false` variable to you .env file. Keep in mind database search is very slow.
### ElasticSearch
You can use [abc tool](https://github.com/appbaseio/abc) to import titles table. After that you will get pretty fast search results.
```sh
abc import --src_type=postgres --src_filter=titles --src_uri="postgresql://postgres:<your-password>@127.0.0.1:5432/<database-name>" "http://localhost:9200/titles"
```

You can also use some shortcuts to find desired title.
```sh
the gift :year 2000
```
```sh
tt0903747 :imdb
```
### Movies

### Series

### Posters
Posters automatically fetched from themoviedb.org and stored at default storage.
### Commands
```sh
php artisan import:titles
```
You can skip tables.
```sh
php artisan import:titles --skip=title
```
Or import only given tables.
```sh
php artisan import:titles --only=rating
```
### Docker compose
Check .env.example file and be sure above ports not used.
```dotenv
PSQL_PORT=5439:5432
APP_PORT=8000:8000
```
#### Commands
```
docker-compose up -d
# If you getting any error when storage:link just remove public/storage folder.
docker-compose run --rm --no-deps iwatched-server php artisan storage:link
# This will migrate basic user tables.
docker-compose run --rm --no-deps iwatched-server php artisan migrate
# Downloads imdb dataset if its not already downloaded and imports to pgsql.
docker-compose run --rm --no-deps iwatched-server php artisan import:titles
```
You can now access app http://localhost:8000 with this url.
```
# If you start docker-compose recently please wait es cluster up and try again.
docker-compose run --rm --no-deps iwatched-server php artisan import:elastic
```
After first run you can start/stop app with below commands.
```
docker-compose start
docker-compose stop
```
### TODO
- [ ] Minio/AWS integration for posters.
================================================
FILE: app/Console/Commands/ImportTitles.php
================================================
<?php
namespace App\Console\Commands;
use App\Watched\Importers\ImporterInterface;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class ImportTitles extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'import:titles
{--skip= : Which tables to skip process. Comma separated.}
{--only= : Only given tables will process. Comma separated. }';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import titles.';
protected $fields = [];
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->info('Starting.');
$fields = $original = ['title', 'episode', 'principal', 'name', 'crew', 'aka', 'rating'];
$skip = $this->option('skip');
$only = $this->option('only');
if ($skip) {
$skip = explode(',', $skip);
$fields = array_diff($fields, $skip);
}
if ($only) {
$fields = array_intersect($fields, explode(',', $only));
}
$this->fields = collect($fields);
if ($this->fields->count() <=0) {
$this->info("Nothing to do, available fields: ". json_encode($original));
return false;
}
$this->dropTables();
$this->createTables();
$this->fields->each(fn($field) => $this->importer($field)->download($this->output)->start()->index());
}
private function dropTables(): void
{
$this->fields->each(function ($field) {
$table = Str::plural($field);
Schema::dropIfExists($table);
$migration = "create_{$table}_table";
$this->info("Dropping {$table}.");
DB::table('migrations')->where('migration', 'like', "%{$migration}")->delete();
});
$this->callSilent('migrate:rollback', ['--path' => 'database/migrations/imdb','--force' => true, '--quiet' => true]);
}
private function createTables(): void
{
$this->info('Migrating tables.');
$this->callSilent('migrate', ['--path' => 'database/migrations/imdb', '--force' => true, '--quiet' => true]);
}
private function importer($field): ImporterInterface
{
$name = "App\Watched\Importers\\". Str::studly("{$field}_importer");
return new $name;
}
}
================================================
FILE: app/Console/Commands/toElastic.php
================================================
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Symfony\Component\Process\Process;
class toElastic extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'import:elastic';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Import titles to elasticsearch.';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$command = base_path('bin') . '/abc import --src_type=postgres --src_filter=titles --src_uri="'.$this->postgresUrl().'" "http://iwatched-es01:9200/titles" 2>/dev/null';
$this->info($command);
exec($command, $output, $return);
if (!$return) {
$this->info("Import succesfull");
}else {
$this->error("ES cluster not up yet please take a few minutes and try again.");
}
}
private function postgresUrl(): string
{
return "postgresql://".env('DB_USERNAME').":".env('DB_PASSWORD')."@".env('DB_HOST').":".env('DB_PORT')."/".env('DB_DATABASE');
}
}
================================================
FILE: app/Console/Kernel.php
================================================
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// $schedule->command('inspire')->hourly();
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
================================================
FILE: app/Crew.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Crew extends Model
{
public function name()
{
return $this->hasOne(Name::class, 'nconst', 'nconst');
}
}
================================================
FILE: app/Episode.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Episode extends Model
{
//
}
================================================
FILE: app/Exceptions/Handler.php
================================================
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];
/**
* Report or log an exception.
*
* @param \Throwable $exception
* @return void
*
* @throws \Exception
*/
public function report(Throwable $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Throwable
*/
public function render($request, Throwable $exception)
{
return parent::render($request, $exception);
}
}
================================================
FILE: app/Http/Controllers/Auth/ConfirmPasswordController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ConfirmsPasswords;
class ConfirmPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Confirm Password Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password confirmations and
| uses a simple trait to include the behavior. You're free to explore
| this trait and override any functions that require customization.
|
*/
use ConfirmsPasswords;
/**
* Where to redirect users when the intended url fails.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
}
================================================
FILE: app/Http/Controllers/Auth/EmailVerificationController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Verified;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\RedirectResponse;
use App\Providers\RouteServiceProvider;
use Illuminate\Auth\Access\AuthorizationException;
class EmailVerificationController extends Controller
{
public function __invoke(string $id, string $hash): RedirectResponse
{
if (!hash_equals((string) $id, (string) Auth::user()->getKey())) {
throw new AuthorizationException();
}
if (!hash_equals((string) $hash, sha1(Auth::user()->getEmailForVerification()))) {
throw new AuthorizationException();
}
if (Auth::user()->hasVerifiedEmail()) {
return redirect(route('home'));
}
if (Auth::user()->markEmailAsVerified()) {
event(new Verified(Auth::user()));
}
return redirect(route('home'));
}
}
================================================
FILE: app/Http/Controllers/Auth/ForgotPasswordController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
}
================================================
FILE: app/Http/Controllers/Auth/LoginController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
================================================
FILE: app/Http/Controllers/Auth/LogoutController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\RedirectResponse;
class LogoutController extends Controller
{
public function __invoke(): RedirectResponse
{
Auth::logout();
return redirect(route('home'));
}
}
================================================
FILE: app/Http/Controllers/Auth/PasswordResetController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
class PasswordResetController extends Controller
{
public function __invoke($token)
{
return view('auth.passwords.reset', [
'token' => $token,
]);
}
}
================================================
FILE: app/Http/Controllers/Auth/RegisterController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}
================================================
FILE: app/Http/Controllers/Auth/ResetPasswordController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
}
================================================
FILE: app/Http/Controllers/Auth/VerificationController.php
================================================
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\VerifiesEmails;
class VerificationController extends Controller
{
/*
|--------------------------------------------------------------------------
| Email Verification Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling email verification for any
| user that recently registered with the application. Emails may also
| be re-sent if the user didn't receive the original email message.
|
*/
use VerifiesEmails;
/**
* Where to redirect users after verification.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
}
================================================
FILE: app/Http/Controllers/Controller.php
================================================
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}
================================================
FILE: app/Http/Controllers/DashboardController.php
================================================
<?php
namespace App\Http\Controllers;
use App\Watched;
class DashboardController extends Controller
{
public function index()
{
$watchedByYears = Watched::select('titles.start_year')
->selectRaw("COUNT('id')")
->leftJoin('titles', 'watched.tconst', '=', 'titles.tconst')
->groupBy('titles.start_year')
->orderByRaw("COUNT('id') DESC")
->limit(15)
->get();
$watched = Watched::query()
->selectRaw("count(case when title_type = 'tvEpisode' then 1 end) as tvEpisode")
->selectRaw("count(case when title_type = 'movie' then 1 end) as movie")
->selectRaw("count(case when title_type = 'tvSeries' then 1 end) as tvSeries")
->first();
return view('dashboard', compact('watched', 'watchedByYears'));
}
}
================================================
FILE: app/Http/Controllers/HomeController.php
================================================
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Contracts\Support\Renderable
*/
public function index()
{
return view('home');
}
}
================================================
FILE: app/Http/Controllers/MovieController.php
================================================
<?php
namespace App\Http\Controllers;
use App\Movie;
use App\Name;
use App\Title;
use App\Watched\Traits\TitleFilter;
class MovieController extends Controller
{
use TitleFilter;
public function index()
{
$movies = $this->filter()->simplePaginate(10);
$movies->each(function ($movie) {
$this->checkPoster($movie);
});
return view('movies', compact('movies'));
}
public function show($id)
{
$title = Title::with('crew', 'principal', 'principal.name','poster','watched', 'rating')
->where('tconst', $id)
->firstOrFail();
$directors = Name::whereIn('nconst',explode(',', $title->crew->directors))->get();
$writers = Name::whereIn('nconst', explode(',', $title->crew->writers))->get();
return view('show', compact('title', 'directors', 'writers'));
}
}
================================================
FILE: app/Http/Controllers/SearchController.php
================================================
<?php
namespace App\Http\Controllers;
use App\Title;
use App\Watched;
use Elasticsearch\ClientBuilder;
use Illuminate\Http\Request;
class SearchController extends Controller
{
public function search()
{
$imdbIdSearch = $this->searchImdbId();
if ($imdbIdSearch) {
return $imdbIdSearch;
}
if (!config('movie.elasticsearch')) {
return $this->regularSearch();
}
return $this->searchInElasticsearch();
}
public function regularSearch()
{
$name = request('search');
if (strlen($name) < 3) {
return response()->json(['titles' => []]);
}
$titles = Title::query();
preg_match('/:year\s(\d{4})/m', $name, $output_array);
if (count($output_array)>0 && $output_array[1]) {
$titles->where('start_year', $output_array[1]);
$name = trim(str_replace($output_array[0], "", $name));
}
$titles = $titles->where('original_title', 'ILIKE', "%{$name}");
$watched = cache()->remember("users_watched_".auth()->id(), 60, function() {
return Watched::where('title_type', '!=','tvEpisode')
->select('tconst')
->get()
->pluck('tconst')
->toArray();
});
$titles->orderBy('weight', 'DESC');
$titles = $titles->take(10)->get();
return response()->json([
'titles' => $titles->map(function ($item) use($watched) {
$title = [
"original_title"=> $item->original_title,
"start_year"=> $item->start_year,
"weight"=> $item->weight,
"primary_title"=> $item->primary_title,
"title_type"=> $item->title_type,
"tconst"=> $item->tconst,
"watched" => false
];
if (in_array($item->tconst, $watched)) {
$title['watched'] = true;
}
return $title;
})
]);
}
public function searchInElasticsearch()
{
$name = request('search');
$elasticQuery = view()->make("queries/elasticsearch", [])->render();
$elasticQuery = json_decode($elasticQuery, true);
preg_match('/:year\s(\d{4})/m', $name, $output_array);
if (count($output_array)>0 && $output_array[1]) {
$search = trim(str_replace($output_array[0], "", $name));
$elasticQuery['query']['bool']['must'][0]['multi_match']['query'] = strtolower($search);
$elasticQuery['query']['bool']['must'][1]['match']['start_year'] = $output_array[1];
} else {
$elasticQuery['query']['bool']['must'][0]['multi_match']['query'] = strtolower($name);
}
$params = [
'index' => 'titles',
'body' => $elasticQuery,
];
$client = ClientBuilder::create()->setHosts([env('SCOUT_ELASTIC_HOST')])->build();
$results = $client->search($params);
$watched = cache()->remember("users_watched_".auth()->id(), 60, function() {
return Watched::where('title_type', '!=','tvEpisode')
->select('tconst')
->get()
->pluck('tconst')
->toArray();
});
$hits = collect($results['hits']['hits']);
return response()->json([
'titles' => $hits->map(function ($item) use($watched) {
$item['_source']['watched'] = false;
// its not a good way. Maybe i have to index watched model with laravel
// scout and cross check in elastic search.
if (in_array($item['_source']['tconst'], $watched)) {
$item['_source']['watched'] = true;
}
return $item['_source'];
}),
]);
}
public function searchImdbId()
{
preg_match('/(tt(.*?)) :imdb/m', request('search'), $imdbOutput);
if (count($imdbOutput)<=0 || !isset($imdbOutput[1])) {
return false;
}
$imdb = Title::where('tconst', $imdbOutput[1])->first();
if (!$imdb) {
return false;
}
$response = [
'titles' =>[
[
"original_title"=> $imdb->original_title,
"start_year"=> $imdb->start_year,
"weight"=> $imdb->weight,
"primary_title"=> $imdb->primary_title,
"title_type"=> $imdb->title_type,
"tconst"=> $imdb->tconst
]
]
];
return response()->json($response);
}
}
================================================
FILE: app/Http/Controllers/SeriesController.php
================================================
<?php
namespace App\Http\Controllers;
use App\Watched\Traits\TitleFilter;
use Illuminate\Http\Request;
use App\Movie;
use App\Name;
use App\Title;
use App\Episode;
class SeriesController extends Controller
{
use TitleFilter;
public function index()
{
$movies = $this->filter('tvSeries')->simplePaginate(10);
$movies->each(function ($movie) {
$this->checkPoster($movie);
});
return view('series.index', compact('movies'));
}
public function show($id)
{
$title = Title::with('crew', 'principal', 'principal.name','poster','watched', 'rating')
->where('tconst', $id)
->first();
$directors = Name::whereIn('nconst',explode(',', $title->crew->directors))->get();
$writers = Name::whereIn('nconst', explode(',', $title->crew->writers))->get();
$episodes = Episode::distinct('titles.tconst')->select([
'episodes.id',
'episodes.season_number',
'titles.tconst',
'titles.original_title',
'titles.runtime_minutes',
'titles.primary_title',
'watched.watched_at'
])
->leftJoin('titles', 'episodes.tconst', '=', 'titles.tconst')
->leftJoin('watched', 'watched.tconst', '=', 'episodes.tconst')
->where('parent_tconst', $id)
->whereNotNull('season_number')
->orderBy('titles.tconst', 'DESC')
->get();
$seasons = $episodes->groupBy('season_number')->sortKeys();
$seasons = $seasons->map(function ($item) {
return $item->sortBy('episode_number')->values();
});
return view('series.show', compact('title', 'directors', 'writers', 'episodes', 'seasons'));
}
}
================================================
FILE: app/Http/Controllers/WatchListController.php
================================================
<?php
namespace App\Http\Controllers;
use App\Models\WatchList;
use Illuminate\Http\Request;
class WatchListController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param \App\Models\WatchList $watchList
* @return \Illuminate\Http\Response
*/
public function show(WatchList $watchList)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\WatchList $watchList
* @return \Illuminate\Http\Response
*/
public function edit(WatchList $watchList)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\WatchList $watchList
* @return \Illuminate\Http\Response
*/
public function update(Request $request, WatchList $watchList)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\WatchList $watchList
* @return \Illuminate\Http\Response
*/
public function destroy(WatchList $watchList)
{
//
}
}
================================================
FILE: app/Http/Controllers/WatchedController.php
================================================
<?php
namespace App\Http\Controllers;
use App\Watched;
use App\Title;
use Illuminate\Http\Request;
class WatchedController extends Controller
{
public function index()
{
$items = Watched::with(['title', 'title.rating'])
->join('titles', 'watched.tconst', '=', 'titles.tconst')
->whereIn('titles.title_type', ['movie', 'tvSeries'])
->orderByDesc('titles.start_year')
->paginate(10);
return view('watched', [
'items' => $items
]);
}
public function update($id, Request $request)
{
$isWatched = $request->get('watched');
if (!$isWatched) {
$title = Title::where('tconst', $id)->firstOrFail();
Watched::create([
'tconst' => $title->tconst,
'user_id' => auth()->id(),
'title_type' => $title->title_type,
'watched_at' => \Carbon\Carbon::now(),
]);
} else {
$watched = Watched::where('tconst', $id)->firstOrFail();
$watched->delete();
}
cache()->forget("users_watched_".auth()->id());
response()->noContent();
}
}
================================================
FILE: app/Http/Kernel.php
================================================
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
}
================================================
FILE: app/Http/Middleware/Authenticate.php
================================================
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('login');
}
}
}
================================================
FILE: app/Http/Middleware/CheckForMaintenanceMode.php
================================================
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode as Middleware;
class CheckForMaintenanceMode extends Middleware
{
/**
* The URIs that should be reachable while maintenance mode is enabled.
*
* @var array
*/
protected $except = [
//
];
}
================================================
FILE: app/Http/Middleware/EncryptCookies.php
================================================
<?php
namespace App\Http\Middleware;
use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;
class EncryptCookies extends Middleware
{
/**
* The names of the cookies that should not be encrypted.
*
* @var array
*/
protected $except = [
//
];
}
================================================
FILE: app/Http/Middleware/RedirectIfAuthenticated.php
================================================
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect(route('home'));
}
return $next($request);
}
}
================================================
FILE: app/Http/Middleware/TrimStrings.php
================================================
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
class TrimStrings extends Middleware
{
/**
* The names of the attributes that should not be trimmed.
*
* @var array
*/
protected $except = [
'password',
'password_confirmation',
];
}
================================================
FILE: app/Http/Middleware/TrustProxies.php
================================================
<?php
namespace App\Http\Middleware;
use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var array|string
*/
protected $proxies;
/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_ALL;
}
================================================
FILE: app/Http/Middleware/VerifyCsrfToken.php
================================================
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
}
================================================
FILE: app/Jobs/FetchPosterJob.php
================================================
<?php
namespace App\Jobs;
use App\Poster;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class FetchPosterJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $titleID;
/**
* Create a new job instance.
*
* @param $titleID
*/
public function __construct($titleID)
{
$this->titleID = $titleID;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
$info = "https://api.themoviedb.org/3/movie/{$this->titleID}?api_key=".config('movie.v3')."&language=en-US";
$info = json_decode(file_get_contents($info));
$file = file_get_contents("http://image.tmdb.org/t/p/w500{$info->poster_path}");
$name = (string) Str::uuid().'.jpg';
Storage::put("public/posters/".$name, $file);
Poster::firstOrCreate(
['title_id' => $this->titleID],
[
'title_id' => $this->titleID,
'image' => $name,
]
);
}
}
================================================
FILE: app/Models/WatchList.php
================================================
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class WatchList extends Model
{
protected $guarded = [];
}
================================================
FILE: app/Name.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Name extends Model
{
//
}
================================================
FILE: app/Poster.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Poster extends Model
{
protected $guarded = [];
public function title()
{
return $this->belongsTo(Title::class, 'tconst', 'title_id');
}
}
================================================
FILE: app/Principal.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Principal extends Model
{
public function name()
{
return $this->hasOne(Name::class, 'nconst', 'nconst');
}
}
================================================
FILE: app/Providers/AppServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}
}
================================================
FILE: app/Providers/AuthServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
//
}
}
================================================
FILE: app/Providers/BroadcastServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Broadcast::routes();
require base_path('routes/channels.php');
}
}
================================================
FILE: app/Providers/EventServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
================================================
FILE: app/Providers/HorizonServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Laravel\Horizon\Horizon;
use Laravel\Horizon\HorizonApplicationServiceProvider;
class HorizonServiceProvider extends HorizonApplicationServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
parent::boot();
// Horizon::routeSmsNotificationsTo('15556667777');
// Horizon::routeMailNotificationsTo('example@example.com');
// Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');
// Horizon::night();
}
/**
* Register the Horizon gate.
*
* This gate determines who can access Horizon in non-local environments.
*
* @return void
*/
protected function gate()
{
Gate::define('viewHorizon', function ($user) {
return in_array($user->email, [
//
]);
});
}
}
================================================
FILE: app/Providers/RouteServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to your controller routes.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'App\Http\Controllers';
/**
* The path to the "home" route for your application.
*
* @var string
*/
public const HOME = 'dashboard';
/**
* Define your route model bindings, pattern filters, etc.
*
* @return void
*/
public function boot()
{
//
parent::boot();
}
/**
* Define the routes for the application.
*
* @return void
*/
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//
}
/**
* Define the "web" routes for the application.
*
* These routes all receive session state, CSRF protection, etc.
*
* @return void
*/
protected function mapWebRoutes()
{
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
/**
* Define the "api" routes for the application.
*
* These routes are typically stateless.
*
* @return void
*/
protected function mapApiRoutes()
{
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
}
================================================
FILE: app/Rating.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Rating extends Model
{
//
}
================================================
FILE: app/Title.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Title extends Model
{
public function poster()
{
return $this->hasOne(Poster::class, 'title_id', 'tconst')->withDefault([
'image' => 'movie.jpg'
]);
}
public function rating()
{
return $this->hasOne(Rating::class, 'tconst', 'tconst');
}
public function watched()
{
return $this->hasOne(Watched::class, 'tconst', 'tconst')
->where('user_id', auth()->id());
}
public function crew()
{
return $this->hasOne(Crew::class, 'tconst', 'tconst');
}
public function principal()
{
return $this->hasMany(Principal::class, 'tconst', 'tconst');
}
public function getIsWatchedAttribute()
{
if (!$this->watched) {
}
return !!$this->watched;
}
public function url()
{
if ($this->title_type === 'movie') {
return route('movies.show', [$this->idtconst]);
}
return '/series/'.$this->tconst;
}
}
================================================
FILE: app/User.php
================================================
<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
}
================================================
FILE: app/Watched/Importers/AkaImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Support\Facades\DB;
class AkaImporter extends Importer implements ImporterInterface
{
protected $name = 'title.akas.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing akas.</info>');
DB::statement("COPY akas(title_id, ordering,title,region,language,types,attributes,is_original_title) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
DB::table('akas')->where('id', 1)->delete();
return $this;
}
}
================================================
FILE: app/Watched/Importers/CrewImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Support\Facades\DB;
class CrewImporter extends Importer implements ImporterInterface
{
protected $name = 'title.crew.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing crew.</info>');
DB::statement("COPY crews(tconst, directors, writers) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
DB::table('crews')->where('id', 1)->delete();
DB::raw(DB::statement('CREATE INDEX ON public.crews (tconst)'));
return $this;
}
}
================================================
FILE: app/Watched/Importers/EpisodeImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Support\Facades\DB;
class EpisodeImporter extends Importer implements ImporterInterface
{
protected $name = 'title.episode.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing episode.</info>');
DB::statement("COPY episodes(tconst,parent_tconst,season_number,episode_number) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
DB::table('episodes')->where('id', 1)->delete();
DB::raw(DB::statement('CREATE INDEX ON public.episodes (tconst)'));
DB::raw(DB::statement('CREATE INDEX ON public.episodes (parent_tconst)'));
return $this;
}
}
================================================
FILE: app/Watched/Importers/Importer.php
================================================
<?php
namespace App\Watched\Importers;
use GuzzleHttp\Client;
use Symfony\Component\Console\Helper\ProgressBar;
use function ByteUnits\bytes;
abstract class Importer
{
protected $tsvPath;
protected $gzPath;
protected $output;
public function __construct()
{
$this->tsvPath = storage_path("app/imdb/{$this->name}");
$this->gzPath = $this->tsvPath.'gz';
}
public function download($output, $force = false): ImporterInterface
{
$this->output = $output;
$exists = file_exists($this->tsvPath);
if ($exists && !$force) {
return $this;
}
$progressBar = new ProgressBar($output, 100);
$progressBar->setFormat("%status%\n%current%/%max% [%bar%] %percent:3s%%\n");
$progressBar->setMessage('Gathering download information.', 'status');
$progressBar->start();
$client = new Client(['verify' => false, 'base_uri' => 'https://datasets.imdbws.com/']);
$client->request('GET', "{$this->name}.gz", [
'sink' => $this->gzPath,
'progress' => function ($dl_total_size, $dl_size_so_far) use ($progressBar) {
$total = bytes($dl_total_size)->format('MB');
$sofar = bytes($dl_size_so_far)->format('MB');
$percentage = $dl_total_size != '0.00' ? number_format($dl_size_so_far * 100 / $dl_total_size) : 0;
$progressBar->setMessage("Downloading {$this->name}.gz: {$sofar}/{$total} ({$percentage}%)", 'status');
if ($percentage % 10 === 0) {
$progressBar->advance();
}
$progressBar->display();
},
]);
$progressBar->finish();
$this->untar($this->gzPath, $this->tsvPath);
unlink($this->gzPath);
return $this;
}
public function untar($file, $name)
{
$buffer_size = 4096;
$file = gzopen($file, 'rb');
$out_file = fopen($name, 'wb');
while (!gzeof($file)) {
fwrite($out_file, gzread($file, $buffer_size));
}
fclose($out_file);
gzclose($file);
}
}
================================================
FILE: app/Watched/Importers/ImporterInterface.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Console\OutputStyle;
interface ImporterInterface
{
public function start();
public function index(): ImporterInterface;
public function download(OutputStyle $outputStyle): ImporterInterface;
}
================================================
FILE: app/Watched/Importers/NameImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Support\Facades\DB;
class NameImporter extends Importer implements ImporterInterface
{
protected $name = 'name.basics.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing names.</info>');
DB::statement("COPY names(nconst, primary_name, birth_year, death_year ,primary_profession,known_for_titles) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
DB::table('names')->where('id', 1)->delete();
return $this;
}
}
================================================
FILE: app/Watched/Importers/PrincipalImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Support\Facades\DB;
class PrincipalImporter extends Importer implements ImporterInterface
{
protected $name = 'title.principals.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing principals.</info>');
DB::statement("COPY principals(tconst,ordering,nconst,category,job,characters) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
DB::table('principals')->where('id', 1)->delete();
return $this;
}
}
================================================
FILE: app/Watched/Importers/RatingImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Support\Facades\DB;
class RatingImporter extends Importer implements ImporterInterface
{
protected $name = 'title.ratings.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing ratings.</info>');
DB::statement("COPY ratings(tconst,average_rating,num_votes) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
DB::table('ratings')->where('id', 1)->delete();
DB::raw(DB::statement('CREATE INDEX ON public.ratings (tconst)'));
DB::raw(DB::statement('ALTER TABLE ratings ALTER COLUMN average_rating TYPE numeric(3,1) USING (average_rating::numeric(3,1))'));
DB::raw(DB::statement('ALTER TABLE ratings ALTER COLUMN num_votes TYPE integer USING (num_votes::integer)'));
$this->output->writeln('<info>Updating title weights.</info>');
DB::raw(DB::statement('UPDATE "titles" SET weight = ROUND(((ratings.num_votes*ratings.average_rating + (25000*7))/( ratings.num_votes+25000) )::numeric,2)*100 FROM "ratings" WHERE "titles"."tconst" = "ratings"."tconst"'));
DB::raw(DB::statement('CREATE INDEX ON public.titles (weight)'));
return $this;
}
}
================================================
FILE: app/Watched/Importers/TitleImporter.php
================================================
<?php
namespace App\Watched\Importers;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;
class TitleImporter extends Importer implements ImporterInterface
{
protected $name = 'title.basics.tsv';
public function start(): ImporterInterface
{
$this->output->writeln('<info>Importing titles, may take some time</info>');
DB::statement("COPY titles(tconst,title_type,primary_title,original_title,is_adult,start_year,end_year,runtime_minutes,genres) FROM '{$this->tsvPath}'");
return $this;
}
public function index(): ImporterInterface
{
$this->output->writeln('<info>Title cleanup and indexing, may take some time</info>');
$primary_title = DB::select(DB::raw('select id,primary_title,length(primary_title) from titles where length(primary_title) >= 255 order by length(primary_title) DESC'));
foreach($primary_title as $title) {
$description = Str::limit($title->primary_title, 200);
DB::table('titles')->where('id', $title->id)->update([
'primary_title' => $description,
]);
}
$original_title = DB::select(DB::raw('select id,original_title,length(original_title) from titles where length(original_title) >= 255 order by length(original_title) DESC'));
foreach($original_title as $title) {
$description = Str::limit($title->original_title, 200);
DB::table('titles')->where('id', $title->id)->update([
'original_title' => $description,
]);
}
DB::table('titles')->where('id', 1)->delete();
Schema::table('titles', function (Blueprint $table) {
$table->string('primary_title')->change();
$table->string('original_title')->change();
});
$this->output->writeln('<info>Updating title columns.</info>');
DB::raw(DB::statement('ALTER TABLE titles ALTER COLUMN start_year TYPE integer USING (start_year::integer)'));
DB::raw(DB::statement('ALTER TABLE titles ALTER COLUMN end_year TYPE integer USING (end_year::integer)'));
DB::raw(DB::statement('ALTER TABLE titles ALTER COLUMN runtime_minutes TYPE integer USING (runtime_minutes::integer)'));
return $this;
}
}
================================================
FILE: app/Watched/Traits/TitleFilter.php
================================================
<?php
namespace App\Watched\Traits;
use App\Jobs\FetchPosterJob;
use App\Title;
trait TitleFilter
{
public function filter($type = 'movie')
{
$movies = Title::query();
if (request()->has('rating') && request('rating') !== 'Rating') {
$movies = $movies->wherehas('rating', function ($q) {
return $q->where([
['average_rating', '>=', (int) request('rating')],
['average_rating', '<', (int)(request('rating')+1)]
]);
});
}
$movies = $movies->with(['poster', 'rating', 'watched'])
->where('title_type', $type)
->orderByDesc('weight');
if (request('not_watched') === 'yes') {
$movies = $movies->whereDoesntHave('watched');
}
if (request()->has('selected_year') && request('selected_year')!== null) {
$movies = $movies->where('start_year', request('selected_year'));
}
return $movies;
}
private function checkPoster($movie)
{
if (is_null($movie->poster->id)) {
dispatch(new FetchPosterJob($movie->tconst));
}
}
}
================================================
FILE: app/Watched.php
================================================
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Rennokki\QueryCache\Traits\QueryCacheable;
class Watched extends Model
{
use QueryCacheable;
protected $table = 'watched';
protected $guarded = [];
public function title()
{
return $this->hasOne(Title::class, 'tconst', 'tconst');
}
public function url()
{
if ($this->title_type === 'movie') {
return route('movies.show', [$this->tconst]);
}
return '/series/'.$this->tconst;
}
}
================================================
FILE: artisan
================================================
#!/usr/bin/env php
<?php
define('LARAVEL_START', microtime(true));
/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader
| for our application. We just need to utilize it! We'll require it
| into the script here so that we do not have to worry about the
| loading of any our classes "manually". Feels great to relax.
|
*/
require __DIR__.'/vendor/autoload.php';
$app = require_once __DIR__.'/bootstrap/app.php';
/*
|--------------------------------------------------------------------------
| Run The Artisan Application
|--------------------------------------------------------------------------
|
| When we run the console application, the current CLI command will be
| executed in this console and the response sent back to a terminal
| or another output device for the developers. Here goes nothing!
|
*/
$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArgvInput,
new Symfony\Component\Console\Output\ConsoleOutput
);
/*
|--------------------------------------------------------------------------
| Shutdown The Application
|--------------------------------------------------------------------------
|
| Once Artisan has finished running, we will fire off the shutdown events
| so that any final work may be done by the application before we shut
| down the process. This is the last thing to happen to the request.
|
*/
$kernel->terminate($input, $status);
exit($status);
================================================
FILE: bin/abc
================================================
[File too large to display: 49.5 MB]
================================================
FILE: bootstrap/app.php
================================================
<?php
/*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
| The first thing we will do is create a new Laravel application instance
| which serves as the "glue" for all the components of Laravel, and is
| the IoC container for the system binding all of the various parts.
|
*/
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
/*
|--------------------------------------------------------------------------
| Bind Important Interfaces
|--------------------------------------------------------------------------
|
| Next, we need to bind some important interfaces into the container so
| we will be able to resolve them when needed. The kernels serve the
| incoming requests to this application from both the web and CLI.
|
*/
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
/*
|--------------------------------------------------------------------------
| Return The Application
|--------------------------------------------------------------------------
|
| This script returns the application instance. The instance is given to
| the calling script so we can separate the building of the instances
| from the actual running of the application and sending responses.
|
*/
return $app;
================================================
FILE: bootstrap/cache/.gitignore
================================================
*
!.gitignore
================================================
FILE: clear.sh
================================================
#!/usr/bin/env bash
php artisan cache:clear
php artisan route:clear
php artisan config:clear
php artisan view:clear
================================================
FILE: composer.json
================================================
{
"name": "laravel/laravel",
"type": "project",
"description": "The Laravel Framework.",
"keywords": [
"framework",
"laravel"
],
"license": "MIT",
"require": {
"php": "^7.4",
"ext-json": "*",
"doctrine/dbal": "^2.10",
"elasticsearch/elasticsearch": "^7.7",
"fideloper/proxy": "^4.2",
"fruitcake/laravel-cors": "^1.0",
"gabrielelana/byte-units": "^0.5.0",
"guzzlehttp/guzzle": "^6.3",
"laravel-frontend-presets/tall": "^1.7",
"laravel/framework": "^7.1",
"laravel/horizon": "^4.3",
"laravel/tinker": "^2.0",
"rennokki/laravel-eloquent-query-cache": "^2.0"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.3",
"facade/ignition": "^2.0",
"fzaninotto/faker": "^1.9.1",
"mockery/mockery": "^1.3.1",
"nunomaduro/collision": "^4.1",
"phpunit/phpunit": "^8.5"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"autoload": {
"psr-4": {
"App\\": "app/"
},
"classmap": [
"database/seeds",
"database/factories"
]
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi"
]
}
}
================================================
FILE: config/app.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/
'name' => env('APP_NAME', 'Laravel'),
/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/
'env' => env('APP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/
'url' => env('APP_URL', 'http://localhost'),
'asset_url' => env('ASSET_URL', null),
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'UTC',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/
'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
/*
* Package Service Providers...
*/
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\HorizonServiceProvider::class,
App\Providers\RouteServiceProvider::class,
],
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
'Bus' => Illuminate\Support\Facades\Bus::class,
'Cache' => Illuminate\Support\Facades\Cache::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'Event' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Http' => Illuminate\Support\Facades\Http::class,
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
'Notification' => Illuminate\Support\Facades\Notification::class,
'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class,
'Redis' => Illuminate\Support\Facades\Redis::class,
'Request' => Illuminate\Support\Facades\Request::class,
'Response' => Illuminate\Support\Facades\Response::class,
'Route' => Illuminate\Support\Facades\Route::class,
'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class,
'Str' => Illuminate\Support\Str::class,
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
],
];
================================================
FILE: config/auth.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Defaults
|--------------------------------------------------------------------------
|
| This option controls the default authentication "guard" and password
| reset options for your application. You may change these defaults
| as required, but they're a perfect start for most applications.
|
*/
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| here which uses session storage and the Eloquent user provider.
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| Supported: "session", "token"
|
*/
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| If you have multiple user tables or models you may configure multiple
| sources which represent each model / table. These sources may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
|
*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expire time is the number of minutes that the reset token should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
/*
|--------------------------------------------------------------------------
| Password Confirmation Timeout
|--------------------------------------------------------------------------
|
| Here you may define the amount of seconds before a password confirmation
| times out and the user is prompted to re-enter their password via the
| confirmation screen. By default, the timeout lasts for three hours.
|
*/
'password_timeout' => 10800,
];
================================================
FILE: config/broadcasting.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Broadcaster
|--------------------------------------------------------------------------
|
| This option controls the default broadcaster that will be used by the
| framework when an event needs to be broadcast. You may set this to
| any of the connections defined in the "connections" array below.
|
| Supported: "pusher", "redis", "log", "null"
|
*/
'default' => env('BROADCAST_DRIVER', 'null'),
/*
|--------------------------------------------------------------------------
| Broadcast Connections
|--------------------------------------------------------------------------
|
| Here you may define all of the broadcast connections that will be used
| to broadcast events to other systems or over websockets. Samples of
| each available type of connection are provided inside this array.
|
*/
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
],
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
],
'log' => [
'driver' => 'log',
],
'null' => [
'driver' => 'null',
],
],
];
================================================
FILE: config/cache.php
================================================
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Cache Store
|--------------------------------------------------------------------------
|
| This option controls the default cache connection that gets used while
| using this caching library. This connection is used when another is
| not explicitly specified when executing a given caching function.
|
| Supported: "apc", "array", "database", "file",
| "memcached", "redis", "dynamodb"
|
*/
'default' => env('CACHE_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------
| Cache Stores
|--------------------------------------------------------------------------
|
| Here you may define all of the cache "stores" for your application as
| well as their drivers. You may even define multiple stores for the
| same cache driver to group types of items stored in your caches.
|
*/
'stores' => [
'apc' => [
'driver' => 'apc',
],
'array' => [
'driver' => 'array',
'serialize' => false,
],
'database' => [
'driver' => 'database',
'table' => 'cache',
'connection' => null,
],
'file' => [
'driver' => 'file',
'path' => storage_path('framework/cache/data'),
],
'memcached' => [
'driver' => 'memcached',
'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
'sasl' => [
env('MEMCACHED_USERNAME'),
env('MEMCACHED_PASSWORD'),
],
'options' => [
// Memcached::OPT_CONNECT_TIMEOUT => 2000,
],
'servers' => [
[
'host' => env('MEMCACHED_HOST', '127.0.0.1'),
'port' => env('MEMCACHED_PORT', 11211),
'weight' => 100,
],
],
],
'redis' => [
'driver' => 'redis',
'connection' => 'cache',
],
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
],
/*
|--------------------------------------------------------------------------
| Cache Key Prefix
|--------------------------------------------------------------------------
|
| When utilizing a RAM based store such as APC or Memcached, there might
| be other applications utilizing the same cache. So, we'll specify a
| value to get prefixed to all our keys so we can avoid collisions.
|
*/
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
];
================================================
FILE: config/cors.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Cross-Origin Resource Sharing (CORS) Configuration
|--------------------------------------------------------------------------
|
| Here you may configure your settings for cross-origin resource sharing
| or "CORS". This determines what cross-origin operations may execute
| in web browsers. You are free to adjust these settings as needed.
|
| To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
|
*/
'paths' => ['api/*'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => false,
];
================================================
FILE: config/database.php
================================================
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Database Connection Name
|--------------------------------------------------------------------------
|
| Here you may specify which of the database connections below you wish
| to use as your default connection for all database work. Of course
| you may use many connections at once using the Database library.
|
*/
'default' => env('DB_CONNECTION', 'mysql'),
/*
|--------------------------------------------------------------------------
| Database Connections
|--------------------------------------------------------------------------
|
| Here are each of the database connections setup for your application.
| Of course, examples of configuring each database platform that is
| supported by Laravel is shown below to make development simple.
|
|
| All database work in Laravel is done through the PHP PDO facilities
| so make sure you have the driver for your particular database of
| choice installed on your machine before you begin development.
|
*/
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', database_path('database.sqlite')),
'prefix' => '',
'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
],
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],
],
/*
|--------------------------------------------------------------------------
| Migration Repository Table
|--------------------------------------------------------------------------
|
| This table keeps track of all the migrations that have already run for
| your application. Using this information, we can determine which of
| the migrations on disk haven't actually been run in the database.
|
*/
'migrations' => 'migrations',
/*
|--------------------------------------------------------------------------
| Redis Databases
|--------------------------------------------------------------------------
|
| Redis is an open source, fast, and advanced key-value store that also
| provides a richer body of commands than a typical key-value system
| such as APC or Memcached. Laravel makes it easy to dig right in.
|
*/
'redis' => [
'client' => env('REDIS_CLIENT', 'phpredis'),
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
],
'default' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_DB', '0'),
],
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', '6379'),
'database' => env('REDIS_CACHE_DB', '1'),
],
],
];
================================================
FILE: config/filesystems.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
|--------------------------------------------------------------------------
|
| Here you may specify the default filesystem disk that should be used
| by the framework. The "local" disk, as well as a variety of cloud
| based disks are available to your application. Just store away!
|
*/
'default' => env('FILESYSTEM_DRIVER', 'local'),
/*
|--------------------------------------------------------------------------
| Default Cloud Filesystem Disk
|--------------------------------------------------------------------------
|
| Many applications store files both locally and in the cloud. For this
| reason, you may specify a default "cloud" driver here. This driver
| will be bound as the Cloud disk implementation in the container.
|
*/
'cloud' => env('FILESYSTEM_CLOUD', 's3'),
/*
|--------------------------------------------------------------------------
| Filesystem Disks
|--------------------------------------------------------------------------
|
| Here you may configure as many filesystem "disks" as you wish, and you
| may even configure multiple disks of the same driver. Defaults have
| been setup for each driver as an example of the required options.
|
| Supported Drivers: "local", "ftp", "sftp", "s3"
|
*/
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app'),
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
],
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
],
],
/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/
'links' => [
public_path('storage') => storage_path('app/public'),
],
];
================================================
FILE: config/hashing.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Hash Driver
|--------------------------------------------------------------------------
|
| This option controls the default hash driver that will be used to hash
| passwords for your application. By default, the bcrypt algorithm is
| used; however, you remain free to modify this option if you wish.
|
| Supported: "bcrypt", "argon", "argon2id"
|
*/
'driver' => 'bcrypt',
/*
|--------------------------------------------------------------------------
| Bcrypt Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Bcrypt algorithm. This will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'bcrypt' => [
'rounds' => env('BCRYPT_ROUNDS', 10),
],
/*
|--------------------------------------------------------------------------
| Argon Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Argon algorithm. These will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'argon' => [
'memory' => 1024,
'threads' => 2,
'time' => 2,
],
];
================================================
FILE: config/horizon.php
================================================
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Horizon Domain
|--------------------------------------------------------------------------
|
| This is the subdomain where Horizon will be accessible from. If this
| setting is null, Horizon will reside under the same domain as the
| application. Otherwise, this value will serve as the subdomain.
|
*/
'domain' => null,
/*
|--------------------------------------------------------------------------
| Horizon Path
|--------------------------------------------------------------------------
|
| This is the URI path where Horizon will be accessible from. Feel free
| to change this path to anything you like. Note that the URI will not
| affect the paths of its internal API that aren't exposed to users.
|
*/
'path' => 'horizon',
/*
|--------------------------------------------------------------------------
| Horizon Redis Connection
|--------------------------------------------------------------------------
|
| This is the name of the Redis connection where Horizon will store the
| meta information required for it to function. It includes the list
| of supervisors, failed jobs, job metrics, and other information.
|
*/
'use' => 'default',
/*
|--------------------------------------------------------------------------
| Horizon Redis Prefix
|--------------------------------------------------------------------------
|
| This prefix will be used when storing all Horizon data in Redis. You
| may modify the prefix when you are running multiple installations
| of Horizon on the same server so that they don't have problems.
|
*/
'prefix' => env(
'HORIZON_PREFIX',
Str::slug(env('APP_NAME', 'laravel'), '_').'_horizon:'
),
/*
|--------------------------------------------------------------------------
| Horizon Route Middleware
|--------------------------------------------------------------------------
|
| These middleware will get attached onto each Horizon route, giving you
| the chance to add your own middleware to this list or change any of
| the existing middleware. Or, you can simply stick with this list.
|
*/
'middleware' => ['web'],
/*
|--------------------------------------------------------------------------
| Queue Wait Time Thresholds
|--------------------------------------------------------------------------
|
| This option allows you to configure when the LongWaitDetected event
| will be fired. Every connection / queue combination may have its
| own, unique threshold (in seconds) before this event is fired.
|
*/
'waits' => [
'redis:default' => 60,
],
/*
|--------------------------------------------------------------------------
| Job Trimming Times
|--------------------------------------------------------------------------
|
| Here you can configure for how long (in minutes) you desire Horizon to
| persist the recent and failed jobs. Typically, recent jobs are kept
| for one hour while all failed jobs are stored for an entire week.
|
*/
'trim' => [
'recent' => 60,
'pending' => 60,
'completed' => 60,
'recent_failed' => 10080,
'failed' => 10080,
'monitored' => 10080,
],
/*
|--------------------------------------------------------------------------
| Metrics
|--------------------------------------------------------------------------
|
| Here you can configure how many snapshots should be kept to display in
| the metrics graph. This will get used in combination with Horizon's
| `horizon:snapshot` schedule to define how long to retain metrics.
|
*/
'metrics' => [
'trim_snapshots' => [
'job' => 24,
'queue' => 24,
],
],
/*
|--------------------------------------------------------------------------
| Fast Termination
|--------------------------------------------------------------------------
|
| When this option is enabled, Horizon's "terminate" command will not
| wait on all of the workers to terminate unless the --wait option
| is provided. Fast termination can shorten deployment delay by
| allowing a new instance of Horizon to start while the last
| instance will continue to terminate each of its workers.
|
*/
'fast_termination' => false,
/*
|--------------------------------------------------------------------------
| Memory Limit (MB)
|--------------------------------------------------------------------------
|
| This value describes the maximum amount of memory the Horizon worker
| may consume before it is terminated and restarted. You should set
| this value according to the resources available to your server.
|
*/
'memory_limit' => 64,
/*
|--------------------------------------------------------------------------
| Queue Worker Configuration
|--------------------------------------------------------------------------
|
| Here you may define the queue worker settings used by your application
| in all environments. These supervisors and settings handle all your
| queued jobs and will be provisioned by Horizon during deployment.
|
*/
'environments' => [
'production' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
'processes' => 10,
'tries' => 1,
],
],
'local' => [
'supervisor-1' => [
'connection' => 'redis',
'queue' => ['default'],
'balance' => 'simple',
'processes' => 3,
'tries' => 1,
],
],
],
];
================================================
FILE: config/logging.php
================================================
<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that gets used when writing
| messages to the logs. The name specified in this option should match
| one of the channels defined in the "channels" configuration array.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Out of
| the box, Laravel uses the Monolog PHP logging library. This gives
| you a variety of powerful log handlers / formatters to utilize.
|
| Available Drivers: "single", "daily", "slack", "syslog",
| "errorlog", "monolog",
| "custom", "stack"
|
*/
'channels' => [
'stack' => [
'driver' => 'stack',
'channels' => ['single'],
'ignore_exceptions' => false,
],
'single' => [
'driver' => 'single',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
],
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
],
'slack' => [
'driver' => 'slack',
'url' => env('LOG_SLACK_WEBHOOK_URL'),
'username' => 'Laravel Log',
'emoji' => ':boom:',
'level' => 'critical',
],
'papertrail' => [
'driver' => 'monolog',
'level' => 'debug',
'handler' => SyslogUdpHandler::class,
'handler_with' => [
'host' => env('PAPERTRAIL_URL'),
'port' => env('PAPERTRAIL_PORT'),
],
],
'stderr' => [
'driver' => 'monolog',
'handler' => StreamHandler::class,
'formatter' => env('LOG_STDERR_FORMATTER'),
'with' => [
'stream' => 'php://stderr',
],
],
'syslog' => [
'driver' => 'syslog',
'level' => 'debug',
],
'errorlog' => [
'driver' => 'errorlog',
'level' => 'debug',
],
'null' => [
'driver' => 'monolog',
'handler' => NullHandler::class,
],
'emergency' => [
'path' => storage_path('logs/laravel.log'),
],
],
];
================================================
FILE: config/mail.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Mailer
|--------------------------------------------------------------------------
|
| This option controls the default mailer that is used to send any email
| messages sent by your application. Alternative mailers may be setup
| and used as needed; however, this mailer will be used by default.
|
*/
'default' => env('MAIL_MAILER', 'smtp'),
/*
|--------------------------------------------------------------------------
| Mailer Configurations
|--------------------------------------------------------------------------
|
| Here you may configure all of the mailers used by your application plus
| their respective settings. Several examples have been configured for
| you and you are free to add your own as your application requires.
|
| Laravel supports a variety of mail "transport" drivers to be used while
| sending an e-mail. You will specify which one you are using for your
| mailers below. You are free to add additional mailers as required.
|
| Supported: "smtp", "sendmail", "mailgun", "ses",
| "postmark", "log", "array"
|
*/
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
],
'ses' => [
'transport' => 'ses',
],
'mailgun' => [
'transport' => 'mailgun',
],
'postmark' => [
'transport' => 'postmark',
],
'sendmail' => [
'transport' => 'sendmail',
'path' => '/usr/sbin/sendmail -bs',
],
'log' => [
'transport' => 'log',
'channel' => env('MAIL_LOG_CHANNEL'),
],
'array' => [
'transport' => 'array',
],
],
/*
|--------------------------------------------------------------------------
| Global "From" Address
|--------------------------------------------------------------------------
|
| You may wish for all e-mails sent by your application to be sent from
| the same address. Here, you may specify a name and address that is
| used globally for all e-mails that are sent by your application.
|
*/
'from' => [
'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
'name' => env('MAIL_FROM_NAME', 'Example'),
],
/*
|--------------------------------------------------------------------------
| Markdown Mail Settings
|--------------------------------------------------------------------------
|
| If you are using Markdown based email rendering, you may configure your
| theme and component paths here, allowing you to customize the design
| of the emails. Or, you may simply stick with the Laravel defaults!
|
*/
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
],
],
];
================================================
FILE: config/movie.php
================================================
<?php
return [
'account_id' => env('TMDB_ACCOUNT_ID'),
'v3' => env('TMDB_V3_KEY'),
'v4' => env('TMDB_V4_KEY'),
'elasticsearch' => env('ELASTICSEARCH', true)
];
================================================
FILE: config/queue.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Queue Connection Name
|--------------------------------------------------------------------------
|
| Laravel's queue API supports an assortment of back-ends via a single
| API, giving you convenient access to each back-end using the same
| syntax for every one. Here you may define a default connection.
|
*/
'default' => env('QUEUE_CONNECTION', 'sync'),
/*
|--------------------------------------------------------------------------
| Queue Connections
|--------------------------------------------------------------------------
|
| Here you may configure the connection information for each server that
| is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more.
|
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
|
*/
'connections' => [
'sync' => [
'driver' => 'sync',
],
'database' => [
'driver' => 'database',
'table' => 'jobs',
'queue' => 'default',
'retry_after' => 90,
],
'beanstalkd' => [
'driver' => 'beanstalkd',
'host' => 'localhost',
'queue' => 'default',
'retry_after' => 90,
'block_for' => 0,
],
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'your-queue-name'),
'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
],
/*
|--------------------------------------------------------------------------
| Failed Queue Jobs
|--------------------------------------------------------------------------
|
| These options configure the behavior of failed queue job logging so you
| can control which database and table are used to store the jobs that
| have failed. You may change them to any database / table you wish.
|
*/
'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],
];
================================================
FILE: config/services.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Third Party Services
|--------------------------------------------------------------------------
|
| This file is for storing the credentials for third party services such
| as Mailgun, Postmark, AWS and more. This file provides the de facto
| location for this type of information, allowing packages to have
| a conventional file to locate the various service credentials.
|
*/
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
],
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
],
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
];
================================================
FILE: config/session.php
================================================
<?php
use Illuminate\Support\Str;
return [
/*
|--------------------------------------------------------------------------
| Default Session Driver
|--------------------------------------------------------------------------
|
| This option controls the default session "driver" that will be used on
| requests. By default, we will use the lightweight native driver but
| you may specify any of the other wonderful drivers provided here.
|
| Supported: "file", "cookie", "database", "apc",
| "memcached", "redis", "dynamodb", "array"
|
*/
'driver' => env('SESSION_DRIVER', 'file'),
/*
|--------------------------------------------------------------------------
| Session Lifetime
|--------------------------------------------------------------------------
|
| Here you may specify the number of minutes that you wish the session
| to be allowed to remain idle before it expires. If you want them
| to immediately expire on the browser closing, set that option.
|
*/
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,
/*
|--------------------------------------------------------------------------
| Session Encryption
|--------------------------------------------------------------------------
|
| This option allows you to easily specify that all of your session data
| should be encrypted before it is stored. All encryption will be run
| automatically by Laravel and you can use the Session like normal.
|
*/
'encrypt' => false,
/*
|--------------------------------------------------------------------------
| Session File Location
|--------------------------------------------------------------------------
|
| When using the native session driver, we need a location where session
| files may be stored. A default has been set for you but a different
| location may be specified. This is only needed for file sessions.
|
*/
'files' => storage_path('framework/sessions'),
/*
|--------------------------------------------------------------------------
| Session Database Connection
|--------------------------------------------------------------------------
|
| When using the "database" or "redis" session drivers, you may specify a
| connection that should be used to manage these sessions. This should
| correspond to a connection in your database configuration options.
|
*/
'connection' => env('SESSION_CONNECTION', null),
/*
|--------------------------------------------------------------------------
| Session Database Table
|--------------------------------------------------------------------------
|
| When using the "database" session driver, you may specify the table we
| should use to manage the sessions. Of course, a sensible default is
| provided for you; however, you are free to change this as needed.
|
*/
'table' => 'sessions',
/*
|--------------------------------------------------------------------------
| Session Cache Store
|--------------------------------------------------------------------------
|
| When using the "apc", "memcached", or "dynamodb" session drivers you may
| list a cache store that should be used for these sessions. This value
| must match with one of the application's configured cache "stores".
|
*/
'store' => env('SESSION_STORE', null),
/*
|--------------------------------------------------------------------------
| Session Sweeping Lottery
|--------------------------------------------------------------------------
|
| Some session drivers must manually sweep their storage location to get
| rid of old sessions from storage. Here are the chances that it will
| happen on a given request. By default, the odds are 2 out of 100.
|
*/
'lottery' => [2, 100],
/*
|--------------------------------------------------------------------------
| Session Cookie Name
|--------------------------------------------------------------------------
|
| Here you may change the name of the cookie used to identify a session
| instance by ID. The name specified here will get used every time a
| new session cookie is created by the framework for every driver.
|
*/
'cookie' => env(
'SESSION_COOKIE',
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
/*
|--------------------------------------------------------------------------
| Session Cookie Path
|--------------------------------------------------------------------------
|
| The session cookie path determines the path for which the cookie will
| be regarded as available. Typically, this will be the root path of
| your application but you are free to change this when necessary.
|
*/
'path' => '/',
/*
|--------------------------------------------------------------------------
| Session Cookie Domain
|--------------------------------------------------------------------------
|
| Here you may change the domain of the cookie used to identify a session
| in your application. This will determine which domains the cookie is
| available to in your application. A sensible default has been set.
|
*/
'domain' => env('SESSION_DOMAIN', null),
/*
|--------------------------------------------------------------------------
| HTTPS Only Cookies
|--------------------------------------------------------------------------
|
| By setting this option to true, session cookies will only be sent back
| to the server if the browser has a HTTPS connection. This will keep
| the cookie from being sent to you if it can not be done securely.
|
*/
'secure' => env('SESSION_SECURE_COOKIE'),
/*
|--------------------------------------------------------------------------
| HTTP Access Only
|--------------------------------------------------------------------------
|
| Setting this value to true will prevent JavaScript from accessing the
| value of the cookie and the cookie will only be accessible through
| the HTTP protocol. You are free to modify this option if needed.
|
*/
'http_only' => true,
/*
|--------------------------------------------------------------------------
| Same-Site Cookies
|--------------------------------------------------------------------------
|
| This option determines how your cookies behave when cross-site requests
| take place, and can be used to mitigate CSRF attacks. By default, we
| will set this value to "lax" since this is a secure default value.
|
| Supported: "lax", "strict", "none", null
|
*/
'same_site' => 'lax',
];
================================================
FILE: config/view.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| View Storage Paths
|--------------------------------------------------------------------------
|
| Most templating systems load templates from disk. Here you may specify
| an array of paths that should be checked for your views. Of course
| the usual Laravel view path has already been registered for you.
|
*/
'paths' => [
resource_path('views'),
],
/*
|--------------------------------------------------------------------------
| Compiled View Path
|--------------------------------------------------------------------------
|
| This option determines where all the compiled Blade templates will be
| stored for your application. Typically, this is within the storage
| directory. However, as usual, you are free to change this value.
|
*/
'compiled' => env(
'VIEW_COMPILED_PATH',
realpath(storage_path('framework/views'))
),
];
================================================
FILE: database/.gitignore
================================================
*.sqlite
*.sqlite-journal
================================================
FILE: database/factories/UserFactory.php
================================================
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;
/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| This directory should contain each of the model factory definitions for
| your application. Factories provide a convenient way to generate new
| model instances for testing / seeding your application's database.
|
*/
$factory->define(User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
'remember_token' => Str::random(10),
];
});
================================================
FILE: database/migrations/2014_10_12_000000_create_users_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
================================================
FILE: database/migrations/2014_10_12_100000_create_password_resets_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePasswordResetsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('password_resets', function (Blueprint $table) {
$table->string('email')->index();
$table->string('token');
$table->timestamp('created_at')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('password_resets');
}
}
================================================
FILE: database/migrations/2019_08_19_000000_create_failed_jobs_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFailedJobsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('failed_jobs', function (Blueprint $table) {
$table->id();
$table->text('connection');
$table->text('queue');
$table->longText('payload');
$table->longText('exception');
$table->timestamp('failed_at')->useCurrent();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('failed_jobs');
}
}
================================================
FILE: database/migrations/2020_06_03_231708_create_watched_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateWatchedTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('watched', function (Blueprint $table) {
$table->id();
$table->string('tconst', 16)->unique()->index();
$table->string('title_type');
$table->unsignedBigInteger('user_id')->index();
$table->timestamp('watched_at')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('watched');
}
}
================================================
FILE: database/migrations/2020_06_03_231837_create_posters_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePostersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('posters', function (Blueprint $table) {
$table->id();
$table->string('title_id', 16)->index();
$table->string('image')->default('movie.jpg');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('posters');
}
}
================================================
FILE: database/migrations/2020_06_19_095538_create_watch_lists_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateWatchListsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('watch_lists', function (Blueprint $table) {
$table->id();
$table->string('tconst')->index();
$table->foreignId('user_id')->index();
$table->string('title_type');
$table->string('title');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('watch_lists');
}
}
================================================
FILE: database/migrations/imdb/2020_06_01_231011_create_titles_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTitlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('titles', function (Blueprint $table) {
$table->id();
$table->string('tconst',16)->index();
$table->string('title_type', 16)->nullable();
$table->text('primary_title')->nullable();
$table->text('original_title')->nullable();
$table->string('is_adult',16)->nullable();
$table->string('start_year', 16)->nullable();
$table->string('end_year',16)->nullable();
$table->string('runtime_minutes', 16)->nullable();
$table->string('genres', 64)->nullable();
$table->float('weight')->default(0)->index();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('titles');
}
}
================================================
FILE: database/migrations/imdb/2020_06_01_231940_create_episodes_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateEpisodesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('episodes', function (Blueprint $table) {
$table->id();
$table->string('tconst', 16)->index();
$table->string('parent_tconst', 16)->nullable();
$table->string('season_number', 16)->nullable();
$table->string('episode_number', 16)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('episodes');
}
}
================================================
FILE: database/migrations/imdb/2020_06_01_232132_create_ratings_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateRatingsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('ratings', function (Blueprint $table) {
$table->id();
$table->string('tconst', 16)->nullable();
$table->string('average_rating', 16)->nullable();
$table->string('num_votes', 16)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('ratings');
}
}
================================================
FILE: database/migrations/imdb/2020_06_01_232423_create_principals_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePrincipalsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('principals', function (Blueprint $table) {
$table->id();
$table->string('tconst', 16)->index();
$table->text('nconst')->nullable();
$table->text('category')->nullable();
$table->text('job')->nullable();
$table->text('characters')->nullable();
$table->text('ordering')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('principals');
}
}
================================================
FILE: database/migrations/imdb/2020_06_01_232702_create_names_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateNamesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('names', function (Blueprint $table) {
$table->id();
$table->string('nconst',12)->index();
$table->string('primary_name')->nullable();
$table->string('birth_year', 16)->nullable();
$table->string('death_year', 16)->nullable();
$table->string('primary_profession')->nullable();
$table->string('known_for_titles')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('names');
}
}
================================================
FILE: database/migrations/imdb/2020_06_01_232924_create_crews_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateCrewsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('crews', function (Blueprint $table) {
$table->id();
$table->string('tconst', 16)->nullable();
$table->text('directors')->nullable();
$table->text('writers')->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('crews');
}
}
================================================
FILE: database/migrations/imdb/2020_06_03_135647_create_akas_table.php
================================================
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAkasTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('akas', function (Blueprint $table) {
$table->id();
$table->string('title_id', 16)->index();
$table->string('ordering', 16)->nullable();
$table->text('title')->nullable();
$table->string('region', 16)->nullable();
$table->string('language', 16)->nullable();
$table->string('types', 32)->nullable();
$table->string('attributes')->nullable();
$table->string('is_original_title', 16)->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('akas');
}
}
================================================
FILE: database/seeds/DatabaseSeeder.php
================================================
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*
* @return void
*/
public function run()
{
// $this->call(UserSeeder::class);
}
}
================================================
FILE: docker-compose.yml
================================================
version: "3"
services:
iwatched-server:
build: .cloud/docker
image: iwatched:1.0.0
depends_on:
- pgsql
- redis
volumes:
- ./:/application:cached
- ./.cloud/php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- elastic
pgsql:
image: postgres:10.11
container_name: iwatched-pgsql
environment:
- POSTGRES_DB=${DB_DATABASE}
- POSTGRES_USER=${DB_USERNAME}
- POSTGRES_PASSWORD=${DB_PASSWORD}
stdin_open: true
tty: true
ports:
- ${PSQL_PORT}
volumes:
- db-data:/var/lib/postgresql:cached
- ./:/application:cached
networks:
- elastic
nginx:
image: nginx:alpine
ports:
- ${APP_PORT}
volumes:
- .cloud/nginx/nginx.conf:/etc/nginx/conf.d/default.conf:cached
- ./:/application:cached
depends_on:
- iwatched-server
networks:
- elastic
redis:
image: redis:alpine
ports:
- "6397:6379"
networks:
- elastic
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: iwatched-es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: iwatched-es02
environment:
- node.name=es02
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data02:/usr/share/elasticsearch/data
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:7.7.1
container_name: iwatched-es03
environment:
- node.name=es03
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es01,es02
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data03:/usr/share/elasticsearch/data
networks:
- elastic
volumes:
db-data:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
================================================
FILE: package.json
================================================
{
"private": true,
"scripts": {
"dev": "npm run development",
"development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "npm run development -- --watch",
"watch-poll": "npm run watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"@tailwindcss/custom-forms": "^0.2",
"@tailwindcss/ui": "^0.1",
"axios": "^0.21",
"cross-env": "^7.0",
"laravel-mix": "^5.0.1",
"laravel-mix-tailwind": "^0.1.0",
"resolve-url-loader": "^3.1.0",
"sass": "^1.15.2",
"sass-loader": "^8.0.0",
"tailwindcss": "^1.4",
"vue": "^2.6.11",
"vue-template-compiler": "^2.6.11"
},
"dependencies": {
"@trevoreyre/autocomplete-vue": "^2.2.0",
"dayjs": "^1.8.28"
}
}
================================================
FILE: phpunit.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
>
<testsuites>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">./app</directory>
</whitelist>
</filter>
<php>
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>
================================================
FILE: public/.htaccess
================================================
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
================================================
FILE: public/css/app.css
================================================
/**
* This injects Tailwind's base styles, which is a combination of
* Normalize.css and some additional base styles.
*
* You can see the styles here:
* https://unpkg.com/tailwindcss/dist/base.css
*/
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}
/**
* Manually forked from SUIT CSS Base: https://github.com/suitcss/base
* A thin layer on top of normalize.css that provides a starting point more
* suitable for web applications.
*/
/**
* Removes the default spacing and border for appropriate elements.
*/
blockquote,
dl,
dd,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
figure,
p,
pre {
margin: 0;
}
button {
background-color: transparent;
background-image: none;
padding: 0;
}
/**
* Work around a Firefox/IE bug where the transparent `button` background
* results in a loss of the default `button` focus styles.
*/
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
fieldset {
margin: 0;
padding: 0;
}
ol,
ul {
list-style: none;
margin: 0;
padding: 0;
}
/**
* Tailwind custom reset styles
*/
/**
* 1. Use the user's configured `sans` font-family (with Tailwind's default
* sans-serif font stack as a fallback) as a sane default.
* 2. Use Tailwind's default "normal" line-height so the user isn't forced
* to override it to ensure consistency even when using the default theme.
*/
html {
font-family: Inter var, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 1 */
line-height: 1.5; /* 2 */
}
/**
* 1. Prevent padding and border from affecting element width.
*
* We used to set this in the html element and inherit from
* the parent element for everything else. This caused issues
* in shadow-dom-enhanced elements like <details> where the content
* is wrapped by a div with box-sizing set to `content-box`.
*
* https://github.com/mozdevs/cssremedy/issues/4
*
*
* 2. Allow adding a border to an element by just adding a border-width.
*
* By default, the way the browser specifies that an element should have no
* border is by setting it's border-style to `none` in the user-agent
* stylesheet.
*
* In order to easily add borders to elements by just setting the `border-width`
* property, we change the default border-style for all elements to `solid`, and
* use border-width to hide them instead. This way our `border` utilities only
* need to set the `border-width` property instead of the entire `border`
* shorthand, making our border utilities much more straightforward to compose.
*
* https://github.com/tailwindcss/tailwindcss/pull/116
*/
*,
::before,
::after {
box-sizing: border-box; /* 1 */
border-width: 0; /* 2 */
border-style: solid; /* 2 */
border-color: #d2d6dc; /* 2 */
}
/*
* Ensure horizontal rules are visible by default
*/
hr {
border-top-width: 1px;
}
/**
* Undo the `border-style: none` reset that Normalize applies to images so that
* our `border-{width}` utilities have the expected effect.
*
* The Normalize reset is unnecessary for us since we default the border-width
* to 0 on all elements.
*
* https://github.com/tailwindcss/tailwindcss/issues/362
*/
img {
border-style: solid;
}
textarea {
resize: vertical;
}
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder {
color: #a0aec0;
}
input::-moz-placeholder, textarea::-moz-placeholder {
color: #a0aec0;
}
input:-ms-input-placeholder, textarea:-ms-input-placeholder {
color: #a0aec0;
}
input::-ms-input-placeholder, textarea::-ms-input-placeholder {
color: #a0aec0;
}
input::placeholder,
textarea::placeholder {
color: #a0aec0;
}
button,
[role="button"] {
cursor: pointer;
}
table {
border-collapse: collapse;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-size: inherit;
font-weight: inherit;
}
/**
* Reset links to optimize for opt-in styling instead of
* opt-out.
*/
a {
color: inherit;
text-decoration: inherit;
}
/**
* Reset form element properties that are easy to forget to
* style explicitly so you don't inadvertently introduce
* styles that deviate from your design system. These styles
* supplement a partial reset that is already applied by
* normalize.css.
*/
button,
input,
optgroup,
select,
textarea {
padding: 0;
line-height: inherit;
color: inherit;
}
/**
* Use the configured 'mono' font family for elements that
* are expected to be rendered with a monospace font, falling
* back to the system monospace stack if there is no configured
* 'mono' font family.
*/
pre,
code,
kbd,
samp {
font-family: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
/**
* Make replaced elements `display: block` by default as that's
* the behavior you want almost all of the time. Inspired by
* CSS Remedy, with `svg` added as well.
*
* https://github.com/mozdevs/cssremedy/issues/14
*/
img,
svg,
video,
canvas,
audio,
iframe,
embed,
object {
display: block;
vertical-align: middle;
}
/**
* Constrain images and videos to the parent width and preserve
* their instrinsic aspect ratio.
*
* https://github.com/mozdevs/cssremedy/issues/14
*/
img,
video {
max-width: 100%;
height: auto;
}
/**
* Remove the default box-shadow for invalid elements to prevent
* inputs in Livewire components showing with a
* red border by default in Firefox.
*
* See: https://github.com/laravel-frontend-presets/tall/issues/7
*/
input:invalid, textarea:invalid, select:invalid {
box-shadow: none;
}
/**
* This injects any component classes registered by plugins.
*/
.container {
width: 100%;
}
@media (min-width: 640px) {
.container {
max-width: 640px;
}
}
@media (min-width: 768px) {
.container {
max-width: 768px;
}
}
@media (min-width: 1024px) {
.container {
max-width: 1024px;
}
}
@media (min-width: 1280px) {
.container {
max-width: 1280px;
}
}
.form-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 0.75rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
}
.form-input::-webkit-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input::-moz-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input:-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input::-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input::placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-textarea {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 0.75rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
}
.form-textarea::-webkit-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea::-moz-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea:-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea::-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea::placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-multiselect {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 0.75rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
}
.form-multiselect:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-select {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3e%3cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-print-color-adjust: exact;
color-adjust: exact;
background-repeat: no-repeat;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 2.5rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
background-position: right 0.5rem center;
background-size: 1.5em 1.5em;
}
.form-select::-ms-expand {
color: #9fa6b2;
border: none;
}
@media not print {
.form-select::-ms-expand {
display: none;
}
}
@media print and (-ms-high-contrast: active), print and (-ms-high-contrast: none) {
.form-select {
padding-right: 0.75rem;
}
}
.form-select:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-checkbox {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-print-color-adjust: exact;
color-adjust: exact;
display: inline-block;
vertical-align: middle;
background-origin: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
flex-shrink: 0;
height: 1rem;
width: 1rem;
color: #3f83f8;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.25rem;
}
.form-checkbox:checked {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5.707 7.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414L7 8.586 5.707 7.293z'/%3e%3c/svg%3e");
border-color: transparent;
background-color: currentColor;
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
@media not print {
.form-checkbox::-ms-check {
border-width: 1px;
color: transparent;
background: inherit;
border-color: inherit;
border-radius: inherit;
}
}
.form-checkbox:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-checkbox:checked:focus {
border-color: transparent;
}
.form-radio {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-print-color-adjust: exact;
color-adjust: exact;
display: inline-block;
vertical-align: middle;
background-origin: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
flex-shrink: 0;
border-radius: 100%;
height: 1rem;
width: 1rem;
color: #3f83f8;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
}
.form-radio:checked {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
border-color: transparent;
background-color: currentColor;
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
@media not print {
.form-radio::-ms-check {
border-width: 1px;
color: transparent;
background: inherit;
border-color: inherit;
border-radius: inherit;
}
}
.form-radio:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-radio:checked:focus {
border-color: transparent;
}
.form-input {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 0.75rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
}
.form-input::-webkit-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input::-moz-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input:-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input::-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input::placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-input:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-textarea {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 0.75rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
}
.form-textarea::-webkit-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea::-moz-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea:-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea::-ms-input-placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea::placeholder {
color: #9fa6b2;
opacity: 1;
}
.form-textarea:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-multiselect {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 0.75rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
}
.form-multiselect:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-select {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3e%3cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3e%3c/svg%3e");
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-print-color-adjust: exact;
color-adjust: exact;
background-repeat: no-repeat;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.375rem;
padding-top: 0.5rem;
padding-right: 2.5rem;
padding-bottom: 0.5rem;
padding-left: 0.75rem;
font-size: 1rem;
line-height: 1.5;
background-position: right 0.5rem center;
background-size: 1.5em 1.5em;
}
.form-select::-ms-expand {
color: #9fa6b2;
border: none;
}
@media not print {
.form-select::-ms-expand {
display: none;
}
}
@media print and (-ms-high-contrast: active), print and (-ms-high-contrast: none) {
.form-select {
padding-right: 0.75rem;
}
}
.form-select:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-checkbox {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-print-color-adjust: exact;
color-adjust: exact;
display: inline-block;
vertical-align: middle;
background-origin: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
flex-shrink: 0;
height: 1rem;
width: 1rem;
color: #3f83f8;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
border-radius: 0.25rem;
}
.form-checkbox:checked {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5.707 7.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414L7 8.586 5.707 7.293z'/%3e%3c/svg%3e");
border-color: transparent;
background-color: currentColor;
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
@media not print {
.form-checkbox::-ms-check {
border-width: 1px;
color: transparent;
background: inherit;
border-color: inherit;
border-radius: inherit;
}
}
.form-checkbox:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-checkbox:checked:focus {
border-color: transparent;
}
.form-radio {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-webkit-print-color-adjust: exact;
color-adjust: exact;
display: inline-block;
vertical-align: middle;
background-origin: border-box;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
flex-shrink: 0;
border-radius: 100%;
height: 1rem;
width: 1rem;
color: #3f83f8;
background-color: #ffffff;
border-color: #d2d6dc;
border-width: 1px;
}
.form-radio:checked {
background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
border-color: transparent;
background-color: currentColor;
background-size: 100% 100%;
background-position: center;
background-repeat: no-repeat;
}
@media not print {
.form-radio::-ms-check {
border-width: 1px;
color: transparent;
background: inherit;
border-color: inherit;
border-radius: inherit;
}
}
.form-radio:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(164, 202, 254, 0.45);
border-color: #a4cafe;
}
.form-radio:checked:focus {
border-color: transparent;
}
/**
* Here you would add any of your custom component classes; stuff that you'd
* want loaded *before* the utilities so that the utilities could still
* override them.
*
* Example:
*
* .btn { ... }
* .form-input { ... }
*/
/**
* This injects all of Tailwind's utility classes, generated based on your
* config file.
*/
.space-y-0 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0px * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0px * var(--space-y-reverse));
}
.space-x-0 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0px * var(--space-x-reverse));
margin-left: calc(0px * calc(1 - var(--space-x-reverse)));
}
.space-y-1 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.25rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.25rem * var(--space-y-reverse));
}
.space-x-1 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.25rem * var(--space-x-reverse));
margin-left: calc(0.25rem * calc(1 - var(--space-x-reverse)));
}
.space-y-2 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.5rem * var(--space-y-reverse));
}
.space-x-2 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.5rem * var(--space-x-reverse));
margin-left: calc(0.5rem * calc(1 - var(--space-x-reverse)));
}
.space-y-3 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.75rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.75rem * var(--space-y-reverse));
}
.space-x-3 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.75rem * var(--space-x-reverse));
margin-left: calc(0.75rem * calc(1 - var(--space-x-reverse)));
}
.space-y-4 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(1rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(1rem * var(--space-y-reverse));
}
.space-x-4 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(1rem * var(--space-x-reverse));
margin-left: calc(1rem * calc(1 - var(--space-x-reverse)));
}
.space-y-5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(1.25rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(1.25rem * var(--space-y-reverse));
}
.space-x-5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(1.25rem * var(--space-x-reverse));
margin-left: calc(1.25rem * calc(1 - var(--space-x-reverse)));
}
.space-y-6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(1.5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(1.5rem * var(--space-y-reverse));
}
.space-x-6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(1.5rem * var(--space-x-reverse));
margin-left: calc(1.5rem * calc(1 - var(--space-x-reverse)));
}
.space-y-7 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(1.75rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(1.75rem * var(--space-y-reverse));
}
.space-x-7 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(1.75rem * var(--space-x-reverse));
margin-left: calc(1.75rem * calc(1 - var(--space-x-reverse)));
}
.space-y-8 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(2rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(2rem * var(--space-y-reverse));
}
.space-x-8 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(2rem * var(--space-x-reverse));
margin-left: calc(2rem * calc(1 - var(--space-x-reverse)));
}
.space-y-9 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(2.25rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(2.25rem * var(--space-y-reverse));
}
.space-x-9 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(2.25rem * var(--space-x-reverse));
margin-left: calc(2.25rem * calc(1 - var(--space-x-reverse)));
}
.space-y-10 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(2.5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(2.5rem * var(--space-y-reverse));
}
.space-x-10 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(2.5rem * var(--space-x-reverse));
margin-left: calc(2.5rem * calc(1 - var(--space-x-reverse)));
}
.space-y-11 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(2.75rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(2.75rem * var(--space-y-reverse));
}
.space-x-11 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(2.75rem * var(--space-x-reverse));
margin-left: calc(2.75rem * calc(1 - var(--space-x-reverse)));
}
.space-y-12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(3rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(3rem * var(--space-y-reverse));
}
.space-x-12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(3rem * var(--space-x-reverse));
margin-left: calc(3rem * calc(1 - var(--space-x-reverse)));
}
.space-y-13 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(3.25rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(3.25rem * var(--space-y-reverse));
}
.space-x-13 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(3.25rem * var(--space-x-reverse));
margin-left: calc(3.25rem * calc(1 - var(--space-x-reverse)));
}
.space-y-14 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(3.5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(3.5rem * var(--space-y-reverse));
}
.space-x-14 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(3.5rem * var(--space-x-reverse));
margin-left: calc(3.5rem * calc(1 - var(--space-x-reverse)));
}
.space-y-15 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(3.75rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(3.75rem * var(--space-y-reverse));
}
.space-x-15 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(3.75rem * var(--space-x-reverse));
margin-left: calc(3.75rem * calc(1 - var(--space-x-reverse)));
}
.space-y-16 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(4rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(4rem * var(--space-y-reverse));
}
.space-x-16 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(4rem * var(--space-x-reverse));
margin-left: calc(4rem * calc(1 - var(--space-x-reverse)));
}
.space-y-20 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(5rem * var(--space-y-reverse));
}
.space-x-20 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(5rem * var(--space-x-reverse));
margin-left: calc(5rem * calc(1 - var(--space-x-reverse)));
}
.space-y-24 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(6rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(6rem * var(--space-y-reverse));
}
.space-x-24 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(6rem * var(--space-x-reverse));
margin-left: calc(6rem * calc(1 - var(--space-x-reverse)));
}
.space-y-28 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(7rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(7rem * var(--space-y-reverse));
}
.space-x-28 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(7rem * var(--space-x-reverse));
margin-left: calc(7rem * calc(1 - var(--space-x-reverse)));
}
.space-y-32 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(8rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(8rem * var(--space-y-reverse));
}
.space-x-32 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(8rem * var(--space-x-reverse));
margin-left: calc(8rem * calc(1 - var(--space-x-reverse)));
}
.space-y-36 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(9rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(9rem * var(--space-y-reverse));
}
.space-x-36 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(9rem * var(--space-x-reverse));
margin-left: calc(9rem * calc(1 - var(--space-x-reverse)));
}
.space-y-40 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(10rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(10rem * var(--space-y-reverse));
}
.space-x-40 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(10rem * var(--space-x-reverse));
margin-left: calc(10rem * calc(1 - var(--space-x-reverse)));
}
.space-y-48 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(12rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(12rem * var(--space-y-reverse));
}
.space-x-48 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(12rem * var(--space-x-reverse));
margin-left: calc(12rem * calc(1 - var(--space-x-reverse)));
}
.space-y-56 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(14rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(14rem * var(--space-y-reverse));
}
.space-x-56 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(14rem * var(--space-x-reverse));
margin-left: calc(14rem * calc(1 - var(--space-x-reverse)));
}
.space-y-60 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(15rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(15rem * var(--space-y-reverse));
}
.space-x-60 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(15rem * var(--space-x-reverse));
margin-left: calc(15rem * calc(1 - var(--space-x-reverse)));
}
.space-y-64 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(16rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(16rem * var(--space-y-reverse));
}
.space-x-64 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(16rem * var(--space-x-reverse));
margin-left: calc(16rem * calc(1 - var(--space-x-reverse)));
}
.space-y-72 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(18rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(18rem * var(--space-y-reverse));
}
.space-x-72 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(18rem * var(--space-x-reverse));
margin-left: calc(18rem * calc(1 - var(--space-x-reverse)));
}
.space-y-80 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(20rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(20rem * var(--space-y-reverse));
}
.space-x-80 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(20rem * var(--space-x-reverse));
margin-left: calc(20rem * calc(1 - var(--space-x-reverse)));
}
.space-y-96 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(24rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(24rem * var(--space-y-reverse));
}
.space-x-96 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(24rem * var(--space-x-reverse));
margin-left: calc(24rem * calc(1 - var(--space-x-reverse)));
}
.space-y-px > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(1px * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(1px * var(--space-y-reverse));
}
.space-x-px > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(1px * var(--space-x-reverse));
margin-left: calc(1px * calc(1 - var(--space-x-reverse)));
}
.space-y-0\.5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.125rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.125rem * var(--space-y-reverse));
}
.space-x-0\.5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.125rem * var(--space-x-reverse));
margin-left: calc(0.125rem * calc(1 - var(--space-x-reverse)));
}
.space-y-1\.5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.375rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.375rem * var(--space-y-reverse));
}
.space-x-1\.5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.375rem * var(--space-x-reverse));
margin-left: calc(0.375rem * calc(1 - var(--space-x-reverse)));
}
.space-y-2\.5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.625rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.625rem * var(--space-y-reverse));
}
.space-x-2\.5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.625rem * var(--space-x-reverse));
margin-left: calc(0.625rem * calc(1 - var(--space-x-reverse)));
}
.space-y-3\.5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(0.875rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(0.875rem * var(--space-y-reverse));
}
.space-x-3\.5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(0.875rem * var(--space-x-reverse));
margin-left: calc(0.875rem * calc(1 - var(--space-x-reverse)));
}
.space-y-1\/2 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(50% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(50% * var(--space-y-reverse));
}
.space-x-1\/2 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(50% * var(--space-x-reverse));
margin-left: calc(50% * calc(1 - var(--space-x-reverse)));
}
.space-y-1\/3 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(33.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(33.333333% * var(--space-y-reverse));
}
.space-x-1\/3 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(33.333333% * var(--space-x-reverse));
margin-left: calc(33.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-2\/3 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(66.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(66.666667% * var(--space-y-reverse));
}
.space-x-2\/3 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(66.666667% * var(--space-x-reverse));
margin-left: calc(66.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-1\/4 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(25% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(25% * var(--space-y-reverse));
}
.space-x-1\/4 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(25% * var(--space-x-reverse));
margin-left: calc(25% * calc(1 - var(--space-x-reverse)));
}
.space-y-2\/4 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(50% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(50% * var(--space-y-reverse));
}
.space-x-2\/4 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(50% * var(--space-x-reverse));
margin-left: calc(50% * calc(1 - var(--space-x-reverse)));
}
.space-y-3\/4 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(75% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(75% * var(--space-y-reverse));
}
.space-x-3\/4 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(75% * var(--space-x-reverse));
margin-left: calc(75% * calc(1 - var(--space-x-reverse)));
}
.space-y-1\/5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(20% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(20% * var(--space-y-reverse));
}
.space-x-1\/5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(20% * var(--space-x-reverse));
margin-left: calc(20% * calc(1 - var(--space-x-reverse)));
}
.space-y-2\/5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(40% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(40% * var(--space-y-reverse));
}
.space-x-2\/5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(40% * var(--space-x-reverse));
margin-left: calc(40% * calc(1 - var(--space-x-reverse)));
}
.space-y-3\/5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(60% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(60% * var(--space-y-reverse));
}
.space-x-3\/5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(60% * var(--space-x-reverse));
margin-left: calc(60% * calc(1 - var(--space-x-reverse)));
}
.space-y-4\/5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(80% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(80% * var(--space-y-reverse));
}
.space-x-4\/5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(80% * var(--space-x-reverse));
margin-left: calc(80% * calc(1 - var(--space-x-reverse)));
}
.space-y-1\/6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(16.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(16.666667% * var(--space-y-reverse));
}
.space-x-1\/6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(16.666667% * var(--space-x-reverse));
margin-left: calc(16.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-2\/6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(33.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(33.333333% * var(--space-y-reverse));
}
.space-x-2\/6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(33.333333% * var(--space-x-reverse));
margin-left: calc(33.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-3\/6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(50% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(50% * var(--space-y-reverse));
}
.space-x-3\/6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(50% * var(--space-x-reverse));
margin-left: calc(50% * calc(1 - var(--space-x-reverse)));
}
.space-y-4\/6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(66.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(66.666667% * var(--space-y-reverse));
}
.space-x-4\/6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(66.666667% * var(--space-x-reverse));
margin-left: calc(66.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-5\/6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(83.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(83.333333% * var(--space-y-reverse));
}
.space-x-5\/6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(83.333333% * var(--space-x-reverse));
margin-left: calc(83.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-1\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(8.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(8.333333% * var(--space-y-reverse));
}
.space-x-1\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(8.333333% * var(--space-x-reverse));
margin-left: calc(8.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-2\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(16.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(16.666667% * var(--space-y-reverse));
}
.space-x-2\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(16.666667% * var(--space-x-reverse));
margin-left: calc(16.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-3\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(25% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(25% * var(--space-y-reverse));
}
.space-x-3\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(25% * var(--space-x-reverse));
margin-left: calc(25% * calc(1 - var(--space-x-reverse)));
}
.space-y-4\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(33.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(33.333333% * var(--space-y-reverse));
}
.space-x-4\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(33.333333% * var(--space-x-reverse));
margin-left: calc(33.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-5\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(41.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(41.666667% * var(--space-y-reverse));
}
.space-x-5\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(41.666667% * var(--space-x-reverse));
margin-left: calc(41.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-6\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(50% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(50% * var(--space-y-reverse));
}
.space-x-6\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(50% * var(--space-x-reverse));
margin-left: calc(50% * calc(1 - var(--space-x-reverse)));
}
.space-y-7\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(58.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(58.333333% * var(--space-y-reverse));
}
.space-x-7\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(58.333333% * var(--space-x-reverse));
margin-left: calc(58.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-8\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(66.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(66.666667% * var(--space-y-reverse));
}
.space-x-8\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(66.666667% * var(--space-x-reverse));
margin-left: calc(66.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-9\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(75% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(75% * var(--space-y-reverse));
}
.space-x-9\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(75% * var(--space-x-reverse));
margin-left: calc(75% * calc(1 - var(--space-x-reverse)));
}
.space-y-10\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(83.333333% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(83.333333% * var(--space-y-reverse));
}
.space-x-10\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(83.333333% * var(--space-x-reverse));
margin-left: calc(83.333333% * calc(1 - var(--space-x-reverse)));
}
.space-y-11\/12 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(91.666667% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(91.666667% * var(--space-y-reverse));
}
.space-x-11\/12 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(91.666667% * var(--space-x-reverse));
margin-left: calc(91.666667% * calc(1 - var(--space-x-reverse)));
}
.space-y-full > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(100% * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(100% * var(--space-y-reverse));
}
.space-x-full > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(100% * var(--space-x-reverse));
margin-left: calc(100% * calc(1 - var(--space-x-reverse)));
}
.-space-y-1 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-0.25rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-0.25rem * var(--space-y-reverse));
}
.-space-x-1 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-0.25rem * var(--space-x-reverse));
margin-left: calc(-0.25rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-2 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-0.5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-0.5rem * var(--space-y-reverse));
}
.-space-x-2 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-0.5rem * var(--space-x-reverse));
margin-left: calc(-0.5rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-3 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-0.75rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-0.75rem * var(--space-y-reverse));
}
.-space-x-3 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-0.75rem * var(--space-x-reverse));
margin-left: calc(-0.75rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-4 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-1rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-1rem * var(--space-y-reverse));
}
.-space-x-4 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-1rem * var(--space-x-reverse));
margin-left: calc(-1rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-5 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-1.25rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-1.25rem * var(--space-y-reverse));
}
.-space-x-5 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-1.25rem * var(--space-x-reverse));
margin-left: calc(-1.25rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-6 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-1.5rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-1.5rem * var(--space-y-reverse));
}
.-space-x-6 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-1.5rem * var(--space-x-reverse));
margin-left: calc(-1.5rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-7 > :not(template) ~ :not(template) {
--space-y-reverse: 0;
margin-top: calc(-1.75rem * calc(1 - var(--space-y-reverse)));
margin-bottom: calc(-1.75rem * var(--space-y-reverse));
}
.-space-x-7 > :not(template) ~ :not(template) {
--space-x-reverse: 0;
margin-right: calc(-1.75rem * var(--space-x-reverse));
margin-left: calc(-1.75rem * calc(1 - var(--space-x-reverse)));
}
.-space-y-8 > :not(template) ~ :n
gitextract_mpu2o96m/ ├── .cloud/ │ ├── docker/ │ │ ├── Dockerfile │ │ └── Dockerfile.prod │ ├── nginx/ │ │ └── nginx.conf │ ├── php/ │ │ └── local.ini │ └── scripts/ │ └── entrypoint.sh ├── .editorconfig ├── .eslintrc ├── .gitattributes ├── .gitignore ├── .styleci.yml ├── README.md ├── app/ │ ├── Console/ │ │ ├── Commands/ │ │ │ ├── ImportTitles.php │ │ │ └── toElastic.php │ │ └── Kernel.php │ ├── Crew.php │ ├── Episode.php │ ├── Exceptions/ │ │ └── Handler.php │ ├── Http/ │ │ ├── Controllers/ │ │ │ ├── Auth/ │ │ │ │ ├── ConfirmPasswordController.php │ │ │ │ ├── EmailVerificationController.php │ │ │ │ ├── ForgotPasswordController.php │ │ │ │ ├── LoginController.php │ │ │ │ ├── LogoutController.php │ │ │ │ ├── PasswordResetController.php │ │ │ │ ├── RegisterController.php │ │ │ │ ├── ResetPasswordController.php │ │ │ │ └── VerificationController.php │ │ │ ├── Controller.php │ │ │ ├── DashboardController.php │ │ │ ├── HomeController.php │ │ │ ├── MovieController.php │ │ │ ├── SearchController.php │ │ │ ├── SeriesController.php │ │ │ ├── WatchListController.php │ │ │ └── WatchedController.php │ │ ├── Kernel.php │ │ └── Middleware/ │ │ ├── Authenticate.php │ │ ├── CheckForMaintenanceMode.php │ │ ├── EncryptCookies.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php │ ├── Jobs/ │ │ └── FetchPosterJob.php │ ├── Models/ │ │ └── WatchList.php │ ├── Name.php │ ├── Poster.php │ ├── Principal.php │ ├── Providers/ │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── EventServiceProvider.php │ │ ├── HorizonServiceProvider.php │ │ └── RouteServiceProvider.php │ ├── Rating.php │ ├── Title.php │ ├── User.php │ ├── Watched/ │ │ ├── Importers/ │ │ │ ├── AkaImporter.php │ │ │ ├── CrewImporter.php │ │ │ ├── EpisodeImporter.php │ │ │ ├── Importer.php │ │ │ ├── ImporterInterface.php │ │ │ ├── NameImporter.php │ │ │ ├── PrincipalImporter.php │ │ │ ├── RatingImporter.php │ │ │ └── TitleImporter.php │ │ └── Traits/ │ │ └── TitleFilter.php │ └── Watched.php ├── artisan ├── bin/ │ └── abc ├── bootstrap/ │ ├── app.php │ └── cache/ │ └── .gitignore ├── clear.sh ├── composer.json ├── config/ │ ├── app.php │ ├── auth.php │ ├── broadcasting.php │ ├── cache.php │ ├── cors.php │ ├── database.php │ ├── filesystems.php │ ├── hashing.php │ ├── horizon.php │ ├── logging.php │ ├── mail.php │ ├── movie.php │ ├── queue.php │ ├── services.php │ ├── session.php │ └── view.php ├── database/ │ ├── .gitignore │ ├── factories/ │ │ └── UserFactory.php │ ├── migrations/ │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2014_10_12_100000_create_password_resets_table.php │ │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ │ ├── 2020_06_03_231708_create_watched_table.php │ │ ├── 2020_06_03_231837_create_posters_table.php │ │ ├── 2020_06_19_095538_create_watch_lists_table.php │ │ └── imdb/ │ │ ├── 2020_06_01_231011_create_titles_table.php │ │ ├── 2020_06_01_231940_create_episodes_table.php │ │ ├── 2020_06_01_232132_create_ratings_table.php │ │ ├── 2020_06_01_232423_create_principals_table.php │ │ ├── 2020_06_01_232702_create_names_table.php │ │ ├── 2020_06_01_232924_create_crews_table.php │ │ └── 2020_06_03_135647_create_akas_table.php │ └── seeds/ │ └── DatabaseSeeder.php ├── docker-compose.yml ├── package.json ├── phpunit.xml ├── public/ │ ├── .htaccess │ ├── css/ │ │ └── app.css │ ├── index.php │ ├── js/ │ │ └── app.js │ ├── mix-manifest.json │ ├── robots.txt │ ├── vendor/ │ │ └── horizon/ │ │ ├── app-dark.css │ │ ├── app.css │ │ ├── app.js │ │ └── mix-manifest.json │ └── web.config ├── resources/ │ ├── js/ │ │ ├── app.js │ │ ├── bootstrap.js │ │ └── components/ │ │ ├── CheckboxComponent.vue │ │ ├── MovieComponent.vue │ │ ├── SearchComponent.vue │ │ └── SeriesComponent.vue │ ├── lang/ │ │ └── en/ │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php │ ├── sass/ │ │ └── app.scss │ └── views/ │ ├── auth/ │ │ ├── login.blade.php │ │ ├── passwords/ │ │ │ ├── confirm.blade.php │ │ │ ├── email.blade.php │ │ │ └── reset.blade.php │ │ ├── register.blade.php │ │ └── verify.blade.php │ ├── components/ │ │ ├── app.blade.php │ │ ├── filter.blade.php │ │ └── logo.blade.php │ ├── dashboard.blade.php │ ├── home.blade.php │ ├── layouts/ │ │ ├── app.blade.php │ │ ├── auth.blade.php │ │ └── base.blade.php │ ├── livewire/ │ │ ├── auth/ │ │ │ ├── login.blade.php │ │ │ ├── passwords/ │ │ │ │ ├── confirm.blade.php │ │ │ │ ├── email.blade.php │ │ │ │ └── reset.blade.php │ │ │ ├── register.blade.php │ │ │ └── verify.blade.php │ │ ├── checkbox.blade.php │ │ ├── movie.blade.php │ │ ├── movies.blade.php │ │ └── paginate.blade.php │ ├── movies.blade.php │ ├── queries/ │ │ └── elasticsearch.blade.php │ ├── series/ │ │ ├── index.blade.php │ │ └── show.blade.php │ ├── show.blade.php │ ├── vendor/ │ │ ├── livewire/ │ │ │ └── pagination-links.blade.php │ │ └── pagination/ │ │ ├── default.blade.php │ │ └── simple-default.blade.php │ ├── watched.blade.php │ └── welcome.blade.php ├── routes/ │ ├── api.php │ ├── channels.php │ ├── console.php │ └── web.php ├── server.php ├── storage/ │ ├── app/ │ │ └── .gitignore │ ├── debugbar/ │ │ └── .gitignore │ ├── framework/ │ │ ├── .gitignore │ │ ├── cache/ │ │ │ └── .gitignore │ │ ├── sessions/ │ │ │ └── .gitignore │ │ ├── testing/ │ │ │ └── .gitignore │ │ └── views/ │ │ └── .gitignore │ └── logs/ │ └── .gitignore ├── tailwind.config.js ├── tests/ │ ├── CreatesApplication.php │ ├── Feature/ │ │ ├── Auth/ │ │ │ ├── LoginTest.php │ │ │ ├── LogoutTest.php │ │ │ ├── Passwords/ │ │ │ │ ├── ConfirmTest.php │ │ │ │ ├── EmailTest.php │ │ │ │ └── ResetTest.php │ │ │ ├── RegisterTest.php │ │ │ └── VerifyTest.php │ │ └── ExampleTest.php │ ├── TestCase.php │ └── Unit/ │ └── ExampleTest.php └── webpack.mix.js
SYMBOL INDEX (1164 symbols across 84 files)
FILE: app/Console/Commands/ImportTitles.php
class ImportTitles (line 12) | class ImportTitles extends Command
method handle (line 37) | public function handle()
method dropTables (line 68) | private function dropTables(): void
method createTables (line 81) | private function createTables(): void
method importer (line 87) | private function importer($field): ImporterInterface
FILE: app/Console/Commands/toElastic.php
class toElastic (line 8) | class toElastic extends Command
method __construct (line 29) | public function __construct()
method handle (line 39) | public function handle()
method postgresUrl (line 51) | private function postgresUrl(): string
FILE: app/Console/Kernel.php
class Kernel (line 8) | class Kernel extends ConsoleKernel
method schedule (line 25) | protected function schedule(Schedule $schedule)
method commands (line 35) | protected function commands()
FILE: app/Crew.php
class Crew (line 7) | class Crew extends Model
method name (line 9) | public function name()
FILE: app/Episode.php
class Episode (line 7) | class Episode extends Model
FILE: app/Exceptions/Handler.php
class Handler (line 8) | class Handler extends ExceptionHandler
method report (line 37) | public function report(Throwable $exception)
method render (line 51) | public function render($request, Throwable $exception)
FILE: app/Http/Controllers/Auth/ConfirmPasswordController.php
class ConfirmPasswordController (line 9) | class ConfirmPasswordController extends Controller
method __construct (line 36) | public function __construct()
FILE: app/Http/Controllers/Auth/EmailVerificationController.php
class EmailVerificationController (line 12) | class EmailVerificationController extends Controller
method __invoke (line 14) | public function __invoke(string $id, string $hash): RedirectResponse
FILE: app/Http/Controllers/Auth/ForgotPasswordController.php
class ForgotPasswordController (line 8) | class ForgotPasswordController extends Controller
FILE: app/Http/Controllers/Auth/LoginController.php
class LoginController (line 9) | class LoginController extends Controller
method __construct (line 36) | public function __construct()
FILE: app/Http/Controllers/Auth/LogoutController.php
class LogoutController (line 10) | class LogoutController extends Controller
method __invoke (line 12) | public function __invoke(): RedirectResponse
FILE: app/Http/Controllers/Auth/PasswordResetController.php
class PasswordResetController (line 7) | class PasswordResetController extends Controller
method __invoke (line 9) | public function __invoke($token)
FILE: app/Http/Controllers/Auth/RegisterController.php
class RegisterController (line 12) | class RegisterController extends Controller
method __construct (line 39) | public function __construct()
method validator (line 50) | protected function validator(array $data)
method create (line 65) | protected function create(array $data)
FILE: app/Http/Controllers/Auth/ResetPasswordController.php
class ResetPasswordController (line 9) | class ResetPasswordController extends Controller
FILE: app/Http/Controllers/Auth/VerificationController.php
class VerificationController (line 9) | class VerificationController extends Controller
method __construct (line 36) | public function __construct()
FILE: app/Http/Controllers/Controller.php
class Controller (line 10) | class Controller extends BaseController
FILE: app/Http/Controllers/DashboardController.php
class DashboardController (line 7) | class DashboardController extends Controller
method index (line 9) | public function index()
FILE: app/Http/Controllers/HomeController.php
class HomeController (line 7) | class HomeController extends Controller
method __construct (line 14) | public function __construct()
method index (line 24) | public function index()
FILE: app/Http/Controllers/MovieController.php
class MovieController (line 10) | class MovieController extends Controller
method index (line 14) | public function index()
method show (line 25) | public function show($id)
FILE: app/Http/Controllers/SearchController.php
class SearchController (line 10) | class SearchController extends Controller
method search (line 12) | public function search()
method regularSearch (line 27) | public function regularSearch()
method searchInElasticsearch (line 79) | public function searchInElasticsearch()
method searchImdbId (line 129) | public function searchImdbId()
FILE: app/Http/Controllers/SeriesController.php
class SeriesController (line 12) | class SeriesController extends Controller
method index (line 16) | public function index()
method show (line 27) | public function show($id)
FILE: app/Http/Controllers/WatchListController.php
class WatchListController (line 8) | class WatchListController extends Controller
method index (line 15) | public function index()
method create (line 25) | public function create()
method store (line 36) | public function store(Request $request)
method show (line 47) | public function show(WatchList $watchList)
method edit (line 58) | public function edit(WatchList $watchList)
method update (line 70) | public function update(Request $request, WatchList $watchList)
method destroy (line 81) | public function destroy(WatchList $watchList)
FILE: app/Http/Controllers/WatchedController.php
class WatchedController (line 9) | class WatchedController extends Controller
method index (line 11) | public function index()
method update (line 24) | public function update($id, Request $request)
FILE: app/Http/Kernel.php
class Kernel (line 7) | class Kernel extends HttpKernel
FILE: app/Http/Middleware/Authenticate.php
class Authenticate (line 7) | class Authenticate extends Middleware
method redirectTo (line 15) | protected function redirectTo($request)
FILE: app/Http/Middleware/CheckForMaintenanceMode.php
class CheckForMaintenanceMode (line 7) | class CheckForMaintenanceMode extends Middleware
FILE: app/Http/Middleware/EncryptCookies.php
class EncryptCookies (line 7) | class EncryptCookies extends Middleware
FILE: app/Http/Middleware/RedirectIfAuthenticated.php
class RedirectIfAuthenticated (line 9) | class RedirectIfAuthenticated
method handle (line 19) | public function handle($request, Closure $next, $guard = null)
FILE: app/Http/Middleware/TrimStrings.php
class TrimStrings (line 7) | class TrimStrings extends Middleware
FILE: app/Http/Middleware/TrustProxies.php
class TrustProxies (line 8) | class TrustProxies extends Middleware
FILE: app/Http/Middleware/VerifyCsrfToken.php
class VerifyCsrfToken (line 7) | class VerifyCsrfToken extends Middleware
FILE: app/Jobs/FetchPosterJob.php
class FetchPosterJob (line 14) | class FetchPosterJob implements ShouldQueue
method __construct (line 25) | public function __construct($titleID)
method handle (line 35) | public function handle()
FILE: app/Models/WatchList.php
class WatchList (line 7) | class WatchList extends Model
FILE: app/Name.php
class Name (line 7) | class Name extends Model
FILE: app/Poster.php
class Poster (line 7) | class Poster extends Model
method title (line 11) | public function title()
FILE: app/Principal.php
class Principal (line 7) | class Principal extends Model
method name (line 9) | public function name()
FILE: app/Providers/AppServiceProvider.php
class AppServiceProvider (line 7) | class AppServiceProvider extends ServiceProvider
method register (line 14) | public function register()
method boot (line 24) | public function boot()
FILE: app/Providers/AuthServiceProvider.php
class AuthServiceProvider (line 8) | class AuthServiceProvider extends ServiceProvider
method boot (line 24) | public function boot()
FILE: app/Providers/BroadcastServiceProvider.php
class BroadcastServiceProvider (line 8) | class BroadcastServiceProvider extends ServiceProvider
method boot (line 15) | public function boot()
FILE: app/Providers/EventServiceProvider.php
class EventServiceProvider (line 10) | class EventServiceProvider extends ServiceProvider
method boot (line 28) | public function boot()
FILE: app/Providers/HorizonServiceProvider.php
class HorizonServiceProvider (line 9) | class HorizonServiceProvider extends HorizonApplicationServiceProvider
method boot (line 16) | public function boot()
method gate (line 34) | protected function gate()
FILE: app/Providers/RouteServiceProvider.php
class RouteServiceProvider (line 8) | class RouteServiceProvider extends ServiceProvider
method boot (line 31) | public function boot()
method map (line 43) | public function map()
method mapWebRoutes (line 59) | protected function mapWebRoutes()
method mapApiRoutes (line 73) | protected function mapApiRoutes()
FILE: app/Rating.php
class Rating (line 7) | class Rating extends Model
FILE: app/Title.php
class Title (line 7) | class Title extends Model
method poster (line 9) | public function poster()
method rating (line 16) | public function rating()
method watched (line 21) | public function watched()
method crew (line 27) | public function crew()
method principal (line 32) | public function principal()
method getIsWatchedAttribute (line 37) | public function getIsWatchedAttribute()
method url (line 45) | public function url()
FILE: app/User.php
class User (line 9) | class User extends Authenticatable
FILE: app/Watched.php
class Watched (line 8) | class Watched extends Model
method title (line 16) | public function title()
method url (line 21) | public function url()
FILE: app/Watched/Importers/AkaImporter.php
class AkaImporter (line 7) | class AkaImporter extends Importer implements ImporterInterface
method start (line 11) | public function start(): ImporterInterface
method index (line 20) | public function index(): ImporterInterface
FILE: app/Watched/Importers/CrewImporter.php
class CrewImporter (line 7) | class CrewImporter extends Importer implements ImporterInterface
method start (line 11) | public function start(): ImporterInterface
method index (line 20) | public function index(): ImporterInterface
FILE: app/Watched/Importers/EpisodeImporter.php
class EpisodeImporter (line 7) | class EpisodeImporter extends Importer implements ImporterInterface
method start (line 11) | public function start(): ImporterInterface
method index (line 20) | public function index(): ImporterInterface
FILE: app/Watched/Importers/Importer.php
class Importer (line 9) | abstract class Importer
method __construct (line 17) | public function __construct()
method download (line 23) | public function download($output, $force = false): ImporterInterface
method untar (line 63) | public function untar($file, $name)
FILE: app/Watched/Importers/ImporterInterface.php
type ImporterInterface (line 7) | interface ImporterInterface
method start (line 9) | public function start();
method index (line 11) | public function index(): ImporterInterface;
method download (line 13) | public function download(OutputStyle $outputStyle): ImporterInterface;
FILE: app/Watched/Importers/NameImporter.php
class NameImporter (line 7) | class NameImporter extends Importer implements ImporterInterface
method start (line 11) | public function start(): ImporterInterface
method index (line 20) | public function index(): ImporterInterface
FILE: app/Watched/Importers/PrincipalImporter.php
class PrincipalImporter (line 9) | class PrincipalImporter extends Importer implements ImporterInterface
method start (line 13) | public function start(): ImporterInterface
method index (line 22) | public function index(): ImporterInterface
FILE: app/Watched/Importers/RatingImporter.php
class RatingImporter (line 7) | class RatingImporter extends Importer implements ImporterInterface
method start (line 11) | public function start(): ImporterInterface
method index (line 20) | public function index(): ImporterInterface
FILE: app/Watched/Importers/TitleImporter.php
class TitleImporter (line 10) | class TitleImporter extends Importer implements ImporterInterface
method start (line 14) | public function start(): ImporterInterface
method index (line 23) | public function index(): ImporterInterface
FILE: app/Watched/Traits/TitleFilter.php
type TitleFilter (line 10) | trait TitleFilter
method filter (line 12) | public function filter($type = 'movie')
method checkPoster (line 40) | private function checkPoster($movie)
FILE: database/migrations/2014_10_12_000000_create_users_table.php
class CreateUsersTable (line 7) | class CreateUsersTable extends Migration
method up (line 14) | public function up()
method down (line 32) | public function down()
FILE: database/migrations/2014_10_12_100000_create_password_resets_table.php
class CreatePasswordResetsTable (line 7) | class CreatePasswordResetsTable extends Migration
method up (line 14) | public function up()
method down (line 28) | public function down()
FILE: database/migrations/2019_08_19_000000_create_failed_jobs_table.php
class CreateFailedJobsTable (line 7) | class CreateFailedJobsTable extends Migration
method up (line 14) | public function up()
method down (line 31) | public function down()
FILE: database/migrations/2020_06_03_231708_create_watched_table.php
class CreateWatchedTable (line 7) | class CreateWatchedTable extends Migration
method up (line 14) | public function up()
method down (line 31) | public function down()
FILE: database/migrations/2020_06_03_231837_create_posters_table.php
class CreatePostersTable (line 7) | class CreatePostersTable extends Migration
method up (line 14) | public function up()
method down (line 29) | public function down()
FILE: database/migrations/2020_06_19_095538_create_watch_lists_table.php
class CreateWatchListsTable (line 7) | class CreateWatchListsTable extends Migration
method up (line 14) | public function up()
method down (line 31) | public function down()
FILE: database/migrations/imdb/2020_06_01_231011_create_titles_table.php
class CreateTitlesTable (line 7) | class CreateTitlesTable extends Migration
method up (line 14) | public function up()
method down (line 36) | public function down()
FILE: database/migrations/imdb/2020_06_01_231940_create_episodes_table.php
class CreateEpisodesTable (line 7) | class CreateEpisodesTable extends Migration
method up (line 14) | public function up()
method down (line 30) | public function down()
FILE: database/migrations/imdb/2020_06_01_232132_create_ratings_table.php
class CreateRatingsTable (line 7) | class CreateRatingsTable extends Migration
method up (line 14) | public function up()
method down (line 29) | public function down()
FILE: database/migrations/imdb/2020_06_01_232423_create_principals_table.php
class CreatePrincipalsTable (line 7) | class CreatePrincipalsTable extends Migration
method up (line 14) | public function up()
method down (line 32) | public function down()
FILE: database/migrations/imdb/2020_06_01_232702_create_names_table.php
class CreateNamesTable (line 7) | class CreateNamesTable extends Migration
method up (line 14) | public function up()
method down (line 32) | public function down()
FILE: database/migrations/imdb/2020_06_01_232924_create_crews_table.php
class CreateCrewsTable (line 7) | class CreateCrewsTable extends Migration
method up (line 14) | public function up()
method down (line 29) | public function down()
FILE: database/migrations/imdb/2020_06_03_135647_create_akas_table.php
class CreateAkasTable (line 7) | class CreateAkasTable extends Migration
method up (line 14) | public function up()
method down (line 34) | public function down()
FILE: database/seeds/DatabaseSeeder.php
class DatabaseSeeder (line 5) | class DatabaseSeeder extends Seeder
method run (line 12) | public function run()
FILE: public/js/app.js
function __webpack_require__ (line 6) | function __webpack_require__(moduleId) {
FILE: public/vendor/horizon/app.js
function p (line 2) | function p(o){if(e[o])return e[o].exports;var b=e[o]={i:o,l:!1,exports:{...
function e (line 2) | function e(o){if(p[o])return p[o].exports;var b=p[o]={i:o,l:!1,exports:{...
function p (line 2) | function p(t,e){var p=t[1]||"",o=t[3];if(!o)return p;if(e&&"function"==t...
function o (line 2) | function o(t){for(var e=0;e<t.length;e++){var p=t[e],o=O[p.id];if(o){o.r...
function b (line 2) | function b(){var t=document.createElement("style");return t.type="text/c...
function M (line 2) | function M(t){var e,p,o=document.querySelector("style["+l+'~="'+t.id+'"]...
function n (line 2) | function n(t,e,p,o){var b=p?"":o.css;if(t.styleSheet)t.styleSheet.cssTex...
function z (line 2) | function z(t,e){var p=e.css,o=e.media,b=e.sourceMap;if(o&&t.setAttribute...
function M (line 2) | function M(t){return void 0!==t._view.width}
function n (line 2) | function n(t){var e,p,o,b,n=t._view;if(M(t)){var z=n.width/2;e=n.x-z,p=n...
function u (line 2) | function u(t){return q[(l+t)%4]}
function e (line 2) | function e(e){var p=e.options;n.each(e.scales,(function(t){r.removeBox(e...
function p (line 2) | function p(t){return"top"===t||"bottom"===t}
function z (line 2) | function z(t){var e=t.options;return e.angleLines.display||e.pointLabels...
function r (line 2) | function r(t){var p=t.options.pointLabels,o=b.valueOrDefault(p.fontSize,...
function c (line 2) | function c(t,e,p,o,b){return t===o||t===b?{start:e-p/2,end:e+p/2}:t<o||t...
function O (line 2) | function O(t){return 0===t||180===t?"center":t<180?"left":"right"}
function i (line 2) | function i(t,e,p,o){if(b.isArray(e))for(var M=p.y,n=1.5*o,z=0;z<e.length...
function a (line 2) | function a(t,e,p){90===t||270===t?p.y-=e.h/2:(t>270||t<90)&&(p.y-=e.h)}
function A (line 2) | function A(t){return b.isNumber(t)?t:0}
function z (line 2) | function z(t){return t&&"[object Function]"==={}.toString.call(t)}
function r (line 2) | function r(t,e){if(1!==t.nodeType)return[];var p=t.ownerDocument.default...
function c (line 2) | function c(t){return"HTML"===t.nodeName?t:t.parentNode||t.host}
function O (line 2) | function O(t){if(!t)return document.body;switch(t.nodeName){case"HTML":c...
function A (line 2) | function A(t){return 11===t?i:10===t?a:i||a}
function s (line 2) | function s(t){if(!t)return document.documentElement;for(var e=A(10)?docu...
function d (line 2) | function d(t){return null!==t.parentNode?d(t.parentNode):t}
function q (line 2) | function q(t,e){if(!(t&&t.nodeType&&e&&e.nodeType))return document.docum...
function l (line 2) | function l(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[...
function u (line 2) | function u(t,e){var p=arguments.length>2&&void 0!==arguments[2]&&argumen...
function f (line 2) | function f(t,e){var p="x"===e?"Left":"Top",o="Left"===p?"Right":"Bottom"...
function W (line 2) | function W(t,e,p,o){return Math.max(e["offset"+t],e["scroll"+t],p["clien...
function h (line 2) | function h(t){var e=t.body,p=t.documentElement,o=A(10)&&getComputedStyle...
function t (line 2) | function t(t,e){for(var p=0;p<e.length;p++){var o=e[p];o.enumerable=o.en...
function B (line 2) | function B(t){return g({},t,{right:t.left+t.width,bottom:t.top+t.height})}
function X (line 2) | function X(t){var e={};try{if(A(10)){e=t.getBoundingClientRect();var p=l...
function L (line 2) | function L(t,e){var p=arguments.length>2&&void 0!==arguments[2]&&argumen...
function y (line 2) | function y(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments...
function N (line 2) | function N(t){var e=t.nodeName;if("BODY"===e||"HTML"===e)return!1;if("fi...
function _ (line 2) | function _(t){if(!t||!t.parentElement||A())return document.documentEleme...
function T (line 2) | function T(t,e,p,o){var b=arguments.length>4&&void 0!==arguments[4]&&arg...
function x (line 2) | function x(t){return t.width*t.height}
function w (line 2) | function w(t,e,p,o,b){var M=arguments.length>5&&void 0!==arguments[5]?ar...
function C (line 2) | function C(t,e,p){var o=arguments.length>3&&void 0!==arguments[3]?argume...
function S (line 2) | function S(t){var e=t.ownerDocument.defaultView.getComputedStyle(t),p=pa...
function H (line 2) | function H(t){var e={left:"right",right:"left",bottom:"top",top:"bottom"...
function F (line 2) | function F(t,e,p){p=p.split("-")[0];var o=S(t),b={width:o.width,height:o...
function k (line 2) | function k(t,e){return Array.prototype.find?t.find(e):t.filter(e)[0]}
function E (line 2) | function E(t,e,p){return(void 0===p?t:t.slice(0,function(t,e,p){if(Array...
function D (line 2) | function D(){if(!this.state.isDestroyed){var t={instance:this,styles:{},...
function I (line 2) | function I(t,e){return t.some((function(t){var p=t.name;return t.enabled...
function P (line 2) | function P(t){for(var e=[!1,"ms","Webkit","Moz","O"],p=t.charAt(0).toUpp...
function j (line 2) | function j(){return this.state.isDestroyed=!0,I(this.modifiers,"applySty...
function V (line 2) | function V(t){var e=t.ownerDocument;return e?e.defaultView:window}
function U (line 2) | function U(t,e,p,o){p.updateBound=o,V(t).addEventListener("resize",p.upd...
function $ (line 2) | function $(){this.state.eventsEnabled||(this.state=U(this.reference,this...
function K (line 2) | function K(){var t,e;this.state.eventsEnabled&&(cancelAnimationFrame(thi...
function Y (line 2) | function Y(t){return""!==t&&!isNaN(parseFloat(t))&&isFinite(t)}
function G (line 2) | function G(t,e){Object.keys(e).forEach((function(p){var o="";-1!==["widt...
function Q (line 2) | function Q(t,e,p){var o=k(t,(function(t){return t.name===e})),b=!!o&&t.s...
function et (line 2) | function et(t){var e=arguments.length>1&&void 0!==arguments[1]&&argument...
function Mt (line 2) | function Mt(t,e,p,o){var b=[0,0],M=-1!==["right","left"].indexOf(o),n=t....
function t (line 2) | function t(e,p){var o=this,b=arguments.length>2&&void 0!==arguments[2]?a...
function M (line 2) | function M(){throw new Error("setTimeout has not been defined")}
function n (line 2) | function n(){throw new Error("clearTimeout has not been defined")}
function z (line 2) | function z(t){if(p===setTimeout)return setTimeout(t,0);if((p===M||!p)&&s...
function a (line 2) | function a(){O&&r&&(O=!1,r.length?c=r.concat(c):i=-1,c.length&&A())}
function A (line 2) | function A(){if(!O){var t=z(a);O=!0;for(var e=c.length;e;){for(r=c,c=[];...
function s (line 2) | function s(t,e){this.fun=t,this.array=e}
function d (line 2) | function d(){}
function b (line 2) | function b(){this.handlers=[]}
function r (line 2) | function r(t,e){return t.usePointStyle?e*Math.SQRT2:t.boxWidth}
function O (line 2) | function O(t,e){var p=new c({ctx:t.ctx,options:e,chart:t});n.configure(t...
function r (line 2) | function r(t){this.defaults=t,this.interceptors={request:new M,response:...
function c (line 2) | function c(t){return t>96?t-87:t>64?t-29:t-48}
function O (line 2) | function O(t){var e=0,p=t.split("."),o=p[0],b=p[1]||"",M=1,n=0,z=1;for(4...
function i (line 2) | function i(t){for(var e=0;e<t.length;e++)t[e]=O(t[e])}
function a (line 2) | function a(t,e){var p,o=[];for(p=0;p<e.length;p++)o[p]=t[e[p]];return o}
function A (line 2) | function A(t){var e=t.split("|"),p=e[2].split(" "),o=e[3].split(""),b=e[...
function s (line 2) | function s(t){t&&this._set(A(t))}
function d (line 2) | function d(t){var e=t.toTimeString(),p=e.match(/\([a-z ]+\)/i);"GMT"===(...
function q (line 2) | function q(t){this.zone=t,this.offsetScore=0,this.abbrScore=0}
function l (line 2) | function l(t,e){for(var p,o;o=6e4*((e.at-t.at)/12e4|0);)(p=new d(new Dat...
function u (line 2) | function u(t,e){return t.offsetScore!==e.offsetScore?t.offsetScore-e.off...
function f (line 2) | function f(t,e){var p,o;for(i(e),p=0;p<e.length;p++)o=e[p],M[o]=M[o]||{}...
function W (line 2) | function W(t){var e,p,o,n=t.length,z={},r=[];for(e=0;e<n;e++)for(p in o=...
function h (line 2) | function h(){try{var t=Intl.DateTimeFormat().resolvedOptions().timeZone;...
function v (line 2) | function v(t){return(t||"").toLowerCase().replace(/\//g,"_")}
function R (line 2) | function R(t){var e,o,M,n;for("string"==typeof t&&(t=[t]),e=0;e<t.length...
function m (line 2) | function m(t,e){t=v(t);var M,n=p[t];return n instanceof s?n:"string"==ty...
function g (line 2) | function g(t){var e,p,M,n;for("string"==typeof t&&(t=[t]),e=0;e<t.length...
function B (line 2) | function B(t){var e="X"===t._f||"x"===t._f;return!(!t._a||void 0!==t._tz...
function X (line 2) | function X(t){"undefined"!=typeof console&&console.error}
function L (line 2) | function L(e){var p=Array.prototype.slice.call(arguments,0,-1),o=argumen...
function _ (line 2) | function _(t){return function(){return this._z?this._z.abbr(this):t.call...
function h (line 2) | function h(t,e,p){var o,b,M=(p=p||n).createElement("script");if(M.text=t...
function v (line 2) | function v(t){return null==t?t+"":"object"==typeof t||"function"==typeof...
function g (line 2) | function g(t){var e=!!t&&"length"in t&&t.length,p=v(t);return!u(t)&&!f(t...
function zt (line 2) | function zt(t,e,o,b){var M,z,c,O,i,s,l,u=e&&e.ownerDocument,v=e?e.nodeTy...
function rt (line 2) | function rt(){var t=[];return function e(p,b){return t.push(p+" ")>o.cac...
function ct (line 2) | function ct(t){return t[W]=!0,t}
function Ot (line 2) | function Ot(t){var e=A.createElement("fieldset");try{return!!t(e)}catch(...
function it (line 2) | function it(t,e){for(var p=t.split("|"),b=p.length;b--;)o.attrHandle[p[b...
function at (line 2) | function at(t,e){var p=e&&t,o=p&&1===t.nodeType&&1===e.nodeType&&t.sourc...
function At (line 2) | function At(t){return function(e){return"input"===e.nodeName.toLowerCase...
function st (line 2) | function st(t){return function(e){var p=e.nodeName.toLowerCase();return(...
function dt (line 2) | function dt(t){return function(e){return"form"in e?e.parentNode&&!1===e....
function qt (line 2) | function qt(t){return ct((function(e){return e=+e,ct((function(p,o){for(...
function lt (line 2) | function lt(t){return t&&void 0!==t.getElementsByTagName&&t}
function ut (line 2) | function ut(){}
function ft (line 2) | function ft(t){for(var e=0,p=t.length,o="";e<p;e++)o+=t[e].value;return o}
function Wt (line 2) | function Wt(t,e,p){var o=e.dir,b=e.next,M=b||o,n=p&&"parentNode"===M,z=R...
function ht (line 2) | function ht(t){return t.length>1?function(e,p,o){for(var b=t.length;b--;...
function vt (line 2) | function vt(t,e,p,o,b){for(var M,n=[],z=0,r=t.length,c=null!=e;z<r;z++)(...
function Rt (line 2) | function Rt(t,e,p,o,b,M){return o&&!o[W]&&(o=Rt(o)),b&&!b[W]&&(b=Rt(b,M)...
function mt (line 2) | function mt(t){for(var e,p,b,M=t.length,n=o.relative[t[0].type],z=n||o.r...
function N (line 2) | function N(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerC...
function T (line 2) | function T(t,e,p){return u(e)?R.grep(t,(function(t,o){return!!e.call(t,o...
function H (line 2) | function H(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}
function k (line 2) | function k(t){return t}
function E (line 2) | function E(t){throw t}
function D (line 2) | function D(t,e,p,o){var b;try{t&&u(b=t.promise)?b.call(t).done(e).fail(p...
function n (line 2) | function n(t,e,o,b){return function(){var z=this,r=arguments,c=function(...
function j (line 2) | function j(){n.removeEventListener("DOMContentLoaded",j),p.removeEventLi...
function K (line 2) | function K(t,e){return e.toUpperCase()}
function Y (line 2) | function Y(t){return t.replace(U,"ms-").replace($,K)}
function J (line 2) | function J(){this.expando=R.expando+J.uid++}
function pt (line 2) | function pt(t,e,p){var o;if(void 0===p&&1===t.nodeType)if(o="data-"+e.re...
function it (line 2) | function it(t,e,p,o){var b,M,n=20,z=o?function(){return o.cur()}:functio...
function At (line 2) | function At(t){var e,p=t.ownerDocument,o=t.nodeName,b=at[o];return b||(e...
function st (line 2) | function st(t,e){for(var p,o,b=[],M=0,n=t.length;M<n;M++)(o=t[M]).style&...
function ft (line 2) | function ft(t,e){var p;return p=void 0!==t.getElementsByTagName?t.getEle...
function Wt (line 2) | function Wt(t,e){for(var p=0,o=t.length;p<o;p++)Q.set(t[p],"globalEval",...
function mt (line 2) | function mt(t,e,p,o,b){for(var M,n,z,r,c,O,i=e.createDocumentFragment(),...
function Lt (line 2) | function Lt(){return!0}
function yt (line 2) | function yt(){return!1}
function Nt (line 2) | function Nt(t,e){return t===function(){try{return n.activeElement}catch(...
function _t (line 2) | function _t(t,e,p,o,b,M){var n,z;if("object"==typeof e){for(z in"string"...
function Tt (line 2) | function Tt(t,e,p){p?(Q.set(t,e,!1),R.event.add(t,e,{namespace:!1,handle...
function Ht (line 2) | function Ht(t,e){return N(t,"table")&&N(11!==e.nodeType?e:e.firstChild,"...
function Ft (line 2) | function Ft(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}
function kt (line 2) | function kt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.sli...
function Et (line 2) | function Et(t,e){var p,o,b,M,n,z,r,c;if(1===e.nodeType){if(Q.hasData(t)&...
function Dt (line 2) | function Dt(t,e){var p=e.nodeName.toLowerCase();"input"===p&&dt.test(t.t...
function It (line 2) | function It(t,e,p,o){e=c.apply([],e);var b,M,n,z,r,O,i=0,a=t.length,A=a-...
function Pt (line 2) | function Pt(t,e,p){for(var o,b=e?R.filter(e,t):t,M=0;null!=(o=b[M]);M++)...
function $t (line 2) | function $t(t,e,p){var o,b,M,n,z=t.style;return(p=p||Vt(t))&&(""!==(n=p....
function Kt (line 2) | function Kt(t,e){return{get:function(){if(!t())return(this.get=e).apply(...
function t (line 2) | function t(){if(O){c.style.cssText="position:absolute;left:-11111px;widt...
function e (line 2) | function e(t){return Math.round(parseFloat(t))}
function Qt (line 2) | function Qt(t){var e=R.cssProps[t]||Jt[t];return e||(t in Gt?t:Jt[t]=fun...
function oe (line 2) | function oe(t,e,p){var o=bt.exec(e);return o?Math.max(0,o[2]-(p||0))+(o[...
function be (line 2) | function be(t,e,p,o,b,M){var n="width"===e?1:0,z=0,r=0;if(p===(o?"border...
function Me (line 2) | function Me(t,e,p){var o=Vt(t),b=(!l.boxSizingReliable()||p)&&"border-bo...
function ne (line 2) | function ne(t,e,p,o,b){return new ne.prototype.init(t,e,p,o,b)}
function ie (line 2) | function ie(){re&&(!1===n.hidden&&p.requestAnimationFrame?p.requestAnima...
function ae (line 2) | function ae(){return p.setTimeout((function(){ze=void 0})),ze=Date.now()}
function Ae (line 2) | function Ae(t,e){var p,o=0,b={height:t};for(e=e?1:0;o<4;o+=2-e)b["margin...
function se (line 2) | function se(t,e,p){for(var o,b=(de.tweeners[e]||[]).concat(de.tweeners["...
function de (line 2) | function de(t,e,p){var o,b,M=0,n=de.prefilters.length,z=R.Deferred().alw...
function We (line 2) | function We(t){return(t.match(F)||[]).join(" ")}
function he (line 2) | function he(t){return t.getAttribute&&t.getAttribute("class")||""}
function ve (line 2) | function ve(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(F)|...
function xe (line 2) | function xe(t,e,p,o){var b;if(Array.isArray(e))R.each(e,(function(e,b){p...
function je (line 2) | function je(t){return function(e,p){"string"!=typeof e&&(p=e,e="*");var ...
function Ve (line 2) | function Ve(t,e,p,o){var b={},M=t===De;function n(z){var r;return b[z]=!...
function Ue (line 2) | function Ue(t,e){var p,o,b=R.ajaxSettings.flatOptions||{};for(p in e)voi...
function g (line 2) | function g(t,e,n,z){var c,a,A,W,h,v=e;O||(O=!0,r&&p.clearTimeout(r),o=vo...
function e (line 2) | function e(t,e){return M.valueOrDefault(t.showLine,e.showLines)}
function r (line 2) | function r(t,e,p){return Math.max(Math.min(t,p),e)}
function n (line 2) | function n(t,e){!o.isUndefined(t)&&o.isUndefined(t["Content-Type"])&&(t[...
function p (line 2) | function p(t,p){var o=t._chartjs;if(o){var b=o.listeners,M=b.indexOf(p);...
function o (line 2) | function o(t,e,p,o,b,M,n,z){var r,c="function"==typeof t?t.options:t;if(...
function Me (line 2) | function Me(t,e,p){switch(p.length){case 0:return t.call(e);case 1:retur...
function ne (line 2) | function ne(t,e,p,o){for(var b=-1,M=null==t?0:t.length;++b<M;){var n=t[b...
function ze (line 2) | function ze(t,e){for(var p=-1,o=null==t?0:t.length;++p<o&&!1!==e(t[p],p,...
function re (line 2) | function re(t,e){for(var p=null==t?0:t.length;p--&&!1!==e(t[p],p,t););re...
function ce (line 2) | function ce(t,e){for(var p=-1,o=null==t?0:t.length;++p<o;)if(!e(t[p],p,t...
function Oe (line 2) | function Oe(t,e){for(var p=-1,o=null==t?0:t.length,b=0,M=[];++p<o;){var ...
function ie (line 2) | function ie(t,e){return!!(null==t?0:t.length)&&he(t,e,0)>-1}
function ae (line 2) | function ae(t,e,p){for(var o=-1,b=null==t?0:t.length;++o<b;)if(p(e,t[o])...
function Ae (line 2) | function Ae(t,e){for(var p=-1,o=null==t?0:t.length,b=Array(o);++p<o;)b[p...
function se (line 2) | function se(t,e){for(var p=-1,o=e.length,b=t.length;++p<o;)t[b+p]=e[p];r...
function de (line 2) | function de(t,e,p,o){var b=-1,M=null==t?0:t.length;for(o&&M&&(p=t[++b]);...
function qe (line 2) | function qe(t,e,p,o){var b=null==t?0:t.length;for(o&&b&&(p=t[--b]);b--;)...
function le (line 2) | function le(t,e){for(var p=-1,o=null==t?0:t.length;++p<o;)if(e(t[p],p,t)...
function fe (line 2) | function fe(t,e,p){var o;return p(t,(function(t,p,b){if(e(t,p,b))return ...
function We (line 2) | function We(t,e,p,o){for(var b=t.length,M=p+(o?1:-1);o?M--:++M<b;)if(e(t...
function he (line 2) | function he(t,e,p){return e==e?function(t,e,p){var o=p-1,b=t.length;for(...
function ve (line 2) | function ve(t,e,p,o){for(var b=p-1,M=t.length;++b<M;)if(o(t[b],e))return...
function Re (line 2) | function Re(t){return t!=t}
function me (line 2) | function me(t,e){var p=null==t?0:t.length;return p?Le(t,e)/p:NaN}
function ge (line 2) | function ge(t){return function(e){return null==e?void 0:e[t]}}
function Be (line 2) | function Be(t){return function(e){return null==t?void 0:t[e]}}
function Xe (line 2) | function Xe(t,e,p,o,b){return b(t,(function(t,b,M){p=o?(o=!1,t):e(p,t,b,...
function Le (line 2) | function Le(t,e){for(var p,o=-1,b=t.length;++o<b;){var M=e(t[o]);void 0!...
function ye (line 2) | function ye(t,e){for(var p=-1,o=Array(t);++p<t;)o[p]=e(p);return o}
function Ne (line 2) | function Ne(t){return function(e){return t(e)}}
function _e (line 2) | function _e(t,e){return Ae(e,(function(e){return t[e]}))}
function Te (line 2) | function Te(t,e){return t.has(e)}
function xe (line 2) | function xe(t,e){for(var p=-1,o=t.length;++p<o&&he(e,t[p],0)>-1;);return p}
function we (line 2) | function we(t,e){for(var p=t.length;p--&&he(e,t[p],0)>-1;);return p}
function Ce (line 2) | function Ce(t,e){for(var p=t.length,o=0;p--;)t[p]===e&&++o;return o}
function Fe (line 2) | function Fe(t){return"\\"+It[t]}
function ke (line 2) | function ke(t){return St.test(t)}
function Ee (line 2) | function Ee(t){var e=-1,p=Array(t.size);return t.forEach((function(t,o){...
function De (line 2) | function De(t,e){return function(p){return t(e(p))}}
function Ie (line 2) | function Ie(t,e){for(var p=-1,o=t.length,b=0,M=[];++p<o;){var z=t[p];z!=...
function Pe (line 2) | function Pe(t){var e=-1,p=Array(t.size);return t.forEach((function(t){p[...
function je (line 2) | function je(t){var e=-1,p=Array(t.size);return t.forEach((function(t){p[...
function Ve (line 2) | function Ve(t){return ke(t)?function(t){var e=wt.lastIndex=0;for(;wt.tes...
function Ue (line 2) | function Ue(t){return ke(t)?function(t){return t.match(wt)||[]}(t):funct...
function Xp (line 2) | function Xp(t){if(jn(t)&&!xn(t)&&!(t instanceof _p)){if(t instanceof Np)...
function t (line 2) | function t(){}
function yp (line 2) | function yp(){}
function Np (line 2) | function Np(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!...
function _p (line 2) | function _p(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,thi...
function Tp (line 2) | function Tp(t){var e=-1,p=null==t?0:t.length;for(this.clear();++e<p;){va...
function xp (line 2) | function xp(t){var e=-1,p=null==t?0:t.length;for(this.clear();++e<p;){va...
function wp (line 2) | function wp(t){var e=-1,p=null==t?0:t.length;for(this.clear();++e<p;){va...
function Cp (line 2) | function Cp(t){var e=-1,p=null==t?0:t.length;for(this.__data__=new wp;++...
function Sp (line 2) | function Sp(t){var e=this.__data__=new xp(t);this.size=e.size}
function Hp (line 2) | function Hp(t,e){var p=xn(t),o=!p&&Tn(t),b=!p&&!o&&Hn(t),M=!p&&!o&&!b&&Q...
function Fp (line 2) | function Fp(t){var e=t.length;return e?t[So(0,e-1)]:void 0}
function kp (line 2) | function kp(t,e){return RM(lb(t),Kp(e,0,t.length))}
function Ep (line 2) | function Ep(t){return RM(lb(t))}
function Dp (line 2) | function Dp(t,e,p){(void 0!==p&&!yn(t[e],p)||void 0===p&&!(e in t))&&Up(...
function Ip (line 2) | function Ip(t,e,p){var o=t[e];mt.call(t,e)&&yn(o,p)&&(void 0!==p||e in t...
function Pp (line 2) | function Pp(t,e){for(var p=t.length;p--;)if(yn(t[p][0],e))return p;retur...
function jp (line 2) | function jp(t,e,p,o){return Zp(t,(function(t,b,M){e(o,t,p(t),M)})),o}
function Vp (line 2) | function Vp(t,e){return t&&ub(e,Wz(e),t)}
function Up (line 2) | function Up(t,e,p){"__proto__"==e&&Be?Be(t,e,{configurable:!0,enumerable...
function $p (line 2) | function $p(t,e){for(var p=-1,b=e.length,M=o(b),n=null==t;++p<b;)M[p]=n?...
function Kp (line 2) | function Kp(t,e,p){return t==t&&(void 0!==p&&(t=t<=p?t:p),void 0!==e&&(t...
function Yp (line 2) | function Yp(t,e,p,o,b,M){var n,z=1&e,c=2&e,a=4&e;if(p&&(n=b?p(t,o,b,M):p...
function Gp (line 2) | function Gp(t,e,p){var o=p.length;if(null==t)return!o;for(t=dt(t);o--;){...
function Jp (line 2) | function Jp(t,e,p){if("function"!=typeof t)throw new ut(M);return fM((fu...
function Qp (line 2) | function Qp(t,e,p,o){var b=-1,M=ie,n=!0,z=t.length,r=[],c=e.length;if(!z...
function eo (line 2) | function eo(t,e){var p=!0;return Zp(t,(function(t,o,b){return p=!!e(t,o,...
function po (line 2) | function po(t,e,p){for(var o=-1,b=t.length;++o<b;){var M=t[o],n=e(M);if(...
function oo (line 2) | function oo(t,e){var p=[];return Zp(t,(function(t,o,b){e(t,o,b)&&p.push(...
function bo (line 2) | function bo(t,e,p,o,b){var M=-1,n=t.length;for(p||(p=MM),b||(b=[]);++M<n...
function zo (line 2) | function zo(t,e){return t&&Mo(t,e,Wz)}
function ro (line 2) | function ro(t,e){return t&&no(t,e,Wz)}
function co (line 2) | function co(t,e){return Oe(e,(function(e){return En(t[e])}))}
function Oo (line 2) | function Oo(t,e){for(var p=0,o=(e=zb(e,t)).length;null!=t&&p<o;)t=t[gM(e...
function io (line 2) | function io(t,e,p){var o=e(t);return xn(t)?o:se(o,p(t))}
function ao (line 2) | function ao(t){return null==t?void 0===t?"[object Undefined]":"[object N...
function Ao (line 2) | function Ao(t,e){return t>e}
function so (line 2) | function so(t,e){return null!=t&&mt.call(t,e)}
function qo (line 2) | function qo(t,e){return null!=t&&e in dt(t)}
function lo (line 2) | function lo(t,e,p){for(var b=p?ae:ie,M=t[0].length,n=t.length,z=n,r=o(n)...
function uo (line 2) | function uo(t,e,p){var o=null==(t=dM(t,e=zb(e,t)))?t:t[gM(FM(e))];return...
function fo (line 2) | function fo(t){return jn(t)&&ao(t)==r}
function Wo (line 2) | function Wo(t,e,p,o,b){return t===e||(null==t||null==e||!jn(t)&&!jn(e)?t...
function ho (line 2) | function ho(t,e,p,o){var b=p.length,M=b,n=!o;if(null==t)return!M;for(t=d...
function vo (line 2) | function vo(t){return!(!Pn(t)||(e=t,Bt&&Bt in e))&&(En(t)?Nt:nt).test(BM...
function Ro (line 2) | function Ro(t){return"function"==typeof t?t:null==t?Uz:"object"==typeof ...
function mo (line 2) | function mo(t){if(!iM(t))return bp(t);var e=[];for(var p in dt(t))mt.cal...
function go (line 2) | function go(t){if(!Pn(t))return function(t){var e=[];if(null!=t)for(var ...
function Bo (line 2) | function Bo(t,e){return t<e}
function Xo (line 2) | function Xo(t,e){var p=-1,b=Cn(t)?o(t.length):[];return Zp(t,(function(t...
function Lo (line 2) | function Lo(t){var e=Qb(t);return 1==e.length&&e[0][2]?AM(e[0][0],e[0][1...
function yo (line 2) | function yo(t,e){return rM(t)&&aM(e)?AM(gM(t),e):function(p){var o=dz(p,...
function No (line 2) | function No(t,e,p,o,b){t!==e&&Mo(e,(function(M,n){if(b||(b=new Sp),Pn(M)...
function _o (line 2) | function _o(t,e){var p=t.length;if(p)return nM(e+=e<0?p:0,p)?t[e]:void 0}
function To (line 2) | function To(t,e,p){var o=-1;return e=Ae(e.length?e:[Uz],Ne(Gb())),functi...
function xo (line 2) | function xo(t,e,p){for(var o=-1,b=e.length,M={};++o<b;){var n=e[o],z=Oo(...
function wo (line 2) | function wo(t,e,p,o){var b=o?ve:he,M=-1,n=e.length,z=t;for(t===e&&(e=lb(...
function Co (line 2) | function Co(t,e){for(var p=t?e.length:0,o=p-1;p--;){var b=e[p];if(p==o||...
function So (line 2) | function So(t,e){return t+Ze(cp()*(e-t+1))}
function Ho (line 2) | function Ho(t,e){var p="";if(!t||e<1||e>9007199254740991)return p;do{e%2...
function Fo (line 2) | function Fo(t,e){return WM(sM(t,e,Uz),t+"")}
function ko (line 2) | function ko(t){return Fp(yz(t))}
function Eo (line 2) | function Eo(t,e){var p=yz(t);return RM(p,Kp(e,0,p.length))}
function Do (line 2) | function Do(t,e,p,o){if(!Pn(t))return t;for(var b=-1,M=(e=zb(e,t)).lengt...
function jo (line 2) | function jo(t){return RM(yz(t))}
function Vo (line 2) | function Vo(t,e,p){var b=-1,M=t.length;e<0&&(e=-e>M?0:M+e),(p=p>M?M:p)<0...
function Uo (line 2) | function Uo(t,e){var p;return Zp(t,(function(t,o,b){return!(p=e(t,o,b))}...
function $o (line 2) | function $o(t,e,p){var o=0,b=null==t?o:t.length;if("number"==typeof e&&e...
function Ko (line 2) | function Ko(t,e,p,o){e=p(e);for(var b=0,M=null==t?0:t.length,n=e!=e,z=nu...
function Yo (line 2) | function Yo(t,e){for(var p=-1,o=t.length,b=0,M=[];++p<o;){var n=t[p],z=e...
function Go (line 2) | function Go(t){return"number"==typeof t?t:Jn(t)?NaN:+t}
function Jo (line 2) | function Jo(t){if("string"==typeof t)return t;if(xn(t))return Ae(t,Jo)+"...
function Qo (line 2) | function Qo(t,e,p){var o=-1,b=ie,M=t.length,n=!0,z=[],r=z;if(p)n=!1,b=ae...
function Zo (line 2) | function Zo(t,e){return null==(t=dM(t,e=zb(e,t)))||delete t[gM(FM(e))]}
function tb (line 2) | function tb(t,e,p,o){return Do(t,e,p(Oo(t,e)),o)}
function eb (line 2) | function eb(t,e,p,o){for(var b=t.length,M=o?b:-1;(o?M--:++M<b)&&e(t[M],M...
function pb (line 2) | function pb(t,e){var p=t;return p instanceof _p&&(p=p.value()),de(e,(fun...
function ob (line 2) | function ob(t,e,p){var b=t.length;if(b<2)return b?Qo(t[0]):[];for(var M=...
function bb (line 2) | function bb(t,e,p){for(var o=-1,b=t.length,M=e.length,n={};++o<b;){var z...
function Mb (line 2) | function Mb(t){return Sn(t)?t:[]}
function nb (line 2) | function nb(t){return"function"==typeof t?t:Uz}
function zb (line 2) | function zb(t,e){return xn(t)?t:rM(t,e)?[t]:mM(zz(t))}
function cb (line 2) | function cb(t,e,p){var o=t.length;return p=void 0===p?o:p,!e&&p>=o?t:Vo(...
function ib (line 2) | function ib(t,e){if(e)return t.slice();var p=t.length,o=It?It(p):new t.c...
function ab (line 2) | function ab(t){var e=new t.constructor(t.byteLength);return new St(e).se...
function Ab (line 2) | function Ab(t,e){var p=e?ab(t.buffer):t.buffer;return new t.constructor(...
function sb (line 2) | function sb(t,e){if(t!==e){var p=void 0!==t,o=null===t,b=t==t,M=Jn(t),n=...
function db (line 2) | function db(t,e,p,b){for(var M=-1,n=t.length,z=p.length,r=-1,c=e.length,...
function qb (line 2) | function qb(t,e,p,b){for(var M=-1,n=t.length,z=-1,r=p.length,c=-1,O=e.le...
function lb (line 2) | function lb(t,e){var p=-1,b=t.length;for(e||(e=o(b));++p<b;)e[p]=t[p];re...
function ub (line 2) | function ub(t,e,p,o){var b=!p;p||(p={});for(var M=-1,n=e.length;++M<n;){...
function fb (line 2) | function fb(t,e){return function(p,o){var b=xn(p)?ne:jp,M=e?e():{};retur...
function Wb (line 2) | function Wb(t){return Fo((function(e,p){var o=-1,b=p.length,M=b>1?p[b-1]...
function hb (line 2) | function hb(t,e){return function(p,o){if(null==p)return p;if(!Cn(p))retu...
function vb (line 2) | function vb(t){return function(e,p,o){for(var b=-1,M=dt(e),n=o(e),z=n.le...
function Rb (line 2) | function Rb(t){return function(e){var p=ke(e=zz(e))?Ue(e):void 0,o=p?p[0...
function mb (line 2) | function mb(t){return function(e){return de(Ez(Tz(e).replace(Tt,"")),t,"...
function gb (line 2) | function gb(t){return function(){var e=arguments;switch(e.length){case 0...
function Bb (line 2) | function Bb(t){return function(e,p,o){var b=dt(e);if(!Cn(e)){var M=Gb(p,...
function Xb (line 2) | function Xb(t){return jb((function(e){var p=e.length,o=p,b=Np.prototype....
function Lb (line 2) | function Lb(t,e,p,b,M,n,z,r,c,O){var i=128&e,a=1&e,A=2&e,s=24&e,d=512&e,...
function yb (line 2) | function yb(t,e){return function(p,o){return function(t,e,p,o){return zo...
function Nb (line 2) | function Nb(t,e){return function(p,o){var b;if(void 0===p&&void 0===o)re...
function _b (line 2) | function _b(t){return jb((function(e){return e=Ae(e,Ne(Gb())),Fo((functi...
function Tb (line 2) | function Tb(t,e){var p=(e=void 0===e?" ":Jo(e)).length;if(p<2)return p?H...
function xb (line 2) | function xb(t){return function(e,p,b){return b&&"number"!=typeof b&&zM(e...
function wb (line 2) | function wb(t){return function(e,p){return"string"==typeof e&&"string"==...
function Cb (line 2) | function Cb(t,e,p,o,b,M,n,z,r,c){var O=8&e;e|=O?32:64,4&(e&=~(O?64:32))|...
function Sb (line 2) | function Sb(t){var e=st[t];return function(t,p){if(t=Mz(t),(p=null==p?0:...
function Fb (line 2) | function Fb(t){return function(e){var p=pM(e);return p==d?Ee(e):p==f?je(...
function kb (line 2) | function kb(t,e,p,b,z,r,c,O){var i=2&e;if(!i&&"function"!=typeof t)throw...
function Eb (line 2) | function Eb(t,e,p,o){return void 0===t||yn(t,ht[p])&&!mt.call(o,p)?e:t}
function Db (line 2) | function Db(t,e,p,o,b,M){return Pn(t)&&Pn(e)&&(M.set(e,t),No(t,e,void 0,...
function Ib (line 2) | function Ib(t){return $n(t)?void 0:t}
function Pb (line 2) | function Pb(t,e,p,o,b,M){var n=1&p,z=t.length,r=e.length;if(z!=r&&!(n&&r...
function jb (line 2) | function jb(t){return WM(sM(t,void 0,xM),t+"")}
function Vb (line 2) | function Vb(t){return io(t,Wz,tM)}
function Ub (line 2) | function Ub(t){return io(t,hz,eM)}
function Kb (line 2) | function Kb(t){for(var e=t.name+"",p=up[e],o=mt.call(up,e)?p.length:0;o-...
function Yb (line 2) | function Yb(t){return(mt.call(Xp,"placeholder")?Xp:t).placeholder}
function Gb (line 2) | function Gb(){var t=Xp.iteratee||$z;return t=t===$z?Ro:t,arguments.lengt...
function Jb (line 2) | function Jb(t,e){var p,o,b=t.__data__;return("string"==(o=typeof(p=e))||...
function Qb (line 2) | function Qb(t){for(var e=Wz(t),p=e.length;p--;){var o=e[p],b=t[o];e[p]=[...
function Zb (line 2) | function Zb(t,e){var p=function(t,e){return null==t?void 0:t[e]}(t,e);re...
function oM (line 2) | function oM(t,e,p){for(var o=-1,b=(e=zb(e,t)).length,M=!1;++o<b;){var n=...
function bM (line 2) | function bM(t){return"function"!=typeof t.constructor||iM(t)?{}:Lp(Vt(t))}
function MM (line 2) | function MM(t){return xn(t)||Tn(t)||!!(Jt&&t&&t[Jt])}
function nM (line 2) | function nM(t,e){var p=typeof t;return!!(e=null==e?9007199254740991:e)&&...
function zM (line 2) | function zM(t,e,p){if(!Pn(p))return!1;var o=typeof e;return!!("number"==...
function rM (line 2) | function rM(t,e){if(xn(t))return!1;var p=typeof t;return!("number"!=p&&"...
function cM (line 2) | function cM(t){var e=Kb(t),p=Xp[e];if("function"!=typeof p||!(e in _p.pr...
function iM (line 2) | function iM(t){var e=t&&t.constructor;return t===("function"==typeof e&&...
function aM (line 2) | function aM(t){return t==t&&!Pn(t)}
function AM (line 2) | function AM(t,e){return function(p){return null!=p&&(p[t]===e&&(void 0!=...
function sM (line 2) | function sM(t,e,p){return e=Mp(void 0===e?t.length-1:e,0),function(){for...
function dM (line 2) | function dM(t,e){return e.length<2?t:Oo(t,Vo(e,0,-1))}
function qM (line 2) | function qM(t,e){for(var p=t.length,o=np(e.length,p),b=lb(t);o--;){var M...
function lM (line 2) | function lM(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__pro...
function hM (line 2) | function hM(t,e,p){var o=e+"";return WM(t,function(t,e){var p=e.length;i...
function vM (line 2) | function vM(t){var e=0,p=0;return function(){var o=zp(),b=16-(o-p);if(p=...
function RM (line 2) | function RM(t,e){var p=-1,o=t.length,b=o-1;for(e=void 0===e?o:e;++p<e;){...
function gM (line 2) | function gM(t){if("string"==typeof t||Jn(t))return t;var e=t+"";return"0...
function BM (line 2) | function BM(t){if(null!=t){try{return Rt.call(t)}catch(t){}try{return t+...
function XM (line 2) | function XM(t){if(t instanceof _p)return t.clone();var e=new Np(t.__wrap...
function _M (line 2) | function _M(t,e,p){var o=null==t?0:t.length;if(!o)return-1;var b=null==p...
function TM (line 2) | function TM(t,e,p){var o=null==t?0:t.length;if(!o)return-1;var b=o-1;ret...
function xM (line 2) | function xM(t){return(null==t?0:t.length)?bo(t,1):[]}
function wM (line 2) | function wM(t){return t&&t.length?t[0]:void 0}
function FM (line 2) | function FM(t){var e=null==t?0:t.length;return e?t[e-1]:void 0}
function EM (line 2) | function EM(t,e){return t&&t.length&&e&&e.length?wo(t,e):t}
function IM (line 2) | function IM(t){return null==t?t:Op.call(t)}
function UM (line 2) | function UM(t){if(!t||!t.length)return[];var e=0;return t=Oe(t,(function...
function $M (line 2) | function $M(t,e){if(!t||!t.length)return[];var p=UM(t);return null==e?p:...
function tn (line 2) | function tn(t){var e=Xp(t);return e.__chain__=!0,e}
function en (line 2) | function en(t,e){return e(t)}
function nn (line 2) | function nn(t,e){return(xn(t)?ze:Zp)(t,Gb(e,3))}
function zn (line 2) | function zn(t,e){return(xn(t)?re:to)(t,Gb(e,3))}
function an (line 2) | function an(t,e){return(xn(t)?Ae:Xo)(t,Gb(e,3))}
function qn (line 2) | function qn(t,e,p){return e=p?void 0:e,kb(t,128,void 0,void 0,void 0,voi...
function ln (line 2) | function ln(t,e){var p;if("function"!=typeof e)throw new ut(M);return t=...
function Wn (line 2) | function Wn(t,e,p){var o,b,n,z,r,c,O=0,i=!1,a=!1,A=!0;if("function"!=typ...
function Rn (line 2) | function Rn(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)...
function mn (line 2) | function mn(t){if("function"!=typeof t)throw new ut(M);return function()...
function yn (line 2) | function yn(t,e){return t===e||t!=t&&e!=e}
function Cn (line 2) | function Cn(t){return null!=t&&In(t.length)&&!En(t)}
function Sn (line 2) | function Sn(t){return jn(t)&&Cn(t)}
function kn (line 2) | function kn(t){if(!jn(t))return!1;var e=ao(t);return e==a||"[object DOME...
function En (line 2) | function En(t){if(!Pn(t))return!1;var e=ao(t);return e==A||e==s||"[objec...
function Dn (line 2) | function Dn(t){return"number"==typeof t&&t==oz(t)}
function In (line 2) | function In(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}
function Pn (line 2) | function Pn(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}
function jn (line 2) | function jn(t){return null!=t&&"object"==typeof t}
function Un (line 2) | function Un(t){return"number"==typeof t||jn(t)&&ao(t)==q}
function $n (line 2) | function $n(t){if(!jn(t)||ao(t)!=l)return!1;var e=Vt(t);if(null===e)retu...
function Gn (line 2) | function Gn(t){return"string"==typeof t||!xn(t)&&jn(t)&&ao(t)==W}
function Jn (line 2) | function Jn(t){return"symbol"==typeof t||jn(t)&&ao(t)==h}
function ez (line 2) | function ez(t){if(!t)return[];if(Cn(t))return Gn(t)?Ue(t):lb(t);if(Qt&&t...
function pz (line 2) | function pz(t){return t?(t=Mz(t))===1/0||t===-1/0?17976931348623157e292*...
function oz (line 2) | function oz(t){var e=pz(t),p=e%1;return e==e?p?e-p:e:0}
function bz (line 2) | function bz(t){return t?Kp(oz(t),0,4294967295):0}
function Mz (line 2) | function Mz(t){if("number"==typeof t)return t;if(Jn(t))return NaN;if(Pn(...
function nz (line 2) | function nz(t){return ub(t,hz(t))}
function zz (line 2) | function zz(t){return null==t?"":Jo(t)}
function dz (line 2) | function dz(t,e,p){var o=null==t?void 0:Oo(t,e);return void 0===o?p:o}
function qz (line 2) | function qz(t,e){return null!=t&&oM(t,e,qo)}
function Wz (line 2) | function Wz(t){return Cn(t)?Hp(t):mo(t)}
function hz (line 2) | function hz(t){return Cn(t)?Hp(t,!0):go(t)}
function Bz (line 2) | function Bz(t,e){if(null==t)return{};var p=Ae(Ub(t),(function(t){return[...
function yz (line 2) | function yz(t){return null==t?[]:_e(t,Wz(t))}
function _z (line 2) | function _z(t){return kz(zz(t).toLowerCase())}
function Tz (line 2) | function Tz(t){return(t=zz(t))&&t.replace(ct,Se).replace(xt,"")}
function Ez (line 2) | function Ez(t,e,p){return t=zz(t),void 0===(e=p?void 0:e)?function(t){re...
function Pz (line 2) | function Pz(t){return function(){return t}}
function Uz (line 2) | function Uz(t){return t}
function $z (line 2) | function $z(t){return Ro("function"==typeof t?t:Yp(t,1))}
function Gz (line 2) | function Gz(t,e,p){var o=Wz(e),b=co(e,o);null!=p||Pn(e)&&(b.length||!o.l...
function Jz (line 2) | function Jz(){}
function er (line 2) | function er(t){return rM(t)?ge(gM(t)):function(t){return function(e){ret...
function br (line 2) | function br(){return[]}
function Mr (line 2) | function Mr(){return!1}
function b (line 2) | function b(t){return encodeURIComponent(t).replace(/%40/gi,"@").replace(...
function b (line 2) | function b(t){var o=t;return e&&(p.setAttribute("href",o),o=p.href),p.se...
function z (line 2) | function z(t){var e=this._view;return!!e&&Math.abs(t-e.x)<e.radius+e.hit...
function a (line 2) | function a(t,e){return t-e}
function A (line 2) | function A(t){var e,p,o,b={},M=[];for(e=0,p=t.length;e<p;++e)b[o=t[e]]||...
function s (line 2) | function s(t,e,p,o){var b=function(t,e,p){for(var o,b,M,n=0,z=t.length-1...
function d (line 2) | function d(t,e){var p=e.parser,b=e.parser||e.format;return"function"==ty...
function q (line 2) | function q(t,e){if(M.isNullOrUndef(t))return null;var p=e.options.time,o...
function l (line 2) | function l(t){for(var e=i.indexOf(t)+1,p=i.length;e<p;++e)if(O[i[e]].com...
function u (line 2) | function u(t,e,p,b){var n,z=b.time,r=z.unit||function(t,e,p,o){var b,M,n...
function o (line 2) | function o(t,e){for(var p=0;p<e.length;p++){var o=e[p];o.enumerable=o.en...
function b (line 2) | function b(t,e,p){return e&&o(t.prototype,e),p&&o(t,p),t}
function M (line 2) | function M(t,e,p){return e in t?Object.defineProperty(t,e,{value:p,enume...
function n (line 2) | function n(t){for(var e=1;e<arguments.length;e++){var p=null!=arguments[...
function z (line 2) | function z(t){var p=this,o=!1;return e(this).one(r.TRANSITION_END,(funct...
function t (line 2) | function t(t){this._element=t}
function t (line 2) | function t(t){this._element=t}
function t (line 2) | function t(t,e){this._items=null,this._interval=null,this._activeElement...
function t (line 2) | function t(t,e){this._isTransitioning=!1,this._element=t,this._config=th...
function t (line 2) | function t(t,e){this._element=t,this._popper=null,this._config=this._get...
function t (line 2) | function t(t,e){this._config=this._getConfig(e),this._element=t,this._di...
function ze (line 2) | function ze(t,e,p){if(0===t.length)return t;if(p&&"function"==typeof p)r...
function t (line 2) | function t(t,e){if(void 0===p)throw new TypeError("Bootstrap's tooltips ...
function M (line 2) | function M(){return t.apply(this,arguments)||this}
function t (line 2) | function t(t,p){var o=this;this._element=t,this._scrollElement="BODY"===...
function t (line 2) | function t(t){this._element=t}
function t (line 2) | function t(t,e){this._element=t,this._config=this._getConfig(e),this._ti...
function M (line 2) | function M(t,e){this._id=t,this._clearFn=e}
function c (line 2) | function c(t){t.cancelToken&&t.cancelToken.throwIfRequested()}
function b (line 2) | function b(t){return null==t}
function M (line 2) | function M(t){return null!=t}
function n (line 2) | function n(t){return!0===t}
function z (line 2) | function z(t){return"string"==typeof t||"number"==typeof t||"symbol"==ty...
function r (line 2) | function r(t){return null!==t&&"object"==typeof t}
function O (line 2) | function O(t){return"[object Object]"===c.call(t)}
function i (line 2) | function i(t){return"[object RegExp]"===c.call(t)}
function a (line 2) | function a(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e...
function A (line 2) | function A(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null...
function s (line 2) | function s(t){var e=parseFloat(t);return isNaN(e)?t:e}
function d (line 2) | function d(t,e){for(var p=Object.create(null),o=t.split(","),b=0;b<o.len...
function u (line 2) | function u(t,e){if(t.length){var p=t.indexOf(e);if(p>-1)return t.splice(...
function W (line 2) | function W(t,e){return f.call(t,e)}
function h (line 2) | function h(t){var e=Object.create(null);return function(p){return e[p]||...
function p (line 2) | function p(p){var o=arguments.length;return o?o>1?t.apply(e,arguments):t...
function L (line 2) | function L(t,e){e=e||0;for(var p=t.length-e,o=new Array(p);p--;)o[p]=t[p...
function y (line 2) | function y(t,e){for(var p in e)t[p]=e[p];return t}
function N (line 2) | function N(t){for(var e={},p=0;p<t.length;p++)t[p]&&y(e,t[p]);return e}
function _ (line 2) | function _(t,e,p){}
function w (line 2) | function w(t,e){if(t===e)return!0;var p=r(t),o=r(e);if(!p||!o)return!p&&...
function C (line 2) | function C(t,e){for(var p=0;p<t.length;p++)if(w(t[p],e))return p;return-1}
function S (line 2) | function S(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments...
function E (line 2) | function E(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}
function D (line 2) | function D(t,e,p,o){Object.defineProperty(t,e,{value:p,enumerable:!!o,wr...
function bt (line 2) | function bt(t){return"function"==typeof t&&/native code/.test(t.toString...
function t (line 2) | function t(){this.set=Object.create(null)}
function it (line 2) | function it(t){Ot.push(t),ct.target=t}
function at (line 2) | function at(){Ot.pop(),ct.target=Ot[Ot.length-1]}
function qt (line 2) | function qt(t){return new At(void 0,void 0,void 0,String(t))}
function lt (line 2) | function lt(t){var e=new At(t.tag,t.data,t.children&&t.children.slice(),...
function vt (line 2) | function vt(t){ht=t}
function mt (line 2) | function mt(t,e){var p;if(r(t)&&!(t instanceof At))return W(t,"__ob__")&...
function gt (line 2) | function gt(t,e,p,o,b){var M=new ct,n=Object.getOwnPropertyDescriptor(t,...
function Bt (line 2) | function Bt(t,e,p){if(Array.isArray(t)&&a(e))return t.length=Math.max(t....
function Xt (line 2) | function Xt(t,e){if(Array.isArray(t)&&a(e))t.splice(e,1);else{var p=t.__...
function Lt (line 2) | function Lt(t){for(var e=void 0,p=0,o=t.length;p<o;p++)(e=t[p])&&e.__ob_...
function Nt (line 2) | function Nt(t,e){if(!e)return t;for(var p,o,b,M=Object.keys(e),n=0;n<M.l...
function _t (line 2) | function _t(t,e,p){return p?function(){var o="function"==typeof e?e.call...
function Tt (line 2) | function Tt(t,e){var p=e?t?t.concat(e):Array.isArray(e)?e:[e]:t;return p...
function xt (line 2) | function xt(t,e,p,o){var b=Object.create(t||null);return e?y(b,e):b}
function Ct (line 2) | function Ct(t,e,p){if("function"==typeof e&&(e=e.options),function(t,e){...
function St (line 2) | function St(t,e,p,o){if("string"==typeof p){var b=t[e];if(W(b,p))return ...
function Ht (line 2) | function Ht(t,e,p,o){var b=e[t],M=!W(p,t),n=p[t],z=Et(Boolean,b.type);if...
function Ft (line 2) | function Ft(t){var e=t&&t.toString().match(/^\s*function (\w+)/);return ...
function kt (line 2) | function kt(t,e){return Ft(t)===Ft(e)}
function Et (line 2) | function Et(t,e){if(!Array.isArray(e))return kt(e,t)?0:-1;for(var p=0,o=...
function Dt (line 2) | function Dt(t,e,p){if(e)for(var o=e;o=o.$parent;){var b=o.$options.error...
function It (line 2) | function It(t,e,p){if(k.errorHandler)try{return k.errorHandler.call(null...
function Pt (line 2) | function Pt(t,e,p){if(!V&&!U||"undefined"==typeof console)throw t}
function Kt (line 2) | function Kt(){$t=!1;var t=Ut.slice(0);Ut.length=0;for(var e=0;e<t.length...
function Zt (line 2) | function Zt(t,e){var p;if(Ut.push((function(){if(t)try{t.call(e)}catch(t...
function ee (line 2) | function ee(t){!function t(e,p){var o,b,M=Array.isArray(e);if(!M&&!r(e)|...
function be (line 2) | function be(t){function e(){var t=arguments,p=e.fns;if(!Array.isArray(p)...
function Me (line 2) | function Me(t,e,p,o,M,z){var r,c,O,i;for(r in t)c=t[r],O=e[r],i=oe(r),b(...
function ne (line 2) | function ne(t,e,p){var o;t instanceof At&&(t=t.data.hook||(t.data.hook={...
function ze (line 2) | function ze(t,e,p,o,b){if(M(e)){if(W(e,p))return t[p]=e[p],b||delete e[p...
function re (line 2) | function re(t){return z(t)?[qt(t)]:Array.isArray(t)?function t(e,p){var ...
function ce (line 2) | function ce(t){return M(t)&&M(t.text)&&!1===t.isComment}
function Oe (line 2) | function Oe(t,e){return(t.__esModule||nt&&"Module"===t[Symbol.toStringTa...
function ie (line 2) | function ie(t){return t.isComment&&t.asyncFactory}
function ae (line 2) | function ae(t){if(Array.isArray(t))for(var e=0;e<t.length;e++){var p=t[e...
function Ae (line 2) | function Ae(t,e){pe.$on(t,e)}
function se (line 2) | function se(t,e){pe.$off(t,e)}
function de (line 2) | function de(t,e){var p=pe;return function o(){var b=e.apply(null,argumen...
function qe (line 2) | function qe(t,e,p){pe=t,Me(e,p||{},Ae,se,de),pe=void 0}
function le (line 2) | function le(t,e){var p={};if(!t)return p;for(var o=0,b=t.length;o<b;o++)...
function ue (line 2) | function ue(t){return t.isComment&&!t.asyncFactory||" "===t.text}
function fe (line 2) | function fe(t,e){e=e||{};for(var p=0;p<t.length;p++)Array.isArray(t[p])?...
function he (line 2) | function he(t){var e=We;return We=t,function(){We=e}}
function ve (line 2) | function ve(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}
function Re (line 2) | function Re(t,e){if(e){if(t._directInactive=!1,ve(t))return}else if(t._d...
function me (line 2) | function me(t,e){it();var p=t.$options[e];if(p)for(var o=0,b=p.length;o<...
function _e (line 2) | function _e(){var t,e;for(ye=!0,ge.sort((function(t,e){return t.id-e.id}...
function Ce (line 2) | function Ce(t,e,p){we.get=function(){return this[e][p]},we.set=function(...
function Se (line 2) | function Se(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){va...
function Fe (line 2) | function Fe(t,e,p){var o=!pt();"function"==typeof p?(we.get=o?ke(e):Ee(p...
function ke (line 2) | function ke(t){return function(){var e=this._computedWatchers&&this._com...
function Ee (line 2) | function Ee(t){return function(){return t.call(this,this)}}
function De (line 2) | function De(t,e,p,o){return O(p)&&(o=p,p=p.handler),"string"==typeof p&&...
function Ie (line 2) | function Ie(t,e){if(t){for(var p=Object.create(null),o=nt?Reflect.ownKey...
function Pe (line 2) | function Pe(t,e){var p,o,b,n,z;if(Array.isArray(t)||"string"==typeof t)f...
function je (line 2) | function je(t,e,p,o){var b,M=this.$scopedSlots[t];M?(p=p||{},o&&(p=y(y({...
function Ve (line 2) | function Ve(t){return St(this.$options,"filters",t)||x}
function Ue (line 2) | function Ue(t,e){return Array.isArray(t)?-1===t.indexOf(e):t!==e}
function $e (line 2) | function $e(t,e,p,o,b){var M=k.keyCodes[e]||p;return b&&o&&!k.keyCodes[e...
function Ke (line 2) | function Ke(t,e,p,o,b){if(p)if(r(p)){var M;Array.isArray(p)&&(p=N(p));va...
function Ye (line 2) | function Ye(t,e){var p=this._staticTrees||(this._staticTrees=[]),o=p[t];...
function Ge (line 2) | function Ge(t,e,p){return Je(t,"__once__"+e+(p?"_"+p:""),!0),t}
function Je (line 2) | function Je(t,e,p){if(Array.isArray(t))for(var o=0;o<t.length;o++)t[o]&&...
function Qe (line 2) | function Qe(t,e,p){t.isStatic=!0,t.key=e,t.isOnce=p}
function Ze (line 2) | function Ze(t,e){if(e)if(O(e)){var p=t.on=t.on?y({},t.on):{};for(var o i...
function tp (line 2) | function tp(t){t._o=Ge,t._n=s,t._s=A,t._l=Pe,t._t=je,t._q=w,t._i=C,t._m=...
function ep (line 2) | function ep(t,e,p,b,M){var z,r=M.options;W(b,"_uid")?(z=Object.create(b)...
function pp (line 2) | function pp(t,e,p,o,b){var M=lt(t);return M.fnContext=p,M.fnOptions=o,e....
function op (line 2) | function op(t,e){for(var p in e)t[R(p)]=e[p]}
function np (line 2) | function np(t,e,p,z,c){if(!b(t)){var O=p.$options._base;if(r(t)&&(t=O.ex...
function zp (line 2) | function zp(t,e){var p=function(p,o){t(p,o),e(p,o)};return p._merged=!0,p}
function rp (line 2) | function rp(t,e,p,o,c,O){return(Array.isArray(p)||z(p))&&(c=o,o=p,p=void...
function Op (line 2) | function Op(t){var e=t.options;if(t.super){var p=Op(t.super);if(p!==t.su...
function ip (line 2) | function ip(t){this._init(t)}
function ap (line 2) | function ap(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var p=this,o...
function Ap (line 2) | function Ap(t){return t&&(t.Ctor.options.name||t.tag)}
function sp (line 2) | function sp(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"==typeo...
function dp (line 2) | function dp(t,e){var p=t.cache,o=t.keys,b=t._vnode;for(var M in p){var n...
function qp (line 2) | function qp(t,e,p,o){var b=t[e];!b||o&&b.tag===o.tag||b.componentInstanc...
function o (line 2) | function o(){p.$off(t,o),e.apply(p,arguments)}
function Lp (line 2) | function Lp(t){for(var e=t.data,p=t,o=t;M(o.componentInstance);)(o=o.com...
function yp (line 2) | function yp(t,e){return{staticClass:Np(t.staticClass,e.staticClass),clas...
function Np (line 2) | function Np(t,e){return t?e?t+" "+e:t:e||""}
function _p (line 2) | function _p(t){return Array.isArray(t)?function(t){for(var e,p="",o=0,b=...
function Sp (line 2) | function Sp(t){return wp(t)?"svg":"math"===t?"math":void 0}
function kp (line 2) | function kp(t){if("string"==typeof t){var e=document.querySelector(t);re...
function Ip (line 2) | function Ip(t,e){var p=t.data.ref;if(M(p)){var o=t.context,b=t.component...
function Vp (line 2) | function Vp(t,e){return t.key===e.key&&(t.tag===e.tag&&t.isComment===e.i...
function Up (line 2) | function Up(t,e,p){var o,b,n={};for(o=e;o<=p;++o)M(b=t[o].key)&&(n[b]=o)...
function Kp (line 2) | function Kp(t,e){(t.data.directives||e.data.directives)&&function(t,e){v...
function Gp (line 2) | function Gp(t,e){var p,o,b=Object.create(null);if(!t)return b;for(p=0;p<...
function Jp (line 2) | function Jp(t){return t.rawName||t.name+"."+Object.keys(t.modifiers||{})...
function Qp (line 2) | function Qp(t,e,p,o,b){var M=t.def&&t.def[e];if(M)try{M(p.elm,t,p,o,b)}c...
function to (line 2) | function to(t,e){var p=e.componentOptions;if(!(M(p)&&!1===p.Ctor.options...
function eo (line 2) | function eo(t,e,p){t.tagName.indexOf("-")>-1?po(t,e,p):Rp(e)?Xp(p)?t.rem...
function po (line 2) | function po(t,e,p){if(Xp(p))t.removeAttribute(e);else{if(Y&&!G&&("TEXTAR...
function bo (line 2) | function bo(t,e){var p=e.elm,o=e.data,n=t.data;if(!(b(o.staticClass)&&b(...
function Ao (line 2) | function Ao(t){var e,p,o,b,M,n=!1,z=!1,r=!1,c=!1,O=0,i=0,a=0,A=0;for(o=0...
function so (line 2) | function so(t,e){var p=e.indexOf("(");if(p<0)return'_f("'+e+'")('+t+")";...
function qo (line 2) | function qo(t){}
function lo (line 2) | function lo(t,e){return t?t.map((function(t){return t[e]})).filter((func...
function uo (line 2) | function uo(t,e,p){(t.props||(t.props=[])).push({name:e,value:p}),t.plai...
function fo (line 2) | function fo(t,e,p){(t.attrs||(t.attrs=[])).push({name:e,value:p}),t.plai...
function Wo (line 2) | function Wo(t,e,p){t.attrsMap[e]=p,t.attrsList.push({name:e,value:p})}
function ho (line 2) | function ho(t,e,p,o,b,M){(t.directives||(t.directives=[])).push({name:e,...
function vo (line 2) | function vo(t,e,p,b,M,n){var z;b=b||o,"click"===e&&(b.right?(e="contextm...
function Ro (line 2) | function Ro(t,e,p){var o=mo(t,":"+e)||mo(t,"v-bind:"+e);if(null!=o)retur...
function mo (line 2) | function mo(t,e,p){var o;if(null!=(o=t.attrsMap[e]))for(var b=t.attrsLis...
function go (line 2) | function go(t,e,p){var o=p||{},b=o.number,M="$$v";o.trim&&(M="(typeof $$...
function Bo (line 2) | function Bo(t,e){var p=function(t){if(t=t.trim(),Mo=t.length,t.indexOf("...
function Xo (line 2) | function Xo(){return no.charCodeAt(++ro)}
function Lo (line 2) | function Lo(){return ro>=Mo}
function yo (line 2) | function yo(t){return 34===t||39===t}
function No (line 2) | function No(t){var e=1;for(co=ro;!Lo();)if(yo(t=Xo()))_o(t);else if(91==...
function _o (line 2) | function _o(t){for(var e=t;!Lo()&&(t=Xo())!==e;);}
function xo (line 2) | function xo(t,e,p){var o=To;return function b(){var M=e.apply(null,argum...
function wo (line 2) | function wo(t,e,p,o){var b;e=(b=e)._withTask||(b._withTask=function(){Yt...
function Co (line 2) | function Co(t,e,p,o){(o||To).removeEventListener(t,e._withTask||e,p)}
function So (line 2) | function So(t,e){if(!b(t.data.on)||!b(e.data.on)){var p=e.data.on||{},o=...
function Fo (line 2) | function Fo(t,e){if(!b(t.data.domProps)||!b(e.data.domProps)){var p,o,n=...
function ko (line 2) | function ko(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e...
function Io (line 2) | function Io(t){var e=Po(t.style);return t.staticStyle?y(t.staticStyle,e):e}
function Po (line 2) | function Po(t){return Array.isArray(t)?N(t):"string"==typeof t?Do(t):t}
function Go (line 2) | function Go(t,e){var p=e.data,o=t.data;if(!(b(p.staticStyle)&&b(p.style)...
function Zo (line 2) | function Zo(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.s...
function tb (line 2) | function tb(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.s...
function eb (line 2) | function eb(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&y...
function cb (line 2) | function cb(t){rb((function(){rb(t)}))}
function Ob (line 2) | function Ob(t,e){var p=t._transitionClasses||(t._transitionClasses=[]);p...
function ib (line 2) | function ib(t,e){t._transitionClasses&&u(t._transitionClasses,e),tb(t,e)}
function ab (line 2) | function ab(t,e,p){var o=sb(t,e),b=o.type,M=o.timeout,n=o.propCount;if(!...
function sb (line 2) | function sb(t,e){var p,o=window.getComputedStyle(t),b=(o[bb+"Delay"]||""...
function db (line 2) | function db(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.a...
function qb (line 2) | function qb(t){return 1e3*Number(t.slice(0,-1).replace(",","."))}
function lb (line 2) | function lb(t,e){var p=t.elm;M(p._leaveCb)&&(p._leaveCb.cancelled=!0,p._...
function ub (line 2) | function ub(t,e){var p=t.elm;M(p._enterCb)&&(p._enterCb.cancelled=!0,p._...
function fb (line 2) | function fb(t){return"number"==typeof t&&!isNaN(t)}
function Wb (line 2) | function Wb(t){if(b(t))return!1;var e=t.fns;return M(e)?Wb(Array.isArray...
function hb (line 2) | function hb(t,e){!0!==e.data.show&&lb(e)}
function O (line 2) | function O(t){var e=c.parentNode(t);M(e)&&c.removeChild(e,t)}
function i (line 2) | function i(t,e,p,b,z,r,O){if(M(t.elm)&&M(r)&&(t=r[O]=lt(t)),t.isRootInse...
function a (line 2) | function a(t,e){M(t.data.pendingInsert)&&(e.push.apply(e,t.data.pendingI...
function A (line 2) | function A(t,e,p){M(t)&&(M(p)?c.parentNode(p)===t&&c.insertBefore(t,e,p)...
function s (line 2) | function s(t,e,p){if(Array.isArray(e)){0;for(var o=0;o<e.length;++o)i(e[...
function q (line 2) | function q(t){for(;t.componentInstance;)t=t.componentInstance._vnode;ret...
function l (line 2) | function l(t,p){for(var b=0;b<o.create.length;++b)o.create[b](Pp,t);M(e=...
function u (line 2) | function u(t){var e;if(M(e=t.fnScopeId))c.setStyleScope(t.elm,e);else fo...
function f (line 2) | function f(t,e,p,o,b,M){for(;o<=b;++o)i(p[o],M,t,e,!1,p,o)}
function W (line 2) | function W(t){var e,p,b=t.data;if(M(b))for(M(e=b.hook)&&M(e=e.destroy)&&...
function h (line 2) | function h(t,e,p,o){for(;p<=o;++p){var b=e[p];M(b)&&(M(b.tag)?(v(b),W(b)...
function v (line 2) | function v(t,e){if(M(e)||M(t.data)){var p,b=o.remove.length+1;for(M(e)?e...
function R (line 2) | function R(t,e,p,o){for(var b=p;b<o;b++){var n=e[b];if(M(n)&&Vp(t,n))ret...
function m (line 2) | function m(t,e,p,z,r,O){if(t!==e){M(e.elm)&&M(z)&&(e=z[r]=lt(e));var a=e...
function g (line 2) | function g(t,e,p){if(n(p)&&M(t.parent))t.parent.data.pendingInsert=e;els...
function X (line 2) | function X(t,e,p,o){var b,z=e.tag,r=e.data,c=e.children;if(o=o||r&&r.pre...
function mb (line 2) | function mb(t,e,p){gb(t,e,p),(Y||J)&&setTimeout((function(){gb(t,e,p)}),0)}
function gb (line 2) | function gb(t,e,p){var o=e.value,b=t.multiple;if(!b||Array.isArray(o)){f...
function Bb (line 2) | function Bb(t,e){return e.every((function(e){return!w(e,t)}))}
function Xb (line 2) | function Xb(t){return"_value"in t?t._value:t.value}
function Lb (line 2) | function Lb(t){t.target.composing=!0}
function yb (line 2) | function yb(t){t.target.composing&&(t.target.composing=!1,Nb(t.target,"i...
function Nb (line 2) | function Nb(t,e){var p=document.createEvent("HTMLEvents");p.initEvent(e,...
function _b (line 2) | function _b(t){return!t.componentInstance||t.data&&t.data.transition?t:_...
function wb (line 2) | function wb(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abst...
function Cb (line 2) | function Cb(t){var e={},p=t.$options;for(var o in p.propsData)e[o]=t[o];...
function Sb (line 2) | function Sb(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{...
function Db (line 2) | function Db(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._ent...
function Ib (line 2) | function Ib(t){t.data.newPos=t.elm.getBoundingClientRect()}
function Pb (line 2) | function Pb(t){var e=t.data.pos,p=t.data.newPos,o=e.left-p.left,b=e.top-...
function qM (line 2) | function qM(t,e){var p=e?AM:aM;return t.replace(p,(function(t){return iM...
function wM (line 2) | function wM(t,e,p){return{type:1,tag:t,attrsList:e,attrsMap:EM(e),parent...
function CM (line 2) | function CM(t,e){lM=e.warn||qo,vM=e.isPreTag||T,RM=e.mustUseProp||T,mM=e...
function SM (line 2) | function SM(t,e){!function(t){var e=Ro(t,"key");if(e){t.key=e}}(t),t.pla...
function HM (line 2) | function HM(t){var e;if(e=mo(t,"v-for")){var p=function(t){var e=t.match...
function FM (line 2) | function FM(t,e){t.ifConditions||(t.ifConditions=[]),t.ifConditions.push...
function kM (line 2) | function kM(t){var e=t.match(TM);if(e){var p={};return e.forEach((functi...
function EM (line 2) | function EM(t){for(var e={},p=0,o=t.length;p<o;p++)e[t[p].name]=t[p].val...
function PM (line 2) | function PM(t){return wM(t.tag,t.attrsList.slice(),t.parent)}
function YM (line 2) | function YM(t,e){t&&(VM=KM(e.staticKeys||""),UM=e.isReservedTag||T,funct...
function pn (line 2) | function pn(t,e){var p=e?"nativeOn:{":"on:{";for(var o in t)p+='"'+o+'":...
function on (line 2) | function on(t,e){if(!e)return"function(){}";if(Array.isArray(e))return"[...
function bn (line 2) | function bn(t){var e=parseInt(t,10);if(e)return"$event.keyCode!=="+e;var...
function zn (line 2) | function zn(t,e){var p=new nn(e);return{render:"with(this){return "+(t?r...
function rn (line 2) | function rn(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&...
function cn (line 2) | function cn(t,e){t.staticProcessed=!0;var p=e.pre;return t.pre&&(e.pre=t...
function On (line 2) | function On(t,e){if(t.onceProcessed=!0,t.if&&!t.ifProcessed)return an(t,...
function an (line 2) | function an(t,e,p,o){return t.ifProcessed=!0,function t(e,p,o,b){if(!e.l...
function An (line 2) | function An(t,e){var p="{",o=function(t,e){var p=t.directives;if(!p)retu...
function sn (line 2) | function sn(t,e,p){return e.for&&!e.forProcessed?function(t,e,p){var o=e...
function dn (line 2) | function dn(t,e,p,o,b){var M=t.children;if(M.length){var n=M[0];if(1===M...
function qn (line 2) | function qn(t){return void 0!==t.for||"template"===t.tag||"slot"===t.tag}
function ln (line 2) | function ln(t,e){return 1===t.type?rn(t,e):3===t.type&&t.isComment?funct...
function un (line 2) | function un(t){for(var e="",p=0;p<t.length;p++){var o=t[p];e+='"'+o.name...
function fn (line 2) | function fn(t){return t.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"...
function Wn (line 2) | function Wn(t,e){try{return new Function(t)}catch(p){return e.push({err:...
function hn (line 2) | function hn(t){var e=Object.create(null);return function(p,o,b){(o=y({},...
function e (line 2) | function e(e,p){var o=Object.create(t),b=[],M=[];if(o.warn=function(t,e)...
function Bn (line 2) | function Bn(t){return(Rn=Rn||document.createElement("div")).innerHTML=t?...
function n (line 2) | function n(e){return M?e.xAxisID===t.id:e.yAxisID===t.id}
function A (line 2) | function A(t){delete c[t]}
function s (line 2) | function s(t){if(O)setTimeout(s,0,t);else{var e=c[t];if(e){O=!0;try{!fun...
function n (line 2) | function n(e){return M?e.xAxisID===t.id:e.yAxisID===t.id}
function A (line 2) | function A(t,e){for(var p=0;p<t.length;p++){var o=t[p],b=M[o.id];if(b){b...
function s (line 2) | function s(t,e){for(var p=[],o={},b=0;b<t.length;b++){var M=t[b],n=e.bas...
function d (line 2) | function d(t,e){var p=r(t.insertInto);if(!p)throw new Error("Couldn't fi...
function q (line 2) | function q(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t...
function l (line 2) | function l(t){var e=document.createElement("style");if(void 0===t.attrs....
function u (line 2) | function u(t,e){Object.keys(e).forEach((function(p){t.setAttribute(p,e[p...
function f (line 2) | function f(t,e){var p,o,b,M;if(e.transform&&t.css){if(!(M="function"==ty...
function v (line 2) | function v(t,e,p,o){var b=p?"":o.css;if(t.styleSheet)t.styleSheet.cssTex...
function R (line 2) | function R(t,e){var p=e.css,o=e.media;if(o&&t.setAttribute("media",o),t....
function m (line 2) | function m(t,e,p){var o=p.css,b=p.sourceMap,M=void 0===e.convertToAbsolu...
function e (line 2) | function e(){return t.apply(this,arguments)}
function i (line 2) | function i(t){return Object.prototype.toString.call(t).indexOf("Error")>-1}
function a (line 2) | function a(t,e){for(var p in e)t[p]=e[p];return t}
function f (line 2) | function f(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.spl...
function W (line 2) | function W(t){var e=t?Object.keys(t).map((function(e){var p=t[e];if(void...
function v (line 2) | function v(t,e,p,o){var b=o&&o.options.stringifyQuery,M=e.query||{};try{...
function R (line 2) | function R(t){if(Array.isArray(t))return t.map(R);if(t&&"object"==typeof...
function g (line 2) | function g(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}
function B (line 2) | function B(t,e){var p=t.path,o=t.query;void 0===o&&(o={});var b=t.hash;r...
function X (line 2) | function X(t,e){return e===m?t===e:!!e&&(t.path&&e.path?t.path.replace(h...
function L (line 2) | function L(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t...
function _ (line 2) | function _(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||t.default...
function x (line 2) | function x(t,e,p){var o=t.charAt(0);if("/"===o)return t;if("?"===o||"#"=...
function w (line 2) | function w(t){return t.replace(/\/\//g,"/")}
function I (line 2) | function I(t,e){for(var p,o=[],b=0,M=0,n="",z=e&&e.delimiter||"/";null!=...
function P (line 2) | function P(t){return encodeURI(t).replace(/[\/?#]/g,(function(t){return"...
function j (line 2) | function j(t){for(var e=new Array(t.length),p=0;p<t.length;p++)"object"=...
function V (line 2) | function V(t){return t.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}
function U (line 2) | function U(t){return t.replace(/([=!:$\/()])/g,"\\$1")}
function K (line 2) | function K(t,e){return t.keys=e,t}
function Y (line 2) | function Y(t){return t.sensitive?"":"i"}
function G (line 2) | function G(t,e,p){C(e)||(p=e||p,e=[]);for(var o=(p=p||{}).strict,b=!1!==...
function J (line 2) | function J(t,e,p){return C(e)||(p=e||p,e=[]),p=p||{},t instanceof RegExp...
function Z (line 2) | function Z(t,e,p){try{return(Q[t]||(Q[t]=S.compile(t)))(e||{},{pretty:!0...
function tt (line 2) | function tt(t,e,p,o){var b=e||[],M=p||Object.create(null),n=o||Object.cr...
function et (line 2) | function et(t,e){return S(t,[],e)}
function pt (line 2) | function pt(t,e,p,o){var b="string"==typeof t?{path:t}:t;if(b.name||b._n...
function ot (line 2) | function ot(t,e){var p=tt(t),o=p.pathList,b=p.pathMap,M=p.nameMap;functi...
function bt (line 2) | function bt(t,e,p){var o=e.match(t);if(!o)return!1;if(!p)return!0;for(va...
function nt (line 2) | function nt(){window.history.replaceState({key:ut()},"",window.location....
function zt (line 2) | function zt(t,e,p,o){if(t.app){var b=t.options.scrollBehavior;b&&t.app.$...
function rt (line 2) | function rt(){var t=ut();t&&(Mt[t]={x:window.pageXOffset,y:window.pageYO...
function ct (line 2) | function ct(t){return it(t.x)||it(t.y)}
function Ot (line 2) | function Ot(t){return{x:it(t.x)?t.x:window.pageXOffset,y:it(t.y)?t.y:win...
function it (line 2) | function it(t){return"number"==typeof t}
function at (line 2) | function at(t,e){var p,o="object"==typeof t;if(o&&"string"==typeof t.sel...
function lt (line 2) | function lt(){return dt.now().toFixed(3)}
function ut (line 2) | function ut(){return qt}
function ft (line 2) | function ft(t,e){rt();var p=window.history;try{e?p.replaceState({key:qt}...
function Wt (line 2) | function Wt(t){ft(t,!0)}
function ht (line 2) | function ht(t,e,p){var o=function(b){b>=t.length?p():t[b]?e(t[b],(functi...
function vt (line 2) | function vt(t){return function(e,p,o){var b=!1,M=0,n=null;Rt(t,(function...
function Rt (line 2) | function Rt(t,e){return mt(t.map((function(t){return Object.keys(t.compo...
function mt (line 2) | function mt(t){return Array.prototype.concat.apply([],t)}
function Bt (line 2) | function Bt(t){var e=!1;return function(){for(var p=[],o=arguments.lengt...
function Lt (line 2) | function Lt(t,e,p,o){var b=Rt(t,(function(t,o,b,M){var n=function(t,e){"...
function yt (line 2) | function yt(t,e){if(e)return function(){return t.apply(e,arguments)}}
function e (line 2) | function e(e,p){var o=this;t.call(this,e,p);var b=e.options.scrollBehavi...
function _t (line 2) | function _t(t){var e=decodeURI(window.location.pathname);return t&&0===e...
function e (line 2) | function e(e,p,o){t.call(this,e,p),o&&function(t){var e=_t(t);if(!/^\/#/...
function xt (line 2) | function xt(){var t=wt();return"/"===t.charAt(0)||(Ht("/"+t),!1)}
function wt (line 2) | function wt(){var t=window.location.href,e=t.indexOf("#");return-1===e?"...
function Ct (line 2) | function Ct(t){var e=window.location.href,p=e.indexOf("#");return(p>=0?e...
function St (line 2) | function St(t){st?ft(Ct(t)):window.location.hash=t}
function Ht (line 2) | function Ht(t){st?Wt(Ct(t)):window.location.replace(Ct(t))}
function e (line 2) | function e(e,p){t.call(this,e,p),this.stack=[],this.index=-1}
function Dt (line 2) | function Dt(t,e){return t.push(e),function(){var p=t.indexOf(e);p>-1&&t....
function z (line 2) | function z(t){var e,p,o=[];for(e=0,p=t.length;e<p;++e)o.push(t[e].label)...
function r (line 2) | function r(t,e,p){var o=t.getPixelForTick(e);return p&&(o-=0===e?(t.getP...
function c (line 2) | function c(t,e,p){return M.isArray(e)?M.longestText(t,p,e):t.measureText...
function O (line 2) | function O(t){var e=M.valueOrDefault,p=o.global,b=e(t.fontSize,p.default...
function i (line 2) | function i(t){return M.options.toLineHeight(M.valueOrDefault(t.lineHeigh...
function o (line 2) | function o(t){this.message=t}
function b (line 2) | function b(t,e){return o.where(t,(function(t){return t.position===e}))}
function M (line 2) | function M(t,e){t.forEach((function(t,e){return t._tmpIndex_=e,t})),t.so...
function k (line 2) | function k(t){var e=o.findNextWhere(m,(function(e){return e.box===t}));i...
function E (line 2) | function E(t){t.isHorizontal()?(t.left=t.fullWidth?r:y,t.right=t.fullWid...
function b (line 2) | function b(t){if("function"!=typeof t)throw new TypeError("executor must...
function b (line 2) | function b(t){if(t){var e=[0,0,0],p=1,b=t.match(/^#([a-fA-F0-9]{3})$/i);...
function M (line 2) | function M(t){if(t){var e=t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*(...
function n (line 2) | function n(t){if(t){var e=t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+...
function z (line 2) | function z(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"rgba("+t[0]...
function r (line 2) | function r(t,e){return"rgba("+Math.round(t[0]/255*100)+"%, "+Math.round(...
function c (line 2) | function c(t,e){return void 0===e&&(e=void 0!==t[3]?t[3]:1),"hsla("+t[0]...
function O (line 2) | function O(t,e,p){return Math.min(Math.max(e,t),p)}
function i (line 2) | function i(t){var e=t.toString(16).toUpperCase();return e.length<2?"0"+e:e}
function c (line 2) | function c(t,e){var p=new r({ctx:t.ctx,options:e,chart:t});n.configure(t...
function b (line 2) | function b(t,e){return t.native?{x:t.x,y:t.y}:o.getRelativePosition(t,e)}
function M (line 2) | function M(t,e){var p,o,b,M,n;for(o=0,M=t.data.datasets.length;o<M;++o)i...
function n (line 2) | function n(t,e){var p=[];return M(t,(function(t){t.inRange(e.x,e.y)&&p.p...
function z (line 2) | function z(t,e,p,o){var b=Number.POSITIVE_INFINITY,n=[];return M(t,(func...
function r (line 2) | function r(t){var e=-1!==t.indexOf("x"),p=-1!==t.indexOf("y");return fun...
function c (line 2) | function c(t,e,p){var o=b(e,t);p.axis=p.axis||"x";var M=r(p.axis),c=p.in...
function t (line 2) | function t(t,e,p){var o;return"string"==typeof t?(o=parseInt(t,10),-1!==...
function e (line 2) | function e(t){return null!=t&&"none"!==t}
function p (line 2) | function p(p,o,b){var n=document.defaultView,z=M._getParentNode(p),r=n.g...
function n (line 2) | function n(t,e){var p=o.getStyle(t,e),b=p&&p.match(/^(\d+)(\.\d+)?px$/);...
function r (line 2) | function r(t,e,p){t.addEventListener(e,p,z)}
function c (line 2) | function c(t,e,p){t.removeEventListener(e,p,z)}
function O (line 2) | function O(t,e,p,o,b){return{type:t,chart:e,native:b||null,x:void 0!==p?...
function i (line 2) | function i(t,e,p){var M,n,z,c,i=t.$chartjs||(t.$chartjs={}),a=i.resizer=...
function a (line 2) | function a(t){var e=t.$chartjs||{},p=e.resizer;delete e.resizer,function...
function p (line 2) | function p(t){var e,p,o=t[0]/255,b=t[1]/255,M=t[2]/255,n=Math.min(o,b,M)...
function o (line 2) | function o(t){var e,p,o=t[0],b=t[1],M=t[2],n=Math.min(o,b,M),z=Math.max(...
function M (line 2) | function M(t){var e=t[0],o=t[1],b=t[2];return[p(t)[0],100*(1/255*Math.mi...
function n (line 2) | function n(t){var e,p=t[0]/255,o=t[1]/255,b=t[2]/255;return[100*((1-p-(e...
function z (line 2) | function z(t){return R[JSON.stringify(t)]}
function c (line 2) | function c(t){var e=t[0]/255,p=t[1]/255,o=t[2]/255;return[100*(.4124*(e=...
function O (line 2) | function O(t){var e=c(t),p=e[0],o=e[1],b=e[2];return o/=100,b/=108.883,p...
function i (line 2) | function i(t){var e,p,o,b,M,n=t[0]/360,z=t[1]/100,r=t[2]/100;if(0==z)ret...
function a (line 2) | function a(t){var e=t[0]/60,p=t[1]/100,o=t[2]/100,b=Math.floor(e)%6,M=e-...
function A (line 2) | function A(t){var e,p,o,M,n=t[0]/360,z=t[1]/100,c=t[2]/100,O=z+c;switch(...
function s (line 2) | function s(t){var e=t[0]/100,p=t[1]/100,o=t[2]/100,b=t[3]/100;return[255...
function d (line 2) | function d(t){var e,p,o,b=t[0]/100,M=t[1]/100,n=t[2]/100;return p=-.9689...
function q (line 2) | function q(t){var e=t[0],p=t[1],o=t[2];return p/=100,o/=108.883,e=(e/=95...
function l (line 2) | function l(t){var e,p,o,b,M=t[0],n=t[1],z=t[2];return M<=8?b=(p=100*M/90...
function u (line 2) | function u(t){var e,p=t[0],o=t[1],b=t[2];return(e=360*Math.atan2(b,o)/2/...
function f (line 2) | function f(t){return d(l(t))}
function W (line 2) | function W(t){var e,p=t[0],o=t[1];return e=t[2]/360*2*Math.PI,[p,o*Math....
function h (line 2) | function h(t){return v[t]}
function z (line 2) | function z(t,e,p){var o,b=t._model||{},M=b.fill;if(void 0===M&&(M=!!b.ba...
function r (line 2) | function r(t){var e,p=t.el._model||{},o=t.el._scale||{},b=t.fill,M=null;...
function c (line 2) | function c(t,e,p){var o,b=t[e].fill,M=[e];if(!p)return b;for(;!1!==b&&-1...
function O (line 2) | function O(t){var e=t.fill,p="dataset";return!1===e?null:(isFinite(e)||(...
function i (line 2) | function i(t){return t&&!t.skip}
function a (line 2) | function a(t,e,p,o,b){var n;if(o&&b){for(t.moveTo(e[0].x,e[0].y),n=1;n<o...
function o (line 2) | function o(){return e.apply(null,arguments)}
function b (line 2) | function b(t){return t instanceof Array||"[object Array]"===Object.proto...
function M (line 2) | function M(t){return null!=t&&"[object Object]"===Object.prototype.toStr...
function n (line 2) | function n(t){return void 0===t}
function z (line 2) | function z(t){return"number"==typeof t||"[object Number]"===Object.proto...
function r (line 2) | function r(t){return t instanceof Date||"[object Date]"===Object.prototy...
function c (line 2) | function c(t,e){var p,o=[];for(p=0;p<t.length;++p)o.push(e(t[p],p));retu...
function O (line 2) | function O(t,e){return Object.prototype.hasOwnProperty.call(t,e)}
function i (line 2) | function i(t,e){for(var p in e)O(e,p)&&(t[p]=e[p]);return O(e,"toString"...
function a (line 2) | function a(t,e,p,o){return Re(t,e,p,o,!0).utc()}
function A (line 2) | function A(t){return null==t._pf&&(t._pf={empty:!1,unusedTokens:[],unuse...
function s (line 2) | function s(t){if(null==t._isValid){var e=A(t),o=p.call(e.parsedDateParts...
function d (line 2) | function d(t){var e=a(NaN);return null!=t?i(A(e),t):A(e).userInvalidated...
function l (line 2) | function l(t,e){var p,o,b;if(n(e._isAMomentObject)||(t._isAMomentObject=...
function f (line 2) | function f(t){l(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),...
function W (line 2) | function W(t){return t instanceof f||null!=t&&null!=t._isAMomentObject}
function h (line 2) | function h(t){return t<0?Math.ceil(t)||0:Math.floor(t)}
function v (line 2) | function v(t){var e=+t,p=0;return 0!==e&&isFinite(e)&&(p=h(e)),p}
function R (line 2) | function R(t,e,p){var o,b=Math.min(t.length,e.length),M=Math.abs(t.lengt...
function m (line 2) | function m(t){!1===o.suppressDeprecationWarnings&&"undefined"!=typeof co...
function g (line 2) | function g(t,e){var p=!0;return i((function(){if(null!=o.deprecationHand...
function L (line 2) | function L(t,e){null!=o.deprecationHandler&&o.deprecationHandler(t,e),X[...
function y (line 2) | function y(t){return t instanceof Function||"[object Function]"===Object...
function N (line 2) | function N(t,e){var p,o=i({},t);for(p in e)O(e,p)&&(M(t[p])&&M(e[p])?(o[...
function _ (line 2) | function _(t){null!=t&&this.set(t)}
function x (line 2) | function x(t,e){var p=t.toLowerCase();T[p]=T[p+"s"]=T[e]=t}
function w (line 2) | function w(t){return"string"==typeof t?T[t]||T[t.toLowerCase()]:void 0}
function C (line 2) | function C(t){var e,p,o={};for(p in t)O(t,p)&&(e=w(p))&&(o[e]=t[p]);retu...
function H (line 2) | function H(t,e){S[t]=e}
function F (line 2) | function F(t,e,p){var o=""+Math.abs(t),b=e-o.length;return(t>=0?p?"+":""...
function P (line 2) | function P(t,e,p,o){var b=o;"string"==typeof o&&(b=function(){return thi...
function j (line 2) | function j(t,e){return t.isValid()?(e=V(e,t.localeData()),D[e]=D[e]||fun...
function V (line 2) | function V(t,e){var p=5;function o(t){return e.longDateFormat(t)||t}for(...
function ct (line 2) | function ct(t,e,p){rt[t]=y(e)?e:function(t,o){return t&&p?p:e}}
function Ot (line 2) | function Ot(t,e){return O(rt,t)?rt[t](e._strict,e._locale):new RegExp(it...
function it (line 2) | function it(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}
function At (line 2) | function At(t,e){var p,o=e;for("string"==typeof t&&(t=[t]),z(e)&&(o=func...
function st (line 2) | function st(t,e){At(t,(function(t,p,o,b){o._w=o._w||{},e(t,o._w,o,b)}))}
function dt (line 2) | function dt(t,e,p){null!=e&&O(at,t)&&at[t](e,p._a,p,t)}
function qt (line 2) | function qt(t){return lt(t)?366:365}
function lt (line 2) | function lt(t){return t%4==0&&t%100!=0||t%400==0}
function Wt (line 2) | function Wt(t,e){return function(p){return null!=p?(vt(this,t,p),o.updat...
function ht (line 2) | function ht(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():...
function vt (line 2) | function vt(t,e,p){t.isValid()&&!isNaN(p)&&("FullYear"===e&<(t.year())...
function Rt (line 2) | function Rt(t,e){if(isNaN(t)||isNaN(e))return NaN;var p,o=(e%(p=12)+p)%p...
function Xt (line 2) | function Xt(t,e,p){var o,b,M,n=t.toLocaleLowerCase();if(!this._monthsPar...
function Lt (line 2) | function Lt(t,e){var p;if(!t.isValid())return t;if("string"==typeof e)if...
function yt (line 2) | function yt(t){return null!=t?(Lt(this,t),o.updateOffset(this,!0),this):...
function Tt (line 2) | function Tt(){function t(t,e){return e.length-t.length}var e,p,o=[],b=[]...
function xt (line 2) | function xt(t,e,p,o,b,M,n){var z;return t<100&&t>=0?(z=new Date(t+400,e,...
function wt (line 2) | function wt(t){var e;if(t<100&&t>=0){var p=Array.prototype.slice.call(ar...
function Ct (line 2) | function Ct(t,e,p){var o=7+e-p;return-(7+wt(t,0,o).getUTCDay()-e)%7+o-1}
function St (line 2) | function St(t,e,p,o,b){var M,n,z=1+7*(e-1)+(7+p-o)%7+Ct(t,o,b);return z<...
function Ht (line 2) | function Ht(t,e,p){var o,b,M=Ct(t.year(),e,p),n=Math.floor((t.dayOfYear(...
function Ft (line 2) | function Ft(t,e,p){var o=Ct(t,e,p),b=Ct(t+1,e,p);return(qt(t)-o+b)/7}
function kt (line 2) | function kt(t,e){return t.slice(e,7).concat(t.slice(0,e))}
function Pt (line 2) | function Pt(t,e,p){var o,b,M,n=t.toLocaleLowerCase();if(!this._weekdaysP...
function $t (line 2) | function $t(){function t(t,e){return e.length-t.length}var e,p,o,b,M,n=[...
function Kt (line 2) | function Kt(){return this.hours()%12||12}
function Yt (line 2) | function Yt(t,e){P(t,0,0,(function(){return this.localeData().meridiem(t...
function Gt (line 2) | function Gt(t,e){return e._meridiemParse}
function pe (line 2) | function pe(t){return t?t.toLowerCase().replace("_","-"):t}
function oe (line 2) | function oe(e){var p=null;if(!te[e]&&void 0!==t&&t&&t.exports)try{p=Jt._...
function be (line 2) | function be(t,e){var p;return t&&((p=n(e)?ne(t):Me(t,e))?Jt=p:"undefined...
function Me (line 2) | function Me(t,e){if(null!==e){var p,o=Zt;if(e.abbr=t,null!=te[t])L("defi...
function ne (line 2) | function ne(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abb...
function ze (line 2) | function ze(t){var e,p=t._a;return p&&-2===A(t).overflow&&(e=p[1]<0||p[1...
function re (line 2) | function re(t,e,p){return null!=t?t:null!=e?e:p}
function ce (line 2) | function ce(t){var e,p,b,M,n,z=[];if(!t._d){for(b=function(t){var e=new ...
function qe (line 2) | function qe(t){var e,p,o,b,M,n,z=t._i,r=Oe.exec(z)||ie.exec(z);if(r){for...
function ue (line 2) | function ue(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}
function We (line 2) | function We(t){var e,p,o,b,M,n,z,r=le.exec(t._i.replace(/\([^)]*\)|[\n\t...
function he (line 2) | function he(t){if(t._f!==o.ISO_8601)if(t._f!==o.RFC_2822){t._a=[],A(t).e...
function ve (line 2) | function ve(t){var e=t._i,p=t._f;return t._locale=t._locale||ne(t._l),nu...
function Re (line 2) | function Re(t,e,p,o,n){var z,r={};return!0!==p&&!1!==p||(o=p,p=void 0),(...
function me (line 2) | function me(t,e,p,o){return Re(t,e,p,o,!1)}
function Xe (line 2) | function Xe(t,e){var p,o;if(1===e.length&&b(e[0])&&(e=e[0]),!e.length)re...
function ye (line 2) | function ye(t){var e=C(t),p=e.year||0,o=e.quarter||0,b=e.month||0,M=e.we...
function Ne (line 2) | function Ne(t){return t instanceof ye}
function _e (line 2) | function _e(t){return t<0?-1*Math.round(-1*t):Math.round(t)}
function Te (line 2) | function Te(t,e){P(t,0,0,(function(){var t=this.utcOffset(),p="+";return...
function we (line 2) | function we(t,e){var p=(e||"").match(t);if(null===p)return null;var o=((...
function Ce (line 2) | function Ce(t,e){var p,b;return e._isUTC?(p=e.clone(),b=(W(t)||r(t)?t.va...
function Se (line 2) | function Se(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}
function He (line 2) | function He(){return!!this.isValid()&&this._isUTC&&0===this._offset}
function Ee (line 2) | function Ee(t,e){var p,o,b,M,n,r,c=t,i=null;return Ne(t)?c={ms:t._millis...
function De (line 2) | function De(t,e){var p=t&&parseFloat(t.replace(",","."));return(isNaN(p)...
function Ie (line 2) | function Ie(t,e){var p={};return p.months=e.month()-t.month()+12*(e.year...
function Pe (line 2) | function Pe(t,e){return function(p,o){var b;return null===o||isNaN(+o)||...
function je (line 2) | function je(t,e,p,b){var M=e._milliseconds,n=_e(e._days),z=_e(e._months)...
function $e (line 2) | function $e(t,e){var p=12*(e.year()-t.year())+(e.month()-t.month()),o=t....
function Ke (line 2) | function Ke(t){var e;return void 0===t?this._locale._abbr:(null!=(e=ne(t...
function Ge (line 2) | function Ge(){return this._locale}
function Je (line 2) | function Je(t,e){return(t%e+e)%e}
function Qe (line 2) | function Qe(t,e,p){return t<100&&t>=0?new Date(t+400,e,p)-126227808e5:ne...
function Ze (line 2) | function Ze(t,e,p){return t<100&&t>=0?Date.UTC(t+400,e,p)-126227808e5:Da...
function tp (line 2) | function tp(t,e){P(0,[t,t.length],0,e)}
function ep (line 2) | function ep(t,e,p,o,b){var M;return null==t?Ht(this,o,b).year:(e>(M=Ft(t...
function pp (line 2) | function pp(t,e,p,o,b){var M=St(t,e,p,o,b),n=wt(M.year,0,M.dayOfYear);re...
function zp (line 2) | function zp(t,e){e[6]=v(1e3*("0."+t))}
function Op (line 2) | function Op(t){return t}
function ap (line 2) | function ap(t,e,p,o){var b=ne(),M=a().set(o,e);return b[p](M,t)}
function Ap (line 2) | function Ap(t,e,p){if(z(t)&&(e=t,t=void 0),t=t||"",null!=e)return ap(t,e...
function sp (line 2) | function sp(t,e,p,o){"boolean"==typeof t?(z(e)&&(p=e,e=void 0),e=e||""):...
function qp (line 2) | function qp(t,e,p,o){var b=Ee(e,p);return t._milliseconds+=o*b._millisec...
function lp (line 2) | function lp(t){return t<0?Math.floor(t):Math.ceil(t)}
function up (line 2) | function up(t){return 4800*t/146097}
function fp (line 2) | function fp(t){return 146097*t/4800}
function Wp (line 2) | function Wp(t){return function(){return this.as(t)}}
function Np (line 2) | function Np(t){return function(){return this.isValid()?this._data[t]:NaN}}
function Ep (line 2) | function Ep(t,e,p,o,b){return b.relativeTime(e||1,!!p,t,o)}
function Ip (line 2) | function Ip(t){return(t>0)-(t<0)||+t}
function Pp (line 2) | function Pp(){if(!this.isValid())return this.localeData().invalidDate();...
function z (line 2) | function z(t,e){var p=M.color(t);return p.alpha(e*p.alpha()).rgbaString()}
function r (line 2) | function r(t,e){return e&&(M.isArray(e)?Array.prototype.push.apply(t,e):...
function c (line 2) | function c(t){return("string"==typeof t||t instanceof String)&&t.indexOf...
function O (line 2) | function O(t){var e=o.global,p=M.valueOrDefault;return{xPadding:t.xPaddi...
function i (line 2) | function i(t){return r([],c(t))}
function n (line 2) | function n(t){return"[object Array]"===M.call(t)}
function z (line 2) | function z(t){return null!==t&&"object"==typeof t}
function r (line 2) | function r(t){return"[object Function]"===M.call(t)}
function c (line 2) | function c(t,e){if(null!=t)if("object"!=typeof t&&(t=[t]),n(t))for(var p...
function p (line 2) | function p(p,o){"object"==typeof e[o]&&"object"==typeof p?e[o]=t(e[o],p)...
function p (line 2) | function p(p,o){"object"==typeof e[o]&&"object"==typeof p?e[o]=t(e[o],p)...
function z (line 2) | function z(t){var e=new M(t),p=b(M.prototype.request,e);return o.extend(...
FILE: resources/js/app.js
method data (line 15) | data () {
FILE: tests/CreatesApplication.php
type CreatesApplication (line 7) | trait CreatesApplication
method createApplication (line 14) | public function createApplication()
FILE: tests/Feature/Auth/LoginTest.php
class LoginTest (line 12) | class LoginTest extends TestCase
method can_view_login_page (line 17) | public function can_view_login_page()
method is_redirected_if_already_logged_in (line 25) | public function is_redirected_if_already_logged_in()
method a_user_can_login (line 36) | public function a_user_can_login()
method is_redirected_to_the_home_page_after_login (line 49) | public function is_redirected_to_the_home_page_after_login()
method email_is_required (line 61) | public function email_is_required()
method email_must_be_valid_email (line 72) | public function email_must_be_valid_email()
method password_is_required (line 84) | public function password_is_required()
method bad_login_attempt_shows_message (line 95) | public function bad_login_attempt_shows_message()
FILE: tests/Feature/Auth/LogoutTest.php
class LogoutTest (line 10) | class LogoutTest extends TestCase
method an_authenticated_user_can_log_out (line 15) | public function an_authenticated_user_can_log_out()
method an_unauthenticated_user_can_not_log_out (line 27) | public function an_unauthenticated_user_can_not_log_out()
FILE: tests/Feature/Auth/Passwords/ConfirmTest.php
class ConfirmTest (line 12) | class ConfirmTest extends TestCase
method setUp (line 16) | protected function setUp(): void
method a_user_must_confirm_their_password_before_visiting_a_protected_page (line 26) | public function a_user_must_confirm_their_password_before_visiting_a_p...
method a_user_must_enter_a_password_to_confirm_it (line 40) | public function a_user_must_enter_a_password_to_confirm_it()
method a_user_must_enter_their_own_password_to_confirm_it (line 48) | public function a_user_must_enter_their_own_password_to_confirm_it()
method a_user_who_confirms_their_password_will_get_redirected (line 61) | public function a_user_who_confirms_their_password_will_get_redirected()
FILE: tests/Feature/Auth/Passwords/EmailTest.php
class EmailTest (line 10) | class EmailTest extends TestCase
method can_view_password_request_page (line 15) | public function can_view_password_request_page()
method a_user_must_enter_an_email_address (line 23) | public function a_user_must_enter_an_email_address()
method a_user_must_enter_a_valid_email_address (line 31) | public function a_user_must_enter_a_valid_email_address()
method a_user_who_enters_a_valid_email_address_will_get_sent_an_email (line 40) | public function a_user_who_enters_a_valid_email_address_will_get_sent_...
FILE: tests/Feature/Auth/Passwords/ResetTest.php
class ResetTest (line 15) | class ResetTest extends TestCase
method can_view_password_reset_page (line 20) | public function can_view_password_reset_page()
method can_reset_password (line 41) | public function can_reset_password()
method token_is_required (line 68) | public function token_is_required()
method email_is_required (line 78) | public function email_is_required()
method email_is_valid_email (line 89) | public function email_is_valid_email()
method password_is_required (line 100) | function password_is_required()
method password_is_minimum_of_eight_characters (line 111) | function password_is_minimum_of_eight_characters()
method password_matches_password_confirmation (line 122) | function password_matches_password_confirmation()
FILE: tests/Feature/Auth/RegisterTest.php
class RegisterTest (line 13) | class RegisterTest extends TestCase
method registration_page_contains_livewire_component (line 18) | function registration_page_contains_livewire_component()
method is_redirected_if_already_logged_in (line 26) | public function is_redirected_if_already_logged_in()
method a_user_can_register (line 37) | function a_user_can_register()
method name_is_required (line 52) | function name_is_required()
method email_is_required (line 61) | function email_is_required()
method email_is_valid_email (line 70) | function email_is_valid_email()
method email_hasnt_been_taken_already (line 79) | function email_hasnt_been_taken_already()
method see_email_hasnt_already_been_taken_validation_message_as_user_types (line 90) | function see_email_hasnt_already_been_taken_validation_message_as_user...
method password_is_required (line 103) | function password_is_required()
method password_is_minimum_of_eight_characters (line 113) | function password_is_minimum_of_eight_characters()
method password_matches_password_confirmation (line 123) | function password_matches_password_confirmation()
FILE: tests/Feature/Auth/VerifyTest.php
class VerifyTest (line 16) | class VerifyTest extends TestCase
method can_view_verification_page (line 21) | public function can_view_verification_page()
method can_resend_verification_email (line 35) | public function can_resend_verification_email()
method can_verify (line 47) | public function can_verify()
FILE: tests/Feature/ExampleTest.php
class ExampleTest (line 7) | class ExampleTest extends TestCase
method testBasicTest (line 14) | public function testBasicTest()
FILE: tests/TestCase.php
class TestCase (line 8) | abstract class TestCase extends BaseTestCase
method setUp (line 12) | protected function setUp(): void
FILE: tests/Unit/ExampleTest.php
class ExampleTest (line 7) | class ExampleTest extends TestCase
method testBasicTest (line 14) | public function testBasicTest()
Condensed preview — 190 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,727K chars).
[
{
"path": ".cloud/docker/Dockerfile",
"chars": 669,
"preview": "FROM php:7.4-fpm\nLABEL maintainer=\"hakanersu@gmail.com\"\n\n# Installing dependencies\nRUN apt-get update && apt-get install"
},
{
"path": ".cloud/docker/Dockerfile.prod",
"chars": 1530,
"preview": "FROM composer:1.10 as vendor\n\nCOPY composer.json composer.json\nCOPY composer.lock composer.lock\n\nCOPY database/ database"
},
{
"path": ".cloud/nginx/nginx.conf",
"chars": 636,
"preview": "server {\n listen 8000;\n index index.php index.html index.htm;\n root /application/public; # default Laravel's entry po"
},
{
"path": ".cloud/php/local.ini",
"chars": 58,
"preview": "upload_max_filesize=40M\npost_max_size=40M\nmemory_limit=-1\n"
},
{
"path": ".cloud/scripts/entrypoint.sh",
"chars": 10,
"preview": "#!/bin/sh\n"
},
{
"path": ".editorconfig",
"chars": 220,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_"
},
{
"path": ".eslintrc",
"chars": 888,
"preview": "{\n \"extends\": [\n \"eslint:recommended\",\n \"plugin:vue/recommended\"\n ],\n \"rules\": {\n \"import/no-unresolved\": 0,"
},
{
"path": ".gitattributes",
"chars": 111,
"preview": "* text=auto\n*.css linguist-vendored\n*.scss linguist-vendored\n*.js linguist-vendored\nCHANGELOG.md export-ignore\n"
},
{
"path": ".gitignore",
"chars": 188,
"preview": "/node_modules\n/public/hot\n/public/storage\n/storage/*.key\n/vendor\n.env\n.env.backup\n.phpunit.result.cache\nHomestead.json\nH"
},
{
"path": ".styleci.yml",
"chars": 174,
"preview": "php:\n preset: laravel\n disabled:\n - unused_use\n finder:\n not-name:\n - index.php\n - server.php\njs:\n f"
},
{
"path": "README.md",
"chars": 2729,
"preview": "### iWatched\n\nI am currently working on a new version which you can find in pull requests. Also here is a [demo](https:/"
},
{
"path": "app/Console/Commands/ImportTitles.php",
"chars": 2578,
"preview": "<?php\n\nnamespace App\\Console\\Commands;\n\nuse App\\Watched\\Importers\\ImporterInterface;\nuse Illuminate\\Database\\Schema\\Blue"
},
{
"path": "app/Console/Commands/toElastic.php",
"chars": 1346,
"preview": "<?php\n\nnamespace App\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Symfony\\Component\\Process\\Process;\n\nclass to"
},
{
"path": "app/Console/Kernel.php",
"chars": 827,
"preview": "<?php\n\nnamespace App\\Console;\n\nuse Illuminate\\Console\\Scheduling\\Schedule;\nuse Illuminate\\Foundation\\Console\\Kernel as C"
},
{
"path": "app/Crew.php",
"chars": 195,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Crew extends Model\n{\n public function name()\n "
},
{
"path": "app/Episode.php",
"chars": 103,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Episode extends Model\n{\n //\n}\n"
},
{
"path": "app/Exceptions/Handler.php",
"chars": 1141,
"preview": "<?php\n\nnamespace App\\Exceptions;\n\nuse Illuminate\\Foundation\\Exceptions\\Handler as ExceptionHandler;\nuse Throwable;\n\nclas"
},
{
"path": "app/Http/Controllers/Auth/ConfirmPasswordController.php",
"chars": 1024,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider"
},
{
"path": "app/Http/Controllers/Auth/EmailVerificationController.php",
"chars": 964,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Auth\\Events\\Verified;\nu"
},
{
"path": "app/Http/Controllers/Auth/ForgotPasswordController.php",
"chars": 667,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse Illuminate\\Foundation\\Auth\\SendsPa"
},
{
"path": "app/Http/Controllers/Auth/LoginController.php",
"chars": 1002,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider"
},
{
"path": "app/Http/Controllers/Auth/LogoutController.php",
"chars": 370,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider"
},
{
"path": "app/Http/Controllers/Auth/PasswordResetController.php",
"chars": 274,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\n\nclass PasswordResetController extends"
},
{
"path": "app/Http/Controllers/Auth/RegisterController.php",
"chars": 1950,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider"
},
{
"path": "app/Http/Controllers/Auth/ResetPasswordController.php",
"chars": 844,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider"
},
{
"path": "app/Http/Controllers/Auth/VerificationController.php",
"chars": 1130,
"preview": "<?php\n\nnamespace App\\Http\\Controllers\\Auth;\n\nuse App\\Http\\Controllers\\Controller;\nuse App\\Providers\\RouteServiceProvider"
},
{
"path": "app/Http/Controllers/Controller.php",
"chars": 361,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Foundation\\Auth\\Access\\AuthorizesRequests;\nuse Illuminate\\Foundat"
},
{
"path": "app/Http/Controllers/DashboardController.php",
"chars": 854,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Watched;\n\nclass DashboardController extends Controller\n{\n public func"
},
{
"path": "app/Http/Controllers/HomeController.php",
"chars": 467,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Http\\Request;\n\nclass HomeController extends Controller\n{\n /**\n"
},
{
"path": "app/Http/Controllers/MovieController.php",
"chars": 888,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Movie;\nuse App\\Name;\nuse App\\Title;\nuse App\\Watched\\Traits\\TitleFilter;\n"
},
{
"path": "app/Http/Controllers/SearchController.php",
"chars": 4778,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Title;\nuse App\\Watched;\nuse Elasticsearch\\ClientBuilder;\nuse Illuminate\\"
},
{
"path": "app/Http/Controllers/SeriesController.php",
"chars": 1819,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Watched\\Traits\\TitleFilter;\nuse Illuminate\\Http\\Request;\nuse App\\Movie;\n"
},
{
"path": "app/Http/Controllers/WatchListController.php",
"chars": 1706,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Models\\WatchList;\nuse Illuminate\\Http\\Request;\n\nclass WatchListControlle"
},
{
"path": "app/Http/Controllers/WatchedController.php",
"chars": 1195,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nuse App\\Watched;\nuse App\\Title;\nuse Illuminate\\Http\\Request;\n\nclass WatchedContr"
},
{
"path": "app/Http/Kernel.php",
"chars": 2415,
"preview": "<?php\n\nnamespace App\\Http;\n\nuse Illuminate\\Foundation\\Http\\Kernel as HttpKernel;\n\nclass Kernel extends HttpKernel\n{\n "
},
{
"path": "app/Http/Middleware/Authenticate.php",
"chars": 469,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Auth\\Middleware\\Authenticate as Middleware;\n\nclass Authenticate ex"
},
{
"path": "app/Http/Middleware/CheckForMaintenanceMode.php",
"chars": 335,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode as Middleware;\n"
},
{
"path": "app/Http/Middleware/EncryptCookies.php",
"chars": 294,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Cookie\\Middleware\\EncryptCookies as Middleware;\n\nclass EncryptCook"
},
{
"path": "app/Http/Middleware/RedirectIfAuthenticated.php",
"chars": 569,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse App\\Providers\\RouteServiceProvider;\nuse Closure;\nuse Illuminate\\Support\\Facad"
},
{
"path": "app/Http/Middleware/TrimStrings.php",
"chars": 340,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\TrimStrings as Middleware;\n\nclass TrimS"
},
{
"path": "app/Http/Middleware/TrustProxies.php",
"chars": 436,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Fideloper\\Proxy\\TrustProxies as Middleware;\nuse Illuminate\\Http\\Request;\n\ncla"
},
{
"path": "app/Http/Middleware/VerifyCsrfToken.php",
"chars": 307,
"preview": "<?php\n\nnamespace App\\Http\\Middleware;\n\nuse Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken as Middleware;\n\nclass V"
},
{
"path": "app/Jobs/FetchPosterJob.php",
"chars": 1285,
"preview": "<?php\n\nnamespace App\\Jobs;\n\nuse App\\Poster;\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Contracts\\Queue\\ShouldQueue;\nus"
},
{
"path": "app/Models/WatchList.php",
"chars": 134,
"preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass WatchList extends Model\n{\n protected $gu"
},
{
"path": "app/Name.php",
"chars": 100,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Name extends Model\n{\n //\n}\n"
},
{
"path": "app/Poster.php",
"chars": 234,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Poster extends Model\n{\n protected $guarded = []"
},
{
"path": "app/Principal.php",
"chars": 200,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Principal extends Model\n{\n public function name"
},
{
"path": "app/Providers/AppServiceProvider.php",
"chars": 403,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass AppServiceProvider extends ServiceProvid"
},
{
"path": "app/Providers/AuthServiceProvider.php",
"chars": 578,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Foundation\\Support\\Providers\\AuthServiceProvider as ServiceProvider;\nuse"
},
{
"path": "app/Providers/BroadcastServiceProvider.php",
"chars": 380,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\Facades\\Broadcast;\nuse Illuminate\\Support\\ServiceProvider;\n\nclas"
},
{
"path": "app/Providers/EventServiceProvider.php",
"chars": 710,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Auth\\Events\\Registered;\nuse Illuminate\\Auth\\Listeners\\SendEmailVerificat"
},
{
"path": "app/Providers/HorizonServiceProvider.php",
"chars": 970,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\Facades\\Gate;\nuse Laravel\\Horizon\\Horizon;\nuse Laravel\\Horizon\\H"
},
{
"path": "app/Providers/RouteServiceProvider.php",
"chars": 1662,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Foundation\\Support\\Providers\\RouteServiceProvider as ServiceProvider;\nus"
},
{
"path": "app/Rating.php",
"chars": 102,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Rating extends Model\n{\n //\n}\n"
},
{
"path": "app/Title.php",
"chars": 1069,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Title extends Model\n{\n public function poster()"
},
{
"path": "app/User.php",
"chars": 734,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Contracts\\Auth\\MustVerifyEmail;\nuse Illuminate\\Foundation\\Auth\\User as Authenticat"
},
{
"path": "app/Watched/Importers/AkaImporter.php",
"chars": 606,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Support\\Facades\\DB;\n\nclass AkaImporter extends Importer implemen"
},
{
"path": "app/Watched/Importers/CrewImporter.php",
"chars": 636,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Support\\Facades\\DB;\n\nclass CrewImporter extends Importer impleme"
},
{
"path": "app/Watched/Importers/EpisodeImporter.php",
"chars": 756,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Support\\Facades\\DB;\n\nclass EpisodeImporter extends Importer impl"
},
{
"path": "app/Watched/Importers/Importer.php",
"chars": 2166,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse GuzzleHttp\\Client;\nuse Symfony\\Component\\Console\\Helper\\ProgressBar;\nuse fu"
},
{
"path": "app/Watched/Importers/ImporterInterface.php",
"chars": 264,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Console\\OutputStyle;\n\ninterface ImporterInterface\n{\n public f"
},
{
"path": "app/Watched/Importers/NameImporter.php",
"chars": 617,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Support\\Facades\\DB;\n\nclass NameImporter extends Importer impleme"
},
{
"path": "app/Watched/Importers/PrincipalImporter.php",
"chars": 609,
"preview": "<?php\n\n\nnamespace App\\Watched\\Importers;\n\n\nuse Illuminate\\Support\\Facades\\DB;\n\nclass PrincipalImporter extends Importer "
},
{
"path": "app/Watched/Importers/RatingImporter.php",
"chars": 1284,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Support\\Facades\\DB;\n\nclass RatingImporter extends Importer imple"
},
{
"path": "app/Watched/Importers/TitleImporter.php",
"chars": 2359,
"preview": "<?php\n\nnamespace App\\Watched\\Importers;\n\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Facades\\DB;\nus"
},
{
"path": "app/Watched/Traits/TitleFilter.php",
"chars": 1187,
"preview": "<?php\n\n\nnamespace App\\Watched\\Traits;\n\n\nuse App\\Jobs\\FetchPosterJob;\nuse App\\Title;\n\ntrait TitleFilter\n{\n public func"
},
{
"path": "app/Watched.php",
"chars": 532,
"preview": "<?php\n\nnamespace App;\n\nuse Illuminate\\Database\\Eloquent\\Model;\nuse Rennokki\\QueryCache\\Traits\\QueryCacheable;\n\nclass Wat"
},
{
"path": "artisan",
"chars": 1686,
"preview": "#!/usr/bin/env php\n<?php\n\ndefine('LARAVEL_START', microtime(true));\n\n/*\n|-----------------------------------------------"
},
{
"path": "bootstrap/app.php",
"chars": 1620,
"preview": "<?php\n\n/*\n|--------------------------------------------------------------------------\n| Create The Application\n|--------"
},
{
"path": "bootstrap/cache/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "clear.sh",
"chars": 116,
"preview": "#!/usr/bin/env bash\nphp artisan cache:clear\nphp artisan route:clear\nphp artisan config:clear\nphp artisan view:clear\n"
},
{
"path": "composer.json",
"chars": 1921,
"preview": "{\n \"name\": \"laravel/laravel\",\n \"type\": \"project\",\n \"description\": \"The Laravel Framework.\",\n \"keywords\": [\n "
},
{
"path": "config/app.php",
"chars": 9292,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Applicatio"
},
{
"path": "config/auth.php",
"chars": 3796,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Authentica"
},
{
"path": "config/broadcasting.php",
"chars": 1601,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Br"
},
{
"path": "config/cache.php",
"chars": 3100,
"preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n /*\n |--------------------------------------------------------------"
},
{
"path": "config/cors.php",
"chars": 823,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Cross-Orig"
},
{
"path": "config/database.php",
"chars": 5054,
"preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n /*\n |--------------------------------------------------------------"
},
{
"path": "config/filesystems.php",
"chars": 2688,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Fi"
},
{
"path": "config/hashing.php",
"chars": 1571,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Ha"
},
{
"path": "config/horizon.php",
"chars": 6143,
"preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n /*\n |--------------------------------------------------------------"
},
{
"path": "config/logging.php",
"chars": 2896,
"preview": "<?php\n\nuse Monolog\\Handler\\NullHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\SyslogUdpHandler;\n\nreturn"
},
{
"path": "config/mail.php",
"chars": 3339,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Ma"
},
{
"path": "config/movie.php",
"chars": 177,
"preview": "<?php\n\nreturn [\n 'account_id' => env('TMDB_ACCOUNT_ID'),\n 'v3' => env('TMDB_V3_KEY'),\n 'v4' => env('TMDB_V4_KEY"
},
{
"path": "config/queue.php",
"chars": 2760,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Qu"
},
{
"path": "config/services.php",
"chars": 950,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Third Part"
},
{
"path": "config/session.php",
"chars": 6980,
"preview": "<?php\n\nuse Illuminate\\Support\\Str;\n\nreturn [\n\n /*\n |--------------------------------------------------------------"
},
{
"path": "config/view.php",
"chars": 1053,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | View Stora"
},
{
"path": "database/.gitignore",
"chars": 26,
"preview": "*.sqlite\n*.sqlite-journal\n"
},
{
"path": "database/factories/UserFactory.php",
"chars": 876,
"preview": "<?php\n\n/** @var \\Illuminate\\Database\\Eloquent\\Factory $factory */\n\nuse App\\User;\nuse Faker\\Generator as Faker;\nuse Illum"
},
{
"path": "database/migrations/2014_10_12_000000_create_users_table.php",
"chars": 798,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2014_10_12_100000_create_password_resets_table.php",
"chars": 683,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2019_08_19_000000_create_failed_jobs_table.php",
"chars": 774,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2020_06_03_231708_create_watched_table.php",
"chars": 800,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2020_06_03_231837_create_posters_table.php",
"chars": 692,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2020_06_19_095538_create_watch_lists_table.php",
"chars": 768,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_01_231011_create_titles_table.php",
"chars": 1105,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_01_231940_create_episodes_table.php",
"chars": 784,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_01_232132_create_ratings_table.php",
"chars": 719,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_01_232423_create_principals_table.php",
"chars": 851,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_01_232702_create_names_table.php",
"chars": 884,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_01_232924_create_crews_table.php",
"chars": 694,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/imdb/2020_06_03_135647_create_akas_table.php",
"chars": 975,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/seeds/DatabaseSeeder.php",
"chars": 244,
"preview": "<?php\n\nuse Illuminate\\Database\\Seeder;\n\nclass DatabaseSeeder extends Seeder\n{\n /**\n * Seed the application's data"
},
{
"path": "docker-compose.yml",
"chars": 2687,
"preview": "version: \"3\"\n\nservices:\n iwatched-server:\n build: .cloud/docker\n image: iwatched:1.0.0\n depends_on:\n - pg"
},
{
"path": "package.json",
"chars": 1312,
"preview": "{\n \"private\": true,\n \"scripts\": {\n \"dev\": \"npm run development\",\n \"development\": \"cross-env NODE_ENV"
},
{
"path": "phpunit.xml",
"chars": 1197,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:noNam"
},
{
"path": "public/.htaccess",
"chars": 603,
"preview": "<IfModule mod_rewrite.c>\n <IfModule mod_negotiation.c>\n Options -MultiViews -Indexes\n </IfModule>\n\n Rewr"
},
{
"path": "public/css/app.css",
"chars": 3981225,
"preview": "/**\n * This injects Tailwind's base styles, which is a combination of\n * Normalize.css and some additional base styles.\n"
},
{
"path": "public/index.php",
"chars": 1823,
"preview": "<?php\n\n/**\n * Laravel - A PHP Framework For Web Artisans\n *\n * @package Laravel\n * @author Taylor Otwell <taylor@lara"
},
{
"path": "public/js/app.js",
"chars": 1289491,
"preview": "/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/**"
},
{
"path": "public/mix-manifest.json",
"chars": 71,
"preview": "{\n \"/js/app.js\": \"/js/app.js\",\n \"/css/app.css\": \"/css/app.css\"\n}\n"
},
{
"path": "public/robots.txt",
"chars": 24,
"preview": "User-agent: *\nDisallow:\n"
},
{
"path": "public/vendor/horizon/app-dark.css",
"chars": 145109,
"preview": ".vjs__tree .vjs__tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs__tree .vjs__tree__node{cursor:po"
},
{
"path": "public/vendor/horizon/app.css",
"chars": 145078,
"preview": ".vjs__tree .vjs__tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs__tree .vjs__tree__node{cursor:po"
},
{
"path": "public/vendor/horizon/app.js",
"chars": 1597416,
"preview": "/*! For license information please see app.js.LICENSE.txt */\n!function(t){var e={};function p(o){if(e[o])return e[o].exp"
},
{
"path": "public/vendor/horizon/mix-manifest.json",
"chars": 167,
"preview": "{\n \"/app.js\": \"/app.js?id=4f93645700a6c5485654\",\n \"/app.css\": \"/app.css?id=99048465add47d086ac7\",\n \"/app-dark.c"
},
{
"path": "public/web.config",
"chars": 1194,
"preview": "<!--\n Rewrites requires Microsoft URL Rewrite Module for IIS\n Download: https://www.microsoft.com/en-us/download/d"
},
{
"path": "resources/js/app.js",
"chars": 474,
"preview": "require('./bootstrap');\n\nwindow.Vue = require('vue');\n\nconst files = require.context('./', true, /\\.vue$/i)\nfiles.keys()"
},
{
"path": "resources/js/bootstrap.js",
"chars": 602,
"preview": "window.axios = require('axios');\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\n\n/**\n * E"
},
{
"path": "resources/js/components/CheckboxComponent.vue",
"chars": 1498,
"preview": "<template>\n <div class=\"btn-status\">\n <input type=\"checkbox\" @change=\"updateStatus()\" v-model=\"checked\" name=\""
},
{
"path": "resources/js/components/MovieComponent.vue",
"chars": 2926,
"preview": "<template>\n\t<div class=\"bg-white shadow p-1 rounded flex flex-col justify-between movie\" v-if=\"title\">\n\t <div>\n\t "
},
{
"path": "resources/js/components/SearchComponent.vue",
"chars": 3077,
"preview": "<template>\n <div>\n <autocomplete\n :search=\"search\"\n aria-label=\"Search for title\"\n "
},
{
"path": "resources/js/components/SeriesComponent.vue",
"chars": 136,
"preview": "<script>\n export default {\n data () {\n return {\n active: 1,\n }\n }\n"
},
{
"path": "resources/lang/en/auth.php",
"chars": 617,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Authentica"
},
{
"path": "resources/lang/en/pagination.php",
"chars": 534,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Pagination"
},
{
"path": "resources/lang/en/passwords.php",
"chars": 744,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Password R"
},
{
"path": "resources/lang/en/validation.php",
"chars": 7642,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Validation"
},
{
"path": "resources/sass/app.scss",
"chars": 2392,
"preview": "/**\n * This injects Tailwind's base styles, which is a combination of\n * Normalize.css and some additional base styles.\n"
},
{
"path": "resources/views/auth/login.blade.php",
"chars": 164,
"preview": "@extends('layouts.auth')\n@section('title', 'Sign in to your account')\n\n@section('content')\n <div>\n @include('l"
},
{
"path": "resources/views/auth/passwords/confirm.blade.php",
"chars": 166,
"preview": "@extends('layouts.auth')\n@section('title', 'Confirm your password')\n\n@section('content')\n <div>\n @livewire('au"
},
{
"path": "resources/views/auth/passwords/email.blade.php",
"chars": 157,
"preview": "@extends('layouts.auth')\n@section('title', 'Reset password')\n\n@section('content')\n <div>\n @livewire('auth.pass"
},
{
"path": "resources/views/auth/passwords/reset.blade.php",
"chars": 200,
"preview": "@extends('layouts.auth')\n@section('title', 'Reset password')\n\n@section('content')\n <div>\n @livewire('auth.pass"
},
{
"path": "resources/views/auth/register.blade.php",
"chars": 164,
"preview": "@extends('layouts.auth')\n@section('title', 'Create a new account')\n\n@section('content')\n <div>\n @include('live"
},
{
"path": "resources/views/auth/verify.blade.php",
"chars": 159,
"preview": "@extends('layouts.auth')\n@section('title', 'Verify your email address')\n\n@section('content')\n <div>\n @livewire"
},
{
"path": "resources/views/components/app.blade.php",
"chars": 8685,
"preview": "<!DOCTYPE html>\n<html lang=\"{{ str_replace('_', '-', app()->getLocale()) }}\">\n <head>\n <meta charset=\"utf-8\">\n"
},
{
"path": "resources/views/components/filter.blade.php",
"chars": 2833,
"preview": "<form method=\"GET\" action=\"{{ url()->full() }}\">\n <div class=\"flex py-3\">\n <div class=\"relative mr-3\">\n "
},
{
"path": "resources/views/components/logo.blade.php",
"chars": 2148,
"preview": "<a href=\"{{ route('home') }}\">\n <svg {{ $attributes }} viewBox=\"0 0 50 52\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"c"
},
{
"path": "resources/views/dashboard.blade.php",
"chars": 1431,
"preview": "<x-app title=\"Dashboard\">\n\t<div class=\"flex w-1/2 mx-auto bg-white p-5 shadow-lg rounded-lg\">\n <div class=\"w-1/3 "
},
{
"path": "resources/views/home.blade.php",
"chars": 626,
"preview": "@extends('layouts.app')\n\n@section('content')\n<div class=\"container\">\n <div class=\"row justify-content-center\">\n "
},
{
"path": "resources/views/layouts/app.blade.php",
"chars": 77,
"preview": "@extends('layouts.base')\n\n@section('body')\n @yield('content')\n@endsection\n"
},
{
"path": "resources/views/layouts/auth.blade.php",
"chars": 185,
"preview": "@extends('layouts.base')\n\n@section('body')\n <div class=\"flex flex-col justify-center min-h-screen py-12 bg-gray-50 sm"
},
{
"path": "resources/views/layouts/base.blade.php",
"chars": 867,
"preview": "<!DOCTYPE html>\n<html lang=\"{{ str_replace('_', '-', app()->getLocale()) }}\">\n <head>\n <meta charset=\"utf-8\">\n"
},
{
"path": "resources/views/livewire/auth/login.blade.php",
"chars": 4125,
"preview": "<div>\n <div class=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <a href=\"{{ route('home') }}\">\n <x-logo clas"
},
{
"path": "resources/views/livewire/auth/passwords/confirm.blade.php",
"chars": 2643,
"preview": "<div>\n <div class=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <a href=\"{{ route('home') }}\">\n <x-logo clas"
},
{
"path": "resources/views/livewire/auth/passwords/email.blade.php",
"chars": 3017,
"preview": "<div>\n <div class=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <a href=\"{{ route('home') }}\">\n <x-logo clas"
},
{
"path": "resources/views/livewire/auth/passwords/reset.blade.php",
"chars": 3656,
"preview": "<div>\n <div class=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <a href=\"{{ route('home') }}\">\n <x-logo clas"
},
{
"path": "resources/views/livewire/auth/register.blade.php",
"chars": 4806,
"preview": "<div>\n <div class=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <a href=\"{{ route('home') }}\">\n <x-logo clas"
},
{
"path": "resources/views/livewire/auth/verify.blade.php",
"chars": 2145,
"preview": "<div>\n <div class=\"sm:mx-auto sm:w-full sm:max-w-md\">\n <a href=\"{{ route('home') }}\">\n <x-logo clas"
},
{
"path": "resources/views/livewire/checkbox.blade.php",
"chars": 357,
"preview": "<div class=\"btn-status\">\n\t<input type=\"checkbox\" wire:model=\"checked\" name=\"checkbox\" id=\"checkbox{{ $episode->id }}\" cl"
},
{
"path": "resources/views/livewire/movie.blade.php",
"chars": 1610,
"preview": "<div class=\"bg-white shadow p-1 rounded flex flex-col justify-between {{ $type == 'movie' ? 'mb-8' : '' }}\">\n <div>\n "
},
{
"path": "resources/views/livewire/movies.blade.php",
"chars": 3212,
"preview": "<div>\n <div class=\"flex py-3\">\n <div class=\"relative mr-3\">\n <select name=\"years\" id=\"years\" wire:m"
},
{
"path": "resources/views/livewire/paginate.blade.php",
"chars": 1499,
"preview": "@if ($paginator->hasPages())\n <div class=\"flex justify-between\">\n @if ($paginator->onFirstPage())\n "
},
{
"path": "resources/views/movies.blade.php",
"chars": 535,
"preview": "<x-app title=\"Movies\">\n <div class=\"container mx-auto\">\n <x-filter />\n <div class=\"popular-movies mb-5\""
},
{
"path": "resources/views/queries/elasticsearch.blade.php",
"chars": 845,
"preview": "{\n \"query\": {\n \"bool\": {\n \"must\": [\n {\n \"multi_match\": {\n \"query\": \"the marti\",\n "
},
{
"path": "resources/views/series/index.blade.php",
"chars": 505,
"preview": "<x-app title=\"Series\">\n <div class=\"container mx-auto\">\n <x-filter/>\n <div class=\"popular-movies mb-5\">"
},
{
"path": "resources/views/series/show.blade.php",
"chars": 10129,
"preview": "<x-app :title=\"$title->primary_title\">\n <div class=\"container mx-auto\">\n <series inline-template>\n "
},
{
"path": "resources/views/show.blade.php",
"chars": 5739,
"preview": "<x-app :title=\"$title->primary_title\">\n <div class=\"container mx-auto\">\n <div class=\"flex items-stretch\">\n "
},
{
"path": "resources/views/vendor/livewire/pagination-links.blade.php",
"chars": 7641,
"preview": "@if ($paginator->hasPages())\n <nav role=\"navigation\" aria-label=\"Pagination Navigation\" class=\"flex items-center just"
},
{
"path": "resources/views/vendor/pagination/default.blade.php",
"chars": 7642,
"preview": "@if ($paginator->hasPages())\n <nav role=\"navigation\" aria-label=\"Pagination Navigation\" class=\"flex items-center just"
},
{
"path": "resources/views/vendor/pagination/simple-default.blade.php",
"chars": 1701,
"preview": "@if ($paginator->hasPages())\n <nav role=\"navigation\" aria-label=\"Pagination Navigation\" class=\"flex justify-between\">"
},
{
"path": "resources/views/watched.blade.php",
"chars": 2419,
"preview": "<x-app>\n <div class=\"container mx-auto\">\n <div class=\"bg-white shadow-md rounded my-6\">\n <table cla"
},
{
"path": "resources/views/welcome.blade.php",
"chars": 2079,
"preview": "@extends('layouts.app')\n\n@section('content')\n <div class=\"flex flex-col justify-center min-h-screen py-12 bg-gray-50 "
},
{
"path": "routes/api.php",
"chars": 566,
"preview": "<?php\n\nuse Illuminate\\Http\\Request;\nuse Illuminate\\Support\\Facades\\Route;\n\n/*\n|-----------------------------------------"
},
{
"path": "routes/channels.php",
"chars": 551,
"preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Broadcast;\n\n/*\n|------------------------------------------------------------------"
},
{
"path": "routes/console.php",
"chars": 593,
"preview": "<?php\n\nuse Illuminate\\Foundation\\Inspiring;\nuse Illuminate\\Support\\Facades\\Artisan;\n\n/*\n|-------------------------------"
},
{
"path": "routes/web.php",
"chars": 474,
"preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Route;\n\nRoute::view('/', 'welcome');\n\nRoute::auth();\n\nRoute::middleware('auth')->g"
},
{
"path": "server.php",
"chars": 563,
"preview": "<?php\n\n/**\n * Laravel - A PHP Framework For Web Artisans\n *\n * @package Laravel\n * @author Taylor Otwell <taylor@lara"
},
{
"path": "storage/app/.gitignore",
"chars": 23,
"preview": "*\n!public/\n!.gitignore\n"
},
{
"path": "storage/debugbar/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "storage/framework/.gitignore",
"chars": 103,
"preview": "config.php\nroutes.php\nschedule-*\ncompiled.php\nservices.json\nevents.scanned.php\nroutes.scanned.php\ndown\n"
},
{
"path": "storage/framework/cache/.gitignore",
"chars": 21,
"preview": "*\n!data/\n!.gitignore\n"
},
{
"path": "storage/framework/sessions/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "storage/framework/testing/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "storage/framework/views/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "storage/logs/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "tailwind.config.js",
"chars": 924,
"preview": "const defaultTheme = require('tailwindcss/defaultTheme');\n\nmodule.exports = {\n theme: {\n extend: {\n "
},
{
"path": "tests/CreatesApplication.php",
"chars": 380,
"preview": "<?php\n\nnamespace Tests;\n\nuse Illuminate\\Contracts\\Console\\Kernel;\n\ntrait CreatesApplication\n{\n /**\n * Creates the"
},
{
"path": "tests/Feature/Auth/LoginTest.php",
"chars": 2864,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth;\n\nuse App\\User;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Illuminate\\Su"
},
{
"path": "tests/Feature/Auth/LogoutTest.php",
"chars": 730,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth;\n\nuse App\\User;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Illuminate\\Su"
},
{
"path": "tests/Feature/Auth/Passwords/ConfirmTest.php",
"chars": 2089,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth\\Passwords;\n\nuse App\\User;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Ill"
},
{
"path": "tests/Feature/Auth/Passwords/EmailTest.php",
"chars": 1399,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth\\Passwords;\n\nuse App\\User;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Liv"
},
{
"path": "tests/Feature/Auth/Passwords/ResetTest.php",
"chars": 3533,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth\\Passwords;\n\nuse App\\User;\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Ill"
},
{
"path": "tests/Feature/Auth/RegisterTest.php",
"chars": 3709,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth;\n\nuse App\\User;\nuse Tests\\TestCase;\nuse Livewire\\Livewire;\nuse Illuminate\\Support\\Fa"
},
{
"path": "tests/Feature/Auth/VerifyTest.php",
"chars": 1610,
"preview": "<?php\n\nnamespace Tests\\Feature\\Auth;\n\nuse App\\User;\nuse Tests\\TestCase;\nuse Livewire\\Livewire;\nuse Illuminate\\Support\\Fa"
},
{
"path": "tests/Feature/ExampleTest.php",
"chars": 268,
"preview": "<?php\n\nnamespace Tests\\Feature;\n\nuse Tests\\TestCase;\n\nclass ExampleTest extends TestCase\n{\n /**\n * A basic test e"
},
{
"path": "tests/TestCase.php",
"chars": 551,
"preview": "<?php\n\nnamespace Tests;\n\nuse Illuminate\\Foundation\\Mix;\nuse Illuminate\\Foundation\\Testing\\TestCase as BaseTestCase;\n\nabs"
},
{
"path": "tests/Unit/ExampleTest.php",
"chars": 255,
"preview": "<?php\n\nnamespace Tests\\Unit;\n\nuse PHPUnit\\Framework\\TestCase;\n\nclass ExampleTest extends TestCase\n{\n /**\n * A bas"
},
{
"path": "webpack.mix.js",
"chars": 691,
"preview": "const mix = require(\"laravel-mix\");\n\nrequire(\"laravel-mix-tailwind\");\n\n/*\n |--------------------------------------------"
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the hakanersu/iwatched GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 190 files (56.6 MB), approximately 1.9M tokens, and a symbol index with 1164 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.