diff --git a/README.md b/README.md
index 81f2f62ba99fae61f50a9b32afcf99aec1884485..4979c493e7d7c9f0251f39a291877ea69272d16f 100644
--- a/README.md
+++ b/README.md
@@ -1,78 +1,90 @@
-<p align="center"><img src="https://res.cloudinary.com/dtfbvvkyp/image/upload/v1566331377/laravel-logolockup-cmyk-red.svg" width="400"></p>
-
-<p align="center">
-<a href="https://travis-ci.org/laravel/framework"><img src="https://travis-ci.org/laravel/framework.svg" alt="Build Status"></a>
-<a href="https://packagist.org/packages/laravel/framework"><img src="https://poser.pugx.org/laravel/framework/d/total.svg" alt="Total Downloads"></a>
-<a href="https://packagist.org/packages/laravel/framework"><img src="https://poser.pugx.org/laravel/framework/v/stable.svg" alt="Latest Stable Version"></a>
-<a href="https://packagist.org/packages/laravel/framework"><img src="https://poser.pugx.org/laravel/framework/license.svg" alt="License"></a>
-</p>
-
-## About Laravel
-
-Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
-
-- [Simple, fast routing engine](https://laravel.com/docs/routing).
-- [Powerful dependency injection container](https://laravel.com/docs/container).
-- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
-- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
-- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
-- [Robust background job processing](https://laravel.com/docs/queues).
-- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
-
-Laravel is accessible, powerful, and provides tools required for large, robust applications.
-
-## Learning Laravel
-
-Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
-
-If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 1500 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
-
-## Laravel Sponsors
-
-We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell).
-
-- **[Vehikl](https://vehikl.com/)**
-- **[Tighten Co.](https://tighten.co)**
-- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
-- **[64 Robots](https://64robots.com)**
-- **[Cubet Techno Labs](https://cubettech.com)**
-- **[Cyber-Duck](https://cyber-duck.co.uk)**
-- **[British Software Development](https://www.britishsoftware.co)**
-- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)**
-- **[DevSquad](https://devsquad.com)**
-- [UserInsights](https://userinsights.com)
-- [Fragrantica](https://www.fragrantica.com)
-- [SOFTonSOFA](https://softonsofa.com/)
-- [User10](https://user10.com)
-- [Soumettre.fr](https://soumettre.fr/)
-- [CodeBrisk](https://codebrisk.com)
-- [1Forge](https://1forge.com)
-- [TECPRESSO](https://tecpresso.co.jp/)
-- [Runtime Converter](http://runtimeconverter.com/)
-- [WebL'Agence](https://weblagence.com/)
-- [Invoice Ninja](https://www.invoiceninja.com)
-- [iMi digital](https://www.imi-digital.de/)
-- [Earthlink](https://www.earthlink.ro/)
-- [Steadfast Collective](https://steadfastcollective.com/)
-- [We Are The Robots Inc.](https://watr.mx/)
-- [Understand.io](https://www.understand.io/)
-- [Abdel Elrafa](https://abdelelrafa.com)
-- [Hyper Host](https://hyper.host)
-- [Appoly](https://www.appoly.co.uk)
-- [OP.GG](https://op.gg)
-
-## Contributing
-
-Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
-
-## Code of Conduct
-
-In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
-
-## Security Vulnerabilities
-
-If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
-
-## License
-
-The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
+# Datalearn
+
+Datalearn is simple LMS with spreadsheet and autograder tools. It uses Google Spreadsheet with Sheets and Drive API. This application is developed for my final project.
+
+## Tech Stack
+- Framework used is **Laravel 6.18.3** with **PHP 7**
+- Database used is **MySQL**
+
+## Requirements
+- PHP 7.4 or newer
+- MySQL 10.4.11-MariaDB or newer
+- Composer 1.9.3 or newer
+
+## Installation
+1. Make a copy `.env.example` and change its name to `.env`
+2. Customize `.env` file with your configuration
+3. Create a new database with the same name as defined in `.env` file
+4. Run these commands in terminal
+```
+composer install
+composer update
+php artisan storage:link
+php artisan key:generate
+php artisan config:cache
+php artisan migrate
+```
+5. The application uses Google Spreadsheet. Configure the Google Service Account to use it
+6. This application uses TinyMCE. Configure it
+7. There are problems with the libraries. Fix it
+8. Congratulation, the application has been successfully installed. Run the application with this command
+```
+php artisan serve
+```
+
+## Configure Google Service Account
+1. Open [Google API Console](https://console.developers.google.com)
+2. Go to **Credentials tab** and open **CREATE CREDENTIALS --> Service Account**
+3. Fill the forms in first step. Second step and third step are optional
+4. After done, there is a service account that newly created under **Service Accounts** list. Open it
+5. Click the button **ADD KEY** and choose **JSON**
+6. Download the file and change its name to `credentials.json`
+7. Move this file to project directory in `app/Http/Controllers`
+8. Finish
+
+## Configure TinyMCE
+1. Open [TinyMCE](https://www.tiny.cloud)
+2. Complete the registration
+3. After that, you got API Key in Dashboard
+4. Copy the API Key and paste to `app.blade.php` file in project direcotry `resources/views/layouts` on `line 16`
+```php
+<script src="https://cdn.tiny.cloud/1/<API KEY>/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
+```
+5. Finish
+
+## Solve Libraries Problem
+There are problems with the libraries. Do this step to solve the problems
+### Problem 1
+#### Error
+```
+ErrorException
+implode(): Passing glue string after array is deprecated. Swap the parameters 
+```
+#### Solution 
+Open `Resouce.php` file in project directory `vendor/google/apiclient/src/Google/Service`. In `line 291`, change
+```php
+$requestUrl .= '?' . implode($queryVars, '&');
+```
+to
+```php
+$requestUrl .= '?' . implode('&', $queryVars);
+```
+
+### Problem 2
+#### Error
+```
+ErrorException
+count(): Parameter must be an array or an object that implements Countable 
+```
+#### Solution
+Open `CurlFactory.php` file in project directory `vendor/guzzlehttp/guzzle/src/Handler`. In `line 67`, change
+```php
+if (count($this->handles) >= $this->maxHandles) {
+```
+to
+```php
+if (count( (array) $this->handles) >= $this->maxHandles) {
+```
+
+## Author
+Kurniandha Sukma Yunastrian
\ No newline at end of file
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
index c6a6de672709676254ebf05f4ddd5597972645cd..60e601757151f200e3400de17136a73999910c79 100644
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ b/app/Http/Controllers/Auth/RegisterController.php
@@ -68,6 +68,7 @@ class RegisterController extends Controller
             'name' => $data['name'],
             'email' => $data['email'],
             'password' => Hash::make($data['password']),
+            'role' => intval($data['role']),
         ]);
     }
 }
diff --git a/app/Http/Controllers/AutograderController.php b/app/Http/Controllers/AutograderController.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d7adb5a3a5f76fe7360981b4857e5a3c63041c2
--- /dev/null
+++ b/app/Http/Controllers/AutograderController.php
@@ -0,0 +1,297 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Auth;
+use Google_Client;
+
+class AutograderController extends Controller
+{
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('auth');
+    }
+
+    /**
+     * Submit Spreadsheet.
+     *
+     * @return Score
+     */
+    public function index($id_course, $id_topic, Request $request) 
+    {
+        $answer_keys = DB::table('spreadsheets')->where('id', $id_topic)->get();
+        $cells = [];
+        $cells_temp = [];
+        $keys_formula = [];
+        $keys_value = [];
+        foreach($answer_keys as $answer_key) {
+            $cells[] = 'Sheet1!' . $answer_key->cell;
+            $cells_temp[] = $answer_key->cell;
+            $keys_formula[] = $answer_key->formula;
+            $keys_value[] = $answer_key->value;
+        }
+
+        $answers_formula = AutograderController::getStudentAnswer($request->id_spreadsheet, $cells, 0);
+        $answers_value = AutograderController::getStudentAnswer($request->id_spreadsheet, $cells, 1);
+        
+        $results_formula = AutograderController::gradeFormula($keys_formula, $answers_formula);
+        $results_value = AutograderController::gradeValue($keys_value, $answers_value);
+        $results = [];
+        for ($i=0; $i<count($results_formula); $i++) {
+            $results[] = $results_formula[$i]*0.8 + $results_value[$i]*0.2;
+        }
+
+        echo '
+        <table class="table table-hover">
+            <thead>
+                <tr>
+                    <th scope="col">Cell</th>
+                    <th scope="col">Formula Kunci</th>
+                    <th scope="col">Formula Jawaban</th>
+                    <th scope="col">Nilai Kunci</th>
+                    <th scope="col">Nilai Jawaban</th>
+                    <th scope="col">Skor</th>
+                </tr>
+            </thead>
+            <tbody>             
+        ';
+
+        $score = 0;
+        for ($i=0; $i<count($results); $i++) {
+            $score = $score + $results[$i]*100;
+            echo '<tr>';
+            echo '<th>' . $cells_temp[$i] . '</th>';
+            echo '<td>' . $keys_formula[$i] . '</td>';
+            echo '<td>' . $answers_formula[$i] . '</td>';
+            echo '<td>' . $keys_value[$i] . '</td>';
+            echo '<td>' . $answers_value[$i] . '</td>';
+            echo '<td>' . number_format($results[$i]*100, 2, '.', ''). '</td>';
+            echo '</tr>';
+        }
+        echo '
+                    <tr>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <td></td>
+                        <th class="table-primary">Skor Akhir</th>
+                        <th class="table-primary">' . number_format($score/count($results), 2, '.', '') . '</th>
+                    </tr>
+                </tbody>
+            </table>
+            <a href="/course/' . $id_course . '" style="float: right;" class="btn btn-primary" role="button">Kembali ke Kelas</a>
+        ';
+
+        DB::table('grades')->where([
+            ['id_topic', '=' ,$id_topic], 
+            ['id_user', '=', Auth::id()]            
+        ])->delete();
+
+        DB::table('grades')->insert([
+            'id_course' => $id_course,
+            'id_user' => Auth::id(),
+            'id_topic' => $id_topic,
+            'grade' => $score/count($results)
+        ]);
+    }
+
+    /**
+     * Get grade from answer value
+     *
+     * @return grades
+     */
+    public function gradeValue($keys, $answers) 
+    {
+        $results = [];
+        for($i=0; $i<count($keys); $i++) {
+            if ($keys[$i] == $answers[$i]) {
+                $results[] = 1;
+            } else {
+                $results[] = 0;
+            }
+        }
+
+        return $results;
+    }
+
+    /**
+     * Get grade from answer formula
+     *
+     * @return grades
+     */
+    public function gradeFormula($keys, $answers) 
+    {
+        $results = [];
+        for($i=0; $i<count($keys); $i++) {
+            $key_temp = preg_split("/[)\s,(-]+/", $keys[$i]);
+            $answer_temp = preg_split("/[)\s,(-]+/", $answers[$i]);
+
+            $flag = 0;
+            $range_func = array("COUNTBLANK", "MDETERM", "MINVERSE", "SUMPRODUCT", "TRANSPOSE", "COLUMNS", "ROWS");
+            foreach($range_func as $func) {
+                if (in_array('=' . $func, $answer_temp)) {
+                    $flag = 1;
+                    break;
+                }
+            }
+
+            $key = [];
+            for($j=0; $j<count($key_temp); $j++) {
+                if (!empty($key_temp[$j])) {
+                    $key[] = $key_temp[$j];
+                }
+            }
+
+            $answer = [];
+            for($j=0; $j<count($answer_temp); $j++) {
+                if (!empty($answer_temp[$j])) {
+                    $array = str_split($answer_temp[$j]);
+                    if (in_array(':', $array)) {
+                        if ($flag == 0) {
+                            $idx = strpos($answer_temp[$j], ":");
+                            
+                            $row_start_temp = '';
+                            $column_start = 0;
+                            for ($k=0; $k<$idx; $k++) {
+                                if ($k == 0) {
+                                    $column_start = ord($array[$k]);
+                                } else {
+                                    $row_start_temp .= $array[$k];
+                                }
+                            }
+                            $row_start = intval($row_start_temp);
+                
+                            $row_end_temp = '';
+                            $column_end = 0;
+                            for ($k=$idx+1; $k<count($array); $k++) {
+                                if ($k == $idx+1) {
+                                    $column_end = ord($array[$k]);
+                                } else {
+                                    $row_end_temp .= $array[$k];
+                                }
+                            }
+                            $row_end = intval($row_end_temp);
+                
+                            $new_arr = [];
+                            for ($k=$column_start; $k<=$column_end; $k++) {
+                                for ($l=$row_start; $l<=$row_end; $l++) {
+                                    $new_arr[] = chr($k) . strval($l);
+                                }
+                            }
+        
+                            foreach($new_arr as $n) {
+                                $answer[] = $n;
+                            }
+                        } else {
+                            $answer[] = $answer_temp[$j];
+                        }
+                    } else {
+                        $answer[] = $answer_temp[$j];
+                    }
+                }
+            }
+
+            $results[] = AutograderController::cosine($key, $answer);
+        }
+
+        return $results;
+    }
+
+    /**
+     * Get Cosine Similarity
+     *
+     * @return score
+     */
+    public function cosine($key, $answer) {
+        if (count($answer) == 0) {
+            return 0;
+        } else {
+            $token = [];
+            $vector1 = [];
+            $vector2 = [];
+            foreach($key as $k) {
+                if (!in_array($k, $token)) {
+                    $token[] = $k;
+                    $vector1[] = 0;
+                    $vector2[] = 0;
+                }
+            }
+
+            foreach($answer as $k) {
+                if (!in_array($k, $token)) {
+                    $token[] = $k;
+                    $vector1[] = 0;
+                    $vector2[] = 0;
+                }
+            }
+
+            foreach($key as $k) {
+                $vector1[array_search($k, $token)] += 1;
+            }
+            foreach($answer as $k) {
+                $vector2[array_search($k, $token)] += 1;
+            }
+
+            $dot_product = 0;
+            for($i=0; $i<count($token); $i++) {
+                $dot_product += ($vector1[$i])*($vector2[$i]);
+            }
+
+            $length1 = 0;
+            $length2 = 0;
+
+            for($i=0; $i<count($token); $i++) {
+                $length1 += pow($vector1[$i], 2);
+                $length2 += pow($vector2[$i], 2);
+            }
+
+            $similarity = $dot_product/sqrt($length1*$length2);
+            
+            return $similarity;
+        }
+    }
+
+    /**
+     * Get data from spreadsheet
+     *
+     * @return answer
+     */
+    public function getStudentAnswer($id_spreadsheet, $ranges, $type) 
+    {
+        $client = new Google_Client();
+        $client->setApplicationName('Datalearn');
+        $client->setAuthConfig(__DIR__.'/credentials.json');
+        $client->addScope(\Google_Service_Sheets::SPREADSHEETS);
+        $client->setAccessType('offline');
+
+        $service = new \Google_Service_Sheets($client);
+        
+        $render = 'FORMULA';
+        if ($type == 1) {
+            $render = 'FORMATTED_VALUE';
+        }
+        $responses = $service->spreadsheets_values->batchGet($id_spreadsheet, [
+            'valueRenderOption' => $render,
+            'dateTimeRenderOption' => 'SERIAL_NUMBER',
+            'ranges' => $ranges
+        ]);
+
+        $answers = [];
+        foreach ($responses->valueRanges as $response) {
+            if ($response->values == NULL) {
+                $answers[] = NULL;
+            } else {
+                $answers[] = strtoupper(strval(($response->values)[0][0]));
+            }
+        }
+
+        return $answers;
+    }
+}
diff --git a/app/Http/Controllers/CourseController.php b/app/Http/Controllers/CourseController.php
new file mode 100644
index 0000000000000000000000000000000000000000..d2ae817976400ea7f720de39b84fcb4343d22c5b
--- /dev/null
+++ b/app/Http/Controllers/CourseController.php
@@ -0,0 +1,186 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Auth;
+
+class CourseController 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($id_course)
+    {
+        $course = DB::table('courses')->where('id', $id_course)->first();
+        $topics = DB::table('topics')->where('id_course', $id_course)->get();
+        $enrolled_id = DB::table('user_course')->where('id_course', $id_course)->pluck('id_user');
+
+        $students = [];
+        $teacher = '';
+        foreach($enrolled_id as $id) {
+            $temp = DB::table('users')->where('id', $id)->first();
+            if ($temp->role == 1) {
+                $teacher = $temp->name;
+            } else {
+                $students[] = $temp->name;
+            }
+        }
+
+        $scores = [];
+        foreach($topics as $topic) {
+            $grades = DB::table('grades')->where([
+                ['id_topic', '=' ,$topic->id], 
+                ['id_user', '=', Auth::id()]            
+            ])->first();
+            
+            if (empty($grades)) {
+                $scores[] = '-';
+            } else {
+                $scores[] = $grades->grade;
+            }
+        }
+
+        return view('course', ['course' => $course, 'scores' => $scores, 'topics' => $topics, 'students' => $students, 'teacher' => $teacher]);
+    }
+
+    /**
+     * Create new course
+     *
+     * @return newCourse
+     */
+    public function new(Request $request)
+    {
+        $id = DB::table('courses')->insertGetId([
+            'name' => $request->course_name,
+            'description' => $request->course_description,
+        ]);
+
+        DB::table('user_course')->insert([
+            'id_user' => Auth::id(),
+            'id_course' => $id
+        ]);
+        return redirect()->route('home', ['msg' => 2]);
+    }
+
+    /**
+     * Edit course name
+     *
+     * @return newCourse
+     */
+    public function edit($id_course, Request $request)
+    {
+        DB::table('courses')->where('id', $id_course)->update([
+            'name' => $request->course_name,
+        ]);
+
+        return redirect()->route('course', ['id_course' => $id_course, 'msg' => 5]);
+    }
+
+    /**
+     * delete course
+     *
+     * @return msg
+     */
+    public function delete($id_course)
+    {
+        $enrolled_id = DB::table('user_course')->where('id_course', $id_course)->pluck('id_user');
+        $topics = DB::table('courses')->where('id', $id_course)->get();
+        foreach($topics as $topic) {
+            DB::table('spreadsheets')->where('id', $topic->id)->delete();
+            DB::table('grades')->where('id_topic', $topic->id)->delete();
+            DB::table('topics')->where('id', $topic->id)->delete();
+        }
+
+        DB::table('user_course')->where('id_course', $id_course)->delete();
+        DB::table('courses')->where('id', $id_course)->delete();
+        
+        return redirect()->route('home', ['msg' => 4]);
+    }
+
+    /**
+     * Create new course
+     *
+     * @return newCourse
+     */
+    public function enroll(Request $request)
+    {
+        DB::table('user_course')->insert([
+            'id_user' => Auth::id(),
+            'id_course' => $request->enroll_id
+        ]);
+        return redirect()->route('home', ['msg' => 3]);
+    }
+
+    /**
+     * Edit Topic
+     *
+     * @return msg
+     */
+    public function editTopic($id_course, $id_topic, Request $request) {
+        DB::table('topics')->where('id', $id_topic)->update([
+            'name' => $request->topic_name,
+            'description' => $request->topic_description
+        ]);
+
+        return redirect()->route('course', ['id_course' => $id_course, 'msg' => 4]);
+    }
+
+    /**
+     * Show grade
+     *
+     * @return grade
+     */
+    public function grade($id_course) {
+        if (Auth::user()->role == 0) {
+            return redirect()->route('course', ['id_course' => $id_course, 'msg' => 6]);
+        }
+
+        $enrolled_id = DB::table('user_course')->where('id_course', $id_course)->pluck('id_user');
+
+        $topics = DB::table('topics')->where('id_course', $id_course)->get();
+        $name = [];
+        $ids = [];
+        $grades = [];
+        foreach($enrolled_id as $id) {
+            $user = DB::table('users')->where('id', $id)->first();
+
+            if ($user->role == 0) {
+                $name[] = $user->name;
+                $ids[] = $user->id;
+
+                $usergrade = [];
+                foreach($topics as $topic) {
+                    $grade = DB::table('grades')->where([
+                        ['id_course', '=' ,$id_course], 
+                        ['id_user', '=', $user->id],
+                        ['id_topic', '=', $topic->id]
+                    ])->first();
+
+                    if (empty($grade)) {
+                        $usergrade[] = '-';
+                    } else {
+                        $usergrade[] = $grade->grade;
+                    }
+                }
+
+                $grades[] = $usergrade;
+            }
+        }
+
+        return view('grade', ['topics' => $topics, 'names' => $name, 'grades' => $grades, 'id_course' => $id_course]);
+    }
+}
diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php
index 7cbc2c3f0cbc4fd1d2b2734a0301b416f54f479e..c50e4d2b20fa6cc2b058faf5938523677b5974b3 100644
--- a/app/Http/Controllers/HomeController.php
+++ b/app/Http/Controllers/HomeController.php
@@ -3,6 +3,10 @@
 namespace App\Http\Controllers;
 
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Hash;
+use App\Http\Requests\UpdatePasswordRequest;
 
 class HomeController extends Controller
 {
@@ -23,6 +27,58 @@ class HomeController extends Controller
      */
     public function index()
     {
-        return view('home');
+        $profile = DB::table('users')->where('id', Auth::id())->first();
+        $role = 'Siswa';
+        if ($profile->role == 1) {
+            $role = 'Pengajar';
+        }
+
+        $courses = DB::table('courses')->get();
+        $teachers = [];
+        $enrolled_id = DB::table('user_course')->where('id_user', Auth::id())->pluck('id_course');
+
+        $enrolled = [];
+        foreach($enrolled_id as $id) {
+            $enrolled[] = DB::table('courses')->where('id', $id)->first();
+        }
+
+        $image = 'student.png';
+        if (Auth::user()->role == 1) {
+            $image = 'lecturer.png';
+        }
+
+        return view('home', ['image' => $image, 'profile' => $profile, 'role' => $role, 'courses' => $courses, 'enrolled' => $enrolled]);
+    }
+
+    /**
+     * Show the application dashboard.
+     *
+     * @return \Illuminate\Contracts\Support\Renderable
+     */
+    public function editPassword()
+    {
+        return view('editPassword');
+    }
+
+    public function profile(Request $request)
+    {
+        DB::table('users')->where('id', Auth::id())->update([
+            'name' => $request->new_name,
+        ]);
+        
+        return redirect()->route('home', ['msg' => 1]);
+    }
+
+    /**
+     * @param UpdatePasswordRequest $request
+     * @return \Illuminate\Http\RedirectResponse
+     */
+    public function password(UpdatePasswordRequest $request)
+    {
+        DB::table('users')->where('id', Auth::id())->update([
+            'password' => Hash::make($request->get('password'))
+        ]);
+
+        return redirect()->route('home', ['msg' => 5]);
     }
 }
diff --git a/app/Http/Controllers/LearnController.php b/app/Http/Controllers/LearnController.php
new file mode 100644
index 0000000000000000000000000000000000000000..021bfba1fe41d93bb61c0f21a17bd48c91a79870
--- /dev/null
+++ b/app/Http/Controllers/LearnController.php
@@ -0,0 +1,238 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Auth;
+use Google_Client;
+
+class LearnController 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($id_course, $id_topic)
+    {
+        if (Auth::user()->role == 1) {
+            return redirect()->route('course', ['id_course' => $id_course, 'msg' => 6]);
+        }
+
+        $topic = DB::table('topics')->where('id', $id_topic)->first();
+        $cells = DB::table('spreadsheets')->where('id', $id_topic)->get();
+        $ranges = [];
+        foreach($cells as $cell) {
+            $ranges[] = 'Sheet1!' . $cell->cell;
+        }
+        $content = $topic->content;
+
+        $client = LearnController::getClient();
+        $service = new \Google_Service_Drive($client);
+        $copy = new \Google_Service_Drive_DriveFile();
+
+        $response = $service->files->copy($topic->id_spreadsheet, $copy);
+
+        $permission_response = LearnController::edit_permission($response->id);
+        
+        // Clear Answer
+        $requestBody = new \Google_Service_Sheets_BatchClearValuesRequest([
+            'ranges' => $ranges
+        ]);
+        
+        $service2 = new \Google_Service_Sheets($client);
+        $response2 = $service2->spreadsheets_values->batchClear($response->id, $requestBody);
+
+        return view('learn', ['topic_name' => $topic->name, 'id_course' => $id_course, 'id_spreadsheet' => $response->id, 'content' => $content]);
+    }
+
+    /**
+     * Create new Spreadsheet.
+     *
+     * @return id_spreadsheet
+     */
+    public function new($id_course, Request $request)
+    {
+        // Initialize
+        $client = LearnController::getClient();
+        $service = new \Google_Service_Sheets($client);
+
+        // Create Spreadsheet
+        $spreadsheet = new \Google_Service_Sheets_Spreadsheet([
+            'properties' => [
+                'title' => $request->topic_name
+            ]
+        ]);
+        $response = $service->spreadsheets->create($spreadsheet, ['fields' => 'spreadsheetId']);
+
+        $permission_response = LearnController::edit_permission($response->spreadsheetId);
+
+        if (empty($response->spreadsheetId)) {
+            $msg = 0;
+        } else {
+            $msg = 1;
+            DB::table('topics')->insert([
+                'id_course' => $id_course,
+                'name' => $request->topic_name,
+                'description' => $request->topic_description,
+                'content' => '',
+                'id_spreadsheet' => $response->spreadsheetId
+            ]);
+        }
+        return redirect()->route('course', ['id_course' => $id_course, 'msg' => $msg]);
+    }
+
+    /**
+     * Delete Topic.
+     *
+     * @return msg
+     */
+    public function delete($id_course, $id_topic)
+    {
+        DB::table('spreadsheets')->where('id', $id_topic)->delete();
+        DB::table('grades')->where('id_topic', $id_topic)->delete();
+        DB::table('topics')->where('id', $id_topic)->delete();
+        
+        return redirect()->route('course', ['id_course' => $id_course, 'msg' => 3]);
+    }
+
+    /**
+     * Edit Permission.
+     *
+     * @return response
+     */
+    public function edit_permission($id)
+    {
+        $client = LearnController::getClient();
+        $service = new \Google_Service_Drive($client);
+        $permission = new \Google_Service_Drive_Permission([
+            'role' => 'writer',
+            'type' => 'anyone'
+        ]);
+        $response = $service->permissions->create($id, $permission);
+
+        return $response;
+    }
+
+    /**
+     * Edit Spreadsheet.
+     *
+     * @return view
+     */
+    public function edit($id_course, $id_topic)
+    {
+        if (Auth::user()->role == 0) {
+            return redirect()->route('course', ['id_course' => $id_course, 'msg' => 6]);
+        }
+
+        $enrolled = DB::table('user_course')->where('id_user', Auth::id())->get();
+        
+        $flag = 0;
+        $topic = DB::table('topics')->where('id', $id_topic)->first();
+        foreach($enrolled as $enroll) {
+            if ($enroll->id_course == $id_course and $topic->id_course == $enroll->id_course) {
+                $flag = 1;
+            }
+        }
+
+        if ($flag == 0) {
+            return redirect()->route('course', ['id_course' => $id_course, 'msg' => 6]);
+        }
+
+        $cells = DB::table('spreadsheets')->where('id', $id_topic)->get();
+
+        return view('edit', ['cells' => $cells, 'id_course' => $id_course, 'id_spreadsheet' => $topic->id_spreadsheet, 'topic' => $topic]);
+    }
+
+    /**
+     * Save Spreadsheet.
+     *
+     * @return message
+     */
+    public function save($id_course, $id_topic, Request $request)
+    {
+        $cells = [];
+        foreach ($request->cells as $cell) {
+            $cells[] = strtoupper($cell);
+        }
+
+        $client = LearnController::getClient();
+        $service = new \Google_Service_Sheets($client);
+
+        // Get Answer Formula
+        $responses = $service->spreadsheets_values->batchGet($request->id_spreadsheet, [
+            'valueRenderOption' => 'FORMULA',
+            'dateTimeRenderOption' => 'SERIAL_NUMBER',
+            'ranges' => $cells
+        ]);
+
+        $answers = [];
+        foreach ($responses->valueRanges as $response) {
+            if ($response->values == NULL) {
+                $answers[] = NULL;
+            } else {
+                $answers[] = strtoupper(strval(($response->values)[0][0]));
+            }
+        }
+
+        // Get Answer Value
+        $responses2 = $service->spreadsheets_values->batchGet($request->id_spreadsheet, [
+            'valueRenderOption' => 'FORMATTED_VALUE',
+            'dateTimeRenderOption' => 'SERIAL_NUMBER',
+            'ranges' => $cells
+        ]);
+
+        $answers2 = [];
+        foreach ($responses2->valueRanges as $response) {
+            if ($response->values == NULL) {
+                $answers2[] = NULL;
+            } else {
+                $answers2[] = strtoupper(strval(($response->values)[0][0]));
+            }
+        }
+
+        // Save to Database
+        DB::table('spreadsheets')->where('id',$id_topic)->delete();
+        for ($i=0; $i<count($answers); $i++) {
+            DB::table('spreadsheets')->insert([
+                'id' => $id_topic,
+                'cell' => $cells[$i],
+                'value' => $answers2[$i],
+                'formula' => $answers[$i]
+            ]);   
+        }
+
+        DB::table('topics')->where('id', $id_topic)->update([
+            'content' => $request->rich_text,
+        ]);
+
+        return redirect()->route('course', ['id_course' => $id_course, 'msg' => 2]);
+    }
+
+    /**
+     * Returns an authorized API client.
+     * @return Google_Client the authorized client object
+     */
+    public function getClient()
+    {
+        $client = new Google_Client();
+        $client->setApplicationName('Datalearn');
+        $client->setAuthConfig(__DIR__.'/credentials.json');
+        $client->addScope(\Google_Service_Sheets::SPREADSHEETS);
+        $client->addScope(\Google_Service_Sheets::DRIVE);
+        $client->setAccessType('offline');
+
+        return $client;
+    }
+}
diff --git a/app/Http/Requests/UpdatePasswordRequest.php b/app/Http/Requests/UpdatePasswordRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5f3d90427144f9ebbac0a8f892f5f9cb1fc67f79
--- /dev/null
+++ b/app/Http/Requests/UpdatePasswordRequest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Support\Facades\Auth;
+
+class UpdatePasswordRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     *
+     * @return bool
+     */
+    public function authorize()
+    {
+        return Auth::check();
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        return [
+            'password' => ['required', 'string', 'min:8', 'confirmed'],
+        ];
+    }
+}
diff --git a/app/User.php b/app/User.php
index e79dab7fea8f6601eaf07072ee6b12fbe20bdbe1..b5aabd6ede69bab226da638c8629786c18344dfb 100644
--- a/app/User.php
+++ b/app/User.php
@@ -16,7 +16,7 @@ class User extends Authenticatable
      * @var array
      */
     protected $fillable = [
-        'name', 'email', 'password',
+        'name', 'email', 'password', 'role',
     ];
 
     /**
diff --git a/composer.json b/composer.json
index 2ffde8300cfe37f5467d6e0daf1799b66d72cde9..126837d74289203308e826c9b23444f46f0051cb 100644
--- a/composer.json
+++ b/composer.json
@@ -10,8 +10,10 @@
     "require": {
         "php": "^7.2",
         "fideloper/proxy": "^4.0",
+        "google/apiclient": "2.0",
         "laravel/framework": "^6.2",
-        "laravel/tinker": "^2.0"
+        "laravel/tinker": "^2.0",
+        "monolog/monolog": "1.17"
     },
     "require-dev": {
         "facade/ignition": "^1.4",
diff --git a/composer.lock b/composer.lock
index 983e5bec5d385f3473104043c1cc68e3c74d4a0a..fb7baa2f9d6114cfc18797574893f862ddbb09f3 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "2b83301481fedaab4e4fb0c15ce4ec4f",
+    "content-hash": "432896b112566dbc214d7e89066edd36",
     "packages": [
         {
             "name": "dnoegel/php-xdg-base-dir",
@@ -335,78 +335,342 @@
             "time": "2020-02-22T01:51:47+00:00"
         },
         {
-            "name": "jakub-onderka/php-console-color",
-            "version": "v0.2",
+            "name": "firebase/php-jwt",
+            "version": "v3.0.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
-                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
+                "url": "https://github.com/firebase/php-jwt.git",
+                "reference": "fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
-                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
+                "url": "https://api.github.com/repos/firebase/php-jwt/zipball/fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1",
+                "reference": "fa8a06e96526eb7c0eeaa47e4f39be59d21f16e1",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.4.0"
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Firebase\\JWT\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Neuman Vong",
+                    "email": "neuman+pear@twilio.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Anant Narayanan",
+                    "email": "anant@php.net",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+            "homepage": "https://github.com/firebase/php-jwt",
+            "time": "2015-07-22T18:31:08+00:00"
+        },
+        {
+            "name": "google/apiclient",
+            "version": "v2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/googleapis/google-api-php-client.git",
+                "reference": "cd4d61678bc26267f3e5371735ae3f579709ea30"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/cd4d61678bc26267f3e5371735ae3f579709ea30",
+                "reference": "cd4d61678bc26267f3e5371735ae3f579709ea30",
+                "shasum": ""
+            },
+            "require": {
+                "firebase/php-jwt": "~2.0|~3.0",
+                "google/apiclient-services": "*@dev",
+                "google/auth": "0.8",
+                "guzzlehttp/guzzle": "~5.2|~6.0",
+                "guzzlehttp/psr7": "^1.2",
+                "monolog/monolog": "^1.17",
+                "php": ">=5.4",
+                "phpseclib/phpseclib": "~2.0"
             },
             "require-dev": {
-                "jakub-onderka/php-code-style": "1.0",
-                "jakub-onderka/php-parallel-lint": "1.0",
-                "jakub-onderka/php-var-dump-check": "0.*",
-                "phpunit/phpunit": "~4.3",
-                "squizlabs/php_codesniffer": "1.*"
+                "phpunit/phpunit": "~4",
+                "squizlabs/php_codesniffer": "~2.3",
+                "symfony/css-selector": "~2.1",
+                "symfony/dom-crawler": "~2.1",
+                "tedivm/stash": "^0.14.1"
+            },
+            "suggest": {
+                "tedivm/stash": "For caching certs and tokens (using Google_Client::setCache)"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.x-dev"
+                }
+            },
             "autoload": {
+                "psr-0": {
+                    "Google_": "src/"
+                },
+                "classmap": [
+                    "src/Google/Service/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "description": "Client library for Google APIs",
+            "homepage": "http://developers.google.com/api-client-library/php",
+            "keywords": [
+                "google"
+            ],
+            "time": "2016-06-08T01:30:25+00:00"
+        },
+        {
+            "name": "google/apiclient-services",
+            "version": "v0.129",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/googleapis/google-api-php-client-services.git",
+                "reference": "1b7d3bcd683603bcd42ea588923775a85a89222e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/1b7d3bcd683603bcd42ea588923775a85a89222e",
+                "reference": "1b7d3bcd683603bcd42ea588923775a85a89222e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8|^5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Google_Service_": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "description": "Client library for Google APIs",
+            "homepage": "http://developers.google.com/api-client-library/php",
+            "keywords": [
+                "google"
+            ],
+            "time": "2020-04-04T00:24:12+00:00"
+        },
+        {
+            "name": "google/auth",
+            "version": "v0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/googleapis/google-auth-library-php.git",
+                "reference": "ec4edcb043e523267973fda308d9412d7db78e17"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/ec4edcb043e523267973fda308d9412d7db78e17",
+                "reference": "ec4edcb043e523267973fda308d9412d7db78e17",
+                "shasum": ""
+            },
+            "require": {
+                "firebase/php-jwt": "~2.0|~3.0",
+                "guzzlehttp/guzzle": "~5.3|~6.0",
+                "guzzlehttp/psr7": "1.2.*",
+                "php": ">=5.4",
+                "psr/cache": "^1.0",
+                "psr/http-message": "^1.0"
+            },
+            "require-dev": {
+                "fabpot/php-cs-fixer": "^1.11",
+                "phpunit/phpunit": "3.7.*"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ],
                 "psr-4": {
-                    "JakubOnderka\\PhpConsoleColor\\": "src/"
+                    "Google\\Auth\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "BSD-2-Clause"
+                "Apache-2.0"
+            ],
+            "description": "Google Auth Library for PHP",
+            "homepage": "http://github.com/google/google-auth-library-php",
+            "keywords": [
+                "Authentication",
+                "google",
+                "oauth2"
+            ],
+            "time": "2016-05-11T16:56:35+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "6.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "d094e337976dff9d8e2424e8485872194e768662"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d094e337976dff9d8e2424e8485872194e768662",
+                "reference": "d094e337976dff9d8e2424e8485872194e768662",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/promises": "~1.0",
+                "guzzlehttp/psr7": "~1.1",
+                "php": ">=5.5.0"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "~4.0",
+                "psr/log": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.2-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
             ],
             "authors": [
                 {
-                    "name": "Jakub Onderka",
-                    "email": "jakub.onderka@gmail.com"
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
                 }
             ],
-            "time": "2018-09-29T17:23:10+00:00"
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "time": "2016-03-21T20:02:09+00:00"
         },
         {
-            "name": "jakub-onderka/php-console-highlighter",
-            "version": "v0.4",
+            "name": "guzzlehttp/promises",
+            "version": "v1.3.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
-                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
-                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
                 "shasum": ""
             },
             "require": {
-                "ext-tokenizer": "*",
-                "jakub-onderka/php-console-color": "~0.2",
-                "php": ">=5.4.0"
+                "php": ">=5.5.0"
             },
             "require-dev": {
-                "jakub-onderka/php-code-style": "~1.0",
-                "jakub-onderka/php-parallel-lint": "~1.0",
-                "jakub-onderka/php-var-dump-check": "~0.1",
-                "phpunit/phpunit": "~4.0",
-                "squizlabs/php_codesniffer": "~1.5"
+                "phpunit/phpunit": "^4.0"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
             "autoload": {
                 "psr-4": {
-                    "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
                 }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "time": "2016-12-20T10:07:11+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.2.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "2e89629ff057ebb49492ba08e6995d3a6a80021b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/2e89629ff057ebb49492ba08e6995d3a6a80021b",
+                "reference": "2e89629ff057ebb49492ba08e6995d3a6a80021b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -414,26 +678,32 @@
             ],
             "authors": [
                 {
-                    "name": "Jakub Onderka",
-                    "email": "acci@acci.cz",
-                    "homepage": "http://www.acci.cz/"
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
                 }
             ],
-            "description": "Highlight PHP code in terminal",
-            "time": "2018-09-29T18:48:56+00:00"
+            "description": "PSR-7 message implementation",
+            "keywords": [
+                "http",
+                "message",
+                "stream",
+                "uri"
+            ],
+            "time": "2016-02-18T21:54:00+00:00"
         },
         {
             "name": "laravel/framework",
-            "version": "v6.18.1",
+            "version": "v6.18.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/framework.git",
-                "reference": "367c2c8dfdfe83cb2ddbc029c0222174098d093a"
+                "reference": "4e48acfaba87f08320a2764d36c3b6a4a4112ccf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/framework/zipball/367c2c8dfdfe83cb2ddbc029c0222174098d093a",
-                "reference": "367c2c8dfdfe83cb2ddbc029c0222174098d093a",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/4e48acfaba87f08320a2764d36c3b6a4a4112ccf",
+                "reference": "4e48acfaba87f08320a2764d36c3b6a4a4112ccf",
                 "shasum": ""
             },
             "require": {
@@ -518,7 +788,7 @@
                 "ext-memcached": "Required to use the memcache cache driver.",
                 "ext-pcntl": "Required to use all features of the queue worker.",
                 "ext-posix": "Required to use all features of the queue worker.",
-                "ext-redis": "Required to use the Redis cache and queue drivers.",
+                "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
                 "filp/whoops": "Required for friendly error pages in development (^2.4).",
                 "fzaninotto/faker": "Required to use the eloquent factory builder (^1.9.1).",
                 "guzzlehttp/guzzle": "Required to use the Mailgun mail driver and the ping methods on schedules (^6.0|^7.0).",
@@ -566,28 +836,28 @@
                 "framework",
                 "laravel"
             ],
-            "time": "2020-03-10T14:11:04+00:00"
+            "time": "2020-03-24T16:37:50+00:00"
         },
         {
             "name": "laravel/tinker",
-            "version": "v2.2.0",
+            "version": "v2.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laravel/tinker.git",
-                "reference": "37579c93271ec30ef099dd633ec7c2de5e5fb112"
+                "reference": "5271893ec90ad9f8d3e34792ac6b72cad3b84cc2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laravel/tinker/zipball/37579c93271ec30ef099dd633ec7c2de5e5fb112",
-                "reference": "37579c93271ec30ef099dd633ec7c2de5e5fb112",
+                "url": "https://api.github.com/repos/laravel/tinker/zipball/5271893ec90ad9f8d3e34792ac6b72cad3b84cc2",
+                "reference": "5271893ec90ad9f8d3e34792ac6b72cad3b84cc2",
                 "shasum": ""
             },
             "require": {
-                "illuminate/console": "^6.0|^7.0",
-                "illuminate/contracts": "^6.0|^7.0",
-                "illuminate/support": "^6.0|^7.0",
+                "illuminate/console": "^6.0|^7.0|^8.0",
+                "illuminate/contracts": "^6.0|^7.0|^8.0",
+                "illuminate/support": "^6.0|^7.0|^8.0",
                 "php": "^7.2",
-                "psy/psysh": "^0.9",
+                "psy/psysh": "^0.9|^0.10",
                 "symfony/var-dumper": "^4.0|^5.0"
             },
             "require-dev": {
@@ -595,7 +865,7 @@
                 "phpunit/phpunit": "^8.0|^9.0"
             },
             "suggest": {
-                "illuminate/database": "The Illuminate Database package (^6.0|^7.0)."
+                "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)."
             },
             "type": "library",
             "extra": {
@@ -630,20 +900,20 @@
                 "laravel",
                 "psysh"
             ],
-            "time": "2020-02-05T15:00:44+00:00"
+            "time": "2020-03-17T15:34:59+00:00"
         },
         {
             "name": "league/commonmark",
-            "version": "1.3.1",
+            "version": "1.3.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/commonmark.git",
-                "reference": "8015f806173c6ee54de25a87c2d69736696e88db"
+                "reference": "5a67afc2572ec6d430526cdc9c637ef124812389"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/8015f806173c6ee54de25a87c2d69736696e88db",
-                "reference": "8015f806173c6ee54de25a87c2d69736696e88db",
+                "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/5a67afc2572ec6d430526cdc9c637ef124812389",
+                "reference": "5a67afc2572ec6d430526cdc9c637ef124812389",
                 "shasum": ""
             },
             "require": {
@@ -704,20 +974,20 @@
                 "md",
                 "parser"
             ],
-            "time": "2020-02-28T18:53:50+00:00"
+            "time": "2020-04-05T16:01:48+00:00"
         },
         {
             "name": "league/flysystem",
-            "version": "1.0.65",
+            "version": "1.0.66",
             "source": {
                 "type": "git",
                 "url": "https://github.com/thephpleague/flysystem.git",
-                "reference": "8f17b3ba67097aafb8318cd5c553b1acf7c891c8"
+                "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8f17b3ba67097aafb8318cd5c553b1acf7c891c8",
-                "reference": "8f17b3ba67097aafb8318cd5c553b1acf7c891c8",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/021569195e15f8209b1c4bebb78bd66aa4f08c21",
+                "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21",
                 "shasum": ""
             },
             "require": {
@@ -788,62 +1058,57 @@
                 "sftp",
                 "storage"
             ],
-            "time": "2020-03-08T18:53:20+00:00"
+            "time": "2020-03-17T18:58:12+00:00"
         },
         {
             "name": "monolog/monolog",
-            "version": "2.0.2",
+            "version": "1.17.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/Seldaek/monolog.git",
-                "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8"
+                "reference": "877ae631713cc961952df713ae785735b90df682"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c861fcba2ca29404dc9e617eedd9eff4616986b8",
-                "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/877ae631713cc961952df713ae785735b90df682",
+                "reference": "877ae631713cc961952df713ae785735b90df682",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.2",
-                "psr/log": "^1.0.1"
+                "php": ">=5.3.0",
+                "psr/log": "~1.0"
             },
             "provide": {
                 "psr/log-implementation": "1.0.0"
             },
             "require-dev": {
-                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "aws/aws-sdk-php": "^2.4.9",
                 "doctrine/couchdb": "~1.0@dev",
-                "elasticsearch/elasticsearch": "^6.0",
-                "graylog2/gelf-php": "^1.4.2",
-                "jakub-onderka/php-parallel-lint": "^0.9",
-                "php-amqplib/php-amqplib": "~2.4",
+                "graylog2/gelf-php": "~1.0",
                 "php-console/php-console": "^3.1.3",
-                "phpspec/prophecy": "^1.6.1",
-                "phpunit/phpunit": "^8.3",
-                "predis/predis": "^1.1",
-                "rollbar/rollbar": "^1.3",
+                "phpunit/phpunit": "~4.5",
+                "phpunit/phpunit-mock-objects": "2.3.0",
+                "raven/raven": "~0.11",
                 "ruflin/elastica": ">=0.90 <3.0",
-                "swiftmailer/swiftmailer": "^5.3|^6.0"
+                "swiftmailer/swiftmailer": "~5.3",
+                "videlalvaro/php-amqplib": "~2.4"
             },
             "suggest": {
                 "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
                 "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
-                "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
                 "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
-                "ext-mbstring": "Allow to work properly with unicode symbols",
-                "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+                "ext-mongo": "Allow sending log messages to a MongoDB server",
                 "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
-                "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
-                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
                 "php-console/php-console": "Allow sending log messages to Google Chrome",
+                "raven/raven": "Allow sending log messages to a Sentry server",
                 "rollbar/rollbar": "Allow sending log messages to Rollbar",
-                "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+                "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.x-dev"
+                    "dev-master": "1.16.x-dev"
                 }
             },
             "autoload": {
@@ -869,20 +1134,20 @@
                 "logging",
                 "psr-3"
             ],
-            "time": "2019-12-20T14:22:59+00:00"
+            "time": "2015-08-30T11:40:25+00:00"
         },
         {
             "name": "nesbot/carbon",
-            "version": "2.31.0",
+            "version": "2.32.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/briannesbitt/Carbon.git",
-                "reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d"
+                "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
-                "reference": "bbc0ab53f41a4c6f223c18efcdbd9bc725eb5d2d",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
+                "reference": "f10e22cf546704fab1db4ad4b9dedbc5c797a0dc",
                 "shasum": ""
             },
             "require": {
@@ -891,6 +1156,7 @@
                 "symfony/translation": "^3.4 || ^4.0 || ^5.0"
             },
             "require-dev": {
+                "doctrine/orm": "^2.7",
                 "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
                 "kylekatarnls/multi-tester": "^1.1",
                 "phpmd/phpmd": "^2.8",
@@ -939,7 +1205,7 @@
                 "datetime",
                 "time"
             ],
-            "time": "2020-03-01T11:11:58+00:00"
+            "time": "2020-03-31T13:43:19+00:00"
         },
         {
             "name": "nikic/php-parser",
@@ -1101,20 +1367,20 @@
         },
         {
             "name": "phpoption/phpoption",
-            "version": "1.7.2",
+            "version": "1.7.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/schmittjoh/php-option.git",
-                "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959"
+                "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959",
-                "reference": "77f7c4d2e65413aff5b5a8cc8b3caf7a28d81959",
+                "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/4acfd6a4b33a509d8c88f50e5222f734b6aeebae",
+                "reference": "4acfd6a4b33a509d8c88f50e5222f734b6aeebae",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.5.9 || ^7.0"
+                "php": "^5.5.9 || ^7.0 || ^8.0"
             },
             "require-dev": {
                 "bamarni/composer-bin-plugin": "^1.3",
@@ -1152,7 +1418,145 @@
                 "php",
                 "type"
             ],
-            "time": "2019-12-15T19:35:24+00:00"
+            "time": "2020-03-21T18:07:53+00:00"
+        },
+        {
+            "name": "phpseclib/phpseclib",
+            "version": "2.0.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpseclib/phpseclib.git",
+                "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
+                "reference": "34620af4df7d1988d8f0d7e91f6c8a3bf931d8dc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phing/phing": "~2.7",
+                "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
+                "sami/sami": "~2.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "suggest": {
+                "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+                "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+                "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+                "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "phpseclib/bootstrap.php"
+                ],
+                "psr-4": {
+                    "phpseclib\\": "phpseclib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jim Wigginton",
+                    "email": "terrafrost@php.net",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Patrick Monnerat",
+                    "email": "pm@datasphere.ch",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Andreas Fischer",
+                    "email": "bantu@phpbb.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Hans-Jürgen Petrich",
+                    "email": "petrich@tronic-media.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Graham Campbell",
+                    "email": "graham@alt-three.com",
+                    "role": "Developer"
+                }
+            ],
+            "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+            "homepage": "http://phpseclib.sourceforge.net",
+            "keywords": [
+                "BigInteger",
+                "aes",
+                "asn.1",
+                "asn1",
+                "blowfish",
+                "crypto",
+                "cryptography",
+                "encryption",
+                "rsa",
+                "security",
+                "sftp",
+                "signature",
+                "signing",
+                "ssh",
+                "twofish",
+                "x.509",
+                "x509"
+            ],
+            "time": "2020-04-04T23:17:33+00:00"
+        },
+        {
+            "name": "psr/cache",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/cache.git",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Cache\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for caching libraries",
+            "keywords": [
+                "cache",
+                "psr",
+                "psr-6"
+            ],
+            "time": "2016-08-06T20:24:11+00:00"
         },
         {
             "name": "psr/container",
@@ -1203,18 +1607,68 @@
             ],
             "time": "2017-02-14T16:28:37+00:00"
         },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "time": "2016-08-06T14:39:51+00:00"
+        },
         {
             "name": "psr/log",
-            "version": "1.1.2",
+            "version": "1.1.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/log.git",
-                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
-                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
                 "shasum": ""
             },
             "require": {
@@ -1248,7 +1702,7 @@
                 "psr",
                 "psr-3"
             ],
-            "time": "2019-11-01T11:05:21+00:00"
+            "time": "2020-03-23T09:12:05+00:00"
         },
         {
             "name": "psr/simple-cache",
@@ -1300,32 +1754,30 @@
         },
         {
             "name": "psy/psysh",
-            "version": "v0.9.12",
+            "version": "v0.10.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/bobthecow/psysh.git",
-                "reference": "90da7f37568aee36b116a030c5f99c915267edd4"
+                "reference": "2bde2fa03e05dff0aee834598b951d6fc7c6fe02"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/90da7f37568aee36b116a030c5f99c915267edd4",
-                "reference": "90da7f37568aee36b116a030c5f99c915267edd4",
+                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/2bde2fa03e05dff0aee834598b951d6fc7c6fe02",
+                "reference": "2bde2fa03e05dff0aee834598b951d6fc7c6fe02",
                 "shasum": ""
             },
             "require": {
                 "dnoegel/php-xdg-base-dir": "0.1.*",
                 "ext-json": "*",
                 "ext-tokenizer": "*",
-                "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*",
-                "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0",
-                "php": ">=5.4.0",
-                "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0|~5.0",
-                "symfony/var-dumper": "~2.7|~3.0|~4.0|~5.0"
+                "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3",
+                "php": "^8.0 || ^7.0 || ^5.5.9",
+                "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10",
+                "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7"
             },
             "require-dev": {
                 "bamarni/composer-bin-plugin": "^1.2",
-                "hoa/console": "~2.15|~3.16",
-                "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0"
+                "hoa/console": "3.17.*"
             },
             "suggest": {
                 "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
@@ -1340,7 +1792,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-develop": "0.9.x-dev"
+                    "dev-master": "0.10.x-dev"
                 }
             },
             "autoload": {
@@ -1370,7 +1822,7 @@
                 "interactive",
                 "shell"
             ],
-            "time": "2019-12-06T14:19:43+00:00"
+            "time": "2020-04-07T06:44:48+00:00"
         },
         {
             "name": "ramsey/uuid",
@@ -1523,16 +1975,16 @@
         },
         {
             "name": "symfony/console",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/console.git",
-                "reference": "4fa15ae7be74e53f6ec8c83ed403b97e23b665e9"
+                "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/console/zipball/4fa15ae7be74e53f6ec8c83ed403b97e23b665e9",
-                "reference": "4fa15ae7be74e53f6ec8c83ed403b97e23b665e9",
+                "url": "https://api.github.com/repos/symfony/console/zipball/10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
+                "reference": "10bb3ee3c97308869d53b3e3d03f6ac23ff985f7",
                 "shasum": ""
             },
             "require": {
@@ -1595,20 +2047,20 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-24T13:10:00+00:00"
+            "time": "2020-03-30T11:41:10+00:00"
         },
         {
             "name": "symfony/css-selector",
-            "version": "v5.0.5",
+            "version": "v5.0.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/css-selector.git",
-                "reference": "a0b51ba9938ccc206d9284de7eb527c2d4550b44"
+                "reference": "5f8d5271303dad260692ba73dfa21777d38e124e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/css-selector/zipball/a0b51ba9938ccc206d9284de7eb527c2d4550b44",
-                "reference": "a0b51ba9938ccc206d9284de7eb527c2d4550b44",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/5f8d5271303dad260692ba73dfa21777d38e124e",
+                "reference": "5f8d5271303dad260692ba73dfa21777d38e124e",
                 "shasum": ""
             },
             "require": {
@@ -1648,20 +2100,20 @@
             ],
             "description": "Symfony CssSelector Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-04T09:41:09+00:00"
+            "time": "2020-03-27T16:56:45+00:00"
         },
         {
             "name": "symfony/debug",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/debug.git",
-                "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21"
+                "reference": "346636d2cae417992ecfd761979b2ab98b339a45"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/debug/zipball/a980d87a659648980d89193fd8b7a7ca89d97d21",
-                "reference": "a980d87a659648980d89193fd8b7a7ca89d97d21",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/346636d2cae417992ecfd761979b2ab98b339a45",
+                "reference": "346636d2cae417992ecfd761979b2ab98b339a45",
                 "shasum": ""
             },
             "require": {
@@ -1704,20 +2156,20 @@
             ],
             "description": "Symfony Debug Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-23T14:41:43+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/error-handler",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/error-handler.git",
-                "reference": "89aa4b9ac6f1f35171b8621b24f60477312085be"
+                "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/error-handler/zipball/89aa4b9ac6f1f35171b8621b24f60477312085be",
-                "reference": "89aa4b9ac6f1f35171b8621b24f60477312085be",
+                "url": "https://api.github.com/repos/symfony/error-handler/zipball/7e9828fc98aa1cf27b422fe478a84f5b0abb7358",
+                "reference": "7e9828fc98aa1cf27b422fe478a84f5b0abb7358",
                 "shasum": ""
             },
             "require": {
@@ -1760,20 +2212,20 @@
             ],
             "description": "Symfony ErrorHandler Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-26T11:45:31+00:00"
+            "time": "2020-03-30T14:07:33+00:00"
         },
         {
             "name": "symfony/event-dispatcher",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/event-dispatcher.git",
-                "reference": "4ad8e149799d3128621a3a1f70e92b9897a8930d"
+                "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4ad8e149799d3128621a3a1f70e92b9897a8930d",
-                "reference": "4ad8e149799d3128621a3a1f70e92b9897a8930d",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abc8e3618bfdb55e44c8c6a00abd333f831bbfed",
+                "reference": "abc8e3618bfdb55e44c8c6a00abd333f831bbfed",
                 "shasum": ""
             },
             "require": {
@@ -1830,7 +2282,7 @@
             ],
             "description": "Symfony EventDispatcher Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-04T09:32:40+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/event-dispatcher-contracts",
@@ -1892,16 +2344,16 @@
         },
         {
             "name": "symfony/finder",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/finder.git",
-                "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357"
+                "reference": "5729f943f9854c5781984ed4907bbb817735776b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/finder/zipball/ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
-                "reference": "ea69c129aed9fdeca781d4b77eb20b62cf5d5357",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/5729f943f9854c5781984ed4907bbb817735776b",
+                "reference": "5729f943f9854c5781984ed4907bbb817735776b",
                 "shasum": ""
             },
             "require": {
@@ -1937,20 +2389,20 @@
             ],
             "description": "Symfony Finder Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-14T07:42:58+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/http-foundation",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-foundation.git",
-                "reference": "7e41b4fcad4619535f45f8bfa7744c4f384e1648"
+                "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7e41b4fcad4619535f45f8bfa7744c4f384e1648",
-                "reference": "7e41b4fcad4619535f45f8bfa7744c4f384e1648",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/62f92509c9abfd1f73e17b8cf1b72c0bdac6611b",
+                "reference": "62f92509c9abfd1f73e17b8cf1b72c0bdac6611b",
                 "shasum": ""
             },
             "require": {
@@ -1992,20 +2444,20 @@
             ],
             "description": "Symfony HttpFoundation Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-13T19:40:01+00:00"
+            "time": "2020-03-30T14:07:33+00:00"
         },
         {
             "name": "symfony/http-kernel",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/http-kernel.git",
-                "reference": "8c8734486dada83a6041ab744709bdc1651a8462"
+                "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/8c8734486dada83a6041ab744709bdc1651a8462",
-                "reference": "8c8734486dada83a6041ab744709bdc1651a8462",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f356a489e51856b99908005eb7f2c51a1dfc95dc",
+                "reference": "f356a489e51856b99908005eb7f2c51a1dfc95dc",
                 "shasum": ""
             },
             "require": {
@@ -2082,20 +2534,20 @@
             ],
             "description": "Symfony HttpKernel Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-29T10:31:38+00:00"
+            "time": "2020-03-30T14:59:15+00:00"
         },
         {
             "name": "symfony/mime",
-            "version": "v5.0.5",
+            "version": "v5.0.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/mime.git",
-                "reference": "9b3e5b5e58c56bbd76628c952d2b78556d305f3c"
+                "reference": "481b7d6da88922fb1e0d86a943987722b08f3955"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/mime/zipball/9b3e5b5e58c56bbd76628c952d2b78556d305f3c",
-                "reference": "9b3e5b5e58c56bbd76628c952d2b78556d305f3c",
+                "url": "https://api.github.com/repos/symfony/mime/zipball/481b7d6da88922fb1e0d86a943987722b08f3955",
+                "reference": "481b7d6da88922fb1e0d86a943987722b08f3955",
                 "shasum": ""
             },
             "require": {
@@ -2144,20 +2596,20 @@
                 "mime",
                 "mime-type"
             ],
-            "time": "2020-02-04T09:41:09+00:00"
+            "time": "2020-03-27T16:56:45+00:00"
         },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38"
+                "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/fbdeaec0df06cf3d51c93de80c7eb76e271f5a38",
-                "reference": "fbdeaec0df06cf3d51c93de80c7eb76e271f5a38",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
+                "reference": "4719fa9c18b0464d399f1a63bf624b42b6fa8d14",
                 "shasum": ""
             },
             "require": {
@@ -2169,7 +2621,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.14-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
@@ -2202,20 +2654,20 @@
                 "polyfill",
                 "portable"
             ],
-            "time": "2020-01-13T11:15:53+00:00"
+            "time": "2020-02-27T09:26:54+00:00"
         },
         {
             "name": "symfony/polyfill-iconv",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-iconv.git",
-                "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e"
+                "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/926832ce51059bb58211b7b2080a88e0c3b5328e",
-                "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e",
+                "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/ad6d62792bfbcfc385dd34b424d4fcf9712a32c8",
+                "reference": "ad6d62792bfbcfc385dd34b424d4fcf9712a32c8",
                 "shasum": ""
             },
             "require": {
@@ -2227,7 +2679,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.14-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
@@ -2261,20 +2713,20 @@
                 "portable",
                 "shim"
             ],
-            "time": "2020-01-13T11:15:53+00:00"
+            "time": "2020-03-09T19:04:49+00:00"
         },
         {
             "name": "symfony/polyfill-intl-idn",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-intl-idn.git",
-                "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a"
+                "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a",
-                "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a",
+                "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
+                "reference": "47bd6aa45beb1cd7c6a16b7d1810133b728bdfcf",
                 "shasum": ""
             },
             "require": {
@@ -2288,7 +2740,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.14-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
@@ -2323,20 +2775,20 @@
                 "portable",
                 "shim"
             ],
-            "time": "2020-01-17T12:01:36+00:00"
+            "time": "2020-03-09T19:04:49+00:00"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2"
+                "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2",
-                "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
+                "reference": "81ffd3a9c6d707be22e3012b827de1c9775fc5ac",
                 "shasum": ""
             },
             "require": {
@@ -2348,7 +2800,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.14-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
@@ -2382,20 +2834,20 @@
                 "portable",
                 "shim"
             ],
-            "time": "2020-01-13T11:15:53+00:00"
+            "time": "2020-03-09T19:04:49+00:00"
         },
         {
             "name": "symfony/polyfill-php72",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php72.git",
-                "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf"
+                "reference": "37b0976c78b94856543260ce09b460a7bc852747"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf",
-                "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf",
+                "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/37b0976c78b94856543260ce09b460a7bc852747",
+                "reference": "37b0976c78b94856543260ce09b460a7bc852747",
                 "shasum": ""
             },
             "require": {
@@ -2404,7 +2856,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.14-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
@@ -2437,20 +2889,20 @@
                 "portable",
                 "shim"
             ],
-            "time": "2020-01-13T11:15:53+00:00"
+            "time": "2020-02-27T09:26:54+00:00"
         },
         {
             "name": "symfony/polyfill-php73",
-            "version": "v1.14.0",
+            "version": "v1.15.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php73.git",
-                "reference": "5e66a0fa1070bf46bec4bea7962d285108edd675"
+                "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/5e66a0fa1070bf46bec4bea7962d285108edd675",
-                "reference": "5e66a0fa1070bf46bec4bea7962d285108edd675",
+                "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
+                "reference": "0f27e9f464ea3da33cbe7ca3bdf4eb66def9d0f7",
                 "shasum": ""
             },
             "require": {
@@ -2459,7 +2911,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.14-dev"
+                    "dev-master": "1.15-dev"
                 }
             },
             "autoload": {
@@ -2495,20 +2947,20 @@
                 "portable",
                 "shim"
             ],
-            "time": "2020-01-13T11:15:53+00:00"
+            "time": "2020-02-27T09:26:54+00:00"
         },
         {
             "name": "symfony/process",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/process.git",
-                "reference": "bf9166bac906c9e69fb7a11d94875e7ced97bcd7"
+                "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/process/zipball/bf9166bac906c9e69fb7a11d94875e7ced97bcd7",
-                "reference": "bf9166bac906c9e69fb7a11d94875e7ced97bcd7",
+                "url": "https://api.github.com/repos/symfony/process/zipball/3e40e87a20eaf83a1db825e1fa5097ae89042db3",
+                "reference": "3e40e87a20eaf83a1db825e1fa5097ae89042db3",
                 "shasum": ""
             },
             "require": {
@@ -2544,20 +2996,20 @@
             ],
             "description": "Symfony Process Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-07T20:06:44+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/routing",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/routing.git",
-                "reference": "4124d621d0e445732520037f888a0456951bde8c"
+                "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/routing/zipball/4124d621d0e445732520037f888a0456951bde8c",
-                "reference": "4124d621d0e445732520037f888a0456951bde8c",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/0f562fa613e288d7dbae6c63abbc9b33ed75a8f8",
+                "reference": "0f562fa613e288d7dbae6c63abbc9b33ed75a8f8",
                 "shasum": ""
             },
             "require": {
@@ -2620,7 +3072,7 @@
                 "uri",
                 "url"
             ],
-            "time": "2020-02-25T12:41:09+00:00"
+            "time": "2020-03-30T11:41:10+00:00"
         },
         {
             "name": "symfony/service-contracts",
@@ -2682,16 +3134,16 @@
         },
         {
             "name": "symfony/translation",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/translation.git",
-                "reference": "0a19a77fba20818a969ef03fdaf1602de0546353"
+                "reference": "4e54d336f2eca5facad449d0b0118bb449375b76"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/translation/zipball/0a19a77fba20818a969ef03fdaf1602de0546353",
-                "reference": "0a19a77fba20818a969ef03fdaf1602de0546353",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/4e54d336f2eca5facad449d0b0118bb449375b76",
+                "reference": "4e54d336f2eca5facad449d0b0118bb449375b76",
                 "shasum": ""
             },
             "require": {
@@ -2754,7 +3206,7 @@
             ],
             "description": "Symfony Translation Component",
             "homepage": "https://symfony.com",
-            "time": "2020-02-04T09:32:40+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "symfony/translation-contracts",
@@ -2815,16 +3267,16 @@
         },
         {
             "name": "symfony/var-dumper",
-            "version": "v4.4.5",
+            "version": "v4.4.7",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/var-dumper.git",
-                "reference": "2572839911702b0405479410ea7a1334bfab0b96"
+                "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2572839911702b0405479410ea7a1334bfab0b96",
-                "reference": "2572839911702b0405479410ea7a1334bfab0b96",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/5a0c2d93006131a36cf6f767d10e2ca8333b0d4a",
+                "reference": "5a0c2d93006131a36cf6f767d10e2ca8333b0d4a",
                 "shasum": ""
             },
             "require": {
@@ -2887,7 +3339,7 @@
                 "debug",
                 "dump"
             ],
-            "time": "2020-02-24T13:10:00+00:00"
+            "time": "2020-03-27T16:54:36+00:00"
         },
         {
             "name": "tijsverkoyen/css-to-inline-styles",
@@ -2940,16 +3392,16 @@
         },
         {
             "name": "vlucas/phpdotenv",
-            "version": "v3.6.0",
+            "version": "v3.6.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/vlucas/phpdotenv.git",
-                "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156"
+                "reference": "786a947e57086cf236cefdee80784634224b99fa"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1bdf24f065975594f6a117f0f1f6cabf1333b156",
-                "reference": "1bdf24f065975594f6a117f0f1f6cabf1333b156",
+                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/786a947e57086cf236cefdee80784634224b99fa",
+                "reference": "786a947e57086cf236cefdee80784634224b99fa",
                 "shasum": ""
             },
             "require": {
@@ -2958,8 +3410,14 @@
                 "symfony/polyfill-ctype": "^1.9"
             },
             "require-dev": {
+                "ext-filter": "*",
+                "ext-pcre": "*",
                 "phpunit/phpunit": "^4.8.35 || ^5.0 || ^6.0 || ^7.0"
             },
+            "suggest": {
+                "ext-filter": "Required to use the boolean validator.",
+                "ext-pcre": "Required to use most of the library."
+            },
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -2993,7 +3451,7 @@
                 "env",
                 "environment"
             ],
-            "time": "2019-09-10T21:37:39+00:00"
+            "time": "2020-03-27T23:36:02+00:00"
         }
     ],
     "packages-dev": [
@@ -3381,6 +3839,96 @@
             ],
             "time": "2016-01-20T08:20:44+00:00"
         },
+        {
+            "name": "jakub-onderka/php-console-color",
+            "version": "v0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
+                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
+                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "jakub-onderka/php-code-style": "1.0",
+                "jakub-onderka/php-parallel-lint": "1.0",
+                "jakub-onderka/php-var-dump-check": "0.*",
+                "phpunit/phpunit": "~4.3",
+                "squizlabs/php_codesniffer": "1.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JakubOnderka\\PhpConsoleColor\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "jakub.onderka@gmail.com"
+                }
+            ],
+            "abandoned": "php-parallel-lint/php-console-color",
+            "time": "2018-09-29T17:23:10+00:00"
+        },
+        {
+            "name": "jakub-onderka/php-console-highlighter",
+            "version": "v0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
+                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
+                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "jakub-onderka/php-console-color": "~0.2",
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "jakub-onderka/php-code-style": "~1.0",
+                "jakub-onderka/php-parallel-lint": "~1.0",
+                "jakub-onderka/php-var-dump-check": "~0.1",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~1.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "acci@acci.cz",
+                    "homepage": "http://www.acci.cz/"
+                }
+            ],
+            "description": "Highlight PHP code in terminal",
+            "abandoned": "php-parallel-lint/php-console-highlighter",
+            "time": "2018-09-29T18:48:56+00:00"
+        },
         {
             "name": "laravel/ui",
             "version": "v1.0.0",
@@ -4185,16 +4733,16 @@
         },
         {
             "name": "phpunit/phpunit",
-            "version": "8.5.2",
+            "version": "8.5.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0"
+                "reference": "67750516bc02f300e2742fed2f50177f8f37bedf"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
-                "reference": "018b6ac3c8ab20916db85fa91bf6465acb64d1e0",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/67750516bc02f300e2742fed2f50177f8f37bedf",
+                "reference": "67750516bc02f300e2742fed2f50177f8f37bedf",
                 "shasum": ""
             },
             "require": {
@@ -4264,7 +4812,7 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2020-01-08T08:49:49+00:00"
+            "time": "2020-03-31T08:52:04+00:00"
         },
         {
             "name": "scrivo/highlight.php",
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
index 741edead6192a670fb2b10e4fbf303ab2ab3be12..3618ad9af9a8f08271e4fc97dab0e047e034e890 100644
--- a/database/factories/UserFactory.php
+++ b/database/factories/UserFactory.php
@@ -23,6 +23,7 @@ $factory->define(User::class, function (Faker $faker) {
         'email' => $faker->unique()->safeEmail,
         'email_verified_at' => now(),
         'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
+        'role' => 'member',
         'remember_token' => Str::random(10),
     ];
 });
diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php
index a91e1d3c4baed140741e1eb20305b2f13f6ee468..0a12b85e6c7f35c0e7196b1aa672791cb5a4f4e5 100644
--- a/database/migrations/2014_10_12_000000_create_users_table.php
+++ b/database/migrations/2014_10_12_000000_create_users_table.php
@@ -19,6 +19,7 @@ class CreateUsersTable extends Migration
             $table->string('email')->unique();
             $table->timestamp('email_verified_at')->nullable();
             $table->string('password');
+            $table->integer('role');
             $table->rememberToken();
             $table->timestamps();
         });
diff --git a/database/migrations/2020_03_11_190605_create_courses_table.php b/database/migrations/2020_03_11_190605_create_courses_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..47bc50864d257a6ce1271f3e11eac537f5efe7df
--- /dev/null
+++ b/database/migrations/2020_03_11_190605_create_courses_table.php
@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateCoursesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('courses', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->string('name');
+            $table->longText('description');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('courses');
+    }
+}
diff --git a/database/migrations/2020_03_11_190629_create_topics_table.php b/database/migrations/2020_03_11_190629_create_topics_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..ced5d3df5740c2b5e2df55bb5b9654e57f9e4543
--- /dev/null
+++ b/database/migrations/2020_03_11_190629_create_topics_table.php
@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateTopicsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('topics', function (Blueprint $table) {
+            $table->bigIncrements('id');
+            $table->bigInteger('id_course')->unsigned();
+            $table->string('name');
+            $table->longText('description');
+            $table->longText('content');
+            $table->string('id_spreadsheet');
+
+            $table->foreign('id_course')->references('id')->on('courses');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('topics');
+    }
+}
diff --git a/database/migrations/2020_03_11_190641_create_spreadsheets_table.php b/database/migrations/2020_03_11_190641_create_spreadsheets_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..b3ab39ab6c83a7de5fb3407a1a66742a3a3344f1
--- /dev/null
+++ b/database/migrations/2020_03_11_190641_create_spreadsheets_table.php
@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateSpreadsheetsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('spreadsheets', function (Blueprint $table) {
+            $table->bigInteger('id')->unsigned();
+            $table->string('cell');
+            $table->string('value');
+            $table->string('formula');
+
+            $table->primary(['id', 'cell']);
+            $table->foreign('id')->references('id')->on('topics');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('spreadsheets');
+    }
+}
diff --git a/database/migrations/2020_03_11_190651_create_grades_table.php b/database/migrations/2020_03_11_190651_create_grades_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..048825747cb7ce489c4dd98c2f5dee832ba1faa7
--- /dev/null
+++ b/database/migrations/2020_03_11_190651_create_grades_table.php
@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateGradesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('grades', function (Blueprint $table) {
+            $table->bigInteger('id_course')->unsigned();
+            $table->bigInteger('id_user')->unsigned();
+            $table->bigInteger('id_topic')->unsigned();
+            $table->double('grade', 8, 2);
+
+            $table->primary(['id_course', 'id_user', 'id_topic']);
+
+            $table->foreign('id_course')->references('id')->on('courses');
+            $table->foreign('id_user')->references('id')->on('users');
+            $table->foreign('id_topic')->references('id')->on('topics');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('grades');
+    }
+}
diff --git a/database/migrations/2020_03_11_190702_create_user_course_table.php b/database/migrations/2020_03_11_190702_create_user_course_table.php
new file mode 100644
index 0000000000000000000000000000000000000000..62195545fb4eab3c80b902b2880f450d40a4b7f2
--- /dev/null
+++ b/database/migrations/2020_03_11_190702_create_user_course_table.php
@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateUserCourseTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('user_course', function (Blueprint $table) {
+            $table->bigInteger('id_user')->unsigned();
+            $table->bigInteger('id_course')->unsigned();
+
+            $table->primary(['id_user', 'id_course']);
+
+            $table->foreign('id_user')->references('id')->on('users');
+            $table->foreign('id_course')->references('id')->on('courses');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('user_course');
+    }
+}
diff --git a/database/seeds/CoursesTableSeeder.php b/database/seeds/CoursesTableSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..6eba673131eb1e0b8caee2e2505de14a65f0be9a
--- /dev/null
+++ b/database/seeds/CoursesTableSeeder.php
@@ -0,0 +1,27 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class CoursesTableSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        DB::table('courses')->insert([
+        	'name' => 'Pengenalan Spreadsheet',
+        	'description' => 'Belajar pengenalan terkait spreadsheet dari hal yang paling dasar. Cocok untuk anda yang ingin mendalami spreadsheet.'
+        ]);
+        DB::table('courses')->insert([
+        	'name' => 'Spreadsheet Expert',
+        	'description' => 'Belajar spreadsheet untuk level menengah. Cocok untuk anda yang ingin mendalami spreadsheet.'
+        ]);
+        DB::table('courses')->insert([
+        	'name' => 'Data Analisis',
+        	'description' => 'Belajar data analisis menggunakan spreadsheet. Cocok untuk anda pecinta data.'
+        ]);
+    }
+}
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
index 91cb6d1c2dede4151cd947c27d31f2faa7ab5a8b..c2e152521f3372db8e317e50867285d47df1480c 100644
--- a/database/seeds/DatabaseSeeder.php
+++ b/database/seeds/DatabaseSeeder.php
@@ -11,6 +11,10 @@ class DatabaseSeeder extends Seeder
      */
     public function run()
     {
-        // $this->call(UsersTableSeeder::class);
+        $this->call(UsersTableSeeder::class);
+        $this->call(CoursesTableSeeder::class);
+        $this->call(TopicsTableSeeder::class);
+        $this->call(SpreadsheetsTableSeeder::class);
+        $this->call(User_CourseTableSeeder::Class);
     }
 }
diff --git a/database/seeds/SpreadsheetsTableSeeder.php b/database/seeds/SpreadsheetsTableSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..50c2f53fa1cfc8c58169a7076611a7fc73918452
--- /dev/null
+++ b/database/seeds/SpreadsheetsTableSeeder.php
@@ -0,0 +1,21 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class SpreadsheetsTableSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        DB::table('spreadsheets')->insert([
+            'id' => 1,
+            'cell' => 'A1',
+            'value' => '23',
+            'type' => 0
+        ]);
+    }
+}
diff --git a/database/seeds/TopicsTableSeeder.php b/database/seeds/TopicsTableSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfda993bf1afc9206d3c5b8403684b5634bfd43b
--- /dev/null
+++ b/database/seeds/TopicsTableSeeder.php
@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class TopicsTableSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        DB::table('topics')->insert([
+            'id_course' => 1,
+            'name' => 'Baris dan Kolom',
+            'content' => 'Baris adalah blabalbalbalbalbala. Kolom adalah blabalbalblablala.',
+            'id_spreadsheet' => 'null'
+        ]);
+        DB::table('topics')->insert([
+            'id_course' => 1,
+            'name' => 'Formula',
+            'content' => 'Formula adalah blabalbalblablala.',
+            'id_spreadsheet' => 'null'
+        ]);
+        DB::table('topics')->insert([
+            'id_course' => 2,
+            'name' => 'Average',
+            'content' => 'Average adalah salah satu....',
+            'id_spreadsheet' => 'null'
+        ]);
+    }
+}
diff --git a/database/seeds/User_CourseTableSeeder.php b/database/seeds/User_CourseTableSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..61a403eebfd54621ff497d5a65dafee4107672c7
--- /dev/null
+++ b/database/seeds/User_CourseTableSeeder.php
@@ -0,0 +1,45 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class User_CourseTableSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        DB::table('user_course')->insert([
+        	'id_user' => 5,
+            'id_course' => 1,
+            'role' => 1
+        ]);
+        DB::table('user_course')->insert([
+        	'id_user' => 5,
+            'id_course' => 2,
+            'role' => 1
+        ]);
+        DB::table('user_course')->insert([
+        	'id_user' => 6,
+            'id_course' => 3,
+            'role' => 1
+        ]);
+        DB::table('user_course')->insert([
+        	'id_user' => 7,
+            'id_course' => 1,
+            'role' => 0
+        ]);
+        DB::table('user_course')->insert([
+        	'id_user' => 8,
+            'id_course' => 1,
+            'role' => 0
+        ]);
+        DB::table('user_course')->insert([
+        	'id_user' => 8,
+            'id_course' => 2,
+            'role' => 0
+        ]);
+    }
+}
diff --git a/database/seeds/UsersTableSeeder.php b/database/seeds/UsersTableSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..2bd63d58c17ac6a9a9649be158b9eef46556e4b7
--- /dev/null
+++ b/database/seeds/UsersTableSeeder.php
@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class UsersTableSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        DB::table('users')->insert([
+        	'name' => 'Kurniandha Sukma',
+        	'email' => 'kurnia@datalearn.com',
+        	'password' => '$2y$10$20J2FUYhL22ovKKs2Kdfguo4oWEeBfkMxZipexw1BEtIxds3GnT9S',
+        	'role' => 1
+        ]);
+        DB::table('users')->insert([
+        	'name' => 'Fanny Akbar',
+        	'email' => 'fanny@datalearn.com',
+        	'password' => '$2y$10$20J2FUYhL22ovKKs2Kdfguo4oWEeBfkMxZipexw1BEtIxds3GnT9S',
+        	'role' => 1
+        ]);
+        DB::table('users')->insert([
+        	'name' => 'Irfan Sanemi',
+        	'email' => 'irfan@datalearn.com',
+        	'password' => '$2y$10$20J2FUYhL22ovKKs2Kdfguo4oWEeBfkMxZipexw1BEtIxds3GnT9S',
+        	'role' => 0
+        ]);
+        DB::table('users')->insert([
+        	'name' => 'Jojo Andika',
+        	'email' => 'jojo@datalearn.com',
+        	'password' => '$2y$10$20J2FUYhL22ovKKs2Kdfguo4oWEeBfkMxZipexw1BEtIxds3GnT9S',
+        	'role' => 0
+        ]);
+    }
+}
diff --git a/public/css/app.css b/public/css/app.css
index 41395b9121d78dda793c3ea754da7c3c6ae99454..73d3d2b839a96a3ff7ea37a1fca2a7d94a776252 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -576,8 +576,8 @@ pre code {
 
 .container {
   width: 100%;
-  padding-right: 15px;
-  padding-left: 15px;
+  padding-right: 0px;
+  padding-left: 0px;
   margin-right: auto;
   margin-left: auto;
 }
@@ -5161,7 +5161,6 @@ input[type=button].btn-block {
   }
 
   .card-columns .card {
-    display: inline-block;
     width: 100%;
   }
 }
diff --git a/public/css/home.css b/public/css/home.css
new file mode 100644
index 0000000000000000000000000000000000000000..b8340a70cb50c7c47e9d731eaab1f86bcf921971
--- /dev/null
+++ b/public/css/home.css
@@ -0,0 +1,17 @@
+.profile {
+    display: inline-block;
+    text-align: center;
+}
+
+#profile-name {
+    font-weight: bold;
+    margin-top: 5rem;
+}
+
+#edit {
+    margin-top: 2rem;
+}
+
+.editpass {
+    float: left;
+}
\ No newline at end of file
diff --git a/public/img/course.png b/public/img/course.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd2747586fec9708659ff3747a487d3ccc559360
Binary files /dev/null and b/public/img/course.png differ
diff --git a/public/img/lecturer.png b/public/img/lecturer.png
new file mode 100644
index 0000000000000000000000000000000000000000..d6bc7ddf41334b5efac85d2f8acb1691ab3a07b1
Binary files /dev/null and b/public/img/lecturer.png differ
diff --git a/public/img/student.png b/public/img/student.png
new file mode 100644
index 0000000000000000000000000000000000000000..93885b8b734e43e8a7ba7f37d8f88245fffe6ae5
Binary files /dev/null and b/public/img/student.png differ
diff --git a/public/js/app.js b/public/js/app.js
index 1ab8b88d9536ca9bd1081185dd0622a5012a9fed..e21f2599fe3b66a5243e9382d56a944781742d05 100644
--- a/public/js/app.js
+++ b/public/js/app.js
@@ -1932,6 +1932,29 @@ __webpack_require__.r(__webpack_exports__);
 
 /***/ }),
 
+/***/ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Page.vue?vue&type=script&lang=js&":
+/*!***************************************************************************************************************************************************************!*\
+  !*** ./node_modules/babel-loader/lib??ref--4-0!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Page.vue?vue&type=script&lang=js& ***!
+  \***************************************************************************************************************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+//
+//
+//
+//
+//
+//
+/* harmony default export */ __webpack_exports__["default"] = ({
+  mounted: function mounted() {
+    console.log('Component mounted.');
+  }
+});
+
+/***/ }),
+
 /***/ "./node_modules/bootstrap/dist/js/bootstrap.js":
 /*!*****************************************************!*\
   !*** ./node_modules/bootstrap/dist/js/bootstrap.js ***!
@@ -37332,6 +37355,32 @@ render._withStripped = true
 
 
 
+/***/ }),
+
+/***/ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Page.vue?vue&type=template&id=524c0c0c&":
+/*!*******************************************************************************************************************************************************************************************************!*\
+  !*** ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./resources/js/components/Page.vue?vue&type=template&id=524c0c0c& ***!
+  \*******************************************************************************************************************************************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "render", function() { return render; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return staticRenderFns; });
+var render = function() {
+  var _vm = this
+  var _h = _vm.$createElement
+  var _c = _vm._self._c || _h
+  return _c("div", { staticClass: "container" }, [
+    _vm._v("\n    Hola bandung gregreg\n")
+  ])
+}
+var staticRenderFns = []
+render._withStripped = true
+
+
+
 /***/ }),
 
 /***/ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js":
@@ -49517,6 +49566,7 @@ window.Vue = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.common.
 // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))
 
 Vue.component('example-component', __webpack_require__(/*! ./components/ExampleComponent.vue */ "./resources/js/components/ExampleComponent.vue")["default"]);
+Vue.component('pagge', __webpack_require__(/*! ./components/Page.vue */ "./resources/js/components/Page.vue")["default"]);
 /**
  * Next, we will create a fresh Vue application instance and attach it to
  * the page. Then, you may begin adding components to this application
@@ -49654,6 +49704,75 @@ __webpack_require__.r(__webpack_exports__);
 
 
 
+/***/ }),
+
+/***/ "./resources/js/components/Page.vue":
+/*!******************************************!*\
+  !*** ./resources/js/components/Page.vue ***!
+  \******************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _Page_vue_vue_type_template_id_524c0c0c___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Page.vue?vue&type=template&id=524c0c0c& */ "./resources/js/components/Page.vue?vue&type=template&id=524c0c0c&");
+/* harmony import */ var _Page_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Page.vue?vue&type=script&lang=js& */ "./resources/js/components/Page.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ "./node_modules/vue-loader/lib/runtime/componentNormalizer.js");
+
+
+
+
+
+/* normalize component */
+
+var component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__["default"])(
+  _Page_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__["default"],
+  _Page_vue_vue_type_template_id_524c0c0c___WEBPACK_IMPORTED_MODULE_0__["render"],
+  _Page_vue_vue_type_template_id_524c0c0c___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"],
+  false,
+  null,
+  null,
+  null
+  
+)
+
+/* hot reload */
+if (false) { var api; }
+component.options.__file = "resources/js/components/Page.vue"
+/* harmony default export */ __webpack_exports__["default"] = (component.exports);
+
+/***/ }),
+
+/***/ "./resources/js/components/Page.vue?vue&type=script&lang=js&":
+/*!*******************************************************************!*\
+  !*** ./resources/js/components/Page.vue?vue&type=script&lang=js& ***!
+  \*******************************************************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Page_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/babel-loader/lib??ref--4-0!../../../node_modules/vue-loader/lib??vue-loader-options!./Page.vue?vue&type=script&lang=js& */ "./node_modules/babel-loader/lib/index.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Page.vue?vue&type=script&lang=js&");
+/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__["default"] = (_node_modules_babel_loader_lib_index_js_ref_4_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Page_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__["default"]); 
+
+/***/ }),
+
+/***/ "./resources/js/components/Page.vue?vue&type=template&id=524c0c0c&":
+/*!*************************************************************************!*\
+  !*** ./resources/js/components/Page.vue?vue&type=template&id=524c0c0c& ***!
+  \*************************************************************************/
+/*! exports provided: render, staticRenderFns */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Page_vue_vue_type_template_id_524c0c0c___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/vue-loader/lib??vue-loader-options!./Page.vue?vue&type=template&id=524c0c0c& */ "./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/vue-loader/lib/index.js?!./resources/js/components/Page.vue?vue&type=template&id=524c0c0c&");
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "render", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Page_vue_vue_type_template_id_524c0c0c___WEBPACK_IMPORTED_MODULE_0__["render"]; });
+
+/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "staticRenderFns", function() { return _node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_vue_loader_lib_index_js_vue_loader_options_Page_vue_vue_type_template_id_524c0c0c___WEBPACK_IMPORTED_MODULE_0__["staticRenderFns"]; });
+
+
+
 /***/ }),
 
 /***/ "./resources/sass/app.scss":
diff --git a/public/js/learn.js b/public/js/learn.js
new file mode 100644
index 0000000000000000000000000000000000000000..6d54322b9b2adf821986d368f6d59d0797914923
--- /dev/null
+++ b/public/js/learn.js
@@ -0,0 +1,33 @@
+function submit(id_spreadsheet, url) {
+    document.getElementById("submit").disabled = true;
+    document.getElementById("submit").style.display = "none";
+    document.getElementById("back").disabled = true;
+    document.getElementById("loading").style.display = "block";
+    var xmlhttp = new XMLHttpRequest();
+    xmlhttp.onreadystatechange = function() {
+        if (this.readyState == 4 && this.status == 200) {
+            document.getElementById("result-detail").innerHTML = this.responseText;
+            document.getElementById("submit").style.display = "block";
+            document.getElementById("loading").style.display = "none";
+            var x = document.getElementById("result");
+            if (x.style.display === "none") {
+                x.style.display = "block";
+            }
+        }
+    };
+    xmlhttp.open("POST", url, true);
+    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+    xmlhttp.setRequestHeader('X-CSRF-TOKEN', $('meta[name="csrf-token"]').attr('content'));
+    xmlhttp.send("id_spreadsheet=" + id_spreadsheet);
+}
+
+function setForm(number) {
+    if (number > 0) {
+        document.getElementById("cell-answers").innerHTML = '';
+        var str = "";
+        for (i=0; i<number; i++) {
+            str = str.concat('<div class="col-3" style="margin-bottom:1rem;"> <input type="text" name="cells[]" class="form-control"></div>');
+        }
+        document.getElementById("cell-answers").innerHTML = str;
+    }
+}
\ No newline at end of file
diff --git a/public/js/text.js b/public/js/text.js
new file mode 100644
index 0000000000000000000000000000000000000000..9232f5c7acfa8d8e7c2bb24a4ec206abf637b4cc
--- /dev/null
+++ b/public/js/text.js
@@ -0,0 +1,24 @@
+function iFrameOn(){
+	richTextField.document.designMode = 'On';
+}
+function iBold(){
+	richTextField.document.execCommand('bold',false,null); 
+}
+function iUnderline(){
+	richTextField.document.execCommand('underline',false,null);
+}
+function iItalic(){
+	richTextField.document.execCommand('italic',false,null); 
+}
+function iUnorderedList(){
+	richTextField.document.execCommand("InsertOrderedList", false,"newOL");
+}
+function iOrderedList(){
+	richTextField.document.execCommand("InsertUnorderedList", false,"newUL");
+}
+function submit_form(){
+	console.log(tinymce.get('rich').getContent({format : 'raw'}));
+	var theForm = document.getElementById("myform");
+	theForm.elements["myTextArea"].value = tinymce.get('rich').getContent({format : 'raw'});
+	theForm.submit();
+}
\ No newline at end of file
diff --git a/resources/js/app.js b/resources/js/app.js
index aa19e31aefbfc9439d0502dcf3718ffef8f02e37..ef6326b7bf756acde2147de8c84d55873d2f3744 100644
--- a/resources/js/app.js
+++ b/resources/js/app.js
@@ -20,6 +20,7 @@ window.Vue = require('vue');
 // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))
 
 Vue.component('example-component', require('./components/ExampleComponent.vue').default);
+Vue.component('pagge', require('./components/Page.vue').default);
 
 /**
  * Next, we will create a fresh Vue application instance and attach it to
diff --git a/resources/js/components/Page.vue b/resources/js/components/Page.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b4dc7af45dbe155a0d10b1ec0d0c86f289400ecb
--- /dev/null
+++ b/resources/js/components/Page.vue
@@ -0,0 +1,13 @@
+<template>
+    <div class="container">
+        Hola bandung gregreg
+    </div>
+</template>
+
+<script>
+    export default {
+        mounted() {
+            console.log('Component mounted.')
+        }
+    }
+</script>
\ No newline at end of file
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
index c12b97e57731b97b20bdacdc4710923f1ff5877f..09455ec24eefc5e5f9d6d155d40bd6291e29799a 100644
--- a/resources/views/auth/login.blade.php
+++ b/resources/views/auth/login.blade.php
@@ -12,7 +12,7 @@
                         @csrf
 
                         <div class="form-group row">
-                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
+                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('Alamat Email') }}</label>
 
                             <div class="col-md-6">
                                 <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
@@ -45,7 +45,7 @@
                                     <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
 
                                     <label class="form-check-label" for="remember">
-                                        {{ __('Remember Me') }}
+                                        {{ __('Ingat saya') }}
                                     </label>
                                 </div>
                             </div>
@@ -59,7 +59,7 @@
 
                                 @if (Route::has('password.request'))
                                     <a class="btn btn-link" href="{{ route('password.request') }}">
-                                        {{ __('Forgot Your Password?') }}
+                                        {{ __('Lupa Password?') }}
                                     </a>
                                 @endif
                             </div>
diff --git a/resources/views/auth/register.blade.php b/resources/views/auth/register.blade.php
index d236a48ecb6d7ffb0d4a4fb62d7be35a79019cac..378818db47ebe9a437804b47e01796321fe56db1 100644
--- a/resources/views/auth/register.blade.php
+++ b/resources/views/auth/register.blade.php
@@ -6,13 +6,12 @@
         <div class="col-md-8">
             <div class="card">
                 <div class="card-header">{{ __('Register') }}</div>
-
                 <div class="card-body">
                     <form method="POST" action="{{ route('register') }}">
                         @csrf
 
                         <div class="form-group row">
-                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
+                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Nama') }}</label>
 
                             <div class="col-md-6">
                                 <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@@ -26,7 +25,7 @@
                         </div>
 
                         <div class="form-group row">
-                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
+                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('Alamat Email') }}</label>
 
                             <div class="col-md-6">
                                 <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@@ -54,13 +53,27 @@
                         </div>
 
                         <div class="form-group row">
-                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
+                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Konfirmasi Password') }}</label>
 
                             <div class="col-md-6">
                                 <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
                             </div>
                         </div>
 
+                        <div class="form-group row">
+                            <label for="user-type" class="col-md-4 col-form-label text-md-right">{{ __('Daftar sebagai') }}</label>
+                            <div class="col-md-6" style="margin-top: 0.5rem;">
+                                <div class="form-check form-check-inline">
+                                <input class="form-check-input" type="radio" name="role" id="inlineRadio1" value="0">
+                                <label class="form-check-label" for="inlineRadio1">Siswa</label>
+                            </div>
+                            <div class="form-check form-check-inline">
+                                <input class="form-check-input" type="radio" name="role" id="inlineRadio2" value="1">
+                                <label class="form-check-label" for="inlineRadio2">Pengajar</label>
+                            </div>
+                            </div>
+                        </div>
+
                         <div class="form-group row mb-0">
                             <div class="col-md-6 offset-md-4">
                                 <button type="submit" class="btn btn-primary">
diff --git a/resources/views/course.blade.php b/resources/views/course.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2a6382577df828ec12bca3cf7b4e28df7e44f50
--- /dev/null
+++ b/resources/views/course.blade.php
@@ -0,0 +1,267 @@
+@extends('layouts.app')
+
+@section('content')
+<div class="container">
+@isset(request()->msg)
+    @if( request()->get('msg') == 1 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Pembuatan Materi Berhasil
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 2 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Perubahan Materi Berhasil Disimpan
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 3 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Materi Berhasil Dihapus
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 4 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Deskripsi Materi Berhasil Diubah
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 5 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Nama Kelas Berhasil Diubah
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 6 )
+        <div class="alert alert-warning alert-dismissible fade show" role="alert">
+            Akses Tidak Diperbolehkan
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @else
+        <div class="alert alert-danger alert-dismissible fade show" role="alert">
+            Pembuatan Materi Gagal
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @endif
+@endisset
+    <div class="row justify-content">
+        <div class="col-md-8">
+            <div class="card">
+                <div class="card-header bg-primary text-white"><b>Kelas {{ $course->name }}</b></div>
+                @if( count($topics) == 0 )
+                    <div class="card-body">Tidak ada Materi</div>
+                @endif
+                <div class="accordion-group" id="accordionTopics">
+                    @foreach($topics as $index => $topic)
+                        <div class="card">
+                            <div class="card-header" id="heading<?php echo $topic->id; ?>">
+                                <h6 class="mb-0">
+                                    <a data-toggle="collapse" aria-expanded="false" aria-controls="collapse<?php echo $topic->id; ?>">
+                                        <b>Materi {{ $index + 1 }}: {{ $topic->name }}</b>
+                                    </a>
+                                </h6>
+                            </div>
+                            <div id="collapse<?php echo $topic->id; ?>" class="collapse show" aria-labelledby="heading<?php echo $topic->id; ?>" data-parent="#accordionTopics">
+                                <div class="card-body">
+                                    {{ $topic->description }} <br/><br/>
+                                    @if(Auth::user()->role == 1)
+                                        <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteModal{{ $topic->id }}">Hapus</button>
+                                        <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#editModal{{ $topic->id }}">Edit Deskripsi</button>
+                                        <a style="float: right;" href="<?php echo $topic->id_course; ?>/learn/<?php echo $topic->id; ?>/edit" class="btn btn-primary" role="button">Isi Konten</a>
+                                        <div class="modal fade" id="deleteModal{{ $topic->id }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                                            <div class="modal-dialog modal-dialog-centered" role="document">
+                                                <div class="modal-content">
+                                                    <form action="{{ Request::url() }}/learn/{{ $topic->id }}/delete" method="post">
+                                                        {{ csrf_field() }}
+                                                        <div class="modal-header">
+                                                            <h5 class="modal-title" id="exampleModalCenterTitle">Hapus Materi</h5>
+                                                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                                            <span aria-hidden="true">&times;</span>
+                                                            </button>
+                                                        </div>
+                                                        <div class="modal-body">Apakah anda yakin menghapus materi <b>{{ $topic->name }}</b>?</div>
+                                                        <div class="modal-footer">
+                                                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                                            <button type="submit" class="btn btn-danger">Hapus Materi</button>
+                                                        </div>
+                                                    </form>
+                                                </div>
+                                            </div>
+                                        </div>
+                                        <div class="modal fade" id="editModal{{ $topic->id }}" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                                            <div class="modal-dialog modal-dialog-centered" role="document">
+                                                <div class="modal-content">
+                                                    <form action="<?php echo Request::url(); ?>/edit_topic/{{ $topic->id }}" method="post">
+                                                        {{ csrf_field() }}
+                                                        <div class="modal-header">
+                                                            <h5 class="modal-title" id="exampleModalCenterTitle">Edit Materi</h5>
+                                                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                                            <span aria-hidden="true">&times;</span>
+                                                            </button>
+                                                        </div>
+                                                        <div class="modal-body">
+                                                            <div class="form-group">
+                                                                <label for="topic-name" class="col-form-label">Edit Judul Materi</label>
+                                                                <input type="text" class="form-control" name="topic_name" id="topic-name" required="required" value="{{ $topic->name }}">
+                                                            </div>
+                                                            <div class="form-group">
+                                                                <label for="topic-description">Edit Deskripsi</label>
+                                                                <textarea class="form-control" name="topic_description" id="topic_description" rows="2">{{ $topic->description }}</textarea>
+                                                            </div>
+                                                        </div>
+                                                        <div class="modal-footer">
+                                                            <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                                            <button type="submit" class="btn btn-primary">Submit</button>
+                                                        </div>
+                                                    </form>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    @else
+                                        <a href="<?php echo $topic->id_course; ?>/learn/<?php echo $topic->id; ?>" class="btn btn-primary" role="button">Buka Materi</a>
+                                    @endif
+                                </div>
+                            </div>
+                        </div>
+                    @endforeach
+                </div> 
+            </div>
+            @if(Auth::user()->role == 1)
+                <br/>
+                <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteCourse">
+                    Hapus Kelas
+                </button>
+                <div class="modal fade" id="deleteCourse" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered" role="document">
+                        <div class="modal-content">
+                            <form action="{{ $course->id }}/delete" method="post">
+                                {{ csrf_field() }}
+                                <div class="modal-header">
+                                    <h5 class="modal-title" id="exampleModalCenterTitle">Hapus Kelas</h5>
+                                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                    <span aria-hidden="true">&times;</span>
+                                    </button>
+                                </div>
+                                <div class="modal-body">Apakah anda yakin menghapus kelas <b>{{ $course->name }}</b>?</div>
+                                <div class="modal-footer">
+                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                    <button type="submit" class="btn btn-danger">Hapus Kelas</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                </div>
+                <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#nameCourse">
+                    Edit Nama Kelas
+                </button>
+                <div class="modal fade" id="nameCourse" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered" role="document">
+                        <div class="modal-content">
+                            <form action="{{ $course->id }}/edit" method="post">
+                                {{ csrf_field() }}
+                                <div class="modal-header">
+                                    <h5 class="modal-title" id="exampleModalCenterTitle">Edit Nama Kelas</h5>
+                                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                    <span aria-hidden="true">&times;</span>
+                                    </button>
+                                </div>
+                                <div class="modal-body">
+                                    <div class="form-group">
+                                        <label for="topic-name" class="col-form-label">Nama Kelas</label>
+                                        <input type="text" class="form-control" name="course_name" id="course-name" required="required" value="{{ $course->name }}">
+                                    </div>
+                                </div>
+                                <div class="modal-footer">
+                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                    <button type="submit" class="btn btn-primary">Submit</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                </div>
+                <button style="float: right;" type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
+                    Tambah Materi
+                </button>
+                <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered" role="document">
+                        <div class="modal-content">
+                            <form action="<?php echo Request::url(); ?>/learn/new" method="post">
+                                {{ csrf_field() }}
+                                <div class="modal-header">
+                                    <h5 class="modal-title" id="exampleModalCenterTitle">Tambah Materi</h5>
+                                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                    <span aria-hidden="true">&times;</span>
+                                    </button>
+                                </div>
+                                <div class="modal-body">
+                                    <div class="form-group">
+                                        <label for="topic-name" class="col-form-label">Masukkan Judul Materi</label>
+                                        <input type="text" class="form-control" name="topic_name" id="topic-name" required="required" placeholder="Judul Materi">
+                                    </div>
+                                    <div class="form-group">
+                                        <label for="topic-description">Deskripsi</label>
+                                        <textarea class="form-control" name="topic_description" id="topic_description" rows="2"></textarea>
+                                    </div>
+                                </div>
+                                <div class="modal-footer">
+                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                    <button type="submit" class="btn btn-primary">Tambah Materi</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                </div>
+            @endif
+        </div>
+        <div class="col-md-4">
+            @if(Auth::user()->role == 0)
+                <div class="card">
+                    <div class="card-header bg-primary text-white"><b>Progress</b></div>
+                    <div class="card-body">
+                        <table class="table table-hover">
+                            <thead>
+                                <tr>
+                                <th scope="col">Materi</th>
+                                <th scope="col">Skor</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                            @foreach($scores as $index => $score)
+                                <tr>
+                                <td>Materi {{ $index + 1 }}</td>
+                                <td>{{ $score }}</td>
+                                </tr>    
+                            @endforeach
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+                <br/>
+            @endif
+            <div class="card">
+                <div class="card-header bg-primary text-white"><b>Peserta Kelas</b></div>
+                <div class="card-body">
+                    {{ $teacher }} (Pengajar) <br/>
+                    @foreach($students as $student)
+                        {{ $student }} <br/>
+                    @endforeach
+                    @if(Auth::user()->role == 1)
+                        <br/>
+                        <a href="<?php echo $course->id; ?>/grade" class="btn btn-primary" role="button">Lihat Nilai</a>
+                    @endif
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+@endsection
\ No newline at end of file
diff --git a/resources/views/edit.blade.php b/resources/views/edit.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..14e65a70e0ef23420b6aa03686e776f568c40f6e
--- /dev/null
+++ b/resources/views/edit.blade.php
@@ -0,0 +1,75 @@
+@extends('layouts.app')
+
+@section('content')
+<!-- <form action="<?php echo Request::url(); ?>/edit/submit" name="myform" id="myform" method="post">
+    {{ csrf_field() }}
+    <div id="wysiwyg_cp" style="padding:8px; width:700px;">
+    <input type="button" onClick="iBold()" value="B"> 
+    <input type="button" onClick="iUnderline()" value="U">
+    <input type="button" onClick="iItalic()" value="I">
+    <input type="button" onClick="iUnorderedList()" value="UL">
+    <input type="button" onClick="iOrderedList()" value="OL">
+    </div>
+    <textarea style="display:none;" name="myTextArea" id="myTextArea" cols="100" rows="14"></textarea>
+    <iframe name="richTextField" id="richTextField" style="border:#000000 1px solid; width:700px; height:300px;"></iframe>
+    <input name="myBtn" type="button" value="Submit Data" onClick="javascript:submit_form();"/>
+</form> -->
+<div class="container-fluid">
+    <div class="row">
+        <div class="col-lg-4">
+            <h4>Materi: {{ $topic->name }}</h4>
+            <div class="accordion" id="accordionCourses">
+                <form action="<?php echo Request::url(); ?>/save" name="myform" id="myform" method="post">
+                    @csrf
+                    <div class="card">
+                        <div class="card-header" id="heading1" style="transform: rotate(0);">
+                            <h5 class="mb-0">
+                                <button class="btn stretched-link" type="button" data-toggle="collapse" data-target="#collapse1" aria-expanded="false" aria-controls="collapse1">
+                                    Atur Persoalan
+                                </button>
+                            </h5>
+                        </div>
+                        <div id="collapse1" class="collapse show" aria-labelledby="heading1" data-parent="#accordionCourses">
+                            <input type="hidden" value="<?php echo $id_spreadsheet; ?>" class="form-control" name="id_spreadsheet" id="id_spreadsheet">
+                            <mytextarea name="rich_text" id="rich_text"><?php echo $topic->content;?></mytextarea>
+                        </div>
+                    </div>
+                    <div class="card">
+                        <div class="card-header" id="heading2" style="transform: rotate(0);">
+                            <h5 class="mb-0">
+                                <button class="btn stretched-link" type="button" data-toggle="collapse" data-target="#collapse2" aria-expanded="false" aria-controls="collapse2">
+                                    Atur Cell Jawaban
+                                </button>
+                            </h5>
+                        </div>
+                        <div id="collapse2" class="collapse" aria-labelledby="heading2" data-parent="#accordionCourses">
+                            <div class="card-body">
+                                <label for="exampleFormControlSelect1">Jumlah Cell Jawaban</label>
+                                <input type="number" class="form-control" id="cell-number" min="1" value="{{ count($cells) }}" onkeyup="setForm(this.value)" onchange="setForm(this.value)">
+                                <br/>
+                                <label for="exampleFormControlSelect1">Masukkan Cell Jawaban</label>
+                                <div class="row" id="cell-answers">
+                                    @foreach($cells as $cell)
+                                        <div class="col-3" style="margin-bottom:1rem;">
+                                            <input type="text" name="cells[]" class="form-control" value="{{ $cell->cell }}">
+                                        </div>
+                                    @endforeach
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                    <a style="margin-top: 1rem;" href="/course/<?php echo $id_course; ?>" class="btn btn-secondary" role="button">Kembali ke Kelas</a>
+                    <button style="float: right; margin-top: 1rem;" type="submit" class="btn btn-primary"><b>Simpan</b></button>
+                </form>
+            </div>
+        </div>
+        <div class="col-lg-8">
+            <iframe 
+                style="width:100%; height:500px; border: 1px solid grey;" 
+                frameBorder="0"
+                src="https://docs.google.com/spreadsheets/d/<?php echo $id_spreadsheet; ?>/edit?usp=drivesdk&rm=embedded">
+            </iframe>
+        </div>
+    </div>
+</div>
+@endsection
\ No newline at end of file
diff --git a/resources/views/editPassword.blade.php b/resources/views/editPassword.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d9432247b9cedd595d788a8e40ab49bf5dd618f
--- /dev/null
+++ b/resources/views/editPassword.blade.php
@@ -0,0 +1,48 @@
+@extends('layouts.app')
+
+@section('content')
+<div class="container">
+    <div class="row justify-content-center">
+        <div class="col-md-8">
+            <div class="card">
+                <div class="card-header">Ubah Password</div>
+
+                <div class="card-body">
+                    <form method="POST" action="/password">
+                        @csrf
+                        <div class="form-group row">
+                            <label for="password" class="col-md-4 col-form-label text-md-right">Password Baru</label>
+
+                            <div class="col-md-6">
+                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
+
+                                @error('password')
+                                    <span class="invalid-feedback" role="alert">
+                                        <strong>{{ $message }}</strong>
+                                    </span>
+                                @enderror
+                            </div>
+                        </div>
+
+                        <div class="form-group row">
+                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">Konfirmasi Password</label>
+
+                            <div class="col-md-6">
+                                <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
+                            </div>
+                        </div>
+
+                        <div class="form-group row mb-0">
+                            <div class="col-md-6 offset-md-4">
+                                <button type="submit" class="btn btn-primary">
+                                    Ubah Password
+                                </button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+@endsection
diff --git a/resources/views/grade.blade.php b/resources/views/grade.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..3617cc57cd2fe61a0f94f41a28e53be228a3c622
--- /dev/null
+++ b/resources/views/grade.blade.php
@@ -0,0 +1,37 @@
+@extends('layouts.app')
+
+@section('content')
+<div class="container">
+    <div class="row justify-content">
+        <div class="col-md-12">
+            <div class="card">
+                <div class="card-header"><b>Hasil Penilaian</b></div>
+                <div class="card-body">
+                    <table class="table table-hover">
+                        <thead>
+                            <tr>
+                            <th scope="col">Nama</th>
+                            @foreach($topics as $topic)
+                                <th scope="col">Materi {{ $topic->name }}</th>
+                            @endforeach
+                            </tr>
+                        </thead>
+                        <tbody>
+                        @foreach($names as $index => $name)
+                            <tr>
+                            <td>{{ $name }}</td>
+                            @foreach($grades[$index] as $grade)
+                                <td>{{ $grade }}</td>
+                            @endforeach
+                            </tr>    
+                        @endforeach
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+            <br/>
+            <a href="/course/<?php echo $id_course; ?>" class="btn btn-primary" id="back" role="button">Kembali ke Kelas</a>
+        </div>
+    </div>
+</div>
+@endsection
\ No newline at end of file
diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php
index 05dfca9228d9a3150d9236434e6a7e0c771f35f3..c7347c306420317ae263887213fd783e4b263522 100644
--- a/resources/views/home.blade.php
+++ b/resources/views/home.blade.php
@@ -2,22 +2,170 @@
 
 @section('content')
 <div class="container">
-    <div class="row justify-content-center">
+@isset(request()->msg)
+    @if( request()->get('msg') == 1 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Profil Berhasil Diubah
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 2 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Pembuatan Kelas Berhasil
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 3 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Daftar Kelas Berhasil
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 4 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Kelas Berhasil Dihapus
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @elseif( request()->get('msg') == 5 )
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            Password Berhasil Diubah
+            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
+                <span aria-hidden="true">&times;</span>
+            </button>
+        </div>
+    @endif
+@endisset
+    <div class="row justify-content">
         <div class="col-md-8">
             <div class="card">
-                <div class="card-header">Dashboard</div>
-
-                <div class="card-body">
-                    @if (session('status'))
-                        <div class="alert alert-success" role="alert">
-                            {{ session('status') }}
-                        </div>
+                <div class="card-header bg-primary text-white"><b>Kelasku</b></div>
+                <div class="card-columns card-body">
+                    @if( count($enrolled) == 0 )
+                        Tidak ada kelas yang diikuti
                     @endif
-
-                    You are logged in!
+                    @foreach($enrolled as $enroll)
+                        <div class="card course" style="width: 14rem">
+                            <img src="img/course.png" class="card-img-top" alt="No Picture">
+                            <div class="card-header">{{ $enroll->name }}</div>
+                            <a href="/course/<?php echo $enroll->id; ?>" class="stretched-link"></a>
+                        </div>
+                    @endforeach
+                </div>
+            </div>
+            @if(Auth::user()->role == 1)
+                <br/>
+                <button style="float: right;" type="button" class="btn btn-primary" data-toggle="modal" data-target="#newCourseModal">
+                    Tambah Kelas
+                </button>
+                <div class="modal fade" id="newCourseModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                    <div class="modal-dialog modal-dialog-centered" role="document">
+                        <div class="modal-content">
+                            <form action="/course/new" method="post">
+                                {{ csrf_field() }}
+                                <div class="modal-header">
+                                    <h5 class="modal-title" id="exampleModalCenterTitle">Tambah Kelas</h5>
+                                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                    <span aria-hidden="true">&times;</span>
+                                    </button>
+                                </div>
+                                <div class="modal-body">
+                                    <div class="form-group">
+                                        <label for="course-name" class="col-form-label">Masukkan Nama Kelas</label>
+                                        <input type="text" class="form-control" name="course_name" id="course-name" required="required" placeholder="Nama Kelas">
+                                    </div>
+                                    <div class="form-group">
+                                        <label for="course-description">Deskripsi</label>
+                                        <textarea class="form-control" name="course_description" id="course_description" rows="2"></textarea>
+                                    </div>
+                                </div>
+                                <div class="modal-footer">
+                                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                    <button type="submit" class="btn btn-primary">Buat Kelas</button>
+                                </div>
+                            </form>
+                        </div>
+                    </div>
+                </div>
+            @endif
+        </div>
+        <div class="col-md-4">
+            <div class="card">
+                <div class="card-header bg-primary text-white"><b>Profil</b></div>
+                <div class="card-body profile">
+                    <img src="img/{{ $image }}" style="width:120px;height:120px;" alt="No Picture"> <br/>
+                    <a id="profile-name">{{ $profile->name }}</a> <br/>
+                    <a id="email">{{ $profile->email }}</a> <br/>
+                    <a id="role">{{ $role }}</a> <br/><br/>
+                    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModalCenter">
+                        Edit Profil
+                    </button>
+                    <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
+                        <div class="modal-dialog modal-dialog-centered" role="document">
+                            <div class="modal-content">
+                                <form action="/profile" method="post">
+                                    {{ csrf_field() }}
+                                    <div class="modal-header">
+                                        <h5 class="modal-title" id="exampleModalCenterTitle">Edit Profil</h5>
+                                        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                        <span aria-hidden="true">&times;</span>
+                                        </button>
+                                    </div>
+                                    <div class="modal-body">
+                                        <div class="form-group">
+                                            <label for="topic-name" class="col-form-label">Nama</label>
+                                            <input type="text" class="form-control" name="new_name" id="new_name" required="required" value="<?php echo $profile->name ?>">
+                                        </div>
+                                    </div>
+                                    <div class="modal-footer">
+                                        <button type="button" class="btn btn-secondary" data-dismiss="modal">Batal</button>
+                                        <a href="edit_password" class="btn btn-primary editpass" role="button">Ubah Password</a>
+                                        <button type="submit" class="btn btn-primary">Submit</button>
+                                    </div>
+                                </form>
+                            </div>
+                        </div>
+                    </div>
                 </div>
             </div>
         </div>
     </div>
+    @if(Auth::user()->role == 0)
+        <div class="py-4 row justify-content-center">
+            <div class="col-md-12">
+                <div class="card">
+                    <div class="card-header bg-primary text-white"><b>Kelas Tersedia</b></div>
+                    <div class="accordion" id="accordionCourses">
+                        @foreach($courses as $index => $course)
+                            <div class="card">
+                                <div class="card-header" id="heading<?php echo $course->id; ?>" style="transform: rotate(0);">
+                                    <a class="stretched-link" type="button" data-toggle="collapse" data-target="#collapse<?php echo $course->id; ?>" aria-expanded="false" aria-controls="collapse<?php echo $course->id; ?>">{{ $course->name }}</a> 
+                                </div>
+
+                                <div id="collapse<?php echo $course->id; ?>" class="collapse" aria-labelledby="heading<?php echo $course->id; ?>" data-parent="#accordionCourses">
+                                    <div class="card-body">
+                                        {{ $course->description }} <br/><br/>
+                                        @if( in_array($course, $enrolled) )
+                                        <a style="color:green;">Anda sudah mengikuti kelas ini</a>
+                                        @else
+                                            <form action="course/enroll" method="post">
+                                                {{ csrf_field() }}
+                                                <input style="display: none;" type="number" class="form-control" name="enroll_id" id="enroll_id" required="required" value="<?php echo $course->id ?>">
+                                                <button type="submit" class="btn btn-primary">Daftar Kelas</button>
+                                            </form>
+                                        @endif
+                                    </div>
+                                </div>
+                            </div>
+                        @endforeach
+                    </div>
+                </div>
+            </div>
+        </div>
+    @endif
 </div>
-@endsection
+@endsection
\ No newline at end of file
diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php
index 7bcfd316b00efaf35e0cfeb67d745797a9eaaf19..e18428a2bbe941216aea4b22be721e28e75aeae5 100644
--- a/resources/views/layouts/app.blade.php
+++ b/resources/views/layouts/app.blade.php
@@ -11,6 +11,10 @@
 
     <!-- Scripts -->
     <script src="{{ asset('js/app.js') }}" defer></script>
+    <script src="{{ asset('js/text.js') }}" defer></script>
+    <script src="{{ asset('js/learn.js') }}" defer></script>
+    <script src="https://cdn.tiny.cloud/1/<API KEY>/tinymce/5/tinymce.min.js" referrerpolicy="origin"></script>
+    <script>tinymce.init({selector:'mytextarea'});</script>
 
     <!-- Fonts -->
     <link rel="dns-prefetch" href="//fonts.gstatic.com">
@@ -18,10 +22,11 @@
 
     <!-- Styles -->
     <link href="{{ asset('css/app.css') }}" rel="stylesheet">
+    <link href="{{ asset('css/home.css') }}" rel="stylesheet">
 </head>
-<body>
+<body onLoad="iFrameOn();">
     <div id="app">
-        <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
+        <nav class="navbar navbar-expand-md navbar-dark bg-primary shadow-sm">
             <div class="container">
                 <a class="navbar-brand" href="{{ url('/') }}">
                     {{ config('app.name', 'Laravel') }}
diff --git a/resources/views/learn.blade.php b/resources/views/learn.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b28eae030fc781f7af799d95d4e1cfd3e1f91df
--- /dev/null
+++ b/resources/views/learn.blade.php
@@ -0,0 +1,32 @@
+@extends('layouts.app')
+
+@section('content')
+<div class="container-fluid">
+    <div class="row justify-content-center">
+        <div class="col-lg-4">
+            <div class="card">
+                <div class="card-header bg-primary text-white"><b>{{ $topic_name }}</b></div>
+                <div class="card-body">
+                    <?php echo $content;?>
+                </div>
+            </div>
+        </div>
+        <div class="col-lg-8">
+            <iframe 
+                style="width:100%; height:500px; border: 1px solid grey;" 
+                frameBorder="0"
+                src="https://docs.google.com/spreadsheets/d/<?php echo $id_spreadsheet; ?>/edit?usp=drivesdk&rm=embedded">
+            </iframe>
+            <a href="/course/<?php echo $id_course; ?>" class="btn btn-primary" id="back" role="button">Kembali ke Kelas</a>
+            <button id="submit" style="float: right;" type="text" onclick="submit('<?php echo $id_spreadsheet; ?>', '<?php echo Request::url(); ?>/submit')" class="btn btn-success"><b>Submit</b></button>
+            <button id="loading" style="float: right; display: none;" type="button" class="btn btn-success" disabled><span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span><b> menilai...</b></button>
+        </div>
+        <div  id="result" class="col-lg-12" style="margin-top: 1rem; display:none">
+            <div class="card">
+                <div class="card-header bg-primary text-white">Hasil</div>
+                <div id="result-detail" class="card-body"></div>
+            </div>
+        </div>
+    </div>
+</div>
+@endsection
\ No newline at end of file
diff --git a/routes/web.php b/routes/web.php
index 12fc04c0eb27c456cd30ab90807c66b72711e642..96da8347b5007fe1e3778d912b77c8316ad8ba9b 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -10,11 +10,22 @@
 | contains the "web" middleware group. Now create something great!
 |
 */
-
-Route::get('/', function () {
-    return view('welcome');
-});
-
 Auth::routes();
-
-Route::get('/home', 'HomeController@index')->name('home');
+Route::get('/', 'HomeController@index')->name('home');
+Route::redirect('/home', '/');
+Route::post('/profile', 'HomeController@profile')->name('profile');
+Route::get('/edit_password', 'HomeController@editPassword')->name('edit_password');
+Route::post('/password', 'HomeController@password')->name('password');
+Route::get('/course/{id_course}', 'CourseController@index')->name('course');
+Route::post('/course/{id_course}/edit_topic/{id_topic}', 'CourseController@editTopic')->name('edit_topic');
+Route::post('/course/new', 'CourseController@new')->name('course/new');
+Route::post('/course/enroll', 'CourseController@enroll')->name('course/enroll');
+Route::post('/course/{id_course}/delete', 'CourseController@delete')->name('course/delete');
+Route::post('/course/{id_course}/edit', 'CourseController@edit')->name('course/edit');
+Route::get('/course/{id_course}/grade', 'CourseController@grade')->name('course/grade');
+Route::post('/course/{id_course}/learn/new', 'LearnController@new')->name('learn/new');
+Route::get('/course/{id_course}/learn/{id_topic}', 'LearnController@index')->name('learn');
+Route::get('/course/{id_course}/learn/{id_topic}/edit', 'LearnController@edit')->name('edit');
+Route::post('/course/{id_course}/learn/{id_topic}/delete', 'LearnController@delete')->name('learn/delete');
+Route::post('/course/{id_course}/learn/{id_topic}/edit/save', 'LearnController@save')->name('edit/save');
+Route::post('/course/{id_course}/learn/{id_topic}/submit', 'AutograderController@index')->name('autograder');
\ No newline at end of file
diff --git a/server.php b/server.php
index 5fb6379e71f275a1784e6638adc96420aaa5c5b2..e14da8b36e0d9a9f51bffb1861ae1204a18bda59 100644
--- a/server.php
+++ b/server.php
@@ -19,3 +19,4 @@ if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
 }
 
 require_once __DIR__.'/public/index.php';
+require_once __DIR__.'/vendor/autoload.php';
\ No newline at end of file