diff --git a/.env.example b/.env.example
index 4c30963d..141efe7b 100644
--- a/.env.example
+++ b/.env.example
@@ -62,9 +62,6 @@ BACKBLAZE_ENDPOINT=
BACKBLAZE_REGION=
BACKBLAZE_BUCKET=
-PASSPORT_CLIENT_ID=
-PASSPORT_CLIENT_SECRET=
-
APP_DEPLOY_SECRET=
CASHIER_LOGGER=stack
@@ -72,4 +69,6 @@ CASHIER_CURRENCY=
STRIPE_KEY=
STRIPE_SECRET=
STRIPE_WEBHOOK_SECRET=
-CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment
\ No newline at end of file
+CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment
+
+SANCTUM_STATEFUL_DOMAINS=localhost,localhost:8000,127.0.0.1,127.0.0.1:8000,::1
\ No newline at end of file
diff --git a/.env.testing b/.env.testing
new file mode 100644
index 00000000..852247d7
--- /dev/null
+++ b/.env.testing
@@ -0,0 +1,58 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=base64:47yorkyoH3qCrKKO4eG6LpZUogoTC51qey5vYq/O3AM=
+APP_DEBUG=true
+APP_URL=http://localhost
+APP_DEMO=false
+
+LOG_CHANNEL=stack
+
+DB_CONNECTION=sqlite
+DB_HOST=null
+DB_PORT=null
+DB_DATABASE=database/test.sqlite
+DB_USERNAME=null
+DB_PASSWORD=null
+
+FILESYSTEM_DRIVER=local
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+SCOUT_DRIVER=tntsearch
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=log
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS=null
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+CASHIER_LOGGER=stack
+CASHIER_CURRENCY=EUR
+STRIPE_KEY=pk_test_51GsACaCBETHMUxzVsYkeApHtqb85paMuye7G77PDDQ28kXqDJ5HTmqLi13aM6xee81OQK1fhkTZ7vmDiWLStU9160061Yb2MtL
+STRIPE_SECRET=sk_test_51GsACaCBETHMUxzVviYCrv0CeZMyWAOfBPe4uH5rkKJcJxrXhIciWQTr7UB1sgw9geoJMkNDVSWBQW36tuAsVznd00zhNHXhok
+STRIPE_WEBHOOK_SECRET=whsec_eKrDhqtpbMUXOKqrUHf78SrZxHHYOdrf
+CASHIER_PAYMENT_NOTIFICATION=App\Notifications\ConfirmPayment
+CASHIER_MODEL=App\Models\User
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+SANCTUM_STATEFUL_DOMAINS=localhost,127.0.0.1,127.0.0.1:8000,::1
diff --git a/.gitignore b/.gitignore
index 6bb6c720..a11cda22 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,3 @@
-/app/Console/Commands/SetupDevelopmentEnvironment.php
/node_modules
/public/hot
/public/storage
@@ -10,6 +9,7 @@
.idea
.env
.env.backup
+.env.testing
.phpunit.result.cache
.phpstorm.meta.php
.vscode/
diff --git a/.run/AuthTest.it_check_non_existed_user_and_return_not_found.run.xml b/.run/AuthTest.it_check_non_existed_user_and_return_not_found.run.xml
new file mode 100644
index 00000000..3efb6fe2
--- /dev/null
+++ b/.run/AuthTest.it_check_non_existed_user_and_return_not_found.run.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index ffaad775..a030d769 100644
--- a/README.md
+++ b/README.md
@@ -230,7 +230,7 @@ VueFileManager is packed with **Stripe** payment options. To configure Stripe, y
## Get your active plans
Would you like to get your subscription plans for your custom front-end page? Create GET request and get all your active plans:
```
-GET /api/public/pricing
+GET /api/pricing
```
## Manage Failed Payments
diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php
new file mode 100644
index 00000000..76ff606e
--- /dev/null
+++ b/app/Actions/Fortify/CreateNewUser.php
@@ -0,0 +1,62 @@
+pluck('value', 'name');
+
+ // Check if account registration is enabled
+ if (!intval($settings['registration'])) {
+ abort(401);
+ }
+
+ Validator::make($input, [
+ 'name' => ['required', 'string', 'max:255'],
+ 'email' => [
+ 'required',
+ 'string',
+ 'email',
+ 'max:255',
+ Rule::unique(User::class),
+ ],
+ 'password' => $this->passwordRules(),
+ ])->validate();
+
+ $user = User::create([
+ 'email' => $input['email'],
+ 'password' => bcrypt($input['password']),
+ ]);
+
+ UserSettings::unguard();
+
+ $user
+ ->settings()
+ ->create([
+ 'name' => $input['name'],
+ 'storage_capacity' => $settings['storage_default'],
+ ]);
+
+ UserSettings::reguard();
+
+ return $user;
+ }
+}
diff --git a/app/Actions/Fortify/PasswordValidationRules.php b/app/Actions/Fortify/PasswordValidationRules.php
new file mode 100644
index 00000000..78ed8cfe
--- /dev/null
+++ b/app/Actions/Fortify/PasswordValidationRules.php
@@ -0,0 +1,18 @@
+ $this->passwordRules(),
+ ])->validate();
+
+ $user->forceFill([
+ 'password' => bcrypt($input['password']),
+ ])->save();
+ }
+}
diff --git a/app/Actions/Fortify/UpdateUserPassword.php b/app/Actions/Fortify/UpdateUserPassword.php
new file mode 100644
index 00000000..e00bc1db
--- /dev/null
+++ b/app/Actions/Fortify/UpdateUserPassword.php
@@ -0,0 +1,35 @@
+ ['required', 'string'],
+ 'password' => $this->passwordRules(),
+ ])->after(function ($validator) use ($user, $input) {
+ if (! isset($input['current_password']) || ! Hash::check($input['current_password'], $user->password)) {
+ $validator->errors()->add('current_password', __('The provided password does not match your current password.'));
+ }
+ })->validateWithBag('updatePassword');
+
+ $user->forceFill([
+ 'password' => bcrypt($input['password']),
+ ])->save();
+ }
+}
diff --git a/app/Actions/Fortify/UpdateUserProfileInformation.php b/app/Actions/Fortify/UpdateUserProfileInformation.php
new file mode 100644
index 00000000..95e84ab4
--- /dev/null
+++ b/app/Actions/Fortify/UpdateUserProfileInformation.php
@@ -0,0 +1,61 @@
+ ['required', 'string', 'max:255'],
+
+ 'email' => [
+ 'required',
+ 'string',
+ 'email',
+ 'max:255',
+ Rule::unique('users')->ignore($user->id),
+ ],
+ ])->validateWithBag('updateProfileInformation');
+
+ if ($input['email'] !== $user->email &&
+ $user instanceof MustVerifyEmail) {
+ $this->updateVerifiedUser($user, $input);
+ } else {
+ $user->forceFill([
+ 'name' => $input['name'],
+ 'email' => $input['email'],
+ ])->save();
+ }
+ }
+
+ /**
+ * Update the given verified user's profile information.
+ *
+ * @param mixed $user
+ * @param array $input
+ * @return void
+ */
+ protected function updateVerifiedUser($user, array $input)
+ {
+ $user->forceFill([
+ 'name' => $input['name'],
+ 'email' => $input['email'],
+ 'email_verified_at' => null,
+ ])->save();
+
+ $user->sendEmailVerificationNotification();
+ }
+}
diff --git a/app/Console/Commands/Deploy.php b/app/Console/Commands/Deploy.php
deleted file mode 100644
index ac3adb07..00000000
--- a/app/Console/Commands/Deploy.php
+++ /dev/null
@@ -1,66 +0,0 @@
-info('Running auto deployment');
- $this->call('down');
-
- // Exec commands
- exec('git pull origin ' . config('app.deploy_branch'));
- //exec('composer update --no-interaction --prefer-dist');
- $this->migrateDatabase();
-
- // Stop deployment
- $this->call('up');
- $this->info('Everything is done, congratulations! 🥳🥳🥳');
-
- Log::info('Application was updated!');
- }
-
- /**
- * Migrate database
- */
- public function migrateDatabase()
- {
- $this->call('migrate', [
- '--force' => true,
- ]);
- }
-}
diff --git a/app/Console/Commands/SetupDevEnvironment.php b/app/Console/Commands/SetupDevEnvironment.php
new file mode 100644
index 00000000..d601ba2d
--- /dev/null
+++ b/app/Console/Commands/SetupDevEnvironment.php
@@ -0,0 +1,911 @@
+faker = Faker\Factory::create();
+ $this->setup = resolve(SetupService::class);
+ $this->helper = resolve(HelperService::class);
+ }
+
+ /**
+ * Execute the console command.
+ *
+ * @return int
+ */
+ public function handle()
+ {
+ $this->info('Setting up development environment');
+
+ $this->info('Creating system directories...');
+ $this->setup->create_directories();
+
+ $this->info('Migrating Databases...');
+ $this->migrate_and_generate();
+
+ $this->info('Storing default settings and content...');
+ $this->store_default_settings();
+ $this->setup->seed_default_pages();
+ $this->setup->seed_default_settings($this->license);
+ $this->setup->seed_default_language();
+
+ $this->info('Creating default admin...');
+ $this->create_admin();
+
+ $this->info('Creating demo users...');
+ $this->create_demo_users();
+
+ $this->info('Creating default admin content...');
+ $this->create_admin_default_content();
+ $this->create_share_records();
+
+ $this->info('Clearing application cache...');
+ $this->clear_cache();
+
+ $this->info('Dispatching jobs...');
+ $this->call('queue:work', [
+ '--stop-when-empty' => true,
+ ]);
+
+ $this->info('Everything is done, congratulations! 🥳🥳🥳');
+ }
+
+ /**
+ * Create default admin account
+ */
+ private function create_admin(): void
+ {
+ $user = User::forceCreate([
+ 'role' => 'admin',
+ 'email' => 'howdy@hi5ve.digital',
+ 'password' => bcrypt('vuefilemanager'),
+ ]);
+
+ $user
+ ->settings()
+ ->create([
+ 'avatar' => 'avatars/avatar-01.png',
+ 'storage_capacity' => 5,
+ 'name' => 'Jane Doe',
+ 'address' => $this->faker->address,
+ 'state' => $this->faker->state,
+ 'city' => $this->faker->city,
+ 'postal_code' => $this->faker->postcode,
+ 'country' => $this->faker->randomElement(['SK', 'CZ', 'DE', 'FR']),
+ 'phone_number' => $this->faker->phoneNumber,
+ 'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']),
+ ]);
+
+ \File::copy(storage_path("demo/avatars/avatar-01.png"), storage_path("app/avatars/avatar-01.png"));
+
+ // Show user credentials
+ $this->info('Default admin account created. Email: howdy@hi5ve.digital and Password: vuefilemanager');
+ }
+
+ /**
+ * Create default admin account
+ */
+ private function create_demo_users(): void
+ {
+ collect([
+ [
+ 'avatar' => 'avatar-02.png',
+ ],
+ [
+ 'avatar' => 'avatar-03.png',
+ ],
+ ])->each(function ($user) {
+
+ $newbie = User::forceCreate([
+ 'role' => 'user',
+ 'email' => $this->faker->email,
+ 'password' => bcrypt('vuefilemanager'),
+ ]);
+
+ $newbie
+ ->settings()
+ ->create([
+ 'avatar' => "avatars/{$user['avatar']}",
+ 'storage_capacity' => 5,
+ 'name' => $this->faker->name,
+ 'address' => $this->faker->address,
+ 'state' => $this->faker->state,
+ 'city' => $this->faker->city,
+ 'postal_code' => $this->faker->postcode,
+ 'country' => $this->faker->randomElement(['SK', 'CZ', 'DE', 'FR']),
+ 'phone_number' => $this->faker->phoneNumber,
+ 'timezone' => $this->faker->randomElement(['+1.0', '+2.0', '+3.0']),
+ ]);
+
+ \File::copy(storage_path("demo/avatars/{$user['avatar']}"), storage_path("app/avatars/{$user['avatar']}"));
+
+ $this->info("Generated user with email: $newbie->email and Password: vuefilemanager");
+ });
+ }
+
+ /**
+ * Create default admin content
+ */
+ private function create_admin_default_content(): void
+ {
+ $user = User::whereEmail('howdy@hi5ve.digital')
+ ->first();
+
+ // 1.
+ $shared_folder = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'author' => 'user',
+ 'name' => 'Shared Folder',
+ 'emoji' => [
+ "codes" => "1F680",
+ "char" => "🚀",
+ "name" => "rocket",
+ "category" => "Travel & Places (transport-air)",
+ "group" => "Travel & Places",
+ "subgroup" => "transport-air"
+ ],
+ 'created_at' => now(),
+ ]);
+
+ Share::factory(Share::class)
+ ->create([
+ 'type' => 'folder',
+ 'item_id' => $shared_folder->id,
+ 'user_id' => $user->id,
+ 'permission' => 'editor',
+ 'is_protected' => false,
+ 'password' => null,
+ 'expire_in' => null,
+ ]);
+
+ $peters_files = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $shared_folder->id,
+ 'author' => 'visitor',
+ 'name' => "Peter's Files",
+ ]);
+
+ // 2.
+ $random_pics = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'author' => 'user',
+ 'name' => 'Random Pics',
+ 'emoji' => [
+ 'codes' => '1F4F7',
+ 'char' => '📷',
+ 'name' => 'camera',
+ 'category' => 'Objects (light & video)',
+ 'group' => 'Objects',
+ 'subgroup' => 'light & video',
+ ],
+ 'created_at' => now()->subMinutes(1),
+ ]);
+
+ $nature = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $random_pics->id,
+ 'author' => 'user',
+ 'name' => "Nature",
+ 'emoji' => [
+ 'codes' => '26F0',
+ 'char' => '⛰',
+ 'name' => 'mountain',
+ 'category' => 'Travel & Places (place-geographic)',
+ 'group' => 'Travel & Places',
+ 'subgroup' => 'place-geographic',
+ ],
+ ]);
+
+ $apartments = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $random_pics->id,
+ 'author' => 'user',
+ 'name' => "Apartments",
+ 'emoji' => [
+ 'codes' => '1F3E0',
+ 'char' => '🏠',
+ 'name' => 'house',
+ 'category' => 'Travel & Places (place-building)',
+ 'group' => 'Travel & Places',
+ 'subgroup' => 'place-building',
+ ],
+ ]);
+
+ // 3.
+ $playable_media = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'author' => 'user',
+ 'name' => 'Playable Media',
+ 'created_at' => now()->subMinutes(2),
+ ]);
+
+ $video = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $playable_media->id,
+ 'author' => 'user',
+ 'name' => "Video",
+ ]);
+
+ $audio = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $playable_media->id,
+ 'author' => 'user',
+ 'name' => "Audio",
+ ]);
+
+ // 4.
+ $multi_level = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'author' => 'user',
+ 'name' => 'Multi Level Folder',
+ 'created_at' => now()->subMinutes(3),
+ ]);
+
+ $first_level = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $multi_level->id,
+ 'author' => 'user',
+ 'name' => "First Level",
+ ]);
+
+ $second_level = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $first_level->id,
+ 'author' => 'user',
+ 'name' => "Second Level",
+ ]);
+
+ $third_level = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'parent_id' => $second_level->id,
+ 'author' => 'user',
+ 'name' => "Third Level",
+ ]);
+
+ // 5.
+ $documents = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'author' => 'user',
+ 'name' => 'Documents',
+ 'created_at' => now()->subMinutes(4),
+ ]);
+
+ Share::factory(Share::class)
+ ->create([
+ 'type' => 'folder',
+ 'item_id' => $documents->id,
+ 'user_id' => $user->id,
+ 'permission' => 'editor',
+ 'is_protected' => false,
+ 'password' => null,
+ 'expire_in' => null,
+ ]);
+
+ // 6.
+ $videohive = Folder::factory(Folder::class)
+ ->create([
+ 'user_id' => $user->id,
+ 'author' => 'user',
+ 'name' => 'Videohive by MakingCG',
+ 'created_at' => now()->subMinutes(5),
+ ]);
+
+ $user
+ ->favouriteFolders()
+ ->sync([
+ $shared_folder->id,
+ $random_pics->id,
+ $documents->id,
+ $peters_files->id,
+ ]);
+
+ // Get documents to root directory
+ collect([
+ [
+ 'name' => 'Random Document',
+ 'basename' => 'Licence.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'School Report',
+ 'basename' => 'Project Notes.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Personal Savings',
+ 'basename' => 'School Report.pages',
+ 'mimetype' => 'pages',
+ ],
+ [
+ 'name' => 'Top Secret Files',
+ 'basename' => 'Stories of the Night Skies.pages',
+ 'mimetype' => 'pages',
+ ],
+ ])
+ ->each(function ($file) use ($user) {
+
+ $basename = Str::random(12) . '-' . $file['basename'];
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => null,
+ 'user_id' => $user->id,
+ 'name' => $file['name'],
+ 'basename' => $basename,
+ 'type' => 'file',
+ 'author' => 'user',
+ 'mimetype' => $file['mimetype'],
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get documents to documents folder
+ collect([
+ [
+ 'name' => 'Home Improvement',
+ 'basename' => 'Licence.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Project Notes',
+ 'basename' => 'Project Notes.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Personal Savings',
+ 'basename' => 'School Report.pages',
+ 'mimetype' => 'pages',
+ ],
+ [
+ 'name' => 'License',
+ 'basename' => 'Stories of the Night Skies.pages',
+ 'mimetype' => 'pages',
+ ],
+ ])
+ ->each(function ($file) use ($user, $documents) {
+
+ $basename = Str::random(12) . '-' . $file['basename'];
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => $documents->id,
+ 'user_id' => $user->id,
+ 'name' => $file['name'],
+ 'basename' => $basename,
+ 'type' => 'file',
+ 'author' => 'user',
+ 'mimetype' => $file['mimetype'],
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get documents to shared folder
+ collect([
+ [
+ 'name' => 'Home plan',
+ 'basename' => 'Licence.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Software Licence',
+ 'basename' => 'Project Notes.pdf',
+ 'mimetype' => 'pdf',
+ ]
+ ])
+ ->each(function ($file) use ($user, $shared_folder) {
+
+ $basename = Str::random(12) . '-' . $file['basename'];
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => $shared_folder->id,
+ 'user_id' => $user->id,
+ 'name' => $file['name'],
+ 'basename' => $basename,
+ 'type' => 'file',
+ 'author' => 'user',
+ 'mimetype' => $file['mimetype'],
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get documents to peter's files folder
+ collect([
+ [
+ 'name' => 'Project Backup',
+ 'basename' => 'Licence.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Yearly report',
+ 'basename' => 'Project Notes.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Work Update',
+ 'basename' => 'School Report.pages',
+ 'mimetype' => 'pages',
+ ],
+ [
+ 'name' => 'Person Writing on Notebook',
+ 'basename' => 'Stories of the Night Skies.pages',
+ 'mimetype' => 'pages',
+ ],
+ [
+ 'name' => 'Blank Business Composition Computer',
+ 'basename' => 'Licence.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => '2020 April - Export',
+ 'basename' => 'Project Notes.pdf',
+ 'mimetype' => 'pdf',
+ ],
+ [
+ 'name' => 'Ballpen Blur Close Up Computer',
+ 'basename' => 'School Report.pages',
+ 'mimetype' => 'pages',
+ ],
+ ])
+ ->each(function ($file) use ($user, $peters_files) {
+
+ $basename = Str::random(12) . '-' . $file['basename'];
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/documents/{$file['basename']}"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => $peters_files->id,
+ 'user_id' => $user->id,
+ 'name' => $file['name'],
+ 'basename' => $basename,
+ 'type' => 'file',
+ 'author' => 'visitor',
+ 'mimetype' => $file['mimetype'],
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get videos
+ collect([
+ 'Apple Watch App Video Promotion.mp4',
+ 'Professional 3D Device Pack for Element 3D.mp4',
+ 'Smart Watch 3D Device Pack for Element 3D.mp4',
+ 'Sphere Bound 3D Titles.mp4',
+ ])
+ ->each(function ($file) use ($user, $videohive) {
+
+ $basename = Str::random(12) . '-' . $file;
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/video/$file"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => $videohive->id,
+ 'user_id' => $user->id,
+ 'name' => $file,
+ 'basename' => $basename,
+ 'type' => 'video',
+ 'author' => 'user',
+ 'mimetype' => 'mp4',
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get video into video folder
+ collect([
+ 'Apple Watch App Video Promotion.mp4',
+ ])
+ ->each(function ($file) use ($user, $video) {
+
+ $basename = Str::random(12) . '-' . $file;
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/video/$file"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => $video->id,
+ 'user_id' => $user->id,
+ 'name' => $file,
+ 'basename' => $basename,
+ 'type' => 'video',
+ 'author' => 'user',
+ 'mimetype' => 'mp4',
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get audios
+ collect([
+ 'D-Block & S-te-Fan - Bla Bla.mp3',
+ ])
+ ->each(function ($file) use ($user, $audio) {
+
+ $basename = Str::random(12) . '-' . $file;
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/audio/$file"), storage_path("app/files/$user->id/$basename"));
+
+ // Create file record
+ File::create([
+ 'folder_id' => $audio->id,
+ 'user_id' => $user->id,
+ 'name' => $file,
+ 'basename' => $basename,
+ 'type' => 'audio',
+ 'author' => 'user',
+ 'mimetype' => 'mp3',
+ 'filesize' => rand(1000000, 4000000),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get meme gallery
+ collect([
+ 'Eggcited bro.jpg',
+ 'Get a Rest.jpg',
+ 'Get Your Shit Together.jpg',
+ 'Happiness is when you are right beside me.jpg',
+ 'Have a Nice Day.jpg',
+ 'It Works On My Machine.jpg',
+ 'I am Just Trying to shine.jpg',
+ 'It Works On My Machine.jpg',
+ 'Missing you It is Pig Time.jpg',
+ 'Sofishticated.jpg',
+ 'whaaaaat.jpg',
+ 'You Are My Sunshine.jpg',
+ ])
+ ->each(function ($file) use ($user, $apartments) {
+
+ $basename = Str::random(12) . '-' . $file;
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/images/memes/$file"), storage_path("app/files/$user->id/$basename"));
+
+ $this->info("Creating thumbnail for image: $file");
+
+ // Create file record
+ File::create([
+ 'folder_id' => null,
+ 'user_id' => $user->id,
+ 'name' => $file,
+ 'basename' => $basename,
+ 'type' => 'image',
+ 'author' => 'user',
+ 'mimetype' => 'jpg',
+ 'filesize' => rand(1000000, 4000000),
+ 'thumbnail' => $this->helper->create_image_thumbnail("files/$user->id/$basename", $file, $user->id),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get apartments gallery
+ collect([
+ 'Apartment Architecture Ceiling Chairs.jpg',
+ 'Apartment Chair.jpg',
+ 'Apartment Contemporary Couch Curtains.jpg',
+ 'Brown Wooden Center Table.jpg',
+ 'Home.jpg',
+ 'Kitchen Appliances.jpg',
+ 'Kitchen Island.jpg',
+ ])
+ ->each(function ($file) use ($user, $apartments) {
+
+ $basename = Str::random(12) . '-' . $file;
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/images/apartments/$file"), storage_path("app/files/$user->id/$basename"));
+
+ $this->info("Creating thumbnail for image: $file");
+
+ // Create file record
+ File::create([
+ 'folder_id' => $apartments->id,
+ 'user_id' => $user->id,
+ 'name' => $file,
+ 'basename' => $basename,
+ 'type' => 'image',
+ 'author' => 'user',
+ 'mimetype' => 'jpg',
+ 'filesize' => rand(1000000, 4000000),
+ 'thumbnail' => $this->helper->create_image_thumbnail("files/$user->id/$basename", $file, $user->id),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+
+ // Get nature gallery
+ collect([
+ 'Bird Patterncolorful Green.jpg',
+ 'Close Up Of Peacock.jpg',
+ 'Close Up Photography Of Tiger.jpg',
+ 'Cold Nature Cute Ice.jpg',
+ 'Landscape Photo of Forest.jpg',
+ 'Photo of Hawksbill Sea Turtle.jpg',
+ 'Photo Of Reindeer in The Snow.jpg',
+ 'View Of Elephant in Water.jpg',
+ 'Waterfall Between Trees.jpg',
+ 'Wildlife Photography of Elephant During Golden Hour.jpg',
+ 'Yellow Animal Eyes Fur.jpg',
+ ])
+ ->each(function ($file) use ($user, $nature) {
+
+ $basename = Str::random(12) . '-' . $file;
+
+ // Copy file into app storage
+ \File::copy(storage_path("demo/images/nature/$file"), storage_path("app/files/$user->id/$basename"));
+
+ $this->info("Creating thumbnail for image: $file");
+
+ // Create file record
+ File::create([
+ 'folder_id' => $nature->id,
+ 'user_id' => $user->id,
+ 'name' => $file,
+ 'basename' => $basename,
+ 'type' => 'image',
+ 'author' => 'user',
+ 'mimetype' => 'jpg',
+ 'filesize' => rand(1000000, 4000000),
+ 'thumbnail' => $this->helper->create_image_thumbnail("files/$user->id/$basename", $file, $user->id),
+ 'created_at' => now()->subMinutes(rand(1, 5)),
+ ]);
+ });
+ }
+
+ private function create_share_records(): void
+ {
+ $user = User::whereEmail('howdy@hi5ve.digital')
+ ->first();
+
+ $images = File::whereType('image')
+ ->whereFolderId(null)
+ ->take(3)
+ ->pluck('id');
+
+ $images->each(function ($id) use ($user) {
+ Share::create([
+ 'user_id' => $user->id,
+ 'item_id' => $id,
+ 'type' => 'file',
+ 'is_protected' => false,
+ 'permission' => 'editor',
+ 'password' => null,
+ 'expire_in' => null,
+ ]);
+ });
+
+ $files = File::whereType('file')
+ ->whereFolderId(null)
+ ->take(2)
+ ->pluck('id');
+
+ $files->each(function ($id) use ($user) {
+ Share::create([
+ 'user_id' => $user->id,
+ 'item_id' => $id,
+ 'type' => 'file',
+ 'is_protected' => false,
+ 'permission' => 'editor',
+ 'password' => null,
+ 'expire_in' => null,
+ ]);
+ });
+ }
+
+ /**
+ * Store main app settings into database
+ */
+ private function store_default_settings(): void
+ {
+ // Get options
+ collect([
+ [
+ 'name' => 'setup_wizard_database',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'app_title',
+ 'value' => 'VueFileManager',
+ ],
+ [
+ 'name' => 'app_description',
+ 'value' => 'Your self-hosted storage cloud software powered by Laravel and Vue',
+ ],
+ [
+ 'name' => 'app_logo',
+ 'value' => 'system/logo.svg',
+ ],
+ [
+ 'name' => 'app_logo_horizontal',
+ 'value' => 'system/logo-horizontal.svg',
+ ],
+ [
+ 'name' => 'app_favicon',
+ 'value' => 'system/favicon.png',
+ ],
+ [
+ 'name' => 'app_og_image',
+ 'value' => 'system/og-image.jpg',
+ ],
+ [
+ 'name' => 'app_touch_icon',
+ 'value' => 'system/touch-icon.png',
+ ],
+ [
+ 'name' => 'google_analytics',
+ 'value' => '',
+ ],
+ [
+ 'name' => 'contact_email',
+ 'value' => '',
+ ],
+ [
+ 'name' => 'registration',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'payments_active',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'storage_limitation',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'storage_default',
+ 'value' => 5,
+ ],
+ [
+ 'name' => 'setup_wizard_success',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'license',
+ 'value' => $this->license,
+ ],
+ [
+ 'name' => 'purchase_code',
+ 'value' => '26b889eb-3602-4bf2-beb3-3sc378fcf484',
+ ],
+ [
+ 'name' => 'billing_address',
+ 'value' => 'Palo Alto 20',
+ ],
+ [
+ 'name' => 'billing_city',
+ 'value' => 'Palo Alto',
+ ],
+ [
+ 'name' => 'billing_country',
+ 'value' => 'US',
+ ],
+ [
+ 'name' => 'billing_name',
+ 'value' => 'VueFileManager Inc.',
+ ],
+ [
+ 'name' => 'billing_phone_number',
+ 'value' => '312343141243214',
+ ],
+ [
+ 'name' => 'billing_postal_code',
+ 'value' => '43213',
+ ],
+ [
+ 'name' => 'billing_state',
+ 'value' => 'California',
+ ],
+ [
+ 'name' => 'billing_vat_number',
+ 'value' => '41241241234',
+ ]
+ ])->each(function ($col) {
+ Setting::forceCreate([
+ 'name' => $col['name'],
+ 'value' => $col['value']
+ ]);
+ });
+
+ // Get system images
+ collect(['logo.svg', 'logo-horizontal.svg', 'favicon.png', 'og-image.jpg', 'touch-icon.png'])
+ ->each(function ($file) {
+ \File::copy(storage_path("demo/app/$file"), storage_path("app/system/$file"));
+ });
+
+ }
+
+ /**
+ * Migrate database and generate application keys
+ */
+ private function migrate_and_generate(): void
+ {
+ // Migrate database
+ $this->call('migrate:fresh', [
+ '--force' => true
+ ]);
+
+ // Generate app key
+ $this->call('key:generate', [
+ '--force' => true
+ ]);
+ }
+
+ /**
+ * Clear app cache
+ */
+ private function clear_cache(): void
+ {
+ $this->call('cache:clear');
+ $this->call('config:clear');
+ $this->call('view:clear');
+ }
+}
\ No newline at end of file
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index 1cebee01..7d4cde41 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -2,15 +2,8 @@
namespace App\Console;
-use App\Console\Commands\Deploy;
-
-// use App\Console\Commands\SetupDevelopmentEnvironment;
use App\Console\Commands\SetupDevEnvironment;
-use App\Console\Commands\SetupProductionEnvironment;
-use App\Console\Commands\UpgradeApp;
-use App\Share;
-use App\Zip;
-use Carbon\Carbon;
+use App\Services\SchedulerService;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
@@ -22,8 +15,7 @@ class Kernel extends ConsoleKernel
* @var array
*/
protected $commands = [
- Deploy::class,
- // SetupDevelopmentEnvironment::class,
+ SetupDevEnvironment::class,
];
/**
@@ -34,16 +26,22 @@ class Kernel extends ConsoleKernel
*/
protected function schedule(Schedule $schedule)
{
- $schedule->call(function () {
- $this->delete_expired_shared_links();
- })->everyMinute();
+ $scheduler = resolve(SchedulerService::class);
- $schedule->call(function () {
- $this->delete_old_zips();
+ $schedule->call(function () use ($scheduler) {
+ $scheduler->delete_expired_shared_links();
+ })->everyTenMinutes();
+
+ $schedule->call(function () use ($scheduler) {
+ $scheduler->delete_old_zips();
+
+ if (!is_storage_driver(['local'])) {
+ $scheduler->delete_failed_files();
+ }
})->everySixHours();
// Run queue jobs every minute
- $schedule->command('queue:work --tries=3')
+ $schedule->command('queue:work --stop-when-empty')
->everyMinute()
->withoutOverlapping();
}
@@ -59,42 +57,4 @@ class Kernel extends ConsoleKernel
require base_path('routes/console.php');
}
-
- /**
- * Delete old zips
- */
- protected function delete_old_zips(): void
- {
- // Get all zips
- $zips = Zip::where('created_at', '<=', Carbon::now()->subDay()->toDateTimeString())->get();
-
- $zips->each(function ($zip) {
-
- // Delete zip file
- \Storage::disk('local')->delete('zip/' . $zip->basename);
-
- // Delete zip record
- $zip->delete();
- });
- }
-
- /**
- * Get and delete expired shared links
- */
- protected function delete_expired_shared_links(): void
- {
- // Get all shares with expiration time
- $shares = Share::whereNotNull('expire_in')->get();
-
- $shares->each(function ($share) {
-
- // Get dates
- $created_at = Carbon::parse($share->created_at);
-
- // If time was over, then delete share record
- if ($created_at->diffInHours(Carbon::now()) >= $share->expire_in) {
- $share->delete();
- }
- });
- }
}
diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php
index dcba3ebc..a0aff064 100644
--- a/app/Exceptions/Handler.php
+++ b/app/Exceptions/Handler.php
@@ -2,6 +2,7 @@
namespace App\Exceptions;
+use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
@@ -50,6 +51,12 @@ class Handler extends ExceptionHandler
*/
public function render($request, Throwable $exception)
{
+ if ($exception instanceof ModelNotFoundException) {
+
+ return response()
+ ->redirectTo('/not-found')->setStatusCode(404);
+ }
+
return parent::render($request, $exception);
}
}
\ No newline at end of file
diff --git a/app/FileManagerFile.php b/app/FileManagerFile.php
deleted file mode 100644
index 5067ccc5..00000000
--- a/app/FileManagerFile.php
+++ /dev/null
@@ -1,240 +0,0 @@
- 'array',
- ];
-
- /**
- * Sortable columns
- *
- * @var string[]
- */
- public $sortable = [
- 'name',
- 'created_at',
- ];
-
- /**
- * Set routes with public access
- *
- * @param $token
- */
- public function setPublicUrl($token)
- {
- $this->public_access = $token;
- }
-
- /**
- * Format created at date
- *
- * @return string
- */
- public function getCreatedAtAttribute()
- {
- return format_date(set_time_by_user_timezone($this->attributes['created_at']), __('vuefilemanager.time'));
- }
-
- /**
- * Form\a\t created at date reformat
- *
- * @return string
- */
- public function getDeletedAtAttribute()
- {
- if (!$this->attributes['deleted_at']) return null;
-
- return format_date(set_time_by_user_timezone($this->attributes['deleted_at']), __('vuefilemanager.time'));
- }
-
- /**
- * Format fileSize
- *
- * @return string
- */
- public function getFilesizeAttribute()
- {
- return Metric::bytes($this->attributes['filesize'])->format();
- }
-
- /**
- * Format thumbnail url
- *
- * @return string
- */
- public function getThumbnailAttribute()
- {
- // Get thumbnail from external storage
- if ($this->attributes['thumbnail'] && is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
-
- return Storage::temporaryUrl('file-manager/' . $this->attributes['thumbnail'], now()->addHour());
- }
-
- // Get thumbnail from local storage
- if ($this->attributes['thumbnail']) {
-
- // Thumbnail route
- $route = route('thumbnail', ['name' => $this->attributes['thumbnail']]);
-
- if ($this->public_access) {
- return $route . '/public/' . $this->public_access;
- }
-
- return $route;
- }
-
- return null;
- }
-
- /**
- * Format file url
- *
- * @return string
- */
- public function getFileUrlAttribute()
- {
- // Get file from external storage
- if (is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
-
- $file_pretty_name = is_storage_driver('backblaze')
- ? Str::snake(mb_strtolower($this->attributes['name']))
- : get_pretty_name($this->attributes['basename'], $this->attributes['name'], $this->attributes['mimetype']);
-
- $header = [
- "ResponseAcceptRanges" => "bytes",
- "ResponseContentType" => $this->attributes['mimetype'],
- "ResponseContentLength" => $this->attributes['filesize'],
- "ResponseContentRange" => "bytes 0-600/" . $this->attributes['filesize'],
- 'ResponseContentDisposition' => 'attachment; filename=' . $file_pretty_name,
- ];
-
- return Storage::temporaryUrl('file-manager/' . $this->attributes['basename'], now()->addDay(), $header);
- }
-
- // Get thumbnail from local storage
- $route = route('file', ['name' => $this->attributes['basename']]);
-
- if ($this->public_access) {
- return $route . '/public/' . $this->public_access;
- }
-
- return $route;
- }
-
- /**
- * Index file
- *
- * @return array
- */
- public function toSearchableArray()
- {
- $array = $this->toArray();
- $name = Str::slug($array['name'], ' ');
-
- return [
- 'id' => $this->id,
- 'name' => $name,
- 'nameNgrams' => utf8_encode((new TNTIndexer)->buildTrigrams(implode(', ', [$name]))),
- ];
- }
-
- /**
- * Get parent
- *
- * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
- */
- public function parent()
- {
- return $this->belongsTo('App\FileManagerFolder', 'folder_id', 'unique_id');
- }
-
- /**
- * Get folder
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasOne
- */
- public function folder()
- {
- return $this->hasOne('App\FileManagerFolder', 'unique_id', 'folder_id');
- }
-
- /**
- * Get sharing attributes
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasOne
- */
- public function shared()
- {
- return $this->hasOne('App\Share', 'item_id', 'unique_id');
- }
-}
diff --git a/app/FileManagerFolder.php b/app/FileManagerFolder.php
deleted file mode 100644
index 7d8b1593..00000000
--- a/app/FileManagerFolder.php
+++ /dev/null
@@ -1,279 +0,0 @@
- 'object',
- ];
-
- /**
- * Sortable columns
- *
- * @var string[]
- */
- public $sortable = [
- 'name',
- 'created_at',
- ];
-
- /**
- * Index folder
- *
- * @return array
- */
- public function toSearchableArray()
- {
- $array = $this->toArray();
- $name = Str::slug($array['name'], ' ');
-
- return [
- 'id' => $this->id,
- 'name' => $name,
- 'nameNgrams' => utf8_encode((new TNTIndexer)->buildTrigrams(implode(', ', [$name]))),
- ];
- }
-
- /**
- * Counts how many folder have items
- *
- * @return int
- */
- public function getItemsAttribute()
- {
- $folders = $this->folders()->count();
- $files = $this->files()->count();
-
- return $folders + $files;
- }
-
- /**
- * Counts how many folder have items
- *
- * @return int
- */
- public function getTrashedItemsAttribute()
- {
- $folders = $this->trashed_folders()->count();
- $files = $this->trashed_files()->count();
-
- return $folders + $files;
- }
-
- /**
- * Format created at date reformat
- *
- * @return string
- */
- public function getCreatedAtAttribute()
- {
- return format_date(set_time_by_user_timezone($this->attributes['created_at']), __('vuefilemanager.time'));
- }
-
- /**
- * Format created at date reformat
- *
- * @return string
- */
- public function getDeletedAtAttribute()
- {
- if (! $this->attributes['deleted_at']) return null;
-
- return format_date(set_time_by_user_timezone($this->attributes['deleted_at']), __('vuefilemanager.time'));
- }
-
- /**
- * Get parent
- *
- * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
- */
- public function parent()
- {
- return $this->belongsTo('App\FileManagerFolder', 'parent_id', 'unique_id');
- }
-
- public function folderIds()
- {
- return $this->children()->with('folderIds')->select(['unique_id', 'parent_id']);
- }
-
- /**
- * Get all files
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function files()
- {
- return $this->hasMany('App\FileManagerFile', 'folder_id', 'unique_id');
- }
-
- /**
- * Get all trashed files
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function trashed_files()
- {
-
- return $this->hasMany('App\FileManagerFile', 'folder_id', 'unique_id')->withTrashed();
- }
-
- /**
- * Get all folders
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function folders()
- {
- return $this->children()->with('folders');
- }
-
- /**
- * Get all trashed folders
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function trashed_folders()
- {
- return $this->children()->with('trashed_folders')->withTrashed()->select(['parent_id', 'unique_id', 'name']);
- }
-
- /**
- * Get childrens
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function children()
- {
- return $this->hasMany('App\FileManagerFolder', 'parent_id', 'unique_id');
- }
-
- /**
- * Get trashed childrens
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function trashed_children()
- {
- return $this->hasMany('App\FileManagerFolder', 'parent_id', 'unique_id')->withTrashed();
- }
-
- /**
- * Get sharing attributes
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasOne
- */
- public function shared()
- {
- return $this->hasOne('App\Share', 'item_id', 'unique_id');
- }
-
- // Delete all folder childrens
- public static function boot()
- {
- parent::boot();
-
- static::deleting(function ($item) {
-
- if ( $item->isForceDeleting() ) {
-
- $item->trashed_children()->each(function($folder) {
- $folder->forceDelete();
- });
-
- } else {
-
- $item->children()->each(function($folder) {
- $folder->delete();
- });
-
- $item->files()->each(function($file) {
- $file->delete();
- });
- }
- });
-
- static::restoring(function ($item) {
-
- // Restore children folders
- $item->trashed_children()->each(function($folder) {
- $folder->restore();
- });
-
- // Restore children files
- $item->trashed_files()->each(function($files) {
- $files->restore();
- });
- });
- }
-}
\ No newline at end of file
diff --git a/app/Http/Controllers/Admin/DashboardController.php b/app/Http/Controllers/Admin/DashboardController.php
index 10ca9b62..d35bcfc4 100644
--- a/app/Http/Controllers/Admin/DashboardController.php
+++ b/app/Http/Controllers/Admin/DashboardController.php
@@ -2,20 +2,19 @@
namespace App\Http\Controllers\Admin;
-use App\FileManagerFile;
+use App\Models\File;
use App\Http\Controllers\Controller;
use App\Http\Resources\UsersCollection;
use App\Services\StripeService;
-use App\Setting;
-use App\User;
+use App\Models\User;
use ByteUnits\Metric;
-use Illuminate\Http\Request;
+use DB;
use Laravel\Cashier\Subscription;
class DashboardController extends Controller
{
/**
- * DashboardController constructor.
+ * @param StripeService $stripe
*/
public function __construct(StripeService $stripe)
{
@@ -29,26 +28,21 @@ class DashboardController extends Controller
*/
public function index()
{
- // Get total users
- $total_users = User::all()->count();
-
- // Get total used space
- $total_used_space = FileManagerFile::all()->map(function ($item) {
- return (int)$item->getRawOriginal('filesize');
- })->sum();
-
// Get total premium users
- $total_premium_users = Subscription::where('stripe_status', 'active')->get()->count();
+ $premium_users = Subscription::whereStripeStatus('active')
+ ->count();
- // Get License
- $license = Setting::where('name', 'license')->first();
+ // Get total storage usage
+ $storage_usage = Metric::bytes(
+ DB::table('files')->sum('filesize')
+ )->format();
return [
- 'license' => $license ? $license->value : null,
+ 'license' => get_setting('license'),
'app_version' => config('vuefilemanager.version'),
- 'total_users' => $total_users,
- 'total_used_space' => Metric::bytes($total_used_space)->format(),
- 'total_premium_users' => $total_premium_users,
+ 'total_users' => User::count(),
+ 'total_used_space' => $storage_usage,
+ 'total_premium_users' => $premium_users,
];
}
@@ -57,10 +51,11 @@ class DashboardController extends Controller
*
* @return UsersCollection
*/
- public function new_registrations()
+ public function newbies()
{
return new UsersCollection(
- User::sortable(['created_at' => 'desc'])->paginate(10)
+ User::sortable(['created_at' => 'desc'])
+ ->paginate(10)
);
}
}
diff --git a/app/Http/Controllers/Admin/InvoiceController.php b/app/Http/Controllers/Admin/InvoiceController.php
index 381aa3f9..8ea293e0 100644
--- a/app/Http/Controllers/Admin/InvoiceController.php
+++ b/app/Http/Controllers/Admin/InvoiceController.php
@@ -5,15 +5,15 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Resources\InvoiceAdminCollection;
use App\Http\Resources\InvoiceResource;
-use App\Invoice;
+use App\Models\Invoice;
use App\Services\StripeService;
-use App\Setting;
+use App\Models\Setting;
use Illuminate\Http\Request;
class InvoiceController extends Controller
{
/**
- * PlanController constructor.
+ * @param StripeService $stripe
*/
public function __construct(StripeService $stripe)
{
@@ -33,20 +33,16 @@ class InvoiceController extends Controller
}
/**
- * Get single invoice by $token
+ * Get single invoice by invoice $token
*
* @param $customer
* @param $token
- * @return InvoiceResource
+ * @return InvoiceResource|\Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function show($customer, $token)
{
- $settings = json_decode(Setting::all()->pluck('value', 'name')->toJson());
-
- $invoice = $this->stripe->getUserInvoice($customer, $token);
-
return view('vuefilemanager.invoice')
- ->with('settings', $settings)
- ->with('invoice', $invoice);
+ ->with('settings', get_settings_in_json())
+ ->with('invoice', $this->stripe->getUserInvoice($customer, $token));
}
}
diff --git a/app/Http/Controllers/Admin/LanguageController.php b/app/Http/Controllers/Admin/LanguageController.php
new file mode 100644
index 00000000..ecec0b52
--- /dev/null
+++ b/app/Http/Controllers/Admin/LanguageController.php
@@ -0,0 +1,136 @@
+get()), 200
+ );
+ }
+
+ /**
+ * Get all language strings for admin translate
+ *
+ * @param Language $language
+ */
+ public function get_language(Language $language)
+ {
+ return response(
+ new LanguageResource($language), 200
+ );
+ }
+
+ /**
+ * Create new language
+ *
+ * @param CreateLanguageRequest $request
+ * @return string
+ */
+ public function create_language(CreateLanguageRequest $request)
+ {
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ $language = Language::create([
+ 'name' => $request->input('name'),
+ 'locale' => $request->input('locale')
+ ]);
+
+ return response(
+ new LanguageResource($language), 201
+ );
+ }
+
+ /**
+ * Update language
+ *
+ * @param UpdateLanguageRequest $request
+ * @param Language $language
+ */
+ public function update_language(UpdateLanguageRequest $request, Language $language)
+ {
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ $language->update(make_single_input($request));
+
+ return response(
+ new LanguageResource($language), 201
+ );
+ }
+
+ /**
+ * Update string for language
+ *
+ * @param UpdateStringRequest $request
+ * @param Language $language
+ * @return Application|ResponseFactory|Response
+ */
+ public function update_string(UpdateStringRequest $request, Language $language)
+ {
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ $language
+ ->languageTranslations()
+ ->where('key', $request->name)
+ ->update([
+ 'value' => $request->value
+ ]);
+
+ cache()->forget("language-translations-{$language->locale}");
+
+ return response(
+ 'Done', 204
+ );
+ }
+
+ /**
+ * Delete the language with all children strings
+ *
+ * @param Language $language
+ * @return ResponseFactory|Response
+ */
+ public function delete_language(Language $language)
+ {
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ if ($language->locale === 'en') {
+ abort(401, "Sorry, you can't delete default language.");
+ }
+
+ // If user try to delete language used as default,
+ // then set en language as default
+ if ($language->locale === get_setting('language')) {
+ Setting::whereName('language')->first()
+ ->update(['value' => 'en']);
+ }
+
+ $language->delete();
+
+ return response(
+ 'Done', 204
+ );
+ }
+}
diff --git a/app/Http/Controllers/Admin/PagesController.php b/app/Http/Controllers/Admin/PagesController.php
index 6d076916..5a93fbfe 100644
--- a/app/Http/Controllers/Admin/PagesController.php
+++ b/app/Http/Controllers/Admin/PagesController.php
@@ -5,12 +5,19 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Resources\PageCollection;
use App\Http\Resources\PageResource;
-use App\Http\Tools\Demo;
-use App\Page;
+use App\Services\DemoService;
+use App\Models\Page;
+use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
+use Illuminate\Http\Response;
class PagesController extends Controller
{
+ public function __construct()
+ {
+ $this->demo = resolve(DemoService::class);
+ }
+
/**
* Get all pages
*
@@ -19,43 +26,38 @@ class PagesController extends Controller
public function index()
{
return new PageCollection(
- Page::sortable()->paginate(10)
+ Page::sortable()
+ ->paginate(10)
);
}
/**
- * Get page resource
+ * Get single page resource
*
- * @param $slug
+ * @param $page
* @return PageResource
*/
- public function show($slug)
+ public function show(Page $page)
{
- return new PageResource(
- Page::where('slug', $slug)->first()
- );
+ return new PageResource($page);
}
/**
* Update page content
*
* @param Request $request
- * @param $slug
- * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ * @param Page $page
+ * @return ResponseFactory|Response
*/
- public function update(Request $request, $slug)
+ public function update(Request $request, Page $page)
{
- // Check if is demo
- if (env('APP_DEMO')) {
- return Demo::response_204();
- }
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
- // Get page
- $page = Page::where('slug', $slug)->first();
+ $page->update(
+ make_single_input($request)
+ );
- // Update page
- $page->update(make_single_input($request));
-
- return response('Done', 204);
+ return response(new PageResource($page), 204);
}
}
diff --git a/app/Http/Controllers/Admin/PlanController.php b/app/Http/Controllers/Admin/PlanController.php
index 41895859..b555fe98 100644
--- a/app/Http/Controllers/Admin/PlanController.php
+++ b/app/Http/Controllers/Admin/PlanController.php
@@ -7,11 +7,14 @@ use App\Http\Resources\PlanCollection;
use App\Http\Resources\PlanResource;
use App\Http\Resources\UserResource;
use App\Http\Resources\UsersCollection;
-use App\Http\Tools\Demo;
-use App\Plan;
+use App\Services\DemoService;
+use App\Models\Plan;
use App\Services\StripeService;
-use App\User;
+use App\Models\User;
+use Illuminate\Contracts\Foundation\Application;
+use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Request;
+use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
use Laravel\Cashier\Subscription;
use Rinvex\Subscriptions\Models\PlanFeature;
@@ -19,17 +22,18 @@ use Rinvex\Subscriptions\Models\PlanFeature;
class PlanController extends Controller
{
/**
- * PlanController constructor.
+ * @param StripeService $stripe
*/
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
+ $this->demo = resolve(DemoService::class);
}
/**
* Get all plans
*
- * @return PlanCollection
+ * @return PlanCollection|Application|ResponseFactory|Response
*/
public function index()
{
@@ -42,14 +46,14 @@ class PlanController extends Controller
});
}
- return new PlanCollection($plans);
+ return response(new PlanCollection($plans), 200);
}
/**
* Get plan record
*
* @param $id
- * @return PlanResource
+ * @return PlanResource|Application|ResponseFactory|Response
*/
public function show($id)
{
@@ -62,19 +66,19 @@ class PlanController extends Controller
});
}
- return new PlanResource($plan);
+ return response(new PlanResource($plan), 200);
}
/**
* Create new plan
*
* @param Request $request
- * @return PlanResource
+ * @return PlanResource|Application|ResponseFactory|Response
*/
public function store(Request $request)
{
- // Check if is demo
- if (env('APP_DEMO')) {
+ // TODO: inline request
+ if (is_demo()) {
if (Cache::has('plan-starter-pack')) {
$plan = Cache::get('plan-starter-pack');
@@ -94,7 +98,7 @@ class PlanController extends Controller
// Clear cached plans
cache_forget_many(['plans', 'pricing']);
- return $plan;
+ return response($plan, 201);
}
/**
@@ -102,14 +106,12 @@ class PlanController extends Controller
*
* @param Request $request
* @param $id
- * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ * @return ResponseFactory|Response
*/
public function update(Request $request, $id)
{
- // Check if is demo
- if (env('APP_DEMO')) {
- return Demo::response_204();
- }
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
// Update plan
$this->stripe->updatePlan($request, $id);
@@ -117,21 +119,19 @@ class PlanController extends Controller
// Clear cached plans
cache_forget_many(['plans', 'pricing', 'plan-' . $id]);
- return response('Saved!', 204);
+ return response('Saved!', 201);
}
/**
* Delete plan
*
* @param $id
- * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ * @return ResponseFactory|Response
*/
public function delete($id)
{
- // Check if is demo
- if (env('APP_DEMO')) {
- return Demo::response_204();
- }
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
// Delete plan
$this->stripe->deletePlan($id);
@@ -150,10 +150,12 @@ class PlanController extends Controller
*/
public function subscribers($id)
{
- $subscribers = Subscription::where('stripe_plan', $id)->pluck('user_id');
+ $subscribers = Subscription::whereStripePlan($id)
+ ->pluck('user_id');
return new UsersCollection(
- User::sortable()->findMany($subscribers)
+ User::sortable()
+ ->findMany($subscribers)
);
}
}
diff --git a/app/Http/Controllers/Admin/SettingController.php b/app/Http/Controllers/Admin/SettingController.php
new file mode 100644
index 00000000..fe8d3976
--- /dev/null
+++ b/app/Http/Controllers/Admin/SettingController.php
@@ -0,0 +1,190 @@
+demo = resolve(DemoService::class);
+ }
+
+ /**
+ * Get table content
+ *
+ * @param Request $request
+ * @return mixed
+ */
+ public function show(Request $request)
+ {
+ if (strpos($request->column, '|') !== false) {
+
+ $columns = explode('|', $request->column);
+
+ return Setting::whereIn('name', $columns)
+ ->pluck('value', 'name');
+ }
+
+ return Setting::where('name', $request->column)
+ ->pluck('value', 'name');
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function update(Request $request)
+ {
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ // Store image if exist
+ if ($request->hasFile($request->name)) {
+
+ // Find and update image path
+ Setting::updateOrCreate([
+ 'name' => $request->name
+ ], [
+ 'value' => store_system_image($request, $request->name)
+ ]);
+
+ return response('Done', 204);
+ }
+
+ // Find and update variable
+ Setting::updateOrCreate(
+ ['name' => $request->name],
+ ['value' => $request->value]
+ );
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Set new email credentials to .env file
+ *
+ * @param Request $request
+ * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ */
+ public function set_email(Request $request)
+ {
+ // TODO: pridat validator do requestu
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ if (!app()->runningUnitTests()) {
+
+ setEnvironmentValue([
+ 'MAIL_DRIVER' => $request->driver,
+ 'MAIL_HOST' => $request->host,
+ 'MAIL_PORT' => $request->port,
+ 'MAIL_USERNAME' => $request->username,
+ 'MAIL_PASSWORD' => $request->password,
+ 'MAIL_ENCRYPTION' => $request->encryption,
+ ]);
+
+ // Clear config cache
+ Artisan::call('config:clear');
+ Artisan::call('config:cache');
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Configure stripe additionally
+ *
+ * @param Request $request
+ */
+ public function set_stripe(Request $request)
+ {
+ // TODO: pridat validator do requestu
+ // Check payment setup status
+ if (get_setting('payments_configured')) {
+ abort(401, 'Gone');
+ }
+
+ // Try to get stripe account details
+ try {
+ if (!app()->runningUnitTests()) {
+
+ Stripe::make($request->secret, '2020-03-02')
+ ->account()
+ ->details();
+ }
+ } catch (UnauthorizedException $e) {
+
+ throw new HttpException(401, $e->getMessage());
+ }
+
+ // Get options
+ collect([
+ [
+ 'name' => 'stripe_currency',
+ 'value' => $request->currency,
+ ],
+ [
+ 'name' => 'payments_configured',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'payments_active',
+ 'value' => 1,
+ ],
+ ])->each(function ($col) {
+ Setting::forceCreate([
+ 'name' => $col['name'],
+ 'value' => $col['value'],
+ ]);
+ });
+
+ if (!app()->runningUnitTests()) {
+
+ // Set stripe credentials to .env
+ setEnvironmentValue([
+ 'CASHIER_CURRENCY' => $request->currency,
+ 'STRIPE_KEY' => $request->key,
+ 'STRIPE_SECRET' => $request->secret,
+ 'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
+ ]);
+
+ // Clear cache
+ Artisan::call('cache:clear');
+ Artisan::call('config:clear');
+ Artisan::call('config:cache');
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Clear application cache
+ */
+ public function flush_cache()
+ {
+ // Abort in demo mode
+ abort_if(is_demo(), 204, 'Done.');
+
+ if (!app()->runningUnitTests()) {
+ Artisan::call('cache:clear');
+ Artisan::call('config:clear');
+ Artisan::call('config:cache');
+ }
+
+ return response('Done', 204);
+ }
+}
diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php
index f0464333..1925fdfb 100644
--- a/app/Http/Controllers/Admin/UserController.php
+++ b/app/Http/Controllers/Admin/UserController.php
@@ -2,8 +2,8 @@
namespace App\Http\Controllers\Admin;
-use App\FileManagerFile;
-use App\FileManagerFolder;
+use App\Models\File;
+use App\Models\Folder;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ChangeRoleRequest;
use App\Http\Requests\Admin\ChangeStorageCapacityRequest;
@@ -14,18 +14,15 @@ use App\Http\Resources\UsersCollection;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserStorageResource;
use App\Http\Resources\UserSubscription;
-use App\Http\Tools\Demo;
use App\Services\StripeService;
-use App\Share;
-use App\User;
-use App\UserSettings;
+use App\Models\Share;
+use App\Models\User;
+use App\Models\UserSettings;
+use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
-use Illuminate\Http\Request;
+use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Gate;
-use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Password;
-use Illuminate\Support\Str;
use Storage;
class UserController extends Controller
@@ -38,59 +35,58 @@ class UserController extends Controller
/**
* Get user details
*
- * @param $id
+ * @param User $user
* @return UserResource
*/
- public function details($id)
+ public function details(User $user)
{
return new UserResource(
- User::findOrFail($id)
+ $user
);
}
/**
* Get user storage details
*
- * @param $id
+ * @param User $user
* @return UserStorageResource
*/
- public function storage($id)
+ public function storage(User $user)
{
return new UserStorageResource(
- User::findOrFail($id)
+ $user
);
}
/**
* Get user storage details
*
+ * @param User $user
* @return InvoiceCollection
*/
- public function invoices($id)
+ public function invoices(User $user)
{
- $user = User::find($id);
-
return new InvoiceCollection(
- $this->stripe->getUserInvoices($user)
+ $this
+ ->stripe
+ ->getUserInvoices($user)
);
}
/**
* Get user subscription details
*
- * @param $id
- * @return UserSubscription
+ * @param User $user
+ * @return UserSubscription|Application|ResponseFactory|Response
*/
- public function subscription($id)
+ public function subscription(User $user)
{
- $user = User::find($id);
-
- if (! $user->stripeId() || ! $user->subscription('main')) {
- return response('User doesn\'t have any subscription.', 404);
+ if (!$user->stripeId() || !$user->subscription('main')) {
+ return response("User doesn't have any subscription.", 404);
}
return new UserSubscription(
- User::find($id)
+ $user
);
}
@@ -102,7 +98,8 @@ class UserController extends Controller
public function users()
{
return new UsersCollection(
- User::sortable(['created_at', 'DESC'])->paginate('20')
+ User::sortable(['created_at', 'DESC'])
+ ->paginate(20)
);
}
@@ -110,15 +107,13 @@ class UserController extends Controller
* Change user role
*
* @param ChangeRoleRequest $request
- * @param $id
+ * @param User $user
* @return UserResource
*/
- public function change_role(ChangeRoleRequest $request, $id)
+ public function change_role(ChangeRoleRequest $request, User $user)
{
- $user = User::findOrFail($id);
-
// Demo preview
- if (env('APP_DEMO') && $id == 1) {
+ if (is_demo_account('howdy@hi5ve.digial')) {
return new UserResource($user);
}
@@ -126,42 +121,47 @@ class UserController extends Controller
$user->role = $request->input('attributes.role');
$user->save();
- return new UserResource($user);
+ return new UserResource(
+ $user
+ );
}
/**
* Change user storage capacity
*
* @param ChangeStorageCapacityRequest $request
- * @param $id
+ * @param User $user
* @return UserStorageResource
*/
- public function change_storage_capacity(ChangeStorageCapacityRequest $request, $id)
+ public function change_storage_capacity(ChangeStorageCapacityRequest $request, User $user)
{
- $user = User::findOrFail($id);
+ $user
+ ->settings()
+ ->update(
+ $request->input('attributes')
+ );
- $user->settings()->update($request->input('attributes'));
-
- return new UserStorageResource($user);
+ return new UserStorageResource(
+ $user
+ );
}
/**
* Send user password reset link
*
- * @param $id
- * @return ResponseFactory|\Illuminate\Http\Response
+ * @param User $user
+ * @return ResponseFactory|Response
*/
- public function send_password_reset_email($id)
+ public function reset_password(User $user)
{
- $user = User::findOrFail($id);
-
// Demo preview
- if (env('APP_DEMO')) {
+ if (is_demo()) {
return response('Done!', 204);
}
// Get password token
- $token = Password::getRepository()->create($user);
+ $token = Password::getRepository()
+ ->create($user);
// Send user email
$user->sendPasswordResetNotification($token);
@@ -173,100 +173,58 @@ class UserController extends Controller
* Create new user by admin
*
* @param CreateUserByAdmin $request
- * @return UserResource
+ * @return UserResource|Application|ResponseFactory|Response
*/
public function create_user(CreateUserByAdmin $request)
{
- // Store avatar
- if ($request->hasFile('avatar')) {
- $avatar = store_avatar($request->file('avatar'), 'avatars');
- }
-
// Create user
$user = User::forceCreate([
- 'avatar' => $request->hasFile('avatar') ? $avatar : null,
- 'name' => $request->name,
'role' => $request->role,
'email' => $request->email,
- 'password' => Hash::make($request->password),
+ 'password' => bcrypt($request->password),
]);
- // Create settings
- UserSettings::forceCreate([
- 'user_id' => $user->id,
- 'storage_capacity' => $request->storage_capacity,
- ]);
+ UserSettings::unguard();
- return new UserResource($user);
+ $user
+ ->settings()
+ ->create([
+ 'name' => $request->name,
+ 'avatar' => store_avatar($request, 'avatar'),
+ 'storage_capacity' => $request->storage_capacity,
+ ]);
+
+ UserSettings::reguard();
+
+ return response(new UserResource($user), 201);
}
/**
* Delete user with all user data
*
* @param DeleteUserRequest $request
- * @param $id
- * @return ResponseFactory|\Illuminate\Http\Response
+ * @param User $user
+ * @return ResponseFactory|Response
* @throws \Exception
*/
- public function delete_user(DeleteUserRequest $request, $id)
+ public function delete_user(DeleteUserRequest $request, User $user)
{
- $user = User::findOrFail($id);
-
- if ($user->subscribed('main')) {
- abort(202, 'You can\'t delete this account while user have active subscription.');
- }
-
- // Demo preview
- if (env('APP_DEMO')) {
+ if (is_demo()) {
return response('Done!', 204);
}
- // Check for self deleted account
+ if ($user->subscribed('main')) {
+ abort(202, "You can\'t delete this account while user have active subscription.");
+ }
+
if ($user->id === Auth::id()) {
- abort(406, 'You can\'t delete your account');
+ abort(406, "You can\'t delete your account");
}
- // Validate user name
- if ($user->name !== $request->input('data.name')) abort(403);
-
- $shares = Share::where('user_id', $user->id)->get();
-
- $files = FileManagerFile::withTrashed()
- ->where('user_id', $user->id)
- ->get();
- $folders = FileManagerFolder::withTrashed()
- ->where('user_id', $user->id)
- ->get();
-
- // Remove all files and thumbnails
- $files->each(function ($file) {
-
- // Delete file
- Storage::delete('/file-manager/' . $file->basename);
-
- // Delete thumbnail if exist
- if (!is_null($file->thumbnail)) {
- Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
- }
-
- // Delete file permanently
- $file->forceDelete();
- });
-
- // Remove avatar
- if ($user->avatar) {
- Storage::delete('/avatars/' . $user->avatar);
+ if ($user->settings->name !== $request->name) {
+ abort(403, "The name you typed is wrong!");
}
- // Remove folders & shares
- $folders->each->forceDelete();
- $shares->each->forceDelete();
-
- // Remove favourites
- $user->settings->delete();
- $user->favourite_folders()->sync([]);
-
- // Delete user
$user->delete();
return response('Done!', 204);
diff --git a/app/Http/Controllers/App/AppFunctionsController.php b/app/Http/Controllers/App/AppFunctionsController.php
new file mode 100644
index 00000000..6ffb93a7
--- /dev/null
+++ b/app/Http/Controllers/App/AppFunctionsController.php
@@ -0,0 +1,198 @@
+stripe = $stripe;
+ }
+
+ /**
+ * Show index page
+ *
+ * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+ */
+ public function index()
+ {
+ try {
+ // Try to connect to database
+ \DB::getPdo();
+
+ // Get setup status
+ $setup_status = get_setup_status();
+
+ // Get app pages
+ $pages = Page::all();
+
+ // Get all settings
+ $settings = get_settings_in_json();
+
+ } catch (PDOException $e) {
+
+ $setup_status = 'setup-database';
+ }
+
+ return view("index")
+ ->with('settings', $settings ?? null)
+ ->with('legal', $pages ?? null)
+ ->with('installation', $setup_status);
+ }
+
+ /**
+ * Get og site for web crawlers
+ *
+ * @param Share $shared
+ * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
+ */
+ public function og_site(Share $shared)
+ {
+ // Get file/folder record
+ $item = ('App\\Models\\' . ucfirst($shared->type))
+ ::where('user_id', $shared->user->id)
+ ->where('id', $shared->item_id)
+ ->first();
+
+ if ($item->thumbnail) {
+ $item->setPublicUrl($shared->token);
+ }
+
+ return view("vuefilemanager.crawler.og-view")
+ ->with('settings', get_settings_in_json())
+ ->with('metadata', [
+ 'url' => url('/share', ['token' => $shared->token]),
+ 'is_protected' => $shared->is_protected,
+ 'user' => $shared->user->settings->name,
+ 'name' => $item->name,
+ 'size' => $shared->type === 'folder'
+ ? $item->items
+ : $item->filesize,
+ 'thumbnail' => $item->thumbnail ?? null,
+ ]);
+ }
+
+ /**
+ * Send contact message from pages
+ *
+ * @param SendContactMessageRequest $request
+ * @return ResponseFactory|Response
+ */
+ public function contact_form(SendContactMessageRequest $request)
+ {
+ Mail::to(
+ get_setting('contact_email')
+ )->send(
+ new SendContactMessage($request->all())
+ );
+
+ return response('Done', 201);
+ }
+
+ /**
+ * Get single page content
+ *
+ * @param Page $page
+ * @return PageResource
+ */
+ public function get_page(Page $page)
+ {
+ return new PageResource($page);
+ }
+
+ /**
+ * Get selected settings from public route
+ *
+ * @param Request $request
+ * @return mixed
+ */
+ public function get_setting_columns(Request $request)
+ {
+ if (strpos($request->column, '|') !== false) {
+
+ $columns = collect(explode('|', $request->column))
+ ->each(function ($column) {
+ if (in_array($column, $this->blacklist)) {
+ abort(401);
+ }
+ });
+
+ return Setting::whereIn('name', $columns)
+ ->pluck('value', 'name');
+ }
+
+ if (in_array($request->column, $this->blacklist)) {
+ abort(401);
+ }
+
+ return Setting::where('name', $request->column)
+ ->pluck('value', 'name');
+ }
+
+ /**
+ * Get all active storage plans
+ *
+ * @return PricingCollection
+ */
+ public function get_storage_plans()
+ {
+ // Get pricing from cache
+ $pricing = Cache::rememberForever('pricing', function () {
+ return $this->stripe->getActivePlans();
+ });
+
+ // Format pricing to collection
+ $collection = new PricingCollection($pricing);
+
+ // Sort and return pricing
+ return $collection
+ ->sortBy('product.metadata.capacity')
+ ->values()
+ ->all();
+ }
+
+ /**
+ * Get language translations for frontend app
+ *
+ * @param $lang
+ * @return array
+ */
+ public function get_translations($lang)
+ {
+ $translations = Cache::rememberForever("language-translations-$lang", function () use ($lang) {
+ return Language::whereLocale($lang)
+ ->firstOrFail()
+ ->languageTranslations;
+ });
+
+ return map_language_translations($translations);
+ }
+}
diff --git a/app/Http/Controllers/App/Maintenance.php b/app/Http/Controllers/App/Maintenance.php
new file mode 100644
index 00000000..44b28421
--- /dev/null
+++ b/app/Http/Controllers/App/Maintenance.php
@@ -0,0 +1,61 @@
+upgrade_database();
+ }
+
+ /**
+ * @return int|mixed
+ */
+ private function upgrade_database()
+ {
+ $command = Artisan::call('migrate', [
+ '--force' => true
+ ]);
+
+ if ($command === 0) {
+ echo 'Operation was successful.';
+ }
+
+ if ($command === 1) {
+ echo 'Operation failed.';
+ }
+ return $command;
+ }
+}
diff --git a/app/Http/Controllers/App/SetupWizardController.php b/app/Http/Controllers/App/SetupWizardController.php
new file mode 100644
index 00000000..1a3d6bb4
--- /dev/null
+++ b/app/Http/Controllers/App/SetupWizardController.php
@@ -0,0 +1,483 @@
+stripe = resolve(StripeService::class);
+ $this->setup = resolve(SetupService::class);
+
+ $this->check_setup_status();
+ }
+
+ /**
+ * Verify Envato purchase code
+ *
+ * @param Request $request
+ * @return ResponseFactory|\Illuminate\Http\Response|mixed
+ */
+ public function verify_purchase_code(Request $request)
+ {
+ // Verify purchase code
+ $response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
+
+ if ($response->successful()) {
+ return response($response, 204);
+ }
+
+ return response('Purchase code is invalid.', 400);
+ }
+
+ /**
+ * Set up database credentials
+ *
+ * @param StoreDatabaseCredentialsRequest $request
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function setup_database(StoreDatabaseCredentialsRequest $request)
+ {
+ if (!app()->runningUnitTests()) {
+
+ try {
+ // Set temporary database connection
+ config(['database.connections.test.driver' => $request->connection]);
+ config(['database.connections.test.host' => $request->host]);
+ config(['database.connections.test.port' => $request->port]);
+ config(['database.connections.test.database' => $request->name]);
+ config(['database.connections.test.username' => $request->username]);
+ config(['database.connections.test.password' => $request->password]);
+
+ // Test connection
+ \DB::connection('test')->getPdo();
+
+ } catch (PDOException $e) {
+ throw new HttpException(500, $e->getMessage());
+ }
+
+ // TODO: add SANCTUM_STATEFUL_DOMAINS parameter
+
+ setEnvironmentValue([
+ 'DB_CONNECTION' => $request->connection,
+ 'DB_HOST' => $request->host,
+ 'DB_PORT' => $request->port,
+ 'DB_DATABASE' => $request->name,
+ 'DB_USERNAME' => $request->username,
+ 'DB_PASSWORD' => $request->password,
+ ]);
+
+ Artisan::call('config:cache');
+
+ Artisan::call('key:generate', [
+ '--force' => true
+ ]);
+
+ Artisan::call('migrate:fresh', [
+ '--force' => true
+ ]);
+ }
+
+ // Store setup wizard progress
+ Setting::forceCreate([
+ 'name' => 'setup_wizard_database',
+ 'value' => 1,
+ ]);
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Store and test stripe credentials
+ *
+ * @param StoreStripeCredentialsRequest $request
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
+ {
+ if (!app()->runningUnitTests()) {
+
+ // Create stripe instance
+ $stripe = Stripe::make($request->secret, '2020-03-02');
+
+ try {
+ // Try to get stripe account details
+ $stripe->account()->details();
+
+ } catch (UnauthorizedException $e) {
+ throw new HttpException(401, $e->getMessage());
+ }
+ }
+
+ // Set settings
+ collect([
+ [
+ 'name' => 'stripe_currency',
+ 'value' => $request->currency,
+ ],
+ [
+ 'name' => 'payments_configured',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'payments_active',
+ 'value' => 1,
+ ],
+ ])->each(function ($col) {
+ Setting::forceCreate([
+ 'name' => $col['name'],
+ 'value' => $col['value'],
+ ]);
+ });
+
+ if (!app()->runningUnitTests()) {
+
+ // Set stripe credentials to .env
+ setEnvironmentValue([
+ 'CASHIER_CURRENCY' => $request->currency,
+ 'STRIPE_KEY' => $request->key,
+ 'STRIPE_SECRET' => $request->secret,
+ 'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
+ ]);
+
+ // Clear cache
+ Artisan::call('config:cache');
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Store Stripe billings
+ *
+ * @param StoreStripeBillingRequest $request
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function store_stripe_billings(StoreStripeBillingRequest $request)
+ {
+ // Get options
+ collect([
+ [
+ 'name' => 'billing_phone_number',
+ 'value' => $request->billing_phone_number,
+ ],
+ [
+ 'name' => 'billing_postal_code',
+ 'value' => $request->billing_postal_code,
+ ],
+ [
+ 'name' => 'billing_vat_number',
+ 'value' => $request->billing_vat_number,
+ ],
+ [
+ 'name' => 'billing_address',
+ 'value' => $request->billing_address,
+ ],
+ [
+ 'name' => 'billing_country',
+ 'value' => $request->billing_country,
+ ],
+ [
+ 'name' => 'billing_state',
+ 'value' => $request->billing_state,
+ ],
+ [
+ 'name' => 'billing_city',
+ 'value' => $request->billing_city,
+ ],
+ [
+ 'name' => 'billing_name',
+ 'value' => $request->billing_name,
+ ],
+ ])->each(function ($col) {
+ Setting::forceCreate([
+ 'name' => $col['name'],
+ 'value' => $col['value'],
+ ]);
+ });
+
+ if (!app()->runningUnitTests()) {
+ Artisan::call('config:cache');
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Create Stripe subscription plan
+ *
+ * @param StoreStripePlansRequest $request
+ * @return \Illuminate\Contracts\Foundation\Application|ResponseFactory|\Illuminate\Http\Response
+ */
+ public function store_stripe_plans(StoreStripePlansRequest $request)
+ {
+ foreach ($request->plans as $plan) {
+ $this->stripe->createPlan($plan);
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Store environment setup
+ *
+ * @param StoreEnvironmentSetupRequest $request
+ * @return string
+ */
+ public function store_environment_setup(StoreEnvironmentSetupRequest $request)
+ {
+ if (!app()->runningUnitTests()) {
+
+ $drivers = [
+ 'local' => [
+ 'FILESYSTEM_DRIVER' => 'local',
+ ],
+ 's3' => [
+ 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
+ 'AWS_ACCESS_KEY_ID' => $request->storage['key'] ?? null,
+ 'AWS_SECRET_ACCESS_KEY' => $request->storage['secret'] ?? null,
+ 'AWS_DEFAULT_REGION' => $request->storage['region'] ?? null,
+ 'AWS_BUCKET' => $request->storage['bucket'] ?? null,
+ ],
+ 'spaces' => [
+ 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
+ 'DO_SPACES_KEY' => $request->storage['key'] ?? null,
+ 'DO_SPACES_SECRET' => $request->storage['secret'] ?? null,
+ 'DO_SPACES_ENDPOINT' => $request->storage['endpoint'] ?? null,
+ 'DO_SPACES_REGION' => $request->storage['region'] ?? null,
+ 'DO_SPACES_BUCKET' => $request->storage['bucket'] ?? null,
+ ],
+ 'wasabi' => [
+ 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
+ 'WASABI_KEY' => $request->storage['key'] ?? null,
+ 'WASABI_SECRET' => $request->storage['secret'] ?? null,
+ 'WASABI_ENDPOINT' => $request->storage['endpoint'] ?? null,
+ 'WASABI_REGION' => $request->storage['region'] ?? null,
+ 'WASABI_BUCKET' => $request->storage['bucket'] ?? null,
+ ],
+ 'backblaze' => [
+ 'FILESYSTEM_DRIVER' => $request->storage['driver'] ?? null,
+ 'BACKBLAZE_KEY' => $request->storage['key'] ?? null,
+ 'BACKBLAZE_SECRET' => $request->storage['secret'] ?? null,
+ 'BACKBLAZE_ENDPOINT' => $request->storage['endpoint'] ?? null,
+ 'BACKBLAZE_REGION' => $request->storage['region'] ?? null,
+ 'BACKBLAZE_BUCKET' => $request->storage['bucket'] ?? null,
+ ],
+ ];
+
+ // Storage credentials for storage
+ setEnvironmentValue(
+ $drivers[$request->storage['driver']]
+ );
+
+ // Store credentials for mail
+ // TODO: add options for mailgun
+ setEnvironmentValue([
+ 'MAIL_DRIVER' => $request->mail['driver'],
+ 'MAIL_HOST' => $request->mail['host'],
+ 'MAIL_PORT' => $request->mail['port'],
+ 'MAIL_USERNAME' => $request->mail['username'],
+ 'MAIL_PASSWORD' => $request->mail['password'],
+ 'MAIL_ENCRYPTION' => $request->mail['encryption'],
+ ]);
+
+ Artisan::call('config:cache');
+ }
+
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Store app settings
+ * @param StoreAppSetupRequest $request
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function store_app_settings(StoreAppSetupRequest $request)
+ {
+ // Get options
+ collect([
+ [
+ 'name' => 'app_title',
+ 'value' => $request->title,
+ ],
+ [
+ 'name' => 'app_description',
+ 'value' => $request->description,
+ ],
+ [
+ 'name' => 'app_logo',
+ 'value' => store_system_image($request, 'logo'),
+ ],
+ [
+ 'name' => 'app_logo_horizontal',
+ 'value' => store_system_image($request, 'logo_horizontal'),
+ ],
+ [
+ 'name' => 'app_favicon',
+ 'value' => store_system_image($request, 'favicon'),
+ ],
+ [
+ 'name' => 'app_og_image',
+ 'value' => store_system_image($request, 'og_image'),
+ ],
+ [
+ 'name' => 'app_touch_icon',
+ 'value' => store_system_image($request, 'touch_icon'),
+ ],
+ [
+ 'name' => 'google_analytics',
+ 'value' => $request->googleAnalytics,
+ ],
+ [
+ 'name' => 'contact_email',
+ 'value' => $request->contactMail,
+ ],
+ [
+ 'name' => 'registration',
+ 'value' => $request->userRegistration,
+ ],
+ [
+ 'name' => 'storage_limitation',
+ 'value' => $request->storageLimitation,
+ ],
+ [
+ 'name' => 'storage_default',
+ 'value' => $request->defaultStorage ?? 5,
+ ],
+ ])->each(function ($col) {
+ Setting::forceCreate([
+ 'name' => $col['name'],
+ 'value' => $col['value'],
+ ]);
+ });
+
+ if (!app()->runningUnitTests()) {
+ setEnvironmentValue([
+ 'APP_NAME' => Str::camel($request->title),
+ ]);
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Create and login admin account
+ *
+ * @param Request $request
+ * @return ResponseFactory|\Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response
+ */
+ public function create_admin_account(Request $request)
+ {
+ // Validate request
+ // TODO: validator do requestu
+ $request->validate([
+ 'email' => 'required|string|email|unique:users',
+ 'password' => 'required|string|min:6|confirmed',
+ 'name' => 'required|string',
+ 'purchase_code' => 'required|string',
+ 'license' => 'required|string',
+ 'avatar' => 'sometimes|file',
+ ]);
+
+ // Create user
+ $user = User::forceCreate([
+ 'role' => 'admin',
+ 'email' => $request->email,
+ 'password' => bcrypt($request->password),
+ ]);
+
+ $user
+ ->settings()
+ ->create([
+ 'storage_capacity' => get_setting('storage_default'),
+ 'avatar' => store_avatar($request, 'avatar'),
+ 'name' => $request->name,
+ ]);
+
+ collect([
+ [
+ 'name' => 'setup_wizard_success',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'license',
+ 'value' => $request->license,
+ ],
+ [
+ 'name' => 'purchase_code',
+ 'value' => $request->purchase_code,
+ ]
+ ])->each(function ($col) {
+ Setting::forceCreate([
+ 'name' => $col['name'],
+ 'value' => $col['value'],
+ ]);
+ });
+
+ // Set up application
+ $this->setup->seed_default_pages();
+ $this->setup->seed_default_settings($request->license);
+ $this->setup->seed_default_language();
+
+ // Login account
+ if (Auth::attempt($request->only(['email', 'password']))) {
+
+ $request->session()->regenerate();
+
+ return response('Registration was successful', 204);
+ }
+
+ return response('Something went wrong', 500);
+ }
+
+ /**
+ * Get setup wizard status
+ *
+ * @return false | null
+ */
+ private function check_setup_status()
+ {
+ try {
+ // Check database connections
+ DB::getPdo();
+
+ // Get setup_wizard status
+ if (Schema::hasTable('settings') && get_setting('setup_wizard_success')) {
+ abort(410, 'Gone');
+ }
+
+ } catch (PDOException $e) {
+
+ return false;
+ }
+ }
+}
diff --git a/app/Http/Controllers/AppFunctionsController.php b/app/Http/Controllers/AppFunctionsController.php
deleted file mode 100644
index af9961f2..00000000
--- a/app/Http/Controllers/AppFunctionsController.php
+++ /dev/null
@@ -1,261 +0,0 @@
- true
- ]);
- }
-
- // Get settings
- $upgraded = Setting::where('name', 'latest_upgrade')->first();
-
- // Get connection string
- if ($upgraded && $upgraded->value !== '1.7') {
- $connection = 'quiet-update';
- } else if (!$upgraded) {
- $connection = 'quiet-update';
- } else {
- $connection = $this->get_setup_status();
- }
-
- // Get all settings
- $settings = Setting::all();
-
- // Get legal pages
- $legal = Page::whereIn('slug', ['terms-of-service', 'privacy-policy', 'cookie-policy'])
- ->get(['visibility', 'title', 'slug']);
-
- } catch (PDOException $e) {
- $connection = 'setup-database';
- $settings = null;
- }
-
- return view("index")
- ->with('settings', $settings ? json_decode($settings->pluck('value', 'name')->toJson()) : null)
- ->with('legal', isset($legal) ? $legal : null)
- ->with('installation', $connection);
- }
-
- /**
- * Get og site for web crawlers
- *
- * @param $token
- */
- public function og_site($token)
- {
- // Get all settings
- $settings = Setting::all();
-
- // Get shared token
- $shared = get_shared($token);
-
- // Get user
- $user = User::findOrFail($shared->user_id);
-
- // Handle single file
- if ($shared->type === 'file') {
-
- // Get file record
- $file = FileManagerFile::where('user_id', $shared->user_id)
- ->where('unique_id', $shared->item_id)
- ->first();
-
- if ($file->thumbnail) {
- $file->setPublicUrl($token);
- }
-
- $metadata = [
- 'is_protected' => $shared->protected,
- 'url' => url('/shared', ['token' => $token]),
- 'user' => $user->name,
- 'name' => $file->name,
- 'size' => $file->filesize,
- 'thumbnail' => $file->thumbnail ? $file->thumbnail : null,
- ];
- }
-
- // Handle single file
- if ($shared->type === 'folder') {
-
- // Get file record
- $folder = FileManagerFolder::where('user_id', $shared->user_id)
- ->where('unique_id', $shared->item_id)
- ->first();
-
- $metadata = [
- 'is_protected' => $shared->protected,
- 'url' => url('/shared', ['token' => $token]),
- 'user' => $user->name,
- 'name' => $folder->name,
- 'size' => $folder->items,
- 'thumbnail' => null,
- ];
- }
-
- // Return view
- return view("og-view")
- ->with('settings', json_decode($settings->pluck('value', 'name')->toJson()))
- ->with('metadata', $metadata);
- }
-
- /**
- * Check if setup wizard was passed
- *
- * @return string
- */
- private function get_setup_status(): string
- {
- $setup_success = get_setting('setup_wizard_success');
-
- $connection = boolval($setup_success) ? 'setup-done' : 'setup-disclaimer';
-
- return $connection;
- }
-
- /**
- * Send contact message from pages
- *
- * @param SendMessageRequest $request
- * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
- */
- public function contact_form(SendMessageRequest $request)
- {
- // Get receiver email
- $receiver = Setting::where('name', 'contact_email')->first();
-
- // Send message
- Mail::to($receiver->value)->send(new SendSupportForm($request->all()));
-
- return response('Done', 200);
- }
-
- /**
- * Get single page content
- *
- * @param $slug
- * @return PageResource
- */
- public function get_page($slug)
- {
- return new PageResource(
- Page::where('slug', $slug)->first()
- );
- }
-
- /**
- * Get selected settings from public route
- *
- * @param Request $request
- * @return mixed
- */
- public function get_settings(Request $request)
- {
- $column = $request->get('column');
-
- if (strpos($column, '|') !== false) {
-
- $columns = collect(explode('|', $column));
-
- $columns->each(function ($column) {
- if (!in_array($column, $this->whitelist)) abort(401);
- });
-
- return Setting::whereIn('name', $columns)->pluck('value', 'name');
- }
-
- if (!in_array($column, $this->whitelist)) abort(401);
-
- return Setting::where('name', $column)->pluck('value', 'name');
- }
-
- /**
- * Clear application cache
- */
- public function flush_cache()
- {
- // Check if is demo
- if (env('APP_DEMO')) {
- return Demo::response_204();
- }
-
- Artisan::call('cache:clear');
- Artisan::call('config:clear');
- Artisan::call('config:cache');
- }
-
- /**
- * Get Emojis List from the server
- *
- * @return $emojisList
- */
- public function get_emojis_list()
- {
- $emojisList = json_decode(file_get_contents(public_path('assets/emojis.json'), true));
-
- return collect([$emojisList]);
- }
-}
diff --git a/app/Http/Controllers/Auth/AuthController.php b/app/Http/Controllers/Auth/AuthController.php
index 240c630c..99a9aaa5 100644
--- a/app/Http/Controllers/Auth/AuthController.php
+++ b/app/Http/Controllers/Auth/AuthController.php
@@ -3,14 +3,8 @@
namespace App\Http\Controllers\Auth;
use App\Http\Requests\Auth\CheckAccountRequest;
-use App\Setting;
-use App\User;
-use App\UserSettings;
-use Illuminate\Http\Request;
+use App\Models\User;
use App\Http\Controllers\Controller;
-use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Hash;
-use Illuminate\Support\Facades\Route;
class AuthController extends Controller
{
@@ -18,130 +12,22 @@ class AuthController extends Controller
/**
* Check if user account exist
*
- * @param Request $request
+ * @param CheckAccountRequest $request
* @return mixed
*/
public function check_account(CheckAccountRequest $request)
{
// Get User
- $user = User::where('email', $request->input('email'))->select(['name', 'avatar'])->first();
+ $user = User::whereEmail($request->email)
+ ->first();
- // Return user info
- if ($user) return [
- 'name' => $user->name,
- 'avatar' => $user->avatar,
+ if (! $user) {
+ return response(__t('user_not_fount'), 404);
+ }
+
+ return [
+ 'name' => $user->settings->name,
+ 'avatar' => $user->settings->avatar,
];
-
- // Abort with 404, user not found
- return abort('404', __('vuefilemanager.user_not_fount'));
- }
-
- /**
- * Login user
- *
- * @param Request $request
- * @return mixed
- */
- public function login(Request $request)
- {
- $response = Route::dispatch(self::make_login_request($request));
-
- if ($response->isSuccessful()) {
-
- $data = json_decode($response->content(), true);
-
- return response('Login Successfull!', 200)->cookie('access_token', $data['access_token'], 43200);
- }
-
- return $response;
- }
-
- /**
- * Register user
- *
- * @param Request $request
- * @return mixed
- */
- public function register(Request $request)
- {
- $settings = Setting::whereIn('name', ['storage_default', 'registration'])->pluck('value', 'name');
-
- // Check if account registration is enabled
- if (! intval($settings['registration'])) abort(401);
-
- // Validate request
- $request->validate([
- 'name' => ['required', 'string', 'max:255'],
- 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
- 'password' => ['required', 'string', 'min:6', 'confirmed'],
- ]);
-
- // Create user
- $user = User::create([
- 'name' => $request->name,
- 'email' => $request->email,
- 'password' => Hash::make($request->password),
- ]);
-
- // Create settings
- UserSettings::forceCreate([
- 'user_id' => $user->id,
- 'storage_capacity' => $settings['storage_default'],
- ]);
-
- $response = Route::dispatch(self::make_login_request($request));
-
- if ($response->isSuccessful()) {
-
- $data = json_decode($response->content(), true);
-
- return response('Register Successfull!', 200)->cookie('access_token', $data['access_token'], 43200);
- }
-
- return $response;
- }
-
- /**
- * Logout user entity
- *
- * @return \Illuminate\Http\JsonResponse
- */
- public function logout()
- {
- // Demo preview
- if (is_demo(Auth::id())) {
- return response('Logout successfull', 204)
- ->cookie('access_token', '', -1);
- }
-
- // Get user tokens and remove it
- auth()->user()->tokens()->each(function ($token) {
-
- // Remove tokens
- $token->delete();
- });
-
- return response('Logout successful', 204)
- ->cookie('access_token', '', -1);
- }
-
- /**
- * Make login request for get access token
- *
- * @param Request $request
- * @return Request
- */
- private static function make_login_request($request)
- {
- $request->request->add([
- 'grant_type' => 'password',
- 'client_id' => config('services.passport.client_id'),
- 'client_secret' => config('services.passport.client_secret'),
- 'username' => $request->email,
- 'password' => $request->password,
- 'scope' => 'master',
- ]);
-
- return Request::create(url('/oauth/token'), 'POST', $request->all());
}
}
diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php
index 6dfc884d..d91d9e7f 100644
--- a/app/Http/Controllers/Auth/ForgotPasswordController.php
+++ b/app/Http/Controllers/Auth/ForgotPasswordController.php
@@ -6,7 +6,7 @@ use App\Http\Controllers\Controller;
use App\Mail\TestMail;
use App\Notifications\ResetPassword;
use App\Notifications\ResetUserPasswordNotification;
-use App\User;
+use App\Models\User;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Lang;
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
deleted file mode 100644
index c6a6de67..00000000
--- a/app/Http/Controllers/Auth/RegisterController.php
+++ /dev/null
@@ -1,73 +0,0 @@
-middleware('guest');
- }
-
- /**
- * Get a validator for an incoming registration request.
- *
- * @param array $data
- * @return \Illuminate\Contracts\Validation\Validator
- */
- protected function validator(array $data)
- {
- return Validator::make($data, [
- 'name' => ['required', 'string', 'max:255'],
- 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
- 'password' => ['required', 'string', 'min:8', 'confirmed'],
- ]);
- }
-
- /**
- * Create a new user instance after a valid registration.
- *
- * @param array $data
- * @return \App\User
- */
- protected function create(array $data)
- {
- return User::create([
- 'name' => $data['name'],
- 'email' => $data['email'],
- 'password' => Hash::make($data['password']),
- ]);
- }
-}
diff --git a/app/Http/Controllers/DeployController.php b/app/Http/Controllers/DeployController.php
deleted file mode 100644
index 3a691805..00000000
--- a/app/Http/Controllers/DeployController.php
+++ /dev/null
@@ -1,44 +0,0 @@
-headers->get('X-Hub-Signature')) == null) {
- throw new BadRequestHttpException('Header not set');
- }
-
- $signature_parts = explode('=', $signature);
-
- if (count($signature_parts) != 2) {
- throw new BadRequestHttpException('signature has invalid format');
- }
-
- $known_signature = hash_hmac('sha1', $request->getContent(), config('app.deploy_secret'));
-
- if (! hash_equals($known_signature, $signature_parts[1])) {
- throw new UnauthorizedException('Could not verify request signature ' . $signature_parts[1]);
- }
-
- // Run deploying
- Artisan::call('deploy:production');
-
- Log::info('The GitHub webhook was accepted');
-
- return response('The GitHub webhook was accepted', 202);
- }
-}
diff --git a/app/Http/Controllers/FileAccessController.php b/app/Http/Controllers/FileAccessController.php
deleted file mode 100644
index f8a97686..00000000
--- a/app/Http/Controllers/FileAccessController.php
+++ /dev/null
@@ -1,299 +0,0 @@
-where('user_id', $user_id)
- ->where('basename', $filename)
- ->firstOrFail();
-
- // Check user permission
- if (!$request->user()->tokenCan('master')) {
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Check access to file
- $this->check_file_access($shared, $file);
- }
-
- // Store user download size
- $request->user()->record_download((int)$file->getRawOriginal('filesize'));
-
- return $this->download_file($file);
- }
-
- /**
- * Get generated zip for user
- *
- * @param $id
- * @return \Symfony\Component\HttpFoundation\StreamedResponse
- */
- public function get_zip($id)
- {
- $zip = Zip::where('id', $id)
- ->where('user_id', Auth::id())
- ->first();
-
- $zip_path = 'zip/' . $zip->basename;
-
- $header = [
- "Content-Type" => 'application/zip',
- "Content-Length" => Storage::disk('local')->size($zip_path),
- "Accept-Ranges" => "bytes",
- "Content-Range" => "bytes 0-600/" . Storage::disk('local')->size($zip_path),
- "Content-Disposition" => "attachment; filename=" . $zip->basename,
- ];
-
- return Storage::disk('local')->download($zip_path, $zip->basename, $header);
- }
-
- /**
- * Get generated zip for guest
- *
- * @param $id
- * @param $token
- * @return \Symfony\Component\HttpFoundation\StreamedResponse
- */
- public function get_zip_public($id, $token)
- {
- $zip = Zip::where('id', $id)
- ->where('shared_token', $token)
- ->first();
-
- $zip_path = 'zip/' . $zip->basename;
-
- $header = [
- "Content-Type" => 'application/zip',
- "Content-Length" => Storage::disk('local')->size($zip_path),
- "Accept-Ranges" => "bytes",
- "Content-Range" => "bytes 0-600/" . Storage::disk('local')->size($zip_path),
- "Content-Disposition" => "attachment; filename=" . $zip->basename,
- ];
-
- return Storage::disk('local')->download($zip_path, $zip->basename, $header);
- }
-
- /**
- * Get file public
- *
- * @param $filename
- * @param $token
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- public function get_file_public($filename, $token)
- {
- // Get sharing record
- $shared = get_shared($token);
-
- // Abort if shared is protected
- if ((int)$shared->protected) {
- abort(403, "Sorry, you don't have permission");
- }
-
- // Get file record
- $file = FileManagerFile::where('user_id', $shared->user_id)
- ->where('basename', $filename)
- ->firstOrFail();
-
- // Check file access
- $this->check_file_access($shared, $file);
-
- // Store user download size
- User::find($shared->user_id)->record_download((int)$file->getRawOriginal('filesize'));
-
- return $this->download_file($file);
- }
-
- /**
- * Get image thumbnail
- *
- * @param Request $request
- * @param $filename
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- public function get_thumbnail(Request $request, $filename)
- {
- // Get file record
- $file = FileManagerFile::withTrashed()
- ->where('user_id', $request->user()->id)
- ->where('thumbnail', $filename)
- ->firstOrFail();
-
- // Check user permission
- if (!$request->user()->tokenCan('master')) {
- $this->check_file_access($request, $file);
- }
-
- return $this->thumbnail_file($file);
- }
-
- /**
- * Get public image thumbnail
- *
- * @param $filename
- * @param $token
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- public function get_thumbnail_public($filename, $token)
- {
- // Get sharing record
- $shared = get_shared($token);
-
- // Abort if thumbnail is protected
- if ((int)$shared->protected) {
- abort(403, "Sorry, you don't have permission");
- }
-
- // Get file record
- $file = FileManagerFile::where('user_id', $shared->user_id)
- ->where('thumbnail', $filename)
- ->firstOrFail();
-
- // Check file access
- $this->check_file_access($shared, $file);
-
- return $this->thumbnail_file($file);
- }
-
- /**
- * Check user file access
- *
- * @param $shared
- * @param $file
- */
- protected function check_file_access($shared, $file): void
- {
- // Check by parent folder permission
- if ($shared->type === 'folder') {
- Guardian::check_item_access($file->folder_id, $shared);
- }
-
- // Check by single file permission
- if ($shared->type === 'file') {
- if ($shared->item_id !== $file->unique_id) abort(403);
- }
- }
-
- /**
- * Call and download file
- *
- * @param $file
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- private function download_file($file)
- {
- $file_pretty_name = get_pretty_name($file->basename, $file->name, $file->mimetype);
-
- // Get file path
- $path = '/file-manager/' . $file->basename;
-
- // Check if file exist
- if (!Storage::exists($path)) abort(404);
-
- $headers = [
- "Accept-Ranges" => "bytes",
- "Content-Type" => Storage::mimeType($path),
- "Content-Length" => Storage::size($path),
- "Content-Range" => "bytes 0-600/" . Storage::size($path),
- "Content-Disposition" => "attachment; filename=" . $file_pretty_name,
- ];
-
- return response()->download(config('filesystems.disks.local.root') . '/file-manager/' . $file->basename, $file_pretty_name, $headers);
- }
-
- /**
- * @param $file
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- private function thumbnail_file($file)
- {
- // Get file path
- $path = '/file-manager/' . $file->getRawOriginal('thumbnail');
-
- // Check if file exist
- if (!Storage::exists($path)) abort(404);
-
- // Return image thumbnail
- return Storage::download($path, $file->getRawOriginal('thumbnail'));
- }
-}
diff --git a/app/Http/Controllers/FileFunctions/EditItemsController.php b/app/Http/Controllers/FileFunctions/EditItemsController.php
deleted file mode 100644
index 60b496df..00000000
--- a/app/Http/Controllers/FileFunctions/EditItemsController.php
+++ /dev/null
@@ -1,572 +0,0 @@
-user()->tokenCan('editor')) {
-
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Check access to requested directory
- Guardian::check_item_access($request->parent_id, $shared);
- }
-
- // Create new folder
- return Editor::create_folder($request);
- }
-
- /**
- * Create new folder for guest user with edit permission
- *
- * @param CreateFolderRequest $request
- * @param $token
- * @return array
- * @throws Exception
- */
- public function guest_create_folder(CreateFolderRequest $request, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- if (is_demo($shared->user_id)) {
- return Demo::create_folder($request);
- }
-
- // Check shared permission
- if (!is_editor($shared)) abort(403);
-
- // Check access to requested directory
- Guardian::check_item_access($request->parent_id, $shared);
-
- // Create folder
- return Editor::create_folder($request, $shared);
- }
-
- /**
- * Rename item for authenticated master|editor user
- *
- * @param RenameItemRequest $request
- * @param $unique_id
- * @return mixed
- * @throws Exception
- */
- public function user_rename_item(RenameItemRequest $request, $unique_id)
- {
- // Demo preview
- if (is_demo(Auth::id())) {
- return Demo::rename_item($request, $unique_id);
- }
-
- // Check permission to rename item for authenticated editor
- if ($request->user()->tokenCan('editor')) {
-
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Get file|folder item
- $item = get_item($request->type, $unique_id, Auth::id());
-
- // Check access to requested directory
- if ($request->type === 'folder') {
- Guardian::check_item_access($item->unique_id, $shared);
- } else {
- Guardian::check_item_access($item->folder_id, $shared);
- }
- }
-
- // If request have a change folder icon values set the folder icon
- if ($request->type === 'folder' && $request->filled('folder_icon')) {
-
- Editor::set_folder_icon($request->folder_icon, $unique_id);
- }
-
- // Rename Item
- return Editor::rename_item($request, $unique_id);
- }
-
- /**
- * Rename item for guest user with edit permission
- *
- * @param RenameItemRequest $request
- * @param $unique_id
- * @param $token
- * @return mixed
- * @throws Exception
- */
- public function guest_rename_item(RenameItemRequest $request, $unique_id, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- // Demo preview
- if (is_demo($shared->user_id)) {
- return Demo::rename_item($request, $unique_id);
- }
-
- // Check shared permission
- if (!is_editor($shared)) abort(403);
-
- // Get file|folder item
- $item = get_item($request->type, $unique_id, $shared->user_id);
-
- // Check access to requested item
- if ($request->type === 'folder') {
- Guardian::check_item_access($item->unique_id, $shared);
- } else {
- Guardian::check_item_access($item->folder_id, $shared);
- }
-
- // If request have a change folder icon values set the folder icon
- if ($request->type === 'folder' && $request->filled('folder_icon')) {
-
- Editor::set_folder_icon($request->folder_icon, $unique_id, $shared);
- }
-
- // Rename item
- $item = Editor::rename_item($request, $unique_id, $shared);
-
- // Set public url
- if ($item->type !== 'folder') {
- $item->setPublicUrl($token);
- }
-
- return $item;
- }
-
- /**
- * Delete item for authenticated master|editor user
- *
- * @param DeleteItemRequest $request
- * @param $unique_id
- * @return ResponseFactory|\Illuminate\Http\Response
- * @throws Exception
- */
- public function user_delete_item(DeleteItemRequest $request)
- {
- // Demo preview
- if (is_demo(Auth::id())) {
- return Demo::response_204();
- }
-
- foreach ($request->input('data') as $file) {
- $unique_id = $file['unique_id'];
-
- // Check permission to delete item for authenticated editor
- if ($request->user()->tokenCan('editor')) {
-
- // Prevent force delete for non-master users
- if ($file['force_delete']) abort('401');
-
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Get file|folder item
- $item = get_item($file['type'], $unique_id, Auth::id());
-
- // Check access to requested directory
- if ($file['type'] === 'folder') {
- Guardian::check_item_access($item->unique_id, $shared);
- } else {
- Guardian::check_item_access($item->folder_id, $shared);
- }
- }
-
- // Delete item
- Editor::delete_item($file, $unique_id);
- }
-
- return response(null, 204);
- }
-
- /**
- * Delete item for guest user with edit permission
- *
- * @param DeleteItemRequest $request
- * @param $unique_id
- * @param $token
- * @return ResponseFactory|\Illuminate\Http\Response
- * @throws Exception
- */
- public function guest_delete_item(DeleteItemRequest $request, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- // Demo preview
- if (is_demo($shared->user_id)) {
- return Demo::response_204();
- }
-
- // Check shared permission
- if (!is_editor($shared)) abort(403);
-
- foreach ($request->input('data') as $file) {
- $unique_id = $file['unique_id'];
-
- // Get file|folder item
- $item = get_item($file['type'], $unique_id, $shared->user_id);
-
- // Check access to requested item
- if ($file['type'] === 'folder') {
- Guardian::check_item_access($item->unique_id, $shared);
- } else {
- Guardian::check_item_access($item->folder_id, $shared);
- }
-
- // Delete item
- Editor::delete_item($file, $unique_id, $shared);
- }
- // Return response
- return response(null, 204);
- }
-
- /**
- * Upload file for authenticated master|editor user
- *
- * @param UploadRequest $request
- * @return FileManagerFile|Model
- * @throws Exception
- */
- public function user_upload(UploadRequest $request)
- {
- // Demo preview
- if (is_demo(Auth::id())) {
- return Demo::upload($request);
- }
-
- // Check permission to upload for authenticated editor
- if ($request->user()->tokenCan('editor')) {
-
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Check access to requested directory
- Guardian::check_item_access($request->parent_id, $shared);
- }
-
- // Return new uploaded file
- return Editor::upload($request);
- }
-
- /**
- * Delete file for guest user with edit permission
- *
- * @param UploadRequest $request
- * @param $token
- * @return FileManagerFile|Model
- * @throws Exception
- */
- public function guest_upload(UploadRequest $request, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- // Demo preview
- if (is_demo($shared->user_id)) {
- return Demo::upload($request);
- }
-
- // Check shared permission
- if (!is_editor($shared)) abort(403);
-
- // Check access to requested directory
- Guardian::check_item_access($request->parent_id, $shared);
-
- // Return new uploaded file
- $new_file = Editor::upload($request, $shared);
-
- // Set public access url
- $new_file->setPublicUrl($token);
-
- return $new_file;
- }
-
-
-/**
- * User download folder via zip
- *
- * @param $unique_id
- * @return string
- */
- public function user_zip_folder(Request $request,$unique_id)
- {
- // Get user id
- $user_id = Auth::id();
-
- // Check permission to download for authenticated editor
- if ($request->user()->tokenCan('editor')) {
-
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Check access to requested directory
- Guardian::check_item_access($unique_id, $shared);
- }
-
- // Get folder
- $folder = FileManagerFolder::whereUserId($user_id)
- ->where('unique_id', $unique_id);
-
- if (! $folder->exists()) {
- abort(404, 'Requested folder doesn\'t exists.');
- }
-
- $zip = Editor::zip_folder($unique_id);
-
- // Get file
- return response([
- 'url' => route('zip', $zip->id),
- 'name' => $zip->basename,
- ], 200);
- }
-
- /**
- * Guest download folder via zip
- *
- * @param Request $request
- * @param $unique_id
- * @param $token
- * @return string
- */
- public function guest_zip_folder($unique_id, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- // Check access to requested folder
- Guardian::check_item_access($unique_id, $shared);
-
- // Get folder
- $folder = FileManagerFolder::whereUserId($shared->user_id)
- ->where('unique_id', $unique_id);
-
-
- if (! $folder->exists()) {
- abort(404, 'Requested folder doesn\'t exists.');
- }
-
- $zip = Editor::zip_folder($unique_id, $shared);
-
- // Get file
- return response([
- 'url' => route('zip_public', [
- 'id' => $zip->id,
- 'token' => $shared->token,
- ]),
- 'name' => $zip->basename,
- ], 200);
- }
-
- /**
- * User download multiple files via zip
- *
- * @param Request $request
- * @return string
- */
- public function user_zip_multiple_files(Request $request)
- {
- // Check permission to upload for authenticated editor
- if ($request->user()->tokenCan('editor')) {
-
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- $file_parent_folders = FileManagerFile::whereUserId(Auth::id())
- ->whereIn('unique_id', $request->input('files'))
- ->get()
- ->pluck('folder_id')
- ->toArray();
-
- // Check access to requested directory
- Guardian::check_item_access($file_parent_folders, $shared);
- }
-
- // Get requested files
- $files = FileManagerFile::whereUserId(Auth::id())
- ->whereIn('unique_id', $request->input('files'))
- ->get();
-
- $zip = Editor::zip_files($files);
-
- // Get file
- return response([
- 'url' => route('zip', $zip->id),
- 'name' => $zip->basename,
- ], 200);
- }
-
- /**
- * Guest download multiple files via zip
- *
- * @param Request $request
- * @param $token
- * @return string
- */
- public function guest_zip_multiple_files(Request $request, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- $file_parent_folders = FileManagerFile::whereUserId($shared->user_id)
- ->whereIn('unique_id', $request->input('files'))
- ->get()
- ->pluck('folder_id')
- ->toArray();
-
- // Check access to requested directory
- Guardian::check_item_access($file_parent_folders, $shared);
-
- // Get requested files
- $files = FileManagerFile::whereUserId($shared->user_id)
- ->whereIn('unique_id', $request->input('files'))
- ->get();
-
- $zip = Editor::zip_files($files, $shared);
-
- // Get file
- return response([
- 'url' => route('zip_public', [
- 'id' => $zip->id,
- 'token' => $shared->token,
- ]),
- 'name' => $zip->basename,
- ], 200);
- }
-
- /**
- * Move item for authenticated master|editor user
- *
- * @param MoveItemRequest $request
- * @param $unique_id
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function user_move(MoveItemRequest $request)
- {
- // Demo preview
- if (is_demo(Auth::id())) {
- return Demo::response_204();
- }
-
- $to_unique_id = $request->input('to_unique_id');
-
- // Check permission to upload for authenticated editor
- if ($request->user()->tokenCan('editor')) {
- // check if shared_token cookie exist
- if (!$request->hasCookie('shared_token')) abort('401');
-
- // Get shared token
- $shared = get_shared($request->cookie('shared_token'));
-
- // Check access to requested directory
- Guardian::check_item_access($to_unique_id, $shared);
- }
-
- // Move item
- Editor::move($request, $to_unique_id);
-
- return response('Done!', 204);
- }
-
- /**
- * Move item for guest user with edit permission
- *
- * @param MoveItemRequest $request
- * @param $unique_id
- * @param $token
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function guest_move(MoveItemRequest $request, $token)
- {
- // Get shared record
- $shared = get_shared($token);
-
- //Unique id of Folder where move
- $to_unique_id = $request->input('to_unique_id');
-
- // Demo preview
- if (is_demo(Auth::id())) {
- return Demo::response_204();
- }
-
- // Check shared permission
- if (!is_editor($shared)) abort(403);
-
- foreach ($request->input('items') as $item) {
-
- $unique_id = $item['unique_id'];
- $moving_unique_id = $unique_id;
-
-
- if ($item['type'] !== 'folder') {
- $file = FileManagerFile::where('unique_id', $unique_id)
- ->where('user_id', $shared->user_id)
- ->firstOrFail();
-
- $moving_unique_id = $file->folder_id;
- }
-
- // Check access to requested item
- Guardian::check_item_access([
- $to_unique_id, $moving_unique_id
- ], $shared);
- }
-
- // Move item
- Editor::move($request, $to_unique_id, $shared);
-
- return response('Done!', 204);
- }
-}
\ No newline at end of file
diff --git a/app/Http/Controllers/FileFunctions/FavouriteController.php b/app/Http/Controllers/FileFunctions/FavouriteController.php
deleted file mode 100644
index bc547f86..00000000
--- a/app/Http/Controllers/FileFunctions/FavouriteController.php
+++ /dev/null
@@ -1,72 +0,0 @@
-input('folders'), [
- '*.unique_id' => 'required|integer',
- ]);
-
- // Return error
- if ($validator->fails()) abort(400, 'Bad input');
-
- foreach($request->input('folders') as $item) {
-
- // Get user & folder
- $user = Auth::user();
- $folder = FileManagerFolder::where('unique_id', $item['unique_id'])->first();
-
- if (is_demo($user->id)) {
- return Demo::favourites($user);
- }
-
- // Check ownership
- if ($folder->user_id !== $user->id) abort(403);
-
- // Add folder to user favourites
- $user->favourite_folders()->syncWithoutDetaching($item['unique_id']);
-
- }
- // Return updated favourites
- return $user->favourite_folders;
- }
-
- /**
- * Remove folder from user favourites
- *
- * @param $unique_id
- * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
- */
- public function destroy($unique_id)
- {
- // Get user
- $user = Auth::user();
-
- if (is_demo($user->id)) {
- return Demo::favourites($user);
- }
-
- // Remove folder from user favourites
- $user->favourite_folders()->detach($unique_id);
-
- // Return updated favourites
- return $user->favourite_folders;
- }
-}
diff --git a/app/Http/Controllers/FileBrowser/BrowseController.php b/app/Http/Controllers/FileManager/BrowseController.php
similarity index 51%
rename from app/Http/Controllers/FileBrowser/BrowseController.php
rename to app/Http/Controllers/FileManager/BrowseController.php
index 808b811b..e63055bc 100644
--- a/app/Http/Controllers/FileBrowser/BrowseController.php
+++ b/app/Http/Controllers/FileManager/BrowseController.php
@@ -1,20 +1,83 @@
query('trash')) {
+
+ // Get folders and files
+ $folders = Folder::onlyTrashed()
+ ->with('parent')
+ ->where('parent_id', $root_id)
+ ->sortable()
+ ->get();
+
+ $files = File::onlyTrashed()
+ ->with('parent')
+ ->where('folder_id', $root_id)
+ ->sortable()
+ ->get();
+
+ // Collect folders and files to single array
+ return collect([$folders, $files])->collapse();
+ }
+
+ // Get folders and files
+ $folders = Folder::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in'])
+ ->where('parent_id', $root_id)
+ ->where('user_id', Auth::id())
+ ->sortable()
+ ->get();
+
+ $files = File::with(['parent:id,name', 'shared:token,id,item_id,permission,is_protected,expire_in'])
+ ->where('folder_id', $root_id)
+ ->where('user_id', Auth::id())
+ ->sortable()
+ ->get();
+
+ // Collect folders and files to single array
+ return collect([$folders, $files])
+ ->collapse();
+ }
+
+ /**
+ * Get latest user uploads
+ *
+ * @return mixed
+ */
+ public function latest()
+ {
+ $user = User::with(['latest_uploads' => function ($query) {
+ $query->sortable(['created_at' => 'desc']);
+ }])
+ ->where('id', Auth::id())
+ ->first();
+
+ return $user->latest_uploads;
+ }
/**
* Get trashed files
@@ -23,32 +86,35 @@ class BrowseController extends Controller
*/
public function trash()
{
- // Get user id
$user_id = Auth::id();
// Get folders and files
- $folders_trashed = FileManagerFolder::onlyTrashed()
+ $folders_trashed = Folder::onlyTrashed()
->with(['trashed_folders', 'parent'])
->where('user_id', $user_id)
- ->get(['parent_id', 'unique_id', 'name']);
+ ->get(['parent_id', 'id', 'name']);
- $folders = FileManagerFolder::onlyTrashed()
+ $folders = Folder::onlyTrashed()
->with(['parent'])
->where('user_id', $user_id)
- ->whereIn('unique_id', filter_folders_ids($folders_trashed))
+ ->whereIn('id', filter_folders_ids($folders_trashed))
->sortable()
->get();
// Get files trashed
- $files_trashed = FileManagerFile::onlyTrashed()
+ $files_trashed = File::onlyTrashed()
->with(['parent'])
->where('user_id', $user_id)
- ->whereNotIn('folder_id', array_values(array_unique(recursiveFind($folders_trashed->toArray(), 'unique_id'))))
+ ->where(function($query) use ($folders_trashed) {
+ $query->whereNull('folder_id');
+ $query->orWhereNotIn('folder_id', array_values(array_unique(recursiveFind($folders_trashed->toArray(), 'id'))));
+ })
->sortable()
->get();
// Collect folders and files to single array
- return collect([$folders, $files_trashed])->collapse();
+ return collect([$folders, $files_trashed])
+ ->collapse();
}
/**
@@ -58,7 +124,6 @@ class BrowseController extends Controller
*/
public function shared()
{
- // Get user
$user_id = Auth::id();
// Get shared folders and files
@@ -71,37 +136,21 @@ class BrowseController extends Controller
->pluck('item_id');
// Get folders and files
- $folders = FileManagerFolder::with(['parent', 'shared:token,id,item_id,permission,protected,expire_in'])
+ $folders = Folder::with(['parent', 'shared:token,id,item_id,permission,is_protected,expire_in'])
->where('user_id', $user_id)
- ->whereIn('unique_id', $folder_ids)
+ ->whereIn('id', $folder_ids)
->sortable()
->get();
- $files = FileManagerFile::with(['parent', 'shared:token,id,item_id,permission,protected,expire_in'])
+ $files = File::with(['parent', 'shared:token,id,item_id,permission,is_protected,expire_in'])
->where('user_id', $user_id)
- ->whereIn('unique_id', $file_ids)
+ ->whereIn('id', $file_ids)
->sortable()
->get();
// Collect folders and files to single array
- return collect([$folders, $files])->collapse();
- }
-
- /**
- * Get latest user uploads
- *
- * @return mixed
- */
- public function latest() {
-
- // Get User
- $user = User::with(['latest_uploads' => function($query) {
- $query->sortable(['created_at' => 'desc']);
- }])
- ->where('id', Auth::id())
- ->first();
-
- return $user->latest_uploads->makeHidden(['user_id', 'basename']);
+ return collect([$folders, $files])
+ ->collapse();
}
/**
@@ -109,67 +158,13 @@ class BrowseController extends Controller
*
* @return mixed
*/
- public function participant_uploads() {
-
- // Get User
- $uploads = FileManagerFile::with(['parent'])
- ->where('user_id', Auth::id())
- ->whereUserScope('editor')
- ->sortable()
- ->get();
-
- return $uploads;
- }
-
- /**
- * Get directory with files
- *
- * @param Request $request
- * @param $unique_id
- * @return Collection
- */
- public function folder(Request $request, $unique_id)
+ public function participant_uploads()
{
- // Get user
- $user_id = Auth::id();
-
- // Get folder trash items
- if ($request->query('trash')) {
-
- // Get folders and files
- $folders = FileManagerFolder::onlyTrashed()
- ->with('parent')
- ->where('user_id', $user_id)
- ->where('parent_id', $unique_id)
- ->sortable()
- ->get();
-
- $files = FileManagerFile::onlyTrashed()
- ->with('parent')
- ->where('user_id', $user_id)
- ->where('folder_id', $unique_id)
- ->sortable()
- ->get();
-
- // Collect folders and files to single array
- return collect([$folders, $files])->collapse();
- }
-
- // Get folders and files
- $folders = FileManagerFolder::with(['parent', 'shared:token,id,item_id,permission,protected,expire_in'])
- ->where('user_id', $user_id)
- ->where('parent_id', $unique_id)
+ return File::with(['parent'])
+ ->where('user_id', Auth::id())
+ ->whereAuthor('visitor')
->sortable()
->get();
-
- $files = FileManagerFile::with(['parent', 'shared:token,id,item_id,permission,protected,expire_in'])
- ->where('user_id', $user_id)
- ->where('folder_id', $unique_id)
- ->sortable()
- ->get();
-
- // Collect folders and files to single array
- return collect([$folders, $files])->collapse();
}
/**
@@ -177,20 +172,19 @@ class BrowseController extends Controller
*
* @return array
*/
- public function navigation_tree() {
-
- $folders = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
- ->where('parent_id', 0)
+ public function navigation_tree()
+ {
+ $folders = Folder::with('folders:id,parent_id,id,name')
+ ->where('parent_id', null)
->where('user_id', Auth::id())
->sortable()
- ->get(['id', 'parent_id', 'unique_id', 'name']);
+ ->get(['id', 'parent_id', 'id', 'name']);
return [
[
- 'unique_id' => 0,
- 'name' => __('vuefilemanager.home'),
+ 'name' => __t('home'),
'location' => 'base',
- 'folders' => $folders,
+ 'folders' => $folders,
]
];
}
@@ -198,24 +192,26 @@ class BrowseController extends Controller
/**
* Search files
*
- * @param Request $request
- * @return \Illuminate\Database\Eloquent\Collection
+ * @param SearchRequest $request
+ * @return Collection
*/
public function search(SearchRequest $request)
{
- // Get user
$user_id = Auth::id();
+
$query = remove_accents($request->input('query'));
// Search files id db
- $searched_files = FileManagerFile::search($query)
+ $searched_files = File::search($query)
->where('user_id', $user_id)
->get();
- $searched_folders = FileManagerFolder::search($query)
+
+ $searched_folders = Folder::search($query)
->where('user_id', $user_id)
->get();
// Collect folders and files to single array
- return collect([$searched_folders, $searched_files])->collapse();
+ return collect([$searched_folders, $searched_files])
+ ->collapse();
}
}
diff --git a/app/Http/Controllers/FileManager/EditItemsController.php b/app/Http/Controllers/FileManager/EditItemsController.php
new file mode 100644
index 00000000..bc1df508
--- /dev/null
+++ b/app/Http/Controllers/FileManager/EditItemsController.php
@@ -0,0 +1,168 @@
+filemanager = resolve(FileManagerService::class);
+ $this->helper = resolve(HelperService::class);
+ $this->demo = resolve(DemoService::class);
+ }
+
+ /**
+ * Create new folder for authenticated master|editor user
+ *
+ * @param CreateFolderRequest $request
+ * @return Folder|array|Model
+ * @throws Exception
+ */
+ public function create_folder(CreateFolderRequest $request)
+ {
+ if (is_demo_account('howdy@hi5ve.digital')) {
+ return $this->demo->create_folder($request);
+ }
+
+ // Create new folder
+ return $this->filemanager->create_folder($request);
+ }
+
+ /**
+ * Rename item for authenticated master|editor user
+ *
+ * @param RenameItemRequest $request
+ * @param $id
+ * @return mixed
+ * @throws Exception
+ */
+ public function rename_item(RenameItemRequest $request, $id)
+ {
+ if (is_demo_account('howdy@hi5ve.digital')) {
+ return $this->demo->rename_item($request, $id);
+ }
+
+ // If request contain icon or color, then change it
+ if ($request->filled('emoji') || $request->filled('color')) {
+ $this->filemanager->edit_folder_properties($request, $id);
+ }
+
+ // Rename Item
+ return $this->filemanager->rename_item($request, $id);
+ }
+
+ /**
+ * Delete item for authenticated master|editor user
+ *
+ * @param DeleteItemRequest $request
+ * @return ResponseFactory|\Illuminate\Http\Response
+ * @throws Exception
+ */
+ public function delete_item(DeleteItemRequest $request)
+ {
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
+
+ foreach ($request->input('items') as $item) {
+ $this->filemanager->delete_item($item, $item['id']);
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Upload file for authenticated master|editor user
+ *
+ * @param UploadRequest $request
+ * @return array|Model|\Illuminate\Support\Facades\File
+ * @throws Exception
+ */
+ public function upload(UploadRequest $request)
+ {
+ if (is_demo_account('howdy@hi5ve.digital')) {
+ return $this->demo->upload($request);
+ }
+
+ return $this->filemanager->upload($request);
+ }
+
+ /**
+ * Move item for authenticated master|editor user
+ *
+ * @param MoveItemRequest $request
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function move(MoveItemRequest $request)
+ {
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
+
+ $this->filemanager->move($request, $request->to_id);
+
+ return response('Done!', 204);
+ }
+
+ /**
+ * User download folder via zip
+ *
+ * @param $id
+ * @return string
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function zip_folder($id)
+ {
+ $folder = Folder::whereUserId(Auth::id())
+ ->where('id', $id);
+
+ if (!$folder->exists()) {
+ abort(404, "Requested folder doesn't exists.");
+ }
+
+ $zip = $this->filemanager->zip_folder($id);
+
+ return response([
+ 'url' => route('zip', $zip->id),
+ 'name' => $zip->basename,
+ ], 201);
+ }
+
+ /**
+ * User download multiple files via zip
+ *
+ * @param Request $request
+ * @return string
+ */
+ public function zip_multiple_files(Request $request)
+ {
+ $files = File::whereUserId(Auth::id())
+ ->whereIn('id', $request->input('items'))
+ ->get();
+
+ $zip = $this->filemanager->zip_files($files);
+
+ return response([
+ 'url' => route('zip', $zip->id),
+ 'name' => $zip->basename,
+ ], 201);
+ }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/FileManager/FavouriteController.php b/app/Http/Controllers/FileManager/FavouriteController.php
new file mode 100644
index 00000000..5f4f75ab
--- /dev/null
+++ b/app/Http/Controllers/FileManager/FavouriteController.php
@@ -0,0 +1,72 @@
+demo = resolve(DemoService::class);
+ }
+
+ /**
+ * Add folder to user favourites
+ *
+ * @param Request $request
+ * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ */
+ public function store(Request $request)
+ {
+ // todo: pridat validator ako AddToFavouritesRequest
+
+ foreach ($request->folders as $id) {
+
+ // Get user & folder
+ $user = Auth::user();
+
+ if (is_demo($user->id)) {
+ return $this->demo->favourites($user);
+ }
+
+ // Add folder to user favourites
+ $user
+ ->favouriteFolders()
+ ->syncWithoutDetaching($id);
+ }
+
+ // Return updated favourites
+ return response($user->favouriteFolders, 204);
+ }
+
+ /**
+ * Remove folder from user favourites
+ *
+ * @param $id
+ * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ */
+ public function destroy($id)
+ {
+ // Get user
+ $user = Auth::user();
+
+ if (is_demo($user->id)) {
+ return $this->demo->favourites($user);
+ }
+
+ // Remove folder from user favourites
+ $user->favouriteFolders()->detach($id);
+
+ // Return updated favourites
+ return response($user->favouriteFolders, 204);
+ }
+}
diff --git a/app/Http/Controllers/FileManager/FileAccessController.php b/app/Http/Controllers/FileManager/FileAccessController.php
new file mode 100644
index 00000000..438f855f
--- /dev/null
+++ b/app/Http/Controllers/FileManager/FileAccessController.php
@@ -0,0 +1,145 @@
+helper = resolve(HelperService::class);
+ }
+
+ /**
+ * Get avatar
+ *
+ * @param $basename
+ * @return mixed
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function get_avatar($basename)
+ {
+ // Check if file exist
+ if (!Storage::exists("/avatars/$basename")) {
+ abort(404);
+ }
+
+ // Return avatar
+ return Storage::download("/avatars/$basename", $basename);
+ }
+
+ /**
+ * Get system image
+ *
+ * @param $basename
+ * @return mixed
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function get_system_image($basename)
+ {
+ // Check if file exist
+ if (!Storage::exists("/system/$basename")) {
+ abort(404);
+ }
+
+ // Return avatar
+ return Storage::download("/system/$basename", $basename);
+ }
+
+ /**
+ * Get file
+ *
+ * @param Request $request
+ * @param $filename
+ * @return mixed
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function get_file(Request $request, $filename)
+ {
+ // Get file record
+ $file = UserFile::withTrashed()
+ ->where('user_id', Auth::id())
+ ->where('basename', $filename)
+ ->firstOrFail();
+
+ // Check user permission
+ /*if (!$request->user()->tokenCan('master')) {
+
+ // Get shared token
+ $shared = get_shared($request->cookie('shared_token'));
+
+ // Check access to file
+ $this->check_file_access($shared, $file);
+ }*/
+
+
+ // Store user download size
+ $request->user()->record_download(
+ (int)$file->getRawOriginal('filesize')
+ );
+
+ return $this->helper->download_file($file, Auth::id());
+ }
+
+ /**
+ * Get generated zip for user
+ *
+ * @param $id
+ * @return \Symfony\Component\HttpFoundation\StreamedResponse
+ */
+ public function get_zip($id)
+ {
+ $disk = Storage::disk('local');
+
+ $zip = Zip::whereId($id)
+ ->where('user_id', Auth::id())
+ ->firstOrFail();
+
+ $zip
+ ->user
+ ->record_download(
+ $disk->size("zip/$zip->basename")
+ );
+
+ return $disk->download("zip/$zip->basename", $zip->basename, [
+ "Content-Type" => 'application/zip',
+ "Content-Length" => $disk->size("zip/$zip->basename"),
+ "Accept-Ranges" => "bytes",
+ "Content-Range" => "bytes 0-600/" . $disk->size("zip/$zip->basename"),
+ "Content-Disposition" => "attachment; filename=$zip->basename",
+ ]);
+ }
+
+ /**
+ * Get image thumbnail
+ *
+ * @param Request $request
+ * @param $filename
+ * @return mixed
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function get_thumbnail(Request $request, $filename)
+ {
+ // Get file record
+ $file = UserFile::withTrashed()
+ ->whereUserId(Auth::id())
+ ->whereThumbnail($filename)
+ ->firstOrFail();
+
+ // Check user permission
+ /*if (!$request->user()->tokenCan('master')) {
+ $this->check_file_access($request, $file);
+ }*/
+
+ return $this->helper->download_thumbnail_file($file, Auth::id());
+ }
+}
diff --git a/app/Http/Controllers/FileFunctions/ShareController.php b/app/Http/Controllers/FileManager/ShareController.php
similarity index 58%
rename from app/Http/Controllers/FileFunctions/ShareController.php
rename to app/Http/Controllers/FileManager/ShareController.php
index d132dbe3..843fa67c 100644
--- a/app/Http/Controllers/FileFunctions/ShareController.php
+++ b/app/Http/Controllers/FileManager/ShareController.php
@@ -1,21 +1,18 @@
firstOrFail();
-
- return new ShareResource($shared);
+ return new ShareResource(
+ $shared
+ );
}
/**
* Generate file share link
*
* @param CreateShareRequest $request
+ * @param $id
* @return ShareResource
*/
- public function store(CreateShareRequest $request)
+ public function store(CreateShareRequest $request, $id)
{
- do {
- // Generate unique token
- $token = Str::random(16);
-
- } while (Share::where(DB::raw('BINARY `token`'), $token)->exists());
-
// Create shared options
- $options = [
- 'password' => $request->has('password') ? Hash::make($request->password) : null,
- 'type' => $request->type === 'folder' ? 'folder' : 'file',
- 'protected' => $request->isPassword,
- 'permission' => $request->permission,
- 'item_id' => $request->unique_id,
- 'expire_in' => $request->expiration,
- 'user_id' => Auth::id(),
- 'token' => $token,
- ];
-
- // Return created shared record
- $share = new ShareResource(Share::create($options));
+ $shared = Share::create([
+ 'password' => $request->has('password') ? bcrypt($request->password) : null,
+ 'type' => $request->type === 'folder' ? 'folder' : 'file',
+ 'is_protected' => $request->isPassword,
+ 'permission' => $request->permission ?? null,
+ 'item_id' => $id,
+ 'expire_in' => $request->expiration ?? null,
+ 'user_id' => Auth::id(),
+ ]);
// Send shared link via email
if ($request->has('emails')) {
foreach ($request->emails as $email) {
- Notification::route('mail', $email)->notify(new SharedSendViaEmail($token));
+
+ Notification::route('mail', $email)->notify(
+ new SharedSendViaEmail($shared->token)
+ );
}
}
- return $share;
+ // Return created shared record
+ return new ShareResource($shared);
}
/**
@@ -90,10 +81,10 @@ class ShareController extends Controller
// Update sharing record
$shared->update([
- 'permission' => $request->permission,
- 'protected' => $request->protected,
- 'expire_in' => $request->expiration,
- 'password' => $request->password ? Hash::make($request->password) : $shared->password,
+ 'permission' => $request->permission,
+ 'is_protected' => $request->protected,
+ 'expire_in' => $request->expiration,
+ 'password' => $request->password ? bcrypt($request->password) : $shared->password,
]);
// Return shared record
@@ -103,13 +94,12 @@ class ShareController extends Controller
/**
* Delete sharing item
*
- * @param $token
+ * @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
- * @throws \Exception
*/
public function destroy(Request $request)
{
- foreach ($request->input('tokens') as $token) {
+ foreach ($request->tokens as $token) {
// Get sharing record
Share::where('token', $token)
@@ -127,7 +117,6 @@ class ShareController extends Controller
}
}
- // Done
return response('Done!', 204);
}
@@ -137,20 +126,25 @@ class ShareController extends Controller
* @param $token
* @param $request
*/
- public function shared_send_via_email(Request $request, $token)
+ public function send_to_emails_recipients(Request $request, $token)
{
+ // TODO: pridat validation request
// Make validation of array of emails
$validator = Validator::make($request->all(), [
'emails.*' => 'required|email',
]);
// Return error
- if ($validator->fails()) abort(400, 'Bad email input');
+ if ($validator->fails()) {
+ abort(400, 'Bad email input');
+ }
// Send shared link via email
- if($request->has('emails')) {
+ if ($request->has('emails')) {
+
foreach ($request->emails as $email) {
- Notification::route('mail', $email)->notify(new SharedSendViaEmail($token));
+ Notification::route('mail', $email)
+ ->notify(new SharedSendViaEmail($token));
}
}
diff --git a/app/Http/Controllers/FileFunctions/TrashController.php b/app/Http/Controllers/FileManager/TrashController.php
similarity index 59%
rename from app/Http/Controllers/FileFunctions/TrashController.php
rename to app/Http/Controllers/FileManager/TrashController.php
index b5854e2e..26589bf7 100644
--- a/app/Http/Controllers/FileFunctions/TrashController.php
+++ b/app/Http/Controllers/FileManager/TrashController.php
@@ -1,70 +1,40 @@
where('user_id', $user_id)->get();
- $files = FileManagerFile::onlyTrashed()->where('user_id', $user_id)->get();
-
- // Force delete folder
- $folders->each->forceDelete();
-
- // Force delete files
- foreach ($files as $file) {
-
- // Delete file
- Storage::delete('/file-manager/' . $file->basename);
-
- // Delete thumbnail if exist
- if ($file->thumbnail) Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
-
- // Delete file permanently
- $file->forceDelete();
- }
-
- // Return response
- return response('Done!', 204);
+ $this->demo = resolve(DemoService::class);
}
/**
* Restore item from trash
*
* @param Request $request
- * @param $unique_id
* @return ResponseFactory|\Illuminate\Http\Response
*/
public function restore(Request $request)
{
// Validate request
- $validator = Validator::make($request->input('data'), [
- '*.type' => 'required|string',
- '*.unique_id' => 'integer',
+ // TODO: zrefaktorovat validator do requestu
+ $validator = Validator::make($request->input('items'), [
+ '*.type' => 'required|string',
+ '*.id' => 'string',
]);
// Return error
@@ -73,37 +43,35 @@ class TrashController extends Controller
// Get user id
$user_id = Auth::id();
- if (is_demo($user_id)) {
- return Demo::response_204();
- }
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
+
+ foreach ($request->input('items') as $restore) {
- foreach($request->input('data') as $restore_item) {
-
// Get folder
- if ($restore_item['type'] === 'folder') {
+ if ($restore['type'] === 'folder') {
// Get folder
- $item = FileManagerFolder::onlyTrashed()
+ $item = Folder::onlyTrashed()
->where('user_id', $user_id)
- ->where('unique_id', $restore_item['unique_id'])
+ ->where('id', $restore['id'])
->first();
// Restore item to home directory
if ($request->has('to_home') && $request->to_home) {
- $item->parent_id = 0;
+ $item->parent_id = null;
$item->save();
}
} else {
// Get item
- $item = FileManagerFile::onlyTrashed()
+ $item = File::onlyTrashed()
->where('user_id', $user_id)
- ->where('unique_id', $restore_item['unique_id'])
+ ->where('id', $restore['id'])
->first();
// Restore item to home directory
if ($request->has('to_home') && $request->to_home) {
- $item->folder_id = 0;
+ $item->folder_id = null;
$item->save();
}
}
@@ -115,4 +83,42 @@ class TrashController extends Controller
// Return response
return response('Done!', 204);
}
+
+ /**
+ * Empty user trash
+ *
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function dump()
+ {
+ // Get user id
+ $user_id = Auth::id();
+
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
+
+ // Get files and folders
+ $folders = Folder::onlyTrashed()->where('user_id', $user_id)->get();
+ $files = File::onlyTrashed()->where('user_id', $user_id)->get();
+
+ // Force delete folder
+ $folders->each->forceDelete();
+
+ // Force delete files
+ foreach ($files as $file) {
+
+ // Delete file
+ Storage::delete("/files/$user_id/{$file->basename}");
+
+ // Delete thumbnail if exist
+ if ($file->thumbnail) {
+ Storage::delete("/files/$user_id/{$file->getRawOriginal('thumbnail')}");
+ }
+
+ // Delete file permanently
+ $file->forceDelete();
+ }
+
+ // Return response
+ return response('Done!', 204);
+ }
}
diff --git a/app/Http/Controllers/General/PricingController.php b/app/Http/Controllers/General/PricingController.php
deleted file mode 100644
index b3034baf..00000000
--- a/app/Http/Controllers/General/PricingController.php
+++ /dev/null
@@ -1,48 +0,0 @@
-stripe = $stripe;
- }
-
- /**
- * Get all active plans
- *
- * @return PricingCollection
- */
- public function index()
- {
- if (Cache::has('pricing')) {
-
- // Get pricing from cache
- $pricing = Cache::get('pricing');
- } else {
-
- // Store pricing to cache
- $pricing = Cache::rememberForever('pricing', function () {
- return $this->stripe->getActivePlans();
- });
- }
-
- // Format pricing to collection
- $collection = new PricingCollection($pricing);
-
- // Sort and return pricing
- return $collection->sortBy('product.metadata.capacity')
- ->values()
- ->all();
- }
-}
diff --git a/app/Http/Controllers/General/SetupWizardController.php b/app/Http/Controllers/General/SetupWizardController.php
deleted file mode 100644
index 497acc9b..00000000
--- a/app/Http/Controllers/General/SetupWizardController.php
+++ /dev/null
@@ -1,575 +0,0 @@
-stripe = $stripe;
- }
-
- /**
- * Verify Envato purchase code
- *
- * @param Request $request
- * @return ResponseFactory|\Illuminate\Http\Response|mixed
- */
- public function verify_purchase_code(Request $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- // Verify purchase code
- $response = Http::get('https://verify.vuefilemanager.com/api/verify-code/' . $request->purchaseCode);
-
- if ($response->successful()) {
- return $response;
- }
-
- return response('Purchase code is invalid.', 400);
- }
-
- /**
- * Set up database credentials
- *
- * @param StoreDatabaseCredentialsRequest $request
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function setup_database(StoreDatabaseCredentialsRequest $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- try {
- // Set temporary database connection
- config(['database.connections.test.driver' => $request->connection]);
- config(['database.connections.test.host' => $request->host]);
- config(['database.connections.test.port' => $request->port]);
- config(['database.connections.test.database' => $request->name]);
- config(['database.connections.test.username' => $request->username]);
- config(['database.connections.test.password' => $request->password]);
-
- // Test connection
- \DB::connection('test')->getPdo();
-
- } catch (PDOException $e) {
- throw new HttpException(500, $e->getMessage());
- }
-
- setEnvironmentValue([
- 'DB_CONNECTION' => $request->connection,
- 'DB_HOST' => $request->host,
- 'DB_PORT' => $request->port,
- 'DB_DATABASE' => $request->name,
- 'DB_USERNAME' => $request->username,
- 'DB_PASSWORD' => $request->password,
- ]);
-
- // Clear cache
- Artisan::call('config:cache');
-
- // Set up application
- $this->set_up_application();
-
- // Store setup wizard progress
- Setting::create([
- 'name' => 'setup_wizard_database',
- 'value' => 1,
- ]);
-
- return response('Done', 200);
- }
-
- /**
- * Store and test stripe credentials
- *
- * @param StoreStripeCredentialsRequest $request
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function store_stripe_credentials(StoreStripeCredentialsRequest $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- // Create stripe instance
- $stripe = Stripe::make($request->secret, '2020-03-02');
-
- // Try to get stripe account details
- try {
- $stripe->account()->details();
- } catch (UnauthorizedException $e) {
- throw new HttpException(401, $e->getMessage());
- }
-
- // Get options
- $settings = collect([
- [
- 'name' => 'stripe_currency',
- 'value' => $request->currency,
- ],
- [
- 'name' => 'payments_configured',
- 'value' => 1,
- ],
- [
- 'name' => 'payments_active',
- 'value' => 1,
- ],
- ]);
-
- // Store options
- $settings->each(function ($col) {
- Setting::updateOrCreate(['name' => $col['name']], $col);
- });
-
- // Set stripe credentials to .env
- setEnvironmentValue([
- 'CASHIER_CURRENCY' => $request->currency,
- 'STRIPE_KEY' => $request->key,
- 'STRIPE_SECRET' => $request->secret,
- 'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
- ]);
-
- // Clear cache
- Artisan::call('config:cache');
-
- return response('Done', 200);
- }
-
- /**
- * Store Stripe billings
- *
- * @param StoreStripeBillingRequest $request
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function store_stripe_billings(StoreStripeBillingRequest $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- // Get options
- $settings = collect([
- [
- 'name' => 'billing_phone_number',
- 'value' => $request->billing_phone_number,
- ],
- [
- 'name' => 'billing_postal_code',
- 'value' => $request->billing_postal_code,
- ],
- [
- 'name' => 'billing_vat_number',
- 'value' => $request->billing_vat_number,
- ],
- [
- 'name' => 'billing_address',
- 'value' => $request->billing_address,
- ],
- [
- 'name' => 'billing_country',
- 'value' => $request->billing_country,
- ],
- [
- 'name' => 'billing_state',
- 'value' => $request->billing_state,
- ],
- [
- 'name' => 'billing_city',
- 'value' => $request->billing_city,
- ],
- [
- 'name' => 'billing_name',
- 'value' => $request->billing_name,
- ],
- ]);
-
- // Store options
- $settings->each(function ($col) {
- Setting::updateOrCreate(['name' => $col['name']], $col);
- });
-
- // Clear cache
- Artisan::call('config:cache');
-
- return response('Done', 200);
- }
-
- /**
- * Create Stripe subscription plan
- *
- * @param StoreStripePlansRequest $request
- */
- public function store_stripe_plans(StoreStripePlansRequest $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- foreach ($request->input('plans') as $plan) {
- $this->stripe->createPlan($plan);
- }
- }
-
- /**
- * Store environment setup
- *
- * @param StoreEnvironmentSetupRequest $request
- * @return string
- */
- public function store_environment_setup(StoreEnvironmentSetupRequest $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- $storage_driver = $request->input('storage.driver');
-
- if ($storage_driver === 'local') {
-
- setEnvironmentValue([
- 'FILESYSTEM_DRIVER' => 'local',
- ]);
- }
-
- if ($storage_driver === 's3') {
-
- setEnvironmentValue([
- 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
- 'AWS_ACCESS_KEY_ID' => $request->input('storage.key'),
- 'AWS_SECRET_ACCESS_KEY' => $request->input('storage.secret'),
- 'AWS_DEFAULT_REGION' => $request->input('storage.region'),
- 'AWS_BUCKET' => $request->input('storage.bucket'),
- ]);
- }
-
- if ($storage_driver === 'spaces') {
-
- setEnvironmentValue([
- 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
- 'DO_SPACES_KEY' => $request->input('storage.key'),
- 'DO_SPACES_SECRET' => $request->input('storage.secret'),
- 'DO_SPACES_ENDPOINT' => $request->input('storage.endpoint'),
- 'DO_SPACES_REGION' => $request->input('storage.region'),
- 'DO_SPACES_BUCKET' => $request->input('storage.bucket'),
- ]);
- }
-
- if ($storage_driver === 'wasabi') {
-
- setEnvironmentValue([
- 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
- 'WASABI_KEY' => $request->input('storage.key'),
- 'WASABI_SECRET' => $request->input('storage.secret'),
- 'WASABI_ENDPOINT' => $request->input('storage.endpoint'),
- 'WASABI_REGION' => $request->input('storage.region'),
- 'WASABI_BUCKET' => $request->input('storage.bucket'),
- ]);
- }
-
- if ($storage_driver === 'backblaze') {
-
- setEnvironmentValue([
- 'FILESYSTEM_DRIVER' => $request->input('storage.driver'),
- 'BACKBLAZE_KEY' => $request->input('storage.key'),
- 'BACKBLAZE_SECRET' => $request->input('storage.secret'),
- 'BACKBLAZE_ENDPOINT' => $request->input('storage.endpoint'),
- 'BACKBLAZE_REGION' => $request->input('storage.region'),
- 'BACKBLAZE_BUCKET' => $request->input('storage.bucket'),
- ]);
- }
-
- setEnvironmentValue([
- 'MAIL_DRIVER' => $request->input('mail.driver'),
- 'MAIL_HOST' => $request->input('mail.host'),
- 'MAIL_PORT' => $request->input('mail.port'),
- 'MAIL_USERNAME' => $request->input('mail.username'),
- 'MAIL_PASSWORD' => $request->input('mail.password'),
- 'MAIL_ENCRYPTION' => $request->input('mail.encryption'),
- ]);
-
- // Clear cache
- Artisan::call('config:cache');
-
- return response('Done', 200);
- }
-
- /**
- * Store app settings
- * @param StoreAppSetupRequest $request
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function store_app_settings(StoreAppSetupRequest $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- // Store Logo
- if ($request->hasFile('logo')) {
- $logo = store_system_image($request->file('logo'), 'system');
- }
-
- // Store Logo horizontal
- if ($request->hasFile('logo_horizontal')) {
- $logo_horizontal = store_system_image($request->file('logo_horizontal'), 'system');
- }
-
- // Store favicon
- if ($request->hasFile('favicon')) {
- $favicon = store_system_image($request->file('favicon'), 'system');
- }
-
- // Get options
- $settings = collect([
- [
- 'name' => 'app_title',
- 'value' => $request->title,
- ],
- [
- 'name' => 'app_description',
- 'value' => $request->description,
- ],
- [
- 'name' => 'app_logo',
- 'value' => $request->hasFile('logo') ? $logo : null,
- ],
- [
- 'name' => 'app_logo_horizontal',
- 'value' => $request->hasFile('logo_horizontal') ? $logo_horizontal : null,
- ],
- [
- 'name' => 'app_favicon',
- 'value' => $request->hasFile('favicon') ? $favicon : null,
- ],
- [
- 'name' => 'google_analytics',
- 'value' => $request->googleAnalytics,
- ],
- [
- 'name' => 'contact_email',
- 'value' => $request->contactMail,
- ],
- [
- 'name' => 'registration',
- 'value' => $request->userRegistration,
- ],
- [
- 'name' => 'storage_limitation',
- 'value' => $request->storageLimitation,
- ],
- [
- 'name' => 'storage_default',
- 'value' => $request->defaultStorage ? $request->defaultStorage : 5,
- ],
- ]);
-
- // Store options
- $settings->each(function ($col) {
- Setting::updateOrCreate(['name' => $col['name']], $col);
- });
-
- setEnvironmentValue([
- 'APP_NAME' => Str::camel($request->title),
- ]);
-
- return response('Done', 200);
- }
-
- /**
- * Create and login admin account
- *
- * @param Request $request
- * @return ResponseFactory|\Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response
- */
- public function create_admin_account(Request $request)
- {
- // Check setup status
- if ($this->get_setup_status()) abort(410, 'Gone');
-
- // Validate request
- $request->validate([
- 'email' => 'required|string|email|unique:users',
- 'password' => 'required|string|min:6|confirmed',
- 'name' => 'required|string',
- 'purchase_code' => 'required|string',
- 'license' => 'required|string',
- 'avatar' => 'sometimes|file',
- ]);
-
- // Store avatar
- if ($request->hasFile('avatar')) {
- $avatar = store_avatar($request->file('avatar'), 'avatars');
- }
-
- // Create user
- $user = User::forceCreate([
- 'avatar' => $request->hasFile('avatar') ? $avatar : null,
- 'name' => $request->name,
- 'role' => 'admin',
- 'email' => $request->email,
- 'password' => Hash::make($request->password),
- ]);
-
- // Get default storage capacity
- $storage_capacity = Setting::where('name', 'storage_default')->first();
-
- // Create settings
- UserSettings::forceCreate([
- 'user_id' => $user->id,
- 'storage_capacity' => $storage_capacity->value,
- ]);
-
- // Store setup wizard progress
- Setting::updateOrCreate([
- 'name' => 'setup_wizard_success',
- 'value' => 1,
- ]);
-
- // Store License
- Setting::updateOrCreate([
- 'name' => 'license',
- 'value' => $request->license,
- ]);
-
- // Store Purchase Code
- Setting::updateOrCreate([
- 'name' => 'purchase_code',
- 'value' => $request->purchase_code,
- ]);
-
- // Create legal pages and index content
- $pages = collect(config('content.pages'));
- $content = $request->license === 'Extended' ? collect(config('content.content_extended')) : collect(config('content.content_regular'));
-
- $content->each(function ($content) {
- Setting::updateOrCreate($content);
- });
-
- $pages->each(function ($page) {
- Page::updateOrCreate($page);
- });
-
- // Retrieve access token
- $response = Route::dispatch(self::make_login_request($request));
-
- // Send access token to user if request is successful
- if ($response->isSuccessful()) {
-
- $data = json_decode($response->content(), true);
-
- return response('Admin was created', 200)->cookie('access_token', $data['access_token'], 43200);
- }
-
- return $response;
- }
-
- /**
- * Migrate database and generate necessary things
- */
- private function set_up_application()
- {
- // Generate app key
- Artisan::call('key:generate', [
- '--force' => true
- ]);
-
- // Migrate database
- Artisan::call('migrate:fresh', [
- '--force' => true
- ]);
-
- // Create Passport Keys
- Artisan::call('passport:keys', [
- '--force' => true
- ]);
-
- // Create Password grant client
- Artisan::call('passport:client', [
- '--password' => true,
- '--name' => 'vuefilemanager',
- ]);
-
- // Create Personal access client
- Artisan::call('passport:client', [
- '--personal' => true,
- '--name' => 'shared',
- ]);
-
- // Get generated client
- $client = \DB::table('oauth_clients')->where('name', '=', 'vuefilemanager')->first();
-
- // Set passport client to .env
- setEnvironmentValue([
- 'PASSPORT_CLIENT_ID' => $client->id,
- 'PASSPORT_CLIENT_SECRET' => $client->secret,
- ]);
- }
-
- /**
- * Make login request for get access token
- *
- * @param Request $request
- * @return Request
- */
- private static function make_login_request($request)
- {
- $request->request->add([
- 'grant_type' => 'password',
- 'client_id' => config('services.passport.client_id'),
- 'client_secret' => config('services.passport.client_secret'),
- 'username' => $request->email,
- 'password' => $request->password,
- 'scope' => 'master',
- ]);
-
- return Request::create(url('/oauth/token'), 'POST', $request->all());
- }
-
- /**
- * Get setup wizard status
- *
- * @return |null
- */
- private function get_setup_status()
- {
- try {
- // Check database connections
- DB::getPdo();
-
- // Get setup_wizard status
- return Schema::hasTable('settings') ? Setting::where('name', 'setup_wizard_success')->first() : false;
-
- } catch (PDOException $e) {
-
- return false;
- }
- }
-}
diff --git a/app/Http/Controllers/General/UpgradeAppController.php b/app/Http/Controllers/General/UpgradeAppController.php
deleted file mode 100644
index 3dfbd630..00000000
--- a/app/Http/Controllers/General/UpgradeAppController.php
+++ /dev/null
@@ -1,125 +0,0 @@
-upgrade_database();
-
- // Create legal pages and index content for regular license
- if (get_setting('license') === 'Regular') {
-
- $pages = collect(config('content.pages'));
- $content = collect(config('content.content_regular'));
-
- $content->each(function ($content) {
- Setting::updateOrCreate($content);
- });
-
- $pages->each(function ($page) {
- Page::updateOrCreate($page);
- });
- }
- }
-
- /*
- * Upgrade expire_in in shares table
- *
- * @since v1.8
- */
- if (! Schema::hasTable('traffic') && ! Schema::hasTable('zips') && ! Schema::hasTable('jobs')) {
-
- $this->upgrade_database();
- }
- /*
- * Upgrade expire_in in shares table
- *
- * @since v1.8
- */
- if (! Schema::hasTable('traffic') && ! Schema::hasTable('zips') && ! Schema::hasTable('jobs')) {
-
- $this->upgrade_database();
- }
-
- /*
- * Upgrade expire_in in shares table
- *
- * @since v1.7.9
- */
- if (! Schema::hasColumn('shares', 'expire_in')) {
-
- $this->upgrade_database();
- }
-
- /*
- * Upgrade expire_in in shares table
- *
- * @since v1.7.11
- */
- if (! Schema::hasColumn('file_manager_files', 'metadata')) {
-
- $this->upgrade_database();
- }
- }
-
- /**
- * @return int|mixed
- */
- private function upgrade_database()
- {
- $command = Artisan::call('migrate', [
- '--force' => true
- ]);
-
- if ($command === 0) {
- echo 'Operation was successful.';
- }
-
- if ($command === 1) {
- echo 'Operation failed.';
- }
- return $command;
- }
-}
diff --git a/app/Http/Controllers/SettingController.php b/app/Http/Controllers/SettingController.php
deleted file mode 100644
index 1109fead..00000000
--- a/app/Http/Controllers/SettingController.php
+++ /dev/null
@@ -1,156 +0,0 @@
-get('column');
-
- if (strpos($column, '|') !== false) {
-
- $columns = explode('|', $column);
-
- return Setting::whereIn('name', $columns)->pluck('value', 'name');
- }
-
- return Setting::where('name', $column)->pluck('value', 'name');
- }
-
- /**
- * Update the specified resource in storage.
- *
- * @param \Illuminate\Http\Request $request
- * @return \Illuminate\Http\Response
- */
- public function update(Request $request)
- {
- // Check if is demo
- if (env('APP_DEMO')) {
- return Demo::response_204();
- }
-
- // Store image if exist
- if ($request->hasFile($request->name)) {
-
- // Store image
- $image_path = store_system_image($request->file($request->name), 'system');
-
- // Find and update image path
- Setting::updateOrCreate(['name' => $request->name], [
- 'value' => $image_path
- ]);
-
- return response('Done', 204);
- }
-
- // Find and update variable
- Setting::updateOrCreate(['name' => $request->name], [
- 'value' => $request->value
- ]);
-
- return response('Done', 204);
- }
-
- /**
- * Set new email credentials to .env file
- *
- * @param Request $request
- * @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
- */
- public function set_email(Request $request)
- {
- // Check if is demo
- if (env('APP_DEMO')) {
- return Demo::response_204();
- }
-
- setEnvironmentValue([
- 'MAIL_DRIVER' => $request->input('driver'),
- 'MAIL_HOST' => $request->input('host'),
- 'MAIL_PORT' => $request->input('port'),
- 'MAIL_USERNAME' => $request->input('username'),
- 'MAIL_PASSWORD' => $request->input('password'),
- 'MAIL_ENCRYPTION' => $request->input('encryption'),
- ]);
-
- // Clear config cache
- Artisan::call('config:clear');
- Artisan::call('config:cache');
-
- return response('Done', 204);
- }
-
- /**
- * Configure stripe additionally
- *
- * @param Request $request
- */
- public function set_stripe(Request $request)
- {
- // Get stripe status
- $is_stripe = get_setting('payments_configured');
-
- // Check setup status
- if ($is_stripe) abort(401, 'Gone');
-
- // Create stripe instance
- $stripe = Stripe::make($request->secret, '2020-03-02');
-
- // Try to get stripe account details
- try {
- $stripe->account()->details();
- } catch (UnauthorizedException $e) {
- throw new HttpException(401, $e->getMessage());
- }
-
- // Get options
- $settings = collect([
- [
- 'name' => 'stripe_currency',
- 'value' => $request->currency,
- ],
- [
- 'name' => 'payments_configured',
- 'value' => 1,
- ],
- [
- 'name' => 'payments_active',
- 'value' => 1,
- ],
- ]);
-
- // Store options
- $settings->each(function ($col) {
- Setting::updateOrCreate(['name' => $col['name']], $col);
- });
-
- // Set stripe credentials to .env
- setEnvironmentValue([
- 'CASHIER_CURRENCY' => $request->currency,
- 'STRIPE_KEY' => $request->key,
- 'STRIPE_SECRET' => $request->secret,
- 'STRIPE_WEBHOOK_SECRET' => $request->webhookSecret,
- ]);
-
- // Clear cache
- Artisan::call('cache:clear');
- Artisan::call('config:clear');
- Artisan::call('config:cache');
- }
-}
diff --git a/app/Http/Controllers/Sharing/BrowseShareController.php b/app/Http/Controllers/Sharing/BrowseShareController.php
new file mode 100644
index 00000000..e38696b4
--- /dev/null
+++ b/app/Http/Controllers/Sharing/BrowseShareController.php
@@ -0,0 +1,248 @@
+helper = resolve(HelperService::class);
+ }
+
+ /**
+ * Show page index and delete access_token & shared_token cookie
+ * @param Share $shared
+ * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Symfony\Component\HttpFoundation\StreamedResponse
+ */
+ public function index(Share $shared)
+ {
+ // Delete share_session if exist
+ if ($shared->is_protected) {
+ cookie()->queue('share_session', '', -1);
+ }
+
+ // Check if shared is image file and then show it
+ if ($shared->type === 'file' && !$shared->is_protected) {
+
+ $image = File::whereUserId($shared->user_id)
+ ->whereType('image')
+ ->whereId($shared->item_id)
+ ->firstOrFail();
+
+ // Store user download size
+ $shared
+ ->user
+ ->record_download(
+ (int)$image->getRawOriginal('filesize')
+ );
+
+ return $this->get_single_image($image, $shared->user_id);
+ }
+
+ return view("index")
+ ->with('settings', get_settings_in_json() ?? null);
+ }
+
+ /**
+ * Check Password for protected item
+ *
+ * @param AuthenticateShareRequest $request
+ * @param Share $shared
+ * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response
+ */
+ public function authenticate(AuthenticateShareRequest $request, Share $shared)
+ {
+ // Check password
+ if (Hash::check($request->password, $shared->password)) {
+
+ $cookie = json_encode([
+ 'token' => $shared->token,
+ 'authenticated' => true,
+ ]);
+
+ // Return authorize token with shared options
+ return response(new ShareResource($shared), 200)
+ ->cookie('share_session', $cookie, 43200);
+ }
+
+ abort(401, __t('incorrect_password'));
+ }
+
+ /**
+ * Browse shared folder
+ *
+ * @param $id
+ * @param Share $shared
+ * @return Collection
+ */
+ public function browse_folder($id, Share $shared)
+ {
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check if user can get directory
+ $this->helper->check_item_access($id, $shared);
+
+ // Get files and folders
+ list($folders, $files) = $this->helper->get_items_under_shared_by_folder_id($id, $shared);
+
+ // Set thumbnail links for public files
+ $files->map(function ($file) use ($shared) {
+ $file->setPublicUrl($shared->token);
+ });
+
+ // Collect folders and files to single array
+ return collect([$folders, $files])
+ ->collapse();
+ }
+
+ /**
+ * Search shared files
+ *
+ * @param Request $request
+ * @param Share $shared
+ * @return Collection
+ */
+ public function search(Request $request, Share $shared)
+ {
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ $query = remove_accents(
+ $request->input('query')
+ );
+
+ // Search files id db
+ $searched_files = File::search($query)
+ ->where('user_id', $shared->user_id)
+ ->get();
+ $searched_folders = Folder::search($query)
+ ->where('user_id', $shared->user_id)
+ ->get();
+
+ // Get all children content
+ $foldersIds = Folder::with('folders:id,parent_id,id,name')
+ ->where('user_id', $shared->user_id)
+ ->where('parent_id', $shared->item_id)
+ ->get();
+
+ // Get accessible folders
+ $accessible_folder_ids = Arr::flatten([filter_folders_ids($foldersIds), $shared->item_id]);
+
+ // Filter files
+ $files = $searched_files->filter(function ($file) use ($accessible_folder_ids, $shared) {
+
+ // Set public urls
+ $file->setPublicUrl($shared->token);
+
+ // check if item is in accessible folders
+ return in_array($file->folder_id, $accessible_folder_ids);
+ });
+
+ // Filter folders
+ $folders = $searched_folders->filter(function ($folder) use ($accessible_folder_ids) {
+
+ // check if item is in accessible folders
+ return in_array($folder->id, $accessible_folder_ids);
+ });
+
+ // Collect folders and files to single array
+ return collect([$folders, $files])
+ ->collapse();
+ }
+
+ /**
+ * Get navigation tree of shared folder
+ *
+ * @param Share $shared
+ * @return array
+ */
+ public function navigation_tree(Share $shared)
+ {
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check if user can get directory
+ $this->helper->check_item_access($shared->item_id, $shared);
+
+ // Get folders
+ $folders = Folder::with('folders:id,parent_id,name')
+ ->whereParentId($shared->item_id)
+ ->whereUserId($shared->user_id)
+ ->sortable()
+ ->get(['id', 'parent_id', 'id', 'name']);
+
+ return [
+ [
+ 'id' => $shared->item_id,
+ 'name' => __t('home'),
+ 'location' => 'public',
+ 'folders' => $folders,
+ ]
+ ];
+ }
+
+ /**
+ * Get shared file record
+ *
+ * @param Share $shared
+ * @return mixed
+ */
+ public function get_single_file(Share $shared)
+ {
+ // Check ability to access protected share files
+ $this->helper->check_protected_share_record($shared);
+
+ // Get file
+ $file = File::whereUserId($shared->user_id)
+ ->whereId($shared->item_id)
+ ->firstOrFail();
+
+ // Set access urls
+ $file->setPublicUrl($shared->token);
+
+ return response(new FileResource($file), 200);
+ }
+
+ /**
+ * Get image from storage and show it
+ *
+ * @param $file
+ * @param $user_id
+ * @return \Symfony\Component\HttpFoundation\StreamedResponse
+ */
+ private function get_single_image($file, $user_id)
+ {
+ // Format pretty filename
+ $file_pretty_name = $file->name . '.' . $file->mimetype;
+
+ // Get file path
+ $path = "/files/$user_id/$file->basename";
+
+ // Check if file exist
+ if (!Storage::exists($path)) abort(404);
+
+ return Storage::response($path, $file_pretty_name, [
+ "Content-Type" => Storage::mimeType($path),
+ "Content-Length" => Storage::size($path),
+ "Accept-Ranges" => "bytes",
+ "Content-Range" => "bytes 0-600/" . Storage::size($path),
+ ]);
+ }
+}
diff --git a/app/Http/Controllers/Sharing/FileSharedAccessController.php b/app/Http/Controllers/Sharing/FileSharedAccessController.php
new file mode 100644
index 00000000..3cbb9bd7
--- /dev/null
+++ b/app/Http/Controllers/Sharing/FileSharedAccessController.php
@@ -0,0 +1,112 @@
+helper = resolve(HelperService::class);
+ }
+
+ /**
+ * Get generated zip for guest
+ *
+ * @param $id
+ * @param $token
+ * @return \Symfony\Component\HttpFoundation\StreamedResponse
+ */
+ public function get_zip_public($id, $token)
+ {
+ $disk = Storage::disk('local');
+
+ $zip = Zip::where('id', $id)
+ ->where('shared_token', $token)
+ ->first();
+
+ $zip
+ ->user
+ ->record_download(
+ $disk->size("zip/$zip->basename")
+ );
+
+ return $disk
+ ->download("zip/$zip->basename", $zip->basename, [
+ "Content-Type" => 'application/zip',
+ "Content-Length" => $disk->size("zip/$zip->basename"),
+ "Accept-Ranges" => "bytes",
+ "Content-Range" => "bytes 0-600/" . $disk->size("zip/$zip->basename"),
+ "Content-Disposition" => "attachment; filename=" . $zip->basename,
+ ]);
+ }
+
+ /**
+ * Get file public
+ *
+ * @param $filename
+ * @param Share $shared
+ * @return mixed
+ */
+ public function get_file_public($filename, Share $shared)
+ {
+ // Check ability to access protected share files
+ $this->helper->check_protected_share_record($shared);
+
+ // Get file record
+ $file = UserFile::where('user_id', $shared->user_id)
+ ->where('basename', $filename)
+ ->firstOrFail();
+
+ // Check file access
+ $this->helper->check_guest_access_to_shared_items($shared, $file);
+
+ // Store user download size
+ $shared
+ ->user
+ ->record_download(
+ (int)$file->getRawOriginal('filesize')
+ );
+
+ return $this->helper->download_file($file, $shared->user_id);
+ }
+
+ /**
+ * Get public image thumbnail
+ *
+ * @param $filename
+ * @param Share $shared
+ * @return mixed
+ */
+ public function get_thumbnail_public($filename, Share $shared)
+ {
+ // Check ability to access protected share files
+ $this->helper->check_protected_share_record($shared);
+
+ // Get file record
+ $file = UserFile::where('user_id', $shared->user_id)
+ ->where('thumbnail', $filename)
+ ->firstOrFail();
+
+ // Check file access
+ $this->helper->check_guest_access_to_shared_items($shared, $file);
+
+ // Store user download size
+ $shared
+ ->user
+ ->record_download(
+ (int)$file->getRawOriginal('filesize')
+ );
+
+ return $this->helper->download_thumbnail_file($file, $shared->user_id);
+ }
+}
diff --git a/app/Http/Controllers/Sharing/FileSharingController.php b/app/Http/Controllers/Sharing/FileSharingController.php
deleted file mode 100644
index 1c6140f1..00000000
--- a/app/Http/Controllers/Sharing/FileSharingController.php
+++ /dev/null
@@ -1,418 +0,0 @@
-first();
-
- if (! $shared) {
- return view("index");
- }
-
- // Delete old access_token if exist
- Cookie::queue('shared_access_token', '', -1);
-
- // Set cookies
- if ((int) $shared->protected) {
-
- // Set shared token
- Cookie::queue('shared_token', $token, 43200);
- }
-
- // Check if shared is image file and then show it
- if ($shared->type === 'file' && ! (int) $shared->protected) {
-
- $image = FileManagerFile::where('user_id', $shared->user_id)
- ->where('type', 'image')
- ->where('unique_id', $shared->item_id)
- ->first();
-
- if ($image) {
-
- // Store user download size
- User::find($shared->user_id)->record_download((int) $image->getRawOriginal('filesize'));
-
- return $this->show_image($image);
- }
- }
-
- // Get all settings
- $settings = Setting::all();
-
- // Return page index
- return view("index")
- ->with('settings', $settings ? json_decode($settings->pluck('value', 'name')->toJson()) : null);
- }
-
- /**
- * Get image from storage and show it
- *
- * @param $file
- * @return \Symfony\Component\HttpFoundation\StreamedResponse
- */
- private function show_image($file)
- {
- // Format pretty filename
- $file_pretty_name = $file->name . '.' . $file->mimetype;
-
- // Get file path
- $path = '/file-manager/' . $file->basename;
-
- // Check if file exist
- if (!Storage::exists($path)) abort(404);
-
- $header = [
- "Content-Type" => Storage::mimeType($path),
- "Content-Length" => Storage::size($path),
- "Accept-Ranges" => "bytes",
- "Content-Range" => "bytes 0-600/" . Storage::size($path),
- ];
-
- // Get file
- return Storage::response($path, $file_pretty_name, $header);
- }
-
- /**
- * Check Password for protected item
- *
- * @param AuthenticateShareRequest $request
- * @param $token
- * @return array
- */
- public function authenticate(AuthenticateShareRequest $request, $token)
- {
- // Get sharing record
- $shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail();
-
- // Check password
- if (!Hash::check($request->password, $shared->password)) {
-
- abort(401, __('vuefilemanager.incorrect_password'));
- }
-
- // Get owner of shared content
- $user = User::find($shared->user_id);
-
- // Define scope
- $scope = !is_null($shared->permission) ? $shared->permission : 'visitor';
-
- // Generate token for visitor/editor
- $access_token = $user->createToken('shared_access_token', [$scope])->accessToken;
-
- // Return authorize token with shared options
- return response(new ShareResource($shared), 200)
- ->cookie('shared_token', $shared->token, 43200)
- ->cookie('shared_access_token', $access_token, 43200);
- }
-
- /**
- * Browse private folders
- *
- * @param Request $request
- * @param $unique_id
- * @return Collection
- */
- public function get_private_folders(Request $request, $unique_id)
- {
- // Get sharing record
- $shared = Share::where('token', $request->cookie('shared_token'))->firstOrFail();
-
- // Check if user can get directory
- Guardian::check_item_access($unique_id, $shared);
-
- // Get files and folders
- list($folders, $files) = $this->get_items($unique_id, $shared);
-
- // Collect folders and files to single array
- return collect([$folders, $files])->collapse();
- }
-
- /**
- * Browse public folders
- *
- * @param $unique_id
- * @return Collection
- */
- public function get_public_folders($unique_id, $token)
- {
- // Get sharing record
- $shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail();
-
- // Abort if folder is protected
- if ((int) $shared->protected) {
- abort(403, "Sorry, you don't have permission");
- }
-
- // Check if user can get directory
- Guardian::check_item_access($unique_id, $shared);
-
- // Get files and folders
- list($folders, $files) = $this->get_items($unique_id, $shared);
-
- // Set thumbnail links for public files
- $files->map(function ($item) use ($token) {
- $item->setPublicUrl($token);
- });
-
- // Collect folders and files to single array
- return collect([$folders, $files])->collapse();
- }
-
- /**
- * Get shared public file record
- *
- * @param $token
- * @return mixed
- */
- public function file_public($token)
- {
- // Get sharing record
- $shared = Share::where(DB::raw('BINARY `token`'), $token)->firstOrFail();
-
- // Abort if file is protected
- if ((int) $shared->protected) {
- abort(403, "Sorry, you don't have permission");
- }
-
- // Get file
- $file = FileManagerFile::where('user_id', $shared->user_id)
- ->where('unique_id', $shared->item_id)
- ->firstOrFail(['name', 'basename', 'thumbnail', 'type', 'filesize', 'mimetype']);
-
- // Set urls
- $file->setPublicUrl($token);
-
- // Return record
- return $file;
- }
-
- /**
- * Get shared private file record
- *
- * @param $token
- * @return mixed
- */
- public function file_private(Request $request)
- {
- // Get sharing record
- $shared = Share::where('token', $request->cookie('shared_token'))->firstOrFail();
-
- // Return record
- return FileManagerFile::where('user_id', $shared->user_id)
- ->where('unique_id', $shared->item_id)
- ->firstOrFail(['name', 'basename', 'thumbnail', 'type', 'filesize', 'mimetype']);
- }
-
- /**
- * Get navigation tree
- *
- * @param Request $request
- * @return array
- */
- public function get_private_navigation_tree(Request $request)
- {
- // Get sharing record
- $shared = get_shared($request->cookie('shared_token'));
-
- // Check if user can get directory
- Guardian::check_item_access($shared->item_id, $shared);
-
- // Get folders
- $folders = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
- ->where('parent_id', $shared->item_id)
- ->where('user_id', $shared->user_id)
- ->sortable()
- ->get(['id', 'parent_id', 'unique_id', 'name']);
-
- // Return folder tree
- return [
- [
- 'unique_id' => $shared->item_id,
- 'name' => __('vuefilemanager.home'),
- 'location' => 'public',
- 'folders' => $folders,
- ]
- ];
- }
-
- /**
- * Get navigation tree
- *
- * @return array
- */
- public function get_public_navigation_tree($token)
- {
- // Get sharing record
- $shared = Share::where('token', $token)->firstOrFail();
-
- // Check if user can get directory
- Guardian::check_item_access($shared->item_id, $shared);
-
- // Get folders
- $folders = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
- ->where('parent_id', $shared->item_id)
- ->where('user_id', $shared->user_id)
- ->sortable()
- ->get(['id', 'parent_id', 'unique_id', 'name']);
-
- // Return folder tree
- return [
- [
- 'unique_id' => $shared->item_id,
- 'name' => __('vuefilemanager.home'),
- 'location' => 'public',
- 'folders' => $folders,
- ]
- ];
- }
-
- /**
- * Search private files
- *
- * @param Request $request
- * @param $token
- * @return Collection
- */
- public function search_private(Request $request)
- {
- // Get shared
- $shared = get_shared($request->cookie('shared_token'));
-
- // Search files id db
- $searched_files = FileManagerFile::search($request->input('query'))
- ->where('user_id', $shared->user_id)
- ->get();
- $searched_folders = FileManagerFolder::search($request->input('query'))
- ->where('user_id', $shared->user_id)
- ->get();
-
- // Get all children content
- $foldersIds = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
- ->where('user_id', $shared->user_id)
- ->where('parent_id', $shared->item_id)
- ->get();
-
- // Get accessible folders
- $accessible_folder_ids = Arr::flatten([filter_folders_ids($foldersIds), $shared->item_id]);
-
- // Filter files to only accessible files
- $files = $searched_files->filter(function ($file) use ($accessible_folder_ids) {
- return in_array($file->folder_id, $accessible_folder_ids);
- });
-
- // Filter folders to only accessible folders
- $folders = $searched_folders->filter(function ($folder) use ($accessible_folder_ids) {
- return in_array($folder->unique_id, $accessible_folder_ids);
- });
-
- // Collect folders and files to single array
- return collect([$folders, $files])->collapse();
- }
-
- /**
- * Search public files
- *
- * @param Request $request
- * @param $token
- * @return Collection
- */
- public function search_public(Request $request, $token)
- {
- // Get shared
- $shared = get_shared($token);
-
- // Abort if folder is protected
- if ((int) $shared->protected) {
- abort(403, "Sorry, you don't have permission");
- }
-
- // Search files id db
- $searched_files = FileManagerFile::search($request->input('query'))
- ->where('user_id', $shared->user_id)
- ->get();
- $searched_folders = FileManagerFolder::search($request->input('query'))
- ->where('user_id', $shared->user_id)
- ->get();
-
- // Get all children content
- $foldersIds = FileManagerFolder::with('folders:id,parent_id,unique_id,name')
- ->where('user_id', $shared->user_id)
- ->where('parent_id', $shared->item_id)
- ->get();
-
- // Get accessible folders
- $accessible_folder_ids = Arr::flatten([filter_folders_ids($foldersIds), $shared->item_id]);
-
- // Filter files
- $files = $searched_files->filter(function ($file) use ($accessible_folder_ids, $token) {
-
- // Set public urls
- $file->setPublicUrl($token);
-
- // check if item is in accessible folders
- return in_array($file->folder_id, $accessible_folder_ids);
- });
-
- // Filter folders
- $folders = $searched_folders->filter(function ($folder) use ($accessible_folder_ids) {
-
- // check if item is in accessible folders
- return in_array($folder->unique_id, $accessible_folder_ids);
- });
-
- // Collect folders and files to single array
- return collect([$folders, $files])->collapse();
- }
-
- /**
- * Get folders and files
- *
- * @param $unique_id
- * @param $shared
- * @return array
- */
- private function get_items($unique_id, $shared): array
- {
- $folders = FileManagerFolder::where('user_id', $shared->user_id)
- ->where('parent_id', $unique_id)
- ->sortable()
- ->get();
-
- $files = FileManagerFile::where('user_id', $shared->user_id)
- ->where('folder_id', $unique_id)
- ->sortable()
- ->get();
-
- return [$folders, $files];
- }
-}
diff --git a/app/Http/Controllers/Sharing/ManipulateShareItemsController.php b/app/Http/Controllers/Sharing/ManipulateShareItemsController.php
new file mode 100644
index 00000000..c5fd8d91
--- /dev/null
+++ b/app/Http/Controllers/Sharing/ManipulateShareItemsController.php
@@ -0,0 +1,307 @@
+filemanager = resolve(FileManagerService::class);
+ $this->helper = resolve(HelperService::class);
+ $this->demo = resolve(DemoService::class);
+ }
+
+ /**
+ * Create new folder for guest user with edit permission
+ *
+ * @param CreateFolderRequest $request
+ * @param Share $shared
+ * @return array|\Illuminate\Contracts\Foundation\Application|ResponseFactory|\Illuminate\Http\Response
+ * @throws \Exception
+ */
+ public function create_folder(CreateFolderRequest $request, Share $shared)
+ {
+ if (is_demo_account($shared->user->email)) {
+ return $this->demo->create_folder($request);
+ }
+
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check shared permission
+ if (is_visitor($shared)) {
+ abort(403);
+ }
+
+ // Check access to requested directory
+ $this->helper->check_item_access($request->parent_id, $shared);
+
+ // Create folder
+ $folder = $this->filemanager->create_folder($request, $shared);
+
+ return response($folder, 201);
+ }
+
+ /**
+ * Rename item for guest user with edit permission
+ *
+ * @param RenameItemRequest $request
+ * @param $id
+ * @param Share $shared
+ * @return mixed
+ * @throws \Exception
+ */
+ public function rename_item(RenameItemRequest $request, $id, Share $shared)
+ {
+ if (is_demo_account($shared->user->email)) {
+ return $this->demo->rename_item($request, $id);
+ }
+
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check shared permission
+ if (is_visitor($shared)) {
+ abort(403);
+ }
+
+ // Get file|folder item
+ $item = get_item($request->type, $id);
+
+ // Check access to requested item
+ if ($request->type === 'folder') {
+ $this->helper->check_item_access($item->id, $shared);
+ } else {
+ $this->helper->check_item_access($item->folder_id, $shared);
+ }
+
+ // If request have a change folder icon values set the folder icon
+ if ($request->type === 'folder' && $request->filled('icon')) {
+ $this->filemanager->edit_folder_properties($request, $id);
+ }
+
+ // Rename item
+ $item = $this->filemanager->rename_item($request, $id, $shared);
+
+ // Set public url
+ if ($item->type !== 'folder') {
+ $item->setPublicUrl($shared->token);
+ }
+
+ return response($item, 201);
+ }
+
+ /**
+ * Delete item for guest user with edit permission
+ *
+ * @param DeleteItemRequest $request
+ * @param Share $shared
+ * @return ResponseFactory|\Illuminate\Http\Response
+ * @throws \Exception
+ */
+ public function delete_item(DeleteItemRequest $request, Share $shared)
+ {
+ abort_if(is_demo_account($shared->user->email), 204, 'Done.');
+
+
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check shared permission
+ if (is_visitor($shared)) {
+ abort(403);
+ }
+
+ foreach ($request->items as $file) {
+
+ // Get file|folder item
+ $item = get_item($file['type'], $file['id']);
+
+ // Check access to requested item
+ if ($file['type'] === 'folder') {
+ $this->helper->check_item_access($item->id, $shared);
+ } else {
+ $this->helper->check_item_access($item->folder_id, $shared);
+ }
+
+ // Delete item
+ $this->filemanager->delete_item($file, $file['id'], $shared);
+ }
+
+ return response('Done', 204);
+ }
+
+ /**
+ * Delete file for guest user with edit permission
+ *
+ * @param UploadRequest $request
+ * @param Share $shared
+ * @return File|\Illuminate\Contracts\Foundation\Application|ResponseFactory|Model|\Illuminate\Http\Response
+ * @throws \Exception
+ */
+ public function upload(UploadRequest $request, Share $shared)
+ {
+ if (is_demo_account($shared->user->email)) {
+ return $this->demo->upload($request);
+ }
+
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check shared permission
+ if (is_visitor($shared)) {
+ abort(403);
+ }
+
+ // Check access to requested directory
+ $this->helper->check_item_access($request->folder_id, $shared);
+
+ // Return new uploaded file
+ $new_file = $this->filemanager->upload($request, $shared);
+
+ // Set public access url
+ $new_file->setPublicUrl($shared->token);
+
+ return response($new_file, 201);
+ }
+
+ /**
+ * Move item for guest user with edit permission
+ *
+ * @param MoveItemRequest $request
+ * @param Share $shared
+ * @return ResponseFactory|\Illuminate\Http\Response
+ */
+ public function move(MoveItemRequest $request, Share $shared)
+ {
+ abort_if(is_demo_account($shared->user->email), 204, 'Done.');
+
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check shared permission
+ if (is_visitor($shared)) {
+ abort(403);
+ }
+
+ foreach ($request->items as $item) {
+
+ if ($item['type'] === 'folder') {
+
+ $this->helper->check_item_access([
+ $request->to_id, $item['id']
+ ], $shared);
+ }
+
+ if ($item['type'] !== 'folder') {
+
+ $file = File::where('id', $item['id'])
+ ->where('user_id', $shared->user_id)
+ ->firstOrFail();
+
+ $this->helper->check_item_access([
+ $request->to_id, $file->folder_id
+ ], $shared);
+ }
+ }
+
+ $this->filemanager->move($request, $request->to_id);
+
+ return response('Done!', 204);
+ }
+
+ /**
+ * Guest download folder via zip
+ *
+ * @param $id
+ * @param Share $shared
+ * @return string
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function zip_folder($id, Share $shared)
+ {
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ // Check access to requested folder
+ $this->helper->check_item_access($id, $shared);
+
+ // Get folder
+ $folder = Folder::whereUserId($shared->user_id)
+ ->where('id', $id);
+
+ if (!$folder->exists()) {
+ abort(404, 'Requested folder doesn\'t exists.');
+ }
+
+ $zip = $this->filemanager->zip_folder($id, $shared);
+
+ // Get file
+ return response([
+ 'url' => route('zip_public', [
+ 'id' => $zip->id,
+ 'token' => $shared->token,
+ ]),
+ 'name' => $zip->basename,
+ ], 201);
+ }
+
+ /**
+ * Guest download multiple files via zip
+ *
+ * @param Request $request
+ * @param Share $shared
+ * @return string
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function zip_multiple_files(Request $request, Share $shared)
+ {
+ // Check ability to access protected share record
+ $this->helper->check_protected_share_record($shared);
+
+ $file_parent_folders = File::whereUserId($shared->user_id)
+ ->whereIn('id', $request->items)
+ ->get()
+ ->pluck('folder_id')
+ ->toArray();
+
+ // Check access to requested directory
+ $this->helper->check_item_access($file_parent_folders, $shared);
+
+ // Get requested files
+ $files = File::whereUserId($shared->user_id)
+ ->whereIn('id', $request->items)
+ ->get();
+
+ $zip = $this->filemanager->zip_files($files, $shared);
+
+ // Get file
+ return response([
+ 'url' => route('zip_public', [
+ 'id' => $zip->id,
+ 'token' => $shared->token,
+ ]),
+ 'name' => $zip->basename,
+ ], 201);
+ }
+}
diff --git a/app/Http/Controllers/WebhookController.php b/app/Http/Controllers/Subscription/StripeWebhookController.php
similarity index 63%
rename from app/Http/Controllers/WebhookController.php
rename to app/Http/Controllers/Subscription/StripeWebhookController.php
index 05aef00f..ccc01340 100644
--- a/app/Http/Controllers/WebhookController.php
+++ b/app/Http/Controllers/Subscription/StripeWebhookController.php
@@ -1,19 +1,18 @@
stripe = $stripe;
+ $this->stripe = resolve(StripeService::class);
}
/**
@@ -33,13 +32,15 @@ class WebhookController extends CashierController
}
// Get user
- $user = User::where('stripe_id', $payload['data']['object']['customer'])->firstOrFail();
-
- // Get default storage capacity
- $default_storage = Setting::where('name', 'storage_default')->first();
+ $user = User::whereStripeId($payload['data']['object']['customer'])
+ ->firstOrFail();
// Update storage capacity
- $user->settings()->update(['storage_capacity' => $default_storage->value]);
+ $user
+ ->settings()
+ ->update([
+ 'storage_capacity' => get_setting('storage_default')
+ ]);
return $this->successMethod();
}
@@ -53,15 +54,18 @@ class WebhookController extends CashierController
public function handleInvoicePaymentSucceeded($payload)
{
// Get user
- $user = User::where('stripe_id', $payload['data']['object']['customer'])->firstOrFail();
+ $user = User::whereStripeId($payload['data']['object']['customer'])
+ ->firstOrFail();
// Get requested plan
$plan = $this->stripe->getPlan($user->subscription('main')->stripe_plan);
// Update user storage limit
- $user->settings()->update([
- 'storage_capacity' => $plan['product']['metadata']['capacity']
- ]);
+ $user
+ ->settings()
+ ->update([
+ 'storage_capacity' => $plan['product']['metadata']['capacity']
+ ]);
return $this->successMethod();
}
diff --git a/app/Http/Controllers/User/AccountController.php b/app/Http/Controllers/User/AccountController.php
index 64ba5a6b..f995ae04 100644
--- a/app/Http/Controllers/User/AccountController.php
+++ b/app/Http/Controllers/User/AccountController.php
@@ -2,24 +2,28 @@
namespace App\Http\Controllers\User;
-use App\FileManagerFile;
-use App\FileManagerFolder;
+use App\Http\Requests\User\UpdateUserPasswordRequest;
use App\Http\Resources\InvoiceCollection;
use App\Http\Resources\StorageDetailResource;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserStorageResource;
-use App\Http\Tools\Demo;
+use App\Services\DemoService;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Support\Facades\Validator;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
-use Illuminate\Support\Facades\Hash;
use Illuminate\Http\Request;
-use ByteUnits\Metric;
-use App\User;
class AccountController extends Controller
{
+ /**
+ * AccountController constructor.
+ */
+ public function __construct()
+ {
+ $this->demo = resolve(DemoService::class);
+ }
+
/**
* Get all user data to frontend
*
@@ -49,56 +53,13 @@ class AccountController extends Controller
*
* @return InvoiceCollection
*/
- public function invoices() {
+ public function invoices()
+ {
return new InvoiceCollection(
Auth::user()->invoices()
);
}
- /**
- * Update user profile
- *
- * @param Request $request
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public function update_profile(Request $request)
- {
- // Validate request
- $validator = Validator::make($request->all(), [
- 'avatar' => 'file',
- 'name' => 'string',
- 'value' => 'string',
- ]);
-
- // Return error
- if ($validator->fails()) abort(400, 'Bad input');
-
- // Get user
- $user = Auth::user();
-
- // Check if is demo
- if (is_demo($user->id)) {
- return Demo::response_204();
- }
-
- // Update data
- if ($request->hasFile('avatar')) {
-
- // Update avatar
- $avatar = store_avatar($request->file('avatar'), 'avatars');
-
- // Update data
- $user->update(['avatar' => $avatar]);
-
- } else {
-
- // Update text data
- $user->update(make_single_input($request));
- }
-
- return response('Saved!', 204);
- }
-
/**
* Update user settings relationship
*
@@ -108,7 +69,9 @@ class AccountController extends Controller
public function update_user_settings(Request $request)
{
// Validate request
+ // TODO: pridat validator do requestu
$validator = Validator::make($request->all(), [
+ 'avatar' => 'sometimes|file',
'name' => 'string',
'value' => 'string',
]);
@@ -120,12 +83,24 @@ class AccountController extends Controller
$user = Auth::user();
// Check if is demo
- if (is_demo($user->id)) {
- return Demo::response_204();
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
+
+ // Update avatar
+ if ($request->hasFile('avatar')) {
+ $user
+ ->settings()
+ ->update([
+ 'avatar' => store_avatar($request, 'avatar')
+ ]);
+
+ return response('Saved!', 204);
}
- // Update text data
- $user->settings->update(make_single_input($request));
+ $user
+ ->settings()
+ ->update(
+ make_single_input($request)
+ );
return response('Saved!', 204);
}
@@ -136,22 +111,16 @@ class AccountController extends Controller
* @param Request $request
* @return ResponseFactory|\Illuminate\Http\Response
*/
- public function change_password(Request $request)
+ public function change_password(UpdateUserPasswordRequest $request)
{
- // Validate request
- $request->validate([
- 'password' => ['required', 'string', 'min:6', 'confirmed'],
- ]);
-
// Get user
$user = Auth::user();
- if (is_demo($user->id)) {
- return Demo::response_204();
- }
+ // Check if is demo
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Change and store new password
- $user->password = Hash::make($request->input('password'));
+ $user->password = bcrypt($request->input('password'));
$user->save();
return response('Changed!', 204);
diff --git a/app/Http/Controllers/User/PaymentMethodsController.php b/app/Http/Controllers/User/PaymentMethodsController.php
index d73481bd..d70bf1b1 100644
--- a/app/Http/Controllers/User/PaymentMethodsController.php
+++ b/app/Http/Controllers/User/PaymentMethodsController.php
@@ -7,7 +7,7 @@ use App\Http\Requests\Payments\RegisterNewPaymentMethodRequest;
use App\Http\Resources\PaymentCardCollection;
use App\Http\Resources\PaymentCardResource;
use App\Http\Resources\PaymentDefaultCardResource;
-use App\Http\Tools\Demo;
+use App\Services\DemoService;
use App\Services\StripeService;
use Auth;
use Illuminate\Http\Request;
@@ -16,12 +16,11 @@ use Laravel\Cashier\PaymentMethod;
class PaymentMethodsController extends Controller
{
- /**
- * PaymentMethodsController constructor.
- */
+
public function __construct(StripeService $stripe)
{
$this->stripe = $stripe;
+ $this->demo = resolve(DemoService::class);
}
/**
@@ -98,9 +97,7 @@ class PaymentMethodsController extends Controller
$user = Auth::user();
// Check if is demo
- if (is_demo($user->id)) {
- return Demo::response_204();
- }
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Update DefaultPayment Method
$user->updateDefaultPaymentMethod($id);
@@ -148,9 +145,7 @@ class PaymentMethodsController extends Controller
$user = Auth::user();
// Check if is demo
- if (is_demo($user->id)) {
- return Demo::response_204();
- }
+ abort_if(is_demo_account('howdy@hi5ve.digital'), 204, 'Done.');
// Get payment method
$paymentMethod = $user->findPaymentMethod($id);
diff --git a/app/Http/Controllers/User/SubscriptionController.php b/app/Http/Controllers/User/SubscriptionController.php
index 2c50a01c..c7c94771 100644
--- a/app/Http/Controllers/User/SubscriptionController.php
+++ b/app/Http/Controllers/User/SubscriptionController.php
@@ -5,64 +5,61 @@ namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Http\Requests\Subscription\StoreUpgradeAccountRequest;
use App\Http\Resources\UserSubscription;
-use App\Http\Tools\Demo;
-use App\Invoice;
+use App\Services\DemoService;
+use App\Models\User;
use App\Services\StripeService;
use Auth;
-use Cartalyst\Stripe\Exception\CardErrorException;
+use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
-use Illuminate\Http\Request;
+use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
-use Laravel\Cashier\Exceptions\IncompletePayment;
-use Symfony\Component\HttpKernel\Exception\HttpException;
+use Stripe\SetupIntent;
class SubscriptionController extends Controller
{
private $stripe;
+ private $demo;
- /**
- * SubscriptionController constructor.
- * @param $payment
- */
- public function __construct(StripeService $stripe)
+ public function __construct()
{
- $this->stripe = $stripe;
+ $this->stripe = resolve(StripeService::class);
+ $this->demo = DemoService::class;
}
/**
* Generate setup intent
*
- * @return \Stripe\SetupIntent
+ * @return Application|ResponseFactory|Response|SetupIntent
*/
- public function stripe_setup_intent()
+ public function setup_intent()
{
- $user = Auth::user();
-
- return $this->stripe->getSetupIntent($user);
+ return response(
+ $this->stripe->getSetupIntent(Auth::user()), 201
+ );
}
/**
* Get user subscription detail
*
- * @return array
+ * @return void
*/
public function show()
{
- $user = Auth::user();
+ $user = User::find(Auth::id());
- if (! $user->subscription('main')) {
+ if (!$user->subscription('main')) {
return abort(204, 'User don\'t have any subscription');
}
- $slug_user_subscription = 'subscription-user-' . $user->id;
+ $slug = 'subscription-user-' . $user->id;
- if (Cache::has($slug_user_subscription)) {
- return Cache::get($slug_user_subscription);
+ if (Cache::has($slug)) {
+ return Cache::get($slug);
}
- return Cache::rememberForever($slug_user_subscription, function () {
+ return Cache::rememberForever($slug, function () use ($user) {
return new UserSubscription(
- Auth::user()
+ $user
);
});
}
@@ -71,7 +68,7 @@ class SubscriptionController extends Controller
* Upgrade account to subscription
*
* @param StoreUpgradeAccountRequest $request
- * @return ResponseFactory|\Illuminate\Http\Response
+ * @return ResponseFactory|Response
*/
public function upgrade(StoreUpgradeAccountRequest $request)
{
@@ -80,7 +77,7 @@ class SubscriptionController extends Controller
// Check if is demo
if (is_demo($user->id)) {
- return Demo::response_204();
+ return $this->demo->response_204();
}
// Forget user subscription
@@ -109,15 +106,15 @@ class SubscriptionController extends Controller
/**
* Cancel Subscription
*
- * @return ResponseFactory|\Illuminate\Http\Response
+ * @return ResponseFactory|Response
*/
public function cancel()
{
- $user = Auth::user();
+ $user = User::find(Auth::id());
// Check if is demo
if (is_demo($user->id)) {
- return Demo::response_204();
+ return $this->demo->response_204();
}
// Cancel subscription
@@ -132,15 +129,15 @@ class SubscriptionController extends Controller
/**
* Resume Subscription
*
- * @return ResponseFactory|\Illuminate\Http\Response
+ * @return ResponseFactory|Response
*/
public function resume()
{
- $user = Auth::user();
+ $user = User::find(Auth::id());
// Check if is demo
if (is_demo($user->id)) {
- return Demo::response_204();
+ return $this->demo->response_204();
}
// Resume subscription
diff --git a/app/Http/Helpers/helpers.php b/app/Http/Helpers/helpers.php
deleted file mode 100644
index 4f96a4f3..00000000
--- a/app/Http/Helpers/helpers.php
+++ /dev/null
@@ -1,804 +0,0 @@
-first();
-
- return $row ? $row->value : null;
-}
-
-/**
- * Create paragraph from text
- *
- * @param $str
- * @return mixed|null|string|string[]
- */
-function add_paragraphs($str)
-{
- // Trim whitespace
- if (($str = trim($str)) === '') return '';
-
- // Standardize newlines
- $str = str_replace(array("\r\n", "\r"), "\n", $str);
-
- // Trim whitespace on each line
- $str = preg_replace('~^[ \t]+~m', '', $str);
- $str = preg_replace('~[ \t]+$~m', '', $str);
-
- // The following regexes only need to be executed if the string contains html
- if ($html_found = (strpos($str, '<') !== FALSE)) {
- // Elements that should not be surrounded by p tags
- $no_p = '(?:p|div|article|header|aside|hgroup|canvas|output|progress|section|figcaption|audio|video|nav|figure|footer|video|details|main|menu|summary|h[1-6r]|ul|ol|li|blockquote|d[dlt]|pre|t[dhr]|t(?:able|body|foot|head)|c(?:aption|olgroup)|form|s(?:elect|tyle)|a(?:ddress|rea)|ma(?:p|th))';
-
- // Put at least two linebreaks before and after $no_p elements
- $str = preg_replace('~^<' . $no_p . '[^>]*+>~im', "\n$0", $str);
- $str = preg_replace('~' . $no_p . '\s*+>$~im', "$0\n", $str);
- }
-
- // Do the
magic!
- $str = '
' . trim($str) . '
';
- $str = preg_replace('~\n{2,}~', "\n\n", $str);
-
- // The following regexes only need to be executed if the string contains html
- if ($html_found !== FALSE) {
- // Remove p tags around $no_p elements
- $str = preg_replace('~
(?=?' . $no_p . '[^>]*+>)~i', '', $str);
- $str = preg_replace('~(?' . $no_p . '[^>]*+>)
~i', '$1', $str);
- }
-
- // Convert single linebreaks to
- $str = preg_replace('~(?\n", $str);
-
- return $str;
-}
-
-/**
- * Set environment value
- *
- * @param $key
- * @param $value
- * @return bool
- */
-function setEnvironmentValue(array $values)
-{
- $envFile = app()->environmentFilePath();
- $str = file_get_contents($envFile);
-
- if (count($values) > 0) {
- foreach ($values as $envKey => $envValue) {
-
- $str .= "\n"; // In case the searched variable is in the last line without \n
- $keyPosition = strpos($str, "{$envKey}=");
- $endOfLinePosition = strpos($str, "\n", $keyPosition);
- $oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
-
- // If key does not exist, add it
- $str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
- }
- }
-
- $str = substr($str, 0, -1);
- if (!file_put_contents($envFile, $str)) return false;
- return true;
-
-}
-
-/**
- * Get invoice number
- *
- * @return string
- */
-function get_invoice_number()
-{
- $invoices = \App\Invoice::all();
-
- if ($invoices->isEmpty()) {
- return Carbon::now()->year . '001';
- } else {
- return (int)$invoices->last()->order + 1;
- }
-}
-
-/**
- * Forget many cache keys at once
- * @param $cache
- */
-function cache_forget_many($cache)
-{
- foreach ($cache as $item) {
- \Illuminate\Support\Facades\Cache::forget($item);
- }
-}
-
-/**
- * Get app version from config
- *
- * @return \Illuminate\Config\Repository|mixed
- */
-function get_storage()
-{
- return env('FILESYSTEM_DRIVER');
-}
-
-/**
- * Check if is running AWS s3 as storage
- *
- * @return bool
- */
-function is_storage_driver($driver)
-{
- if (is_array($driver)) {
- return in_array(config('filesystems.default'), $driver);
- }
-
- return config('filesystems.default') === $driver;
-}
-
-/**
- * Get app version from config
- *
- * @return \Illuminate\Config\Repository|mixed
- */
-function get_version()
-{
- return config('vuefilemanager.version');
-}
-
-/**
- * Check if is demo
- *
- * @return mixed
- */
-function is_demo($user_id)
-{
- return env('APP_DEMO', false) && $user_id === 1;
-}
-
-/**
- * Get folder or file item
- *
- * @param $type
- * @param $unique_id
- * @param $user_id
- * @return \Illuminate\Database\Eloquent\Builder|Model
- */
-function get_item($type, $unique_id, $user_id)
-{
-
- if ($type === 'folder') {
-
- // Return folder item
- return FileManagerFolder::where('unique_id', $unique_id)
- ->where('user_id', $user_id)
- ->firstOrFail();
- }
-
- // Return file item
- return FileManagerFile::where('unique_id', $unique_id)
- ->where('user_id', $user_id)
- ->firstOrFail();
-}
-
-/**
- * Get shared token
- *
- * @param $token
- * @return \Illuminate\Database\Eloquent\Builder|Model
- */
-function get_shared($token)
-{
-
- return Share::where(DB::raw('BINARY `token`'), $token)
- ->firstOrFail();
-}
-
-/**
- * Check if shared permission is editor
- *
- * @param $shared
- * @return bool
- */
-function is_editor($shared)
-{
-
- return $shared->permission === 'editor';
-}
-
-/**
- * Get unique id
- *
- * @return int
- */
-function get_unique_id(): int
-{
- // Get files and folders
- $folders = FileManagerFolder::withTrashed()->get();
- $files = FileManagerFile::withTrashed()->get();
-
- // Get last ids
- $folders_unique = $folders->isEmpty() ? 0 : $folders->last()->unique_id;
- $files_unique = $files->isEmpty() ? 0 : $files->last()->unique_id;
-
- // Count new unique id
- $unique_id = $folders_unique > $files_unique ? $folders_unique + 1 : $files_unique + 1;
-
- return $unique_id;
-}
-
-/**
- * Store user avatar to storage
- *
- * @param $image
- * @param $path
- * @return string
- */
-function store_avatar($image, $path)
-{
- // Get directory
- $path = check_directory($path);
-
- // Store avatar
- $image_path = Str::random(8) . '-' . $image->getClientOriginalName();
-
- // Create intervention image
- $img = Image::make($image->getRealPath());
-
- // Generate thumbnail
- $img->fit('150', '150')->stream();
-
- // Store thumbnail to disk
- Storage::put($path . '/' . $image_path, $img);
-
- // Return path to image
- return $path . '/' . $image_path;
-}
-
-/**
- * Store system image
- *
- * @param $image
- * @param $path
- * @return string
- */
-function store_system_image($image, $path)
-{
- // Get directory
- $path = check_directory($path);
-
- // Store avatar
- $image_path = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName());
-
- // Store image to disk
- Storage::putFileAs($path, $image, $image_path);
-
- // Return path to image
- return $path . '/' . $image_path;
-}
-
-/**
- * Check if directory exist, if no, then create it
- *
- * @param $directory
- * @return mixed
- */
-function check_directory($directory)
-{
- if (!Storage::exists($directory)) {
- Storage::makeDirectory($directory);
- }
-
- return $directory;
-}
-
-/**
- * Make input from request
- *
- * @param $request
- * @return array
- */
-function make_single_input($request)
-{
- // Create container
- $data = [];
-
- // Add data to array
- $data[$request->name] = $request->value;
-
- // Return input
- return $data;
-}
-
-/**
- * Format integer to gigabytes
- *
- * @param $gigabytes
- * @return string
- */
-function format_gigabytes($gigabytes)
-{
- if ($gigabytes >= 1000) {
- return Metric::gigabytes($gigabytes)->format('Tb/');
- } else {
- return Metric::gigabytes($gigabytes)->format('GB/');
- }
-}
-
-/**
- * Format string to formated megabytes string
- *
- * @param $megabytes
- * @return string
- */
-function format_megabytes($megabytes)
-{
- if ($megabytes >= 1000) {
- return $megabytes / 1000 . 'GB';
- }
-
- if ($megabytes >= 1000000) {
- return $megabytes / 1000000 . 'TB';
- }
-
- return $megabytes . 'MB';
-}
-
-/**
- * Convert megabytes to bytes
- *
- * @param $megabytes
- * @return int|string
- */
-function format_bytes($megabytes)
-{
- return Metric::megabytes($megabytes)->numberOfBytes();
-}
-
-/**
- * Get storage usage in percent
- *
- * @param $used
- * @param $capacity
- * @return string
- */
-function get_storage_fill_percentage($used, $capacity)
-{
- // Format gigabytes to bytes
- $total = intval(Metric::gigabytes($capacity)->numberOfBytes());
-
- // Count progress
- $progress = ($used * 100) / $total;
-
- // Return in 2 decimal
- return number_format((float)$progress, 2, '.', '');
-}
-
-/**
- * Get user capacity fill by percentage
- *
- * @return string
- */
-function user_storage_percentage($id, $additionals = null)
-{
- $user = \App\User::findOrFail($id);
-
- $used = $user->used_capacity;
-
- if ($additionals) {
- $used = $user->used_capacity + $additionals;
- }
-
- return get_storage_fill_percentage($used, $user->settings->storage_capacity);
-}
-
-/**
- * Find all key values in recursive array
- *
- * @param array $array
- * @param $needle
- * @return array
- */
-function recursiveFind(array $array, $needle)
-{
- $iterator = new RecursiveArrayIterator($array);
- $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
- $aHitList = array();
- foreach ($recursive as $key => $value) {
- if ($key === $needle) {
- array_push($aHitList, $value);
- }
- }
- return $aHitList;
-}
-
-/**
- * Get values which appears only once in array
- * @param $arr
- * @return array
- */
-function appeared_once($arr)
-{
- $array_count_values = array_count_values($arr);
-
- $single_time_comming_values_array = [];
-
- foreach ($array_count_values as $key => $val) {
-
- if ($val == 1) {
- $single_time_comming_values_array[] = $key;
- }
- }
-
- return $single_time_comming_values_array;
-}
-
-/**
- * @param $folders
- * @return array
- */
-function filter_folders_ids($folders, $by_column = 'unique_id')
-{
- $folder_unique_ids = recursiveFind($folders->toArray(), $by_column);
-
- return appeared_once($folder_unique_ids);
-}
-
-/**
- * Format localized date
- *
- * @param $date
- * @param string $format
- * @return string
- */
-function format_date($date, $format = '%d. %B. %Y, %H:%M')
-{
- $start = Carbon::parse($date);
-
- return $start->formatLocalized($format);
-}
-
-/**
- * Get file type from mimetype
- *
- * @param $file
- * @return string
- */
-function get_file_type($file_mimetype)
-{
- // Get mimetype from file
- $mimetype = explode('/', $file_mimetype);
-
- switch ($mimetype[0]) {
- case 'image':
- return 'image';
- break;
- case 'video':
- return 'video';
- break;
- case 'audio':
- return 'audio';
- break;
- default:
- return 'file';
- }
-}
-
-
-/**
- * Get file type from mimetype
- *
- * @param $mimetype
- * @return mixed
- */
-function get_file_type_from_mimetype($mimetype)
-{
- return explode('/', $mimetype)[1];
-}
-
-/**
- * Format pretty name file
- *
- * @param $basename
- * @param $name
- * @param $mimetype
- * @return string
- */
-function get_pretty_name($basename, $name, $mimetype)
-{
- $file_extension = substr(strrchr($basename, '.'), 1);
-
- if (strpos($name, $file_extension) !== false) {
- return $name;
- }
-
- if ($file_extension) {
- return $name . '.' . $file_extension;
- }
-
- return $name . '.' . $mimetype;
-}
-
-/**
- * Get exif data from jpeg image
- *
- * @param $file
- * @return array
- */
-function get_image_meta_data($file)
-{
- if (get_file_type_from_mimetype($file->getMimeType()) === 'jpeg') {
-
- try {
-
- // Try to get the exif data
- return mb_convert_encoding(Image::make($file->getRealPath())->exif(),'UTF8', 'UTF8');
-
- } catch ( \Exception $e) {
-
- return null;
-
- }
- }
-}
-
-/**
- * Check if app is in dev mode
- *
- * @return bool
- */
-function is_dev()
-{
- return env('APP_ENV') === 'local' ? true : false;
-}
-
-/**
- * @param $str
- * @return bool
- */
-function seems_utf8($str)
-{
- $length = strlen($str);
- for ($i=0; $i < $length; $i++) {
- $c = ord($str[$i]);
- if ($c < 0x80) $n = 0; # 0bbbbbbb
- elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb
- elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb
- elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb
- elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb
- elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b
- else return false; # Does not match any model
- for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
- if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
- return false;
- }
- }
- return true;
-}
-
-/**
- * Converts all accent characters to ASCII characters.
- *
- * If there are no accent characters, then the string given is just returned.
- *
- * @param string $string Text that might have accent characters
- * @return string Filtered string with replaced "nice" characters.
- */
-function remove_accents($string) {
- if ( !preg_match('/[\x80-\xff]/', $string) )
- return $string;
-
- if (seems_utf8($string)) {
- $chars = array(
- // Decompositions for Latin-1 Supplement
- chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
- chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
- chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
- chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
- chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
- chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
- chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
- chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
- chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
- chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
- chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
- chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
- chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
- chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
- chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
- chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
- chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
- chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
- chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
- chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
- chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
- chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
- chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
- chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
- chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
- chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
- chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
- chr(195).chr(191) => 'y',
- // Decompositions for Latin Extended-A
- chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
- chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
- chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
- chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
- chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
- chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
- chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
- chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
- chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
- chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
- chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
- chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
- chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
- chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
- chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
- chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
- chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
- chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
- chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
- chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
- chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
- chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
- chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
- chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
- chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
- chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
- chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
- chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
- chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
- chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
- chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
- chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
- chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
- chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
- chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
- chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
- chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
- chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
- chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
- chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
- chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
- chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
- chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
- chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
- chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
- chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
- chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
- chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
- chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
- chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
- chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
- chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
- chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
- chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
- chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
- chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
- chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
- chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
- chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
- chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
- chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
- chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
- chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
- chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
- // Euro Sign
- chr(226).chr(130).chr(172) => 'E',
- // GBP (Pound) Sign
- chr(194).chr(163) => '');
-
- $string = strtr($string, $chars);
- } else {
- // Assume ISO-8859-1 if not UTF-8
- $chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
- .chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
- .chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
- .chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
- .chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
- .chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
- .chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
- .chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
- .chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
- .chr(252).chr(253).chr(255);
-
- $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
-
- $string = strtr($string, $chars['in'], $chars['out']);
- $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
- $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
- $string = str_replace($double_chars['in'], $double_chars['out'], $string);
- }
-
- return $string;
-}
-/**
- * Get all files from folder and get their folder location in VueFileManager directories
- *
- * @param $folders
- * @param null $files
- * @param array $path
- * @return array
- */
-function get_files_for_zip($folders, $files, $path = [])
-{
- // Return file list
- if (!isset($folders->folders)) {
- return $files->unique()->values()->all();
- }
-
- // Push file path
- array_push($path, $folders->name);
-
- // Push file to collection
- $folders->files->each(function ($file) use ($files, $path) {
- $files->push([
- 'name' => $file->name,
- 'basename' => $file->basename,
- 'folder_path' => implode('/', $path),
- ]);
- });
-
- // Get all children folders and folders within
- if ($folders->folders->isNotEmpty()) {
- $folders->folders->map(function ($folder) use ($files, $path) {
- return get_files_for_zip($folder, $files, $path);
- });
- }
-
- return get_files_for_zip($folders->folders->first(), $files, $path);
-}
-
-/**
- * Set time by user timezone GMT
- *
- * @param $time
- * @return int
- */
-function set_time_by_user_timezone($time)
-{
- $user = Auth::user();
-
- if($user) {
-
- // Get the value of timezone if user have some
- $time_zone = intval($user->settings->timezone * 60 ?? null);
-
- return Carbon::parse($time)->addMinutes($time_zone ?? null);
- }
-
- return Carbon::parse($time);
-
-}
diff --git a/app/Http/Helpers/subscription.php b/app/Http/Helpers/subscription.php
deleted file mode 100644
index 62b31d41..00000000
--- a/app/Http/Helpers/subscription.php
+++ /dev/null
@@ -1,23 +0,0 @@
-all();
-
- $unsubscribed = $plans->filter(function ($item) use ($plan) {
- return $item->id !== $plan->id;
- });
-
- $capacities = $unsubscribed->map(function ($item) {
- return $item->features->first()->value;
- });
-
- return max(Arr::flatten($capacities)) < $plan->features->first()->value ? 1 : 0;
-}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 91f97058..41f9652d 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -2,11 +2,8 @@
namespace App\Http;
-use App\Http\Middleware\AdminCheck;
-use App\Http\Middleware\CookieAuth;
-use App\Http\Middleware\LastCheck;
-use App\Http\Middleware\SharedAuth;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
+use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
class Kernel extends HttpKernel
{
@@ -18,12 +15,13 @@ class Kernel extends HttpKernel
* @var array
*/
protected $middleware = [
+ // \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
- \App\Http\Middleware\CheckForMaintenanceMode::class,
+ \Fruitcake\Cors\HandleCors::class,
+ \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
- \Fruitcake\Cors\HandleCors::class,
];
/**
@@ -43,8 +41,9 @@ class Kernel extends HttpKernel
],
'api' => [
- \App\Http\Middleware\EncryptCookies::class,
- //'throttle:60,1',
+ EnsureFrontendRequestsAreStateful::class,
+ //'throttle:api',
+ //\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
@@ -57,39 +56,14 @@ class Kernel extends HttpKernel
* @var array
*/
protected $routeMiddleware = [
- 'auth.master' => CookieAuth::class,
- 'auth.shared' => SharedAuth::class,
- 'auth.admin' => AdminCheck::class,
- 'auth' => \App\Http\Middleware\Authenticate::class,
- 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
- 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
- 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
- 'can' => \Illuminate\Auth\Middleware\Authorize::class,
- 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+ 'auth' => \App\Http\Middleware\Authenticate::class,
+ 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+ 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
+ 'can' => \Illuminate\Auth\Middleware\Authorize::class,
+ 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
- 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
- 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
- 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
- 'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
- 'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
- ];
-
- /**
- * The priority-sorted list of middleware.
- *
- * This forces non-global middleware to always be in the given order.
- *
- * @var array
- */
- protected $middlewarePriority = [
- \Illuminate\Session\Middleware\StartSession::class,
- \Illuminate\View\Middleware\ShareErrorsFromSession::class,
- CookieAuth::class,
- SharedAuth::class,
- \App\Http\Middleware\Authenticate::class,
- \Illuminate\Routing\Middleware\ThrottleRequests::class,
- \Illuminate\Session\Middleware\AuthenticateSession::class,
- \Illuminate\Routing\Middleware\SubstituteBindings::class,
- \Illuminate\Auth\Middleware\Authorize::class,
+ 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
+ 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+ 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
}
diff --git a/app/Http/Mail/SendSupportForm.php b/app/Http/Mail/SendContactMessage.php
similarity index 83%
rename from app/Http/Mail/SendSupportForm.php
rename to app/Http/Mail/SendContactMessage.php
index 889f8a9b..6dc49981 100644
--- a/app/Http/Mail/SendSupportForm.php
+++ b/app/Http/Mail/SendContactMessage.php
@@ -1,13 +1,13 @@
from($from)
+ return $this->from(config('mail.from')['address'])
->replyTo($this->request['email'])
->subject('New Contact Message from ' . $this->request['email'])
->view('mails.contact-message')
diff --git a/app/Http/Middleware/AdminCheck.php b/app/Http/Middleware/AdminCheck.php
deleted file mode 100644
index fa488a1d..00000000
--- a/app/Http/Middleware/AdminCheck.php
+++ /dev/null
@@ -1,26 +0,0 @@
-bearerToken()) {
- if ($request->hasCookie('access_token')) {
-
- $access_token = $request->cookie('access_token');
-
- $request->headers->add(['Authorization' => 'Bearer ' . $access_token]);
-
- }
- }
- return $next($request);
- }
-}
diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php
index 3f4dc718..0e3a4854 100644
--- a/app/Http/Middleware/EncryptCookies.php
+++ b/app/Http/Middleware/EncryptCookies.php
@@ -12,6 +12,6 @@ class EncryptCookies extends Middleware
* @var array
*/
protected $except = [
- 'token'
+
];
}
diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php
new file mode 100644
index 00000000..e4956d0b
--- /dev/null
+++ b/app/Http/Middleware/PreventRequestsDuringMaintenance.php
@@ -0,0 +1,17 @@
+check()) {
- return redirect(RouteServiceProvider::HOME);
+ $guards = empty($guards) ? [null] : $guards;
+
+ foreach ($guards as $guard) {
+ if (Auth::guard($guard)->check()) {
+ return redirect('/files');
+ }
}
return $next($request);
diff --git a/app/Http/Middleware/SharedAuth.php b/app/Http/Middleware/SharedAuth.php
deleted file mode 100644
index 27457a3e..00000000
--- a/app/Http/Middleware/SharedAuth.php
+++ /dev/null
@@ -1,29 +0,0 @@
-bearerToken()) {
- if ($request->hasCookie('shared_access_token')) {
-
- $shared_access_token = $request->cookie('shared_access_token');
-
- $request->headers->add(['Authorization' => 'Bearer ' . $shared_access_token]);
-
- }
- }
- return $next($request);
- }
-}
diff --git a/app/Http/Notifications/ConfirmPayment.php b/app/Http/Notifications/ConfirmPayment.php
index cd1be734..7435ef6c 100644
--- a/app/Http/Notifications/ConfirmPayment.php
+++ b/app/Http/Notifications/ConfirmPayment.php
@@ -1,6 +1,6 @@
'required|string|max:255',
+ 'name' => 'required|string|max:255',
];
}
}
diff --git a/app/Http/Requests/FileFunctions/CreateFolderRequest.php b/app/Http/Requests/FileFunctions/CreateFolderRequest.php
index 272697d0..4dd9f9b9 100644
--- a/app/Http/Requests/FileFunctions/CreateFolderRequest.php
+++ b/app/Http/Requests/FileFunctions/CreateFolderRequest.php
@@ -25,8 +25,8 @@ class CreateFolderRequest extends FormRequest
public function rules()
{
return [
- 'parent_id' => 'required|integer',
- 'name' => 'string',
+ 'parent_id' => 'nullable|uuid',
+ 'name' => 'required|string',
];
}
}
diff --git a/app/Http/Requests/FileFunctions/DeleteItemRequest.php b/app/Http/Requests/FileFunctions/DeleteItemRequest.php
index 1524479e..fbb9b486 100644
--- a/app/Http/Requests/FileFunctions/DeleteItemRequest.php
+++ b/app/Http/Requests/FileFunctions/DeleteItemRequest.php
@@ -27,7 +27,7 @@ class DeleteItemRequest extends FormRequest
return [
'data[*].force_delete' => 'required|boolean',
'data[*].type' => 'required|string',
- 'data[*].unique_id' => 'required|integer'
+ 'data[*].id' => 'required|integer'
];
}
}
diff --git a/app/Http/Requests/FileFunctions/MoveItemRequest.php b/app/Http/Requests/FileFunctions/MoveItemRequest.php
index a0977e20..8b337444 100644
--- a/app/Http/Requests/FileFunctions/MoveItemRequest.php
+++ b/app/Http/Requests/FileFunctions/MoveItemRequest.php
@@ -25,9 +25,9 @@ class MoveItemRequest extends FormRequest
public function rules()
{
return [
- 'to_unique_id' => 'required|integer',
- 'items[*].type' => 'required|string',
- 'items[*].unique_id' => 'required|integer',
+ 'to_id' => 'nullable|uuid',
+ 'items[*].type' => 'required|string',
+ 'items[*].id' => 'required|uuid',
];
}
}
diff --git a/app/Http/Requests/FileFunctions/UploadRequest.php b/app/Http/Requests/FileFunctions/UploadRequest.php
index 18859927..a4139684 100644
--- a/app/Http/Requests/FileFunctions/UploadRequest.php
+++ b/app/Http/Requests/FileFunctions/UploadRequest.php
@@ -26,8 +26,8 @@ class UploadRequest extends FormRequest
public function rules()
{
return [
- 'parent_id' => 'required|integer',
- 'file' => ['required','file' , new MimetypeBlacklistValidation]
+ 'folder_id' => 'nullable|uuid',
+ 'file' => ['required', 'file', new MimetypeBlacklistValidation]
];
}
}
diff --git a/app/Http/Requests/Languages/CreateLanguageRequest.php b/app/Http/Requests/Languages/CreateLanguageRequest.php
new file mode 100644
index 00000000..493d3225
--- /dev/null
+++ b/app/Http/Requests/Languages/CreateLanguageRequest.php
@@ -0,0 +1,31 @@
+ 'required|string',
+ 'locale' => 'required|string'
+ ];
+ }
+}
diff --git a/app/Http/Requests/Languages/UpdateLanguageRequest.php b/app/Http/Requests/Languages/UpdateLanguageRequest.php
new file mode 100644
index 00000000..8a825fb4
--- /dev/null
+++ b/app/Http/Requests/Languages/UpdateLanguageRequest.php
@@ -0,0 +1,31 @@
+ 'required|string',
+ 'value' => 'required|string'
+ ];
+ }
+}
diff --git a/app/Http/Requests/Languages/UpdateStringRequest.php b/app/Http/Requests/Languages/UpdateStringRequest.php
new file mode 100644
index 00000000..3e4c61e0
--- /dev/null
+++ b/app/Http/Requests/Languages/UpdateStringRequest.php
@@ -0,0 +1,31 @@
+ 'required|string',
+ 'value' => 'required|string'
+ ];
+ }
+}
diff --git a/app/Http/Requests/PublicPages/SendMessageRequest.php b/app/Http/Requests/PublicPages/SendContactMessageRequest.php
similarity index 91%
rename from app/Http/Requests/PublicPages/SendMessageRequest.php
rename to app/Http/Requests/PublicPages/SendContactMessageRequest.php
index 1aafebf6..416c1513 100644
--- a/app/Http/Requests/PublicPages/SendMessageRequest.php
+++ b/app/Http/Requests/PublicPages/SendContactMessageRequest.php
@@ -4,7 +4,7 @@ namespace App\Http\Requests\PublicPages;
use Illuminate\Foundation\Http\FormRequest;
-class SendMessageRequest extends FormRequest
+class SendContactMessageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
diff --git a/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php b/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php
index 02e9c1d2..ac8f3baf 100644
--- a/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php
+++ b/app/Http/Requests/SetupWizard/StoreAppSetupRequest.php
@@ -27,6 +27,7 @@ class StoreAppSetupRequest extends FormRequest
'title' => 'required|string',
'description' => 'required|string',
'logo' => 'sometimes|file',
+ 'logo_horizontal' => 'sometimes|file',
'favicon' => 'sometimes|file',
'contactMail' => 'required|email',
'googleAnalytics' => 'sometimes|string',
diff --git a/app/Http/Requests/Share/CreateShareRequest.php b/app/Http/Requests/Share/CreateShareRequest.php
index b3e18f49..40d0bedb 100644
--- a/app/Http/Requests/Share/CreateShareRequest.php
+++ b/app/Http/Requests/Share/CreateShareRequest.php
@@ -26,12 +26,11 @@ class CreateShareRequest extends FormRequest
{
return [
'isPassword' => 'required|boolean',
- 'unique_id' => 'required|integer',
'type' => 'required|string',
'expiration' => 'integer|nullable',
'permission' => 'string',
'password' => 'string',
- 'emails.*' => 'email'
+ 'emails.*' => 'email'
];
}
}
diff --git a/app/Http/Requests/User/UpdateUserPasswordRequest.php b/app/Http/Requests/User/UpdateUserPasswordRequest.php
new file mode 100644
index 00000000..6f4e82cb
--- /dev/null
+++ b/app/Http/Requests/User/UpdateUserPasswordRequest.php
@@ -0,0 +1,30 @@
+ 'required|string|min:6|confirmed',
+ ];
+ }
+}
diff --git a/app/Http/Resources/FileResource.php b/app/Http/Resources/FileResource.php
new file mode 100644
index 00000000..a0973320
--- /dev/null
+++ b/app/Http/Resources/FileResource.php
@@ -0,0 +1,35 @@
+ [
+ 'id' => $this->id,
+ 'type' => 'file',
+ 'attributes' => [
+ 'name' => $this->name,
+ 'basename' => $this->basename,
+ 'mimetype' => $this->mimetype,
+ 'filesize' => $this->filesize,
+ 'type' => $this->type,
+ 'file_url' => $this->file_url,
+ 'thumbnail' => $this->thumbnail,
+ 'created_at' => $this->created_at,
+ 'updated_at' => $this->created_at,
+ ]
+ ],
+ ];
+ }
+}
diff --git a/app/Http/Resources/GatewayCollection.php b/app/Http/Resources/GatewayCollection.php
deleted file mode 100644
index 7944bcf1..00000000
--- a/app/Http/Resources/GatewayCollection.php
+++ /dev/null
@@ -1,23 +0,0 @@
- $this->collection,
- ];
- }
-}
diff --git a/app/Http/Resources/GatewayResource.php b/app/Http/Resources/GatewayResource.php
deleted file mode 100644
index 8c7a02fc..00000000
--- a/app/Http/Resources/GatewayResource.php
+++ /dev/null
@@ -1,36 +0,0 @@
- [
- 'id' => (string)$this->id,
- 'type' => 'gateways',
- 'attributes' => [
- 'status' => $this->status,
- 'sandbox' => $this->sandbox,
- 'name' => $this->name,
- 'slug' => $this->slug,
- 'logo' => $this->logo,
- 'client_id' => $this->client_id,
- 'secret' => $this->secret,
- 'webhook' => $this->webhook,
- 'payment_processed' => $this->payment_processed,
- 'optional' => $this->optional,
- ]
- ]
- ];
- }
-}
diff --git a/app/Http/Resources/InvoiceAdminResource.php b/app/Http/Resources/InvoiceAdminResource.php
index 3ddb775e..fb20fb3a 100644
--- a/app/Http/Resources/InvoiceAdminResource.php
+++ b/app/Http/Resources/InvoiceAdminResource.php
@@ -2,7 +2,7 @@
namespace App\Http\Resources;
-use App\User;
+use App\Models\User;
use Illuminate\Http\Resources\Json\JsonResource;
use Laravel\Cashier\Cashier;
@@ -16,7 +16,8 @@ class InvoiceAdminResource extends JsonResource
*/
public function toArray($request)
{
- $user = User::where('stripe_id', $this['customer'])->first();
+ $user = User::where('stripe_id', $this['customer'])
+ ->first();
return [
'data' => [
@@ -29,7 +30,7 @@ class InvoiceAdminResource extends JsonResource
'created_at_formatted' => format_date($this['created']),
'created_at' => $this['created'],
'order' => $this['number'],
- 'user_id' => $user ? $user->id : null,
+ 'user_id' => $user->id ?? null,
'client' => [
'billing_address' => $this['customer_address'],
'billing_name' => $this['customer_name'],
@@ -42,24 +43,24 @@ class InvoiceAdminResource extends JsonResource
'description' => $this['lines']['data'][0]['description'],
],
'seller' => null,
- ]
- ],
- $this->mergeWhen($user, function () use ($user) {
- return [
- 'relationships' => [
- 'user' => [
- 'data' => [
- 'id' => (string)$user->id,
- 'type' => 'user',
- 'attributes' => [
- 'name' => $user->name,
- 'avatar' => $user->avatar,
+ ],
+ $this->mergeWhen($user, function () use ($user) {
+ return [
+ 'relationships' => [
+ 'user' => [
+ 'data' => [
+ 'id' => $user->id,
+ 'type' => 'user',
+ 'attributes' => [
+ 'name' => $user->name,
+ 'avatar' => $user->avatar,
+ ]
]
]
]
- ]
- ];
- }),
+ ];
+ }),
+ ],
];
}
}
diff --git a/app/Http/Resources/InvoiceResource.php b/app/Http/Resources/InvoiceResource.php
index 2856d3d5..1d2a6404 100644
--- a/app/Http/Resources/InvoiceResource.php
+++ b/app/Http/Resources/InvoiceResource.php
@@ -2,7 +2,7 @@
namespace App\Http\Resources;
-use App\User;
+use App\Models\User;
use Illuminate\Http\Resources\Json\JsonResource;
class InvoiceResource extends JsonResource
@@ -15,29 +15,8 @@ class InvoiceResource extends JsonResource
*/
public function toArray($request)
{
- $user = User::where('stripe_id', $this->customer)->first();
- $invoice_items = [];
- $invoice_subscriptions = [];
-
- // Format bag
- foreach ($this->invoiceItems() as $item) {
- array_push($invoice_items, [
- 'amount' => $item->total(),
- 'description' => $item->description,
- 'currency' => $item->currency,
- 'type' => $item->type,
- ]);
- }
-
- // Format bag
- foreach ($this->subscriptions() as $item) {
- array_push($invoice_subscriptions, [
- 'amount' => $item->total(),
- 'description' => $item->description,
- 'currency' => $item->currency,
- 'type' => $item->type,
- ]);
- }
+ $user = User::whereStripeId($this->customer)
+ ->first();
return [
'data' => [
@@ -50,31 +29,69 @@ class InvoiceResource extends JsonResource
'created_at_formatted' => format_date($this->date(), '%d. %B. %Y'),
'created_at' => $this->created,
'order' => $this->number,
- 'user_id' => $user ? $user->id : null,
+ 'user_id' => $user->id ?? null,
'client' => [
'billing_address' => $this->customer_address,
'billing_name' => $this->customer_name,
'billing_phone_number' => $this->customer_phone,
],
'seller' => null,
- 'invoice_items' => $invoice_items,
- 'invoice_subscriptions' => $invoice_subscriptions,
- ]
- ],
- $this->mergeWhen($user, [
- 'relationships' => [
- 'user' => [
- 'data' => [
- 'id' => (string)$user->id,
- 'type' => 'user',
- 'attributes' => [
- 'name' => $user->name,
- 'avatar' => $user->avatar,
+ 'invoice_items' => $this->get_invoice_items(),
+ 'invoice_subscriptions' => $this->get_invoice_subscriptions(),
+ ],
+ $this->mergeWhen($user, [
+ 'relationships' => [
+ 'user' => [
+ 'data' => [
+ 'id' => $user->id,
+ 'type' => 'user',
+ 'attributes' => [
+ 'name' => $user->settings->name,
+ 'avatar' => $user->settings->avatar,
+ ]
]
]
]
- ]
- ]),
+ ]),
+ ],
];
}
+
+ /**
+ * @return array
+ */
+ private function get_invoice_subscriptions(): array
+ {
+ $array = [];
+
+ foreach ($this->subscriptions() as $item) {
+ array_push($array, [
+ 'amount' => $item->total(),
+ 'description' => $item->description,
+ 'currency' => $item->currency,
+ 'type' => $item->type,
+ ]);
+ }
+
+ return $array;
+ }
+
+ /**
+ * @return array
+ */
+ private function get_invoice_items(): array
+ {
+ $array = [];
+
+ foreach ($this->invoiceItems() as $item) {
+ array_push($array, [
+ 'amount' => $item->total(),
+ 'description' => $item->description,
+ 'currency' => $item->currency,
+ 'type' => $item->type,
+ ]);
+ }
+
+ return $array;
+ }
}
diff --git a/app/Http/Resources/LanguageCollection.php b/app/Http/Resources/LanguageCollection.php
new file mode 100644
index 00000000..0bfde44f
--- /dev/null
+++ b/app/Http/Resources/LanguageCollection.php
@@ -0,0 +1,32 @@
+whereLocale(get_setting('language') ?? 'en')
+ ->first();
+
+ return [
+ 'data' => $this->collection,
+ 'meta' => [
+ 'current_language' => new LanguageResource($current_language),
+ 'reference_translations' => get_default_language_translations()
+ ],
+ ];
+ }
+}
diff --git a/app/Http/Resources/LanguageResource.php b/app/Http/Resources/LanguageResource.php
new file mode 100644
index 00000000..03e7da34
--- /dev/null
+++ b/app/Http/Resources/LanguageResource.php
@@ -0,0 +1,31 @@
+ [
+ 'id' => $this->id,
+ 'type' => 'languages',
+ 'attributes' => [
+ 'name' => $this->name,
+ 'locale' => $this->locale,
+ 'translations' => map_language_translations($this->languageTranslations),
+ 'updated_at' => $this->updated_at,
+ 'created_at' => $this->created_at,
+ ]
+ ],
+ ];
+ }
+}
diff --git a/app/Http/Resources/PageResource.php b/app/Http/Resources/PageResource.php
index 966dbf6f..4b595d38 100644
--- a/app/Http/Resources/PageResource.php
+++ b/app/Http/Resources/PageResource.php
@@ -2,6 +2,7 @@
namespace App\Http\Resources;
+use App\Models\Page;
use Illuminate\Http\Resources\Json\JsonResource;
class PageResource extends JsonResource
@@ -16,7 +17,7 @@ class PageResource extends JsonResource
{
return [
'data' => [
- 'id' => $this->id,
+ 'id' => $this->slug,
'type' => 'pages',
'attributes' => [
'visibility' => $this->visibility,
diff --git a/app/Http/Resources/PricingResource.php b/app/Http/Resources/PricingResource.php
index c5aea6b8..f28d0f7a 100644
--- a/app/Http/Resources/PricingResource.php
+++ b/app/Http/Resources/PricingResource.php
@@ -2,6 +2,7 @@
namespace App\Http\Resources;
+use App\Services\StripeService;
use Illuminate\Http\Resources\Json\JsonResource;
use Laravel\Cashier\Cashier;
@@ -26,43 +27,9 @@ class PricingResource extends JsonResource
'capacity_formatted' => format_gigabytes($this['product']['metadata']['capacity']),
'capacity' => (int)$this['product']['metadata']['capacity'],
'currency' => config('cashier.currency'),
- 'tax_rates' => $this->get_tax_rates(),
+ 'tax_rates' => resolve(StripeService::class)->get_tax_rates($this['plan']['amount'])
]
]
];
}
-
- /**
- * Get plan tax rates
- *
- * @return array
- */
- private function get_tax_rates(): array
- {
- $stripe = resolve('App\Services\StripeService');
-
- $rates_puplic = [];
-
- // Get tax rates
- $rates = $stripe->getTaxRates();
-
- foreach ($rates as $rate) {
-
- // Continue when is not active
- if (!$rate['active']) continue;
-
- // Calculate tax
- $tax = $this['plan']['amount'] * ($rate['percentage'] / 100);
-
- array_push($rates_puplic, [
- 'id' => $rate['id'],
- 'active' => $rate['active'],
- 'jurisdiction' => $rate['jurisdiction'],
- 'percentage' => $rate['percentage'],
- 'plan_price_formatted' => Cashier::formatAmount(round($this['plan']['amount'] + $tax)),
- ]);
- }
-
- return $rates_puplic;
- }
-}
+}
\ No newline at end of file
diff --git a/app/Http/Resources/ShareResource.php b/app/Http/Resources/ShareResource.php
index 3f37d5ae..fdd89e37 100644
--- a/app/Http/Resources/ShareResource.php
+++ b/app/Http/Resources/ShareResource.php
@@ -19,15 +19,15 @@ class ShareResource extends JsonResource
'id' => (string)$this->id,
'type' => 'shares',
'attributes' => [
- 'permission' => $this->permission,
- 'protected' => (int) $this->protected,
- 'item_id' => (int) $this->item_id,
- 'expire_in' => (int) $this->expire_in,
- 'token' => $this->token,
- 'link' => $this->link,
- 'type' => $this->type,
- 'created_at' => $this->created_at,
- 'updated_at' => $this->updated_at,
+ 'permission' => $this->permission,
+ 'is_protected' => $this->is_protected,
+ 'item_id' => $this->item_id,
+ 'expire_in' => (int)$this->expire_in,
+ 'token' => $this->token,
+ 'link' => $this->link,
+ 'type' => $this->type,
+ 'created_at' => $this->created_at,
+ 'updated_at' => $this->updated_at,
]
]
];
diff --git a/app/Http/Resources/UserResource.php b/app/Http/Resources/UserResource.php
index 2740901a..910d916b 100644
--- a/app/Http/Resources/UserResource.php
+++ b/app/Http/Resources/UserResource.php
@@ -3,7 +3,7 @@
namespace App\Http\Resources;
use App\Services\StripeService;
-use App\User;
+use App\Models\User;
use Cartalyst\Stripe\Api\PaymentMethods;
use Faker\Factory;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -18,75 +18,53 @@ class UserResource extends JsonResource
*/
public function toArray($request)
{
+ // TODO: zrefaktorovat
return [
- 'data' => [
- 'id' => (string)$this->id,
- 'type' => 'user',
- 'attributes' => [
+ 'data' => [
+ 'id' => $this->id,
+ 'type' => 'user',
+ 'attributes' => [
'storage_capacity' => $this->settings->storage_capacity,
'subscription' => $this->subscribed('main'),
'incomplete_payment' => $this->hasIncompletePayment('main') ? route('cashier.payment', $this->subscription('main')->latestPayment()->id) : null,
'stripe_customer' => is_null($this->stripe_id) ? false : true,
- 'name' => $this->name,
- 'email' => env('APP_DEMO') ? obfuscate_email($this->email) : $this->email,
- 'avatar' => $this->avatar,
+ 'email' => is_demo() ? obfuscate_email($this->email) : $this->email,
'role' => $this->role,
+ 'folders' => $this->folder_tree,
+ 'storage' => $this->storage,
'created_at_formatted' => format_date($this->created_at, '%d. %B. %Y'),
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
+ ],
+ 'relationships' => [
+ 'settings' => [
+ 'data' => [
+ 'id' => $this->id,
+ 'type' => 'settings',
+ 'attributes' => [
+ 'avatar' => $this->settings->avatar,
+ 'name' => $this->settings->name,
+ 'address' => $this->settings->address,
+ 'state' => $this->settings->state,
+ 'city' => $this->settings->city,
+ 'postal_code' => $this->settings->postal_code,
+ 'country' => $this->settings->country,
+ 'phone_number' => $this->settings->phone_number,
+ 'timezone' => $this->settings->timezone
+ ]
+ ]
+ ],
+ 'favourites' => [
+ 'data' => [
+ 'id' => $this->id,
+ 'type' => 'favourite_folders',
+ 'attributes' => [
+ 'folders' => $this->favouriteFolders->makeHidden(['pivot'])
+ ],
+ ],
+ ]
]
],
- 'relationships' => [
- 'settings' => [
- 'data' => [
- 'id' => (string)$this->settings->id,
- 'type' => 'settings',
- 'attributes' => [
- 'billing_name' => $this->settings->billing_name,
- 'billing_address' => $this->settings->billing_address,
- 'billing_state' => $this->settings->billing_state,
- 'billing_city' => $this->settings->billing_city,
- 'billing_postal_code' => $this->settings->billing_postal_code,
- 'billing_country' => $this->settings->billing_country,
- 'billing_phone_number' => $this->settings->billing_phone_number,
- ]
- ]
- ],
- 'storage' => [
- 'data' => [
- 'id' => '1',
- 'type' => 'storage',
- 'attributes' => $this->storage
- ]
- ],
- 'favourites' => [
- 'data' => [
- 'id' => '1',
- 'type' => 'folders_favourite',
- 'attributes' => [
- 'folders' => $this->favourite_folders->makeHidden(['pivot'])
- ],
- ],
- ],
- 'tree' => [
- 'data' => [
- 'id' => '1',
- 'type' => 'folders_tree',
- 'attributes' => [
- 'folders' => $this->folder_tree
- ],
- ],
- ],
- 'timezone' => [
- 'data' => [
- 'id' => '1',
- 'type' => 'timezone',
- 'attributes' => [
- 'timezone' =>$this->settings->timezone
- ],
- ]
- ],
- ]
];
}
}
diff --git a/app/Http/Resources/UserStorageResource.php b/app/Http/Resources/UserStorageResource.php
index 89779197..a8897baf 100644
--- a/app/Http/Resources/UserStorageResource.php
+++ b/app/Http/Resources/UserStorageResource.php
@@ -2,7 +2,7 @@
namespace App\Http\Resources;
-use App\FileManagerFile;
+use App\Models\File;
use ByteUnits\Metric;
use Illuminate\Http\Resources\Json\JsonResource;
@@ -21,31 +21,31 @@ class UserStorageResource extends JsonResource
];
// Get all images
- $images = FileManagerFile::where('user_id', $this->id)
+ $images = File::where('user_id', $this->id)
->where('type', 'image')->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all audios
- $audios = FileManagerFile::where('user_id', $this->id)
+ $audios = File::where('user_id', $this->id)
->where('type', 'audio')->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all videos
- $videos = FileManagerFile::where('user_id', $this->id)
+ $videos = File::where('user_id', $this->id)
->where('type', 'video')->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all documents
- $documents = FileManagerFile::where('user_id', $this->id)
+ $documents = File::where('user_id', $this->id)
->whereIn('mimetype', $document_mimetypes)->get()->map(function ($item) {
return (int)$item->getRawOriginal('filesize');
})->sum();
// Get all other files
- $others = FileManagerFile::where('user_id', $this->id)
+ $others = File::where('user_id', $this->id)
->whereNotIn('mimetype', $document_mimetypes)
->whereNotIn('type', ['audio', 'video', 'image'])
->get()->map(function ($item) {
diff --git a/app/Http/Resources/UserSubscription.php b/app/Http/Resources/UserSubscription.php
index 05cd5ede..73e505e4 100644
--- a/app/Http/Resources/UserSubscription.php
+++ b/app/Http/Resources/UserSubscription.php
@@ -14,17 +14,12 @@ class UserSubscription extends JsonResource
*/
public function toArray($request)
{
- $stripe = resolve('App\Services\StripeService');
+ $active_subscription = $this->subscription('main')
+ ->asStripeSubscription();
- $active_subscription = $this->subscription('main')->asStripeSubscription();
-
- // Get subscription details
- $subscription = $stripe->getPlan($this->subscription('main')->stripe_plan);
-
- // Retrieve the timestamp from Stripe
- $current_period_end = $active_subscription["current_period_end"];
- $current_period_start = $active_subscription["current_period_start"];
- $canceled_at = $active_subscription["canceled_at"];
+ // TODO: vybrat z cache
+ $subscription = resolve('App\Services\StripeService')
+ ->getPlan($this->subscription('main')->stripe_plan);
return [
'data' => [
@@ -38,9 +33,9 @@ class UserSubscription extends JsonResource
'capacity' => (int)$subscription['product']['metadata']['capacity'],
'capacity_formatted' => format_gigabytes($subscription['product']['metadata']['capacity']),
'slug' => $subscription['plan']['id'],
- 'canceled_at' => format_date($canceled_at, '%d. %B. %Y'),
- 'created_at' => format_date($current_period_start, '%d. %B. %Y'),
- 'ends_at' => format_date($current_period_end, '%d. %B. %Y'),
+ 'canceled_at' => format_date($active_subscription["canceled_at"], '%d. %B. %Y'),
+ 'created_at' => format_date($active_subscription["current_period_start"], '%d. %B. %Y'),
+ 'ends_at' => format_date($active_subscription["current_period_end"], '%d. %B. %Y'),
]
]
];
diff --git a/app/Http/Tools/Editor.php b/app/Http/Tools/Editor.php
deleted file mode 100644
index d5448ebe..00000000
--- a/app/Http/Tools/Editor.php
+++ /dev/null
@@ -1,708 +0,0 @@
-user_id;
-
- // Get folder
- $folder = FileManagerFolder::where('user_id', $user_id)
- ->where('unique_id', $unique_id)
- ->first();
-
- // Set default folder icon
- if ($folder_icon === 'default') {
- $folder->icon_emoji = null;
- $folder->icon_color = null;
- }
-
- // If request have emoji set folder icon emoji
- if (isset($folder_icon['emoji'])) {
- $folder->icon_emoji = $folder_icon['emoji'];
- $folder->icon_color = null;
- }
-
- // If request have color set folder icon color
- if (isset($folder_icon['color'])) {
- $folder->icon_emoji = null;
- $folder->icon_color = $folder_icon['color'];
- }
-
- // Save changes
- $folder->save();
-
- }
-
- /**
- * Zip requested folder
- *
- * @param $unique_id
- * @param $shared
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- public static function zip_folder($unique_id, $shared = null)
- {
- // Get folder
- $requested_folder = FileManagerFolder::with(['folders.files', 'files'])
- ->where('unique_id', $unique_id)
- ->where('user_id', Auth::id() ?? $shared->user_id)
- ->with('folders')
- ->first();
-
- $files = get_files_for_zip($requested_folder, collect([]));
-
- // Local storage instance
- $disk_local = Storage::disk('local');
-
- // Create zip directory
- if (!$disk_local->exists('zip')) {
- $disk_local->makeDirectory('zip');
- }
-
- // Move file to local storage
- if (!is_storage_driver('local')) {
-
- // Create temp directory
- if (!$disk_local->exists('temp')) {
- $disk_local->makeDirectory('temp');
- }
-
- foreach ($files as $file) {
- try {
- $disk_local->put('temp/' . $file['basename'], Storage::get('file-manager/' . $file['basename']));
- } catch (FileNotFoundException $e) {
- throw new HttpException(404, 'File not found');
- }
- }
- }
-
- // Get zip path
- $zip_name = Str::random(16) . '-' . Str::slug($requested_folder->name) . '.zip';
- $zip_path = 'zip/' . $zip_name;
-
- // Create zip
- $zip = Madzipper::make(storage_path() . '/app/' . $zip_path);
-
- // Get files folder on local storage drive
- $files_folder = is_storage_driver('local') ? 'file-manager' : 'temp';
-
- // Add files to zip
- foreach ($files as $file) {
- $zip->folder($file['folder_path'])->addString($file['name'], File::get(storage_path() . '/app/' . $files_folder . '/' . $file['basename']));
- }
-
- // Close zip
- $zip->close();
-
- // Delete temporary files
- if (!is_storage_driver('local')) {
-
- foreach ($files as $file) {
- $disk_local->delete('temp/' . $file['basename']);
- }
- }
-
- // Store zip record
- return Zip::create([
- 'user_id' => $shared->user_id ?? Auth::id(),
- 'shared_token' => $shared->token ?? null,
- 'basename' => $zip_name,
- ]);
- }
-
- /**
- * Zip selected files, store it in /zip folder and retrieve zip record
- *
- * @param $files
- * @param null $shared
- * @return mixed
- * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
- */
- public static function zip_files($files, $shared = null)
- {
- // Local storage instance
- $disk_local = Storage::disk('local');
-
- // Create zip directory
- if (!$disk_local->exists('zip')) {
- $disk_local->makeDirectory('zip');
- }
-
- // Move file to local storage from external storage service
- if (!is_storage_driver('local')) {
-
- // Create temp directory
- if (!$disk_local->exists('temp')) {
- $disk_local->makeDirectory('temp');
- }
-
- foreach ($files as $file) {
- try {
- $disk_local->put('temp/' . $file['basename'], Storage::get('file-manager/' . $file['basename']));
- } catch (FileNotFoundException $e) {
- throw new HttpException(404, 'File not found');
- }
- }
- }
-
- // Get zip path
- $zip_name = Str::random(16) . '.zip';
- $zip_path = 'zip/' . $zip_name;
-
- // Create zip
- $zip = Madzipper::make(storage_path() . '/app/' . $zip_path);
-
- // Get files folder on local storage drive
- $files_directory = is_storage_driver('local') ? 'file-manager' : 'temp';
-
- // Add files to zip
- $files->each(function ($file) use ($zip, $files_directory) {
- $zip->addString($file['name'] . '.' . $file['mimetype'], File::get(storage_path() . '/app/' . $files_directory . '/' . $file['basename']));
- });
-
- // Close zip
- $zip->close();
-
- // Delete temporary files
- if (!is_storage_driver('local')) {
-
- $files->each(function ($file) use ($disk_local) {
- $disk_local->delete('temp/' . $file['basename']);
- });
- }
-
- // Store zip record
- return Zip::create([
- 'user_id' => $shared->user_id ?? Auth::id(),
- 'shared_token' => $shared->token ?? null,
- 'basename' => $zip_name,
- ]);
- }
-
- /**
- * Create new directory
- *
- * @param $request
- * @param null $shared
- * @return FileManagerFolder|\Illuminate\Database\Eloquent\Model
- */
- public static function create_folder($request, $shared = null)
- {
- // Get variables
- $user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor';
- $name = $request->has('name') ? $request->input('name') : 'New Folder';
- $user_id = is_null($shared) ? Auth::id() : $shared->user_id;
- $unique_id = get_unique_id();
-
- // Create folder
- $folder = FileManagerFolder::create([
- 'parent_id' => $request->parent_id,
- 'unique_id' => $unique_id,
- 'user_scope' => $user_scope,
- 'user_id' => $user_id,
- 'type' => 'folder',
- 'name' => $name,
- ]);
-
- // Return new folder
- return $folder;
- }
-
- /**
- * Rename item name
- *
- * @param RenameItemRequest $request
- * @param $unique_id
- * @param null $shared
- * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
- * @throws \Exception
- */
- public static function rename_item($request, $unique_id, $shared = null)
- {
- // Get user id
- $user_id = is_null($shared) ? Auth::id() : $shared->user_id;
-
- // Get item
- $item = get_item($request->type, $unique_id, $user_id);
-
- // Rename item
- $item->update([
- 'name' => $request->name
- ]);
-
- // Return updated item
- return $item;
- }
-
- /**
- * Delete file or folder
- *
- * @param $request
- * @param $unique_id
- * @param null $shared
- * @throws \Exception
- */
- public static function delete_item($file, $unique_id, $shared = null)
- {
- // Get user id
- $user = is_null($shared) ? Auth::user() : User::findOrFail($shared->user_id);
-
- // Delete folder
- if ($file['type'] === 'folder') {
-
- // Get folder
- $folder = FileManagerFolder::withTrashed()
- ->with(['folders'])
- ->where('user_id', $user->id)
- ->where('unique_id', $unique_id)
- ->first();
-
- // Get folder shared record
- $shared = Share::where('user_id', $user->id)
- ->where('type', '=', 'folder')
- ->where('item_id', $unique_id)
- ->first();
-
- // Delete folder shared record
- if ($shared) {
- $shared->delete();
- }
-
- // Force delete children files
- if ($file['force_delete']) {
-
- // Get children folder ids
- $child_folders = filter_folders_ids($folder->trashed_folders, 'unique_id');
-
- // Get children files
- $files = FileManagerFile::onlyTrashed()
- ->where('user_id', $user->id)
- ->whereIn('folder_id', Arr::flatten([$unique_id, $child_folders]))
- ->get();
-
- // Remove all children files
- foreach ($files as $file) {
-
- // Delete file
- Storage::delete('/file-manager/' . $file->basename);
-
- // Delete thumbnail if exist
- if (!is_null($file->thumbnail)) Storage::delete('/file-manager/' . $file->getRawOriginal('thumbnail'));
-
- // Delete file permanently
- $file->forceDelete();
- }
-
- // Delete folder record
- $folder->forceDelete();
- }
-
- // Soft delete items
- if (!$file['force_delete']) {
-
- // Remove folder from user favourites
- $user->favourite_folders()->detach($unique_id);
-
- // Soft delete folder record
- $folder->delete();
- }
- }
-
- // Delete item
- if ($file['type'] !== 'folder') {
-
- // Get file
- $item = FileManagerFile::withTrashed()
- ->where('user_id', $user->id)
- ->where('unique_id', $unique_id)
- ->first();
-
- // Get folder shared record
- $shared = Share::where('user_id', $user->id)
- ->where('type', '=', 'file')
- ->where('item_id', $unique_id)
- ->first();
-
- // Delete file shared record
- if ($shared) {
- $shared->delete();
- }
-
- // Force delete file
- if ($file['force_delete']) {
-
- // Delete file
- Storage::delete('/file-manager/' . $item->basename);
-
- // Delete thumbnail if exist
- if ($item->thumbnail) Storage::delete('/file-manager/' . $item->getRawOriginal('thumbnail'));
-
- // Delete file permanently
- $item->forceDelete();
- }
-
- // Soft delete file
- if (!$file['force_delete']) {
-
- // Soft delete file
- $item->delete();
- }
- }
- }
-
- /**
- * Move folder or file to new location
- *
- * @param $request
- * @param $unique_id
- * @param null $shared
- */
- public static function move($request, $to_unique_id, $shared = null)
- {
- // Get user id
- $user_id = is_null($shared) ? Auth::id() : $shared->user_id;
-
- foreach ($request->input('items') as $item) {
- $unique_id = $item['unique_id'];
-
- if ($item['type'] === 'folder') {
-
- // Move folder
- $item = FileManagerFolder::where('user_id', $user_id)
- ->where('unique_id', $unique_id)
- ->firstOrFail();
-
- $item->update([
- 'parent_id' => $to_unique_id
- ]);
-
- } else {
-
- // Move file under new folder
- $item = FileManagerFile::where('user_id', $user_id)
- ->where('unique_id', $unique_id)
- ->firstOrFail();
-
- $item->update([
- 'folder_id' => $to_unique_id
- ]);
- }
- }
- }
-
- /**
- * Upload file
- *
- * @param $request
- * @param null $shared
- * @return FileManagerFile|\Illuminate\Database\Eloquent\Model
- * @throws \Exception
- */
- public static function upload($request, $shared = null)
- {
- // Get parent_id from request
- $file = $request->file('file');
-
- // Check or create directories
- self::check_directories(['chunks', 'file-manager']);
-
- // File name
- $user_file_name = basename('chunks/' . substr($file->getClientOriginalName(), 17), '.part');
- $disk_file_name = basename('chunks/' . $file->getClientOriginalName(), '.part');
- $temp_filename = $file->getClientOriginalName();
-
- // File Path
- $file_path = config('filesystems.disks.local.root') . '/chunks/' . $temp_filename;
-
- // Generate file
- File::append($file_path, $file->get());
-
- // Size of file
- $file_size = File::size($file_path);
-
- // Size of limit
- $limit = get_setting('upload_limit');
-
- // File size handling
- if ($limit && $file_size > format_bytes($limit)) abort(413);
-
- // If last then process file
- if ($request->boolean('is_last')) {
-
- $metadata = get_image_meta_data($file);
-
- $disk_local = Storage::disk('local');
- $unique_id = get_unique_id();
-
- // Get user data
- $user_scope = is_null($shared) ? $request->user()->token()->scopes[0] : 'editor';
- $user_id = is_null($shared) ? Auth::id() : $shared->user_id;
-
- // File Info
- $file_size = $disk_local->size('chunks/' . $temp_filename);
- $file_mimetype = $disk_local->mimeType('chunks/' . $temp_filename);
-
- // Check if user has enough space to upload file
- self::check_user_storage_capacity($user_id, $file_size, $temp_filename);
-
- // Create thumbnail
- $thumbnail = self::get_image_thumbnail('chunks/' . $temp_filename, $disk_file_name);
-
- // Move finished file from chunk to file-manager directory
- $disk_local->move('chunks/' . $temp_filename, 'file-manager/' . $disk_file_name);
-
- // Move files to external storage
- if (!is_storage_driver(['local'])) {
-
- // Clear failed uploads if exists
- self::clear_failed_files();
-
- // Move file to external storage service
- self::move_to_external_storage($disk_file_name, $thumbnail);
- }
-
- // Store file
- $options = [
- 'mimetype' => get_file_type_from_mimetype($file_mimetype),
- 'type' => get_file_type($file_mimetype),
- 'folder_id' => $request->parent_id,
- 'metadata' => $metadata,
- 'name' => $user_file_name,
- 'unique_id' => $unique_id,
- 'basename' => $disk_file_name,
- 'user_scope' => $user_scope,
- 'thumbnail' => $thumbnail,
- 'filesize' => $file_size,
- 'user_id' => $user_id,
- ];
-
- // Store user upload size
- if ($request->user()) {
-
- // If upload a loged user
- $request->user()->record_upload($file_size);
-
- } else {
-
- // If upload guest
- User::find($shared->user_id)->record_upload($file_size);
-
- }
-
- // Return new file
- return FileManagerFile::create($options);
- }
- }
-
- /**
- * Clear failed files
- */
- private static function clear_failed_files()
- {
- $local_disk = Storage::disk('local');
-
- // Get all files from storage
- $files = collect([
- $local_disk->allFiles('file-manager'),
- $local_disk->allFiles('chunks')
- ])->collapse();
-
- $files->each(function ($file) use ($local_disk) {
-
- // Get the file's last modification time.
- $last_modified = $local_disk->lastModified($file);
-
- // Get diffInHours
- $diff = Carbon::parse($last_modified)->diffInHours(Carbon::now());
-
- // Delete if file is in local storage more than 24 hours
- if ($diff > 24) {
-
- Log::info('Failed file or chunk ' . $file . ' deleted.');
-
- // Delete file from local storage
- $local_disk->delete($file);
- }
- });
- }
-
- /**
- * Move file to external storage if is set
- *
- * @param string $filename
- * @param string|null $thumbnail
- */
- private static function move_to_external_storage(string $filename, ?string $thumbnail): void
- {
- $disk_local = Storage::disk('local');
-
- foreach ([$filename, $thumbnail] as $file) {
-
- // Check if file exist
- if (!$file) continue;
-
- // Get file size
- $filesize = $disk_local->size('file-manager/' . $file);
-
- // If file is bigger than 5.2MB then run multipart upload
- if ($filesize > 5242880) {
-
- // Get driver
- $driver = \Storage::getDriver();
-
- // Get adapter
- $adapter = $driver->getAdapter();
-
- // Get client
- $client = $adapter->getClient();
-
- // Prepare the upload parameters.
- $uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . '/file-manager/' . $file, [
- 'bucket' => $adapter->getBucket(),
- 'key' => 'file-manager/' . $file
- ]);
-
- try {
-
- // Upload content
- $uploader->upload();
-
- } catch (MultipartUploadException $e) {
-
- // Write error log
- Log::error($e->getMessage());
-
- // Delete file after error
- $disk_local->delete('file-manager/' . $file);
-
- throw new HttpException(409, $e->getMessage());
- }
-
- } else {
-
- // Stream file object to s3
- Storage::putFileAs('file-manager', config('filesystems.disks.local.root') . '/file-manager/' . $file, $file, 'private');
- }
-
- // Delete file after upload
- $disk_local->delete('file-manager/' . $file);
- }
- }
-
- /**
- * Check if directories 'chunks' and 'file-manager exist', if no, then create
- *
- * @param $directories
- */
- private static function check_directories($directories): void
- {
- foreach ($directories as $directory) {
-
- if (!Storage::disk('local')->exists($directory)) {
- Storage::disk('local')->makeDirectory($directory);
- }
-
- if (!is_storage_driver(['local'])) {
- if (!Storage::exists($directory)) {
- Storage::makeDirectory($directory);
- }
- }
- }
- }
-
- /**
- * Create thumbnail for images
- *
- * @param string $file_path
- * @param string $filename
- * @param $file
- * @return string|null
- */
- private static function get_image_thumbnail(string $file_path, string $filename)
- {
- $local_disk = Storage::disk('local');
-
- // Create thumbnail from image
- if (in_array($local_disk->mimeType($file_path), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) {
-
- // Get thumbnail name
- $thumbnail = 'thumbnail-' . $filename;
-
- // Create intervention image
- $image = Image::make(config('filesystems.disks.local.root') . '/' . $file_path)->orientate();
-
- // Resize image
- $image->resize(512, null, function ($constraint) {
- $constraint->aspectRatio();
- })->stream();
-
- // Store thumbnail to disk
- $local_disk->put('file-manager/' . $thumbnail, $image);
- }
-
- // Return thumbnail as svg file
- if ($local_disk->mimeType($file_path) === 'image/svg+xml') {
-
- $thumbnail = $filename;
- }
-
- return $thumbnail ?? null;
- }
-
- /**
- * Check if user has enough space to upload file
- *
- * @param $user_id
- * @param int $file_size
- * @param $temp_filename
- */
- private static function check_user_storage_capacity($user_id, int $file_size, $temp_filename): void
- {
- // Get user storage percentage and get storage_limitation setting
- $user_storage_used = user_storage_percentage($user_id, $file_size);
- $storage_limitation = get_setting('storage_limitation');
-
- // Check if user can upload
- if ($storage_limitation && $user_storage_used >= 100) {
-
- // Delete file
- Storage::disk('local')->delete('chunks/' . $temp_filename);
-
- // Abort uploading
- abort(423, 'You exceed your storage limit!');
- }
- }
-}
\ No newline at end of file
diff --git a/app/Http/Tools/Guardian.php b/app/Http/Tools/Guardian.php
deleted file mode 100644
index 0cef6609..00000000
--- a/app/Http/Tools/Guardian.php
+++ /dev/null
@@ -1,42 +0,0 @@
-where('user_id', $shared->user_id)
- ->where('parent_id', $shared->item_id)
- ->get();
-
- // Get all authorized parent folders by shared folder as root of tree
- $accessible_folder_ids = Arr::flatten([filter_folders_ids($foldersIds), $shared->item_id]);
-
- // Check user access
- if ( is_array($requested_id) ) {
- foreach ($requested_id as $id) {
- if (!in_array($id, $accessible_folder_ids))
- abort(403);
- }
- }
-
- if (! is_array($requested_id)) {
- if (! in_array($requested_id, $accessible_folder_ids))
- abort(403);
- }
- }
-}
\ No newline at end of file
diff --git a/app/Http/helpers.php b/app/Http/helpers.php
new file mode 100644
index 00000000..21aee097
--- /dev/null
+++ b/app/Http/helpers.php
@@ -0,0 +1,892 @@
+value ?? null;
+}
+
+/**
+ * Get all app settings and return them as json
+ */
+function get_settings_in_json()
+{
+ return json_decode(
+ Setting::all()
+ ->pluck('value', 'name')
+ ->toJson()
+ );
+}
+
+/**
+ * Check if setup wizard was passed
+ *
+ * @return string
+ */
+function get_setup_status()
+{
+ $setup_success = get_setting('setup_wizard_success');
+
+ return boolval($setup_success) ? 'setup-done' : 'setup-disclaimer';
+}
+
+/**
+ * Create paragraph from text
+ *
+ * @param $str
+ * @return mixed|null|string|string[]
+ */
+function add_paragraphs($str)
+{
+ // Trim whitespace
+ if (($str = trim($str)) === '') return '';
+
+ // Standardize newlines
+ $str = str_replace(array("\r\n", "\r"), "\n", $str);
+
+ // Trim whitespace on each line
+ $str = preg_replace('~^[ \t]+~m', '', $str);
+ $str = preg_replace('~[ \t]+$~m', '', $str);
+
+ // The following regexes only need to be executed if the string contains html
+ if ($html_found = (strpos($str, '<') !== FALSE)) {
+ // Elements that should not be surrounded by p tags
+ $no_p = '(?:p|div|article|header|aside|hgroup|canvas|output|progress|section|figcaption|audio|video|nav|figure|footer|video|details|main|menu|summary|h[1-6r]|ul|ol|li|blockquote|d[dlt]|pre|t[dhr]|t(?:able|body|foot|head)|c(?:aption|olgroup)|form|s(?:elect|tyle)|a(?:ddress|rea)|ma(?:p|th))';
+
+ // Put at least two linebreaks before and after $no_p elements
+ $str = preg_replace('~^<' . $no_p . '[^>]*+>~im', "\n$0", $str);
+ $str = preg_replace('~' . $no_p . '\s*+>$~im', "$0\n", $str);
+ }
+
+ // Do the magic!
+ $str = '
' . trim($str) . '
';
+ $str = preg_replace('~\n{2,}~', "\n\n", $str);
+
+ // The following regexes only need to be executed if the string contains html
+ if ($html_found !== FALSE) {
+ // Remove p tags around $no_p elements
+ $str = preg_replace('~
(?=?' . $no_p . '[^>]*+>)~i', '', $str);
+ $str = preg_replace('~(?' . $no_p . '[^>]*+>)
~i', '$1', $str);
+ }
+
+ // Convert single linebreaks to
+ $str = preg_replace('~(?\n", $str);
+
+ return $str;
+}
+
+/**
+ * Set environment value
+ *
+ * @param $key
+ * @param $value
+ * @return bool
+ */
+function setEnvironmentValue(array $values)
+{
+ $envFile = app()->environmentFilePath();
+ $str = file_get_contents($envFile);
+
+ if (count($values) > 0) {
+ foreach ($values as $envKey => $envValue) {
+
+ $str .= "\n"; // In case the searched variable is in the last line without \n
+ $keyPosition = strpos($str, "{$envKey}=");
+ $endOfLinePosition = strpos($str, "\n", $keyPosition);
+ $oldLine = substr($str, $keyPosition, $endOfLinePosition - $keyPosition);
+
+ // If key does not exist, add it
+ $str = str_replace($oldLine, "{$envKey}={$envValue}", $str);
+ }
+ }
+
+ $str = substr($str, 0, -1);
+ if (!file_put_contents($envFile, $str)) return false;
+ return true;
+
+}
+
+/**
+ * Get invoice number
+ *
+ * @return string
+ */
+function get_invoice_number()
+{
+ $invoices = \App\Invoice::all();
+
+ if ($invoices->isEmpty()) {
+ return now()->year . '001';
+ } else {
+ return (int)$invoices->last()->order + 1;
+ }
+}
+
+/**
+ * Forget many cache keys at once
+ * @param $cache
+ */
+function cache_forget_many($cache)
+{
+ foreach ($cache as $item) {
+ \Illuminate\Support\Facades\Cache::forget($item);
+ }
+}
+
+/**
+ * Get app version from config
+ *
+ * @return \Illuminate\Config\Repository|mixed
+ */
+function get_storage()
+{
+ return env('FILESYSTEM_DRIVER');
+}
+
+/**
+ * Check if is running AWS s3 as storage
+ *
+ * @return bool
+ */
+function is_storage_driver($driver)
+{
+ if (is_array($driver)) {
+ return in_array(config('filesystems.default'), $driver);
+ }
+
+ return config('filesystems.default') === $driver;
+}
+
+/**
+ * Get app version from config
+ *
+ * @return \Illuminate\Config\Repository|mixed
+ */
+function get_version()
+{
+ return config('vuefilemanager.version');
+}
+
+/**
+ * Check if is demo
+ *
+ * @return boolean
+ */
+function is_demo()
+{
+ return config('vuefilemanager.is_demo');
+}
+
+/**
+ * Check if is demo
+ *
+ * @param $email
+ * @return mixed
+ */
+function is_demo_account($email)
+{
+ return config('vuefilemanager.is_demo') && $email === 'howdy@hi5ve.digital';
+}
+
+/**
+ * Get folder or file item
+ *
+ * @param $type
+ * @param $id
+ * @return \Illuminate\Database\Eloquent\Builder|Model
+ */
+function get_item($type, $id)
+{
+ $model = strtolower($type) === 'folder' ? 'Folder' : 'File';
+
+ return ("App\\Models\\$model")::find($id);
+}
+
+/**
+ * Get shared token
+ *
+ * @param $token
+ * @return \Illuminate\Database\Eloquent\Builder|Model
+ */
+function get_shared($token)
+{
+ return Share::whereToken($token)
+ ->firstOrFail();
+}
+
+/**
+ * Check if shared permission is editor
+ *
+ * @param $shared
+ * @return bool
+ */
+function is_editor($shared)
+{
+ return $shared->permission === 'editor';
+}
+
+/**
+ * Check if shared permission is visitor
+ *
+ * @param $shared
+ * @return bool
+ */
+function is_visitor($shared)
+{
+ return $shared->permission === 'visitor';
+}
+
+/**
+ * Store user avatar to storage
+ *
+ * @param $request
+ * @param $name
+ * @return string
+ */
+function store_avatar($request, $name)
+{
+ if (!$request->hasFile($name)) {
+ return null;
+ }
+
+ $image = $request->file($name);
+
+ // Store avatar
+ $image_path = Str::random(16) . '-' . $image->getClientOriginalName();
+
+ // Create intervention image
+ $img = Image::make($image->getRealPath());
+
+ // Generate thumbnail
+ $img->fit('150', '150')->stream();
+
+ // Store thumbnail to disk
+ Storage::put("avatars/$image_path", $img);
+
+ // Return path to image
+ return "avatars/$image_path";
+}
+
+/**
+ * Store system image
+ *
+ * @param $request
+ * @param $name
+ * @return string
+ */
+function store_system_image($request, $name)
+{
+ if (!$request->hasFile($name)) {
+ return null;
+ }
+
+ $image = $request->file($name);
+
+ // Store avatar
+ $filename = Str::random(8) . '-' . str_replace(' ', '', $image->getClientOriginalName());
+
+ // Store image to disk
+ Storage::putFileAs('system', $image, $filename);
+
+ // Return path to image
+ return "system/$filename";
+}
+
+/**
+ * Make input from request
+ *
+ * @param $request
+ * @return array
+ */
+function make_single_input($request)
+{
+ // Create container
+ $data = [];
+
+ // Add data to array
+ $data[$request->name] = $request->value;
+
+ // Return input
+ return $data;
+}
+
+/**
+ * Format integer to gigabytes
+ *
+ * @param $gigabytes
+ * @return string
+ */
+function format_gigabytes($gigabytes)
+{
+ if ($gigabytes >= 1000) {
+ return Metric::gigabytes($gigabytes)->format('Tb/');
+ } else {
+ return Metric::gigabytes($gigabytes)->format('GB/');
+ }
+}
+
+/**
+ * Format string to formated megabytes string
+ *
+ * @param $megabytes
+ * @return string
+ */
+function format_megabytes($megabytes)
+{
+ if ($megabytes >= 1000) {
+ return $megabytes / 1000 . 'GB';
+ }
+
+ if ($megabytes >= 1000000) {
+ return $megabytes / 1000000 . 'TB';
+ }
+
+ return $megabytes . 'MB';
+}
+
+/**
+ * Convert megabytes to bytes
+ *
+ * @param $megabytes
+ * @return int|string
+ */
+function format_bytes($megabytes)
+{
+ return Metric::megabytes($megabytes)->numberOfBytes();
+}
+
+/**
+ * Get storage usage in percent
+ *
+ * @param $used
+ * @param $capacity
+ * @return string
+ */
+function get_storage_fill_percentage($used, $capacity)
+{
+ // Format gigabytes to bytes
+ $total = intval(Metric::gigabytes($capacity)->numberOfBytes());
+
+ // Count progress
+ if ($total == 0) {
+ $progress = 100;
+ } else {
+ $progress = ($used * 100) / $total;
+ }
+
+ // Return in 2 decimal
+ return number_format((float)$progress, 2, '.', '');
+}
+
+/**
+ * Get user capacity fill by percentage
+ *
+ * @param $id
+ * @param null $additionals
+ * @return string
+ */
+function user_storage_percentage($id, $additionals = null)
+{
+ $user = User::findOrFail($id);
+
+ $used = $user->used_capacity;
+
+ if ($additionals) {
+ $used = $user->used_capacity + $additionals;
+ }
+
+ return get_storage_fill_percentage($used, $user->settings->storage_capacity);
+}
+
+/**
+ * Find all key values in recursive array
+ *
+ * @param array $array
+ * @param $needle
+ * @return array
+ */
+function recursiveFind(array $array, $needle)
+{
+ $iterator = new RecursiveArrayIterator($array);
+ $recursive = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);
+ $aHitList = array();
+ foreach ($recursive as $key => $value) {
+ if ($key === $needle) {
+ array_push($aHitList, $value);
+ }
+ }
+ return $aHitList;
+}
+
+/**
+ * Get values which appears only once in array
+ * @param $arr
+ * @return array
+ */
+function appeared_once($arr)
+{
+ $array_count_values = array_count_values($arr);
+
+ $single_time_comming_values_array = [];
+
+ foreach ($array_count_values as $key => $val) {
+
+ if ($val == 1) {
+ $single_time_comming_values_array[] = $key;
+ }
+ }
+
+ return $single_time_comming_values_array;
+}
+
+/**
+ * @param $folders
+ * @param string $by_column
+ * @return array
+ */
+function filter_folders_ids($folders, $by_column = 'id')
+{
+ $folder_ids = recursiveFind($folders->toArray(), $by_column);
+
+ return appeared_once($folder_ids);
+}
+
+/**
+ * Format localized date
+ *
+ * @param $date
+ * @param string $format
+ * @return string
+ */
+function format_date($date, $format = '%d. %B. %Y, %H:%M')
+{
+ $start = Carbon::parse($date);
+
+ return $start->formatLocalized($format);
+}
+
+/**
+ * Get file type from mimetype
+ *
+ * @param $file
+ * @return string
+ */
+function get_file_type($file_mimetype)
+{
+ // Get mimetype from file
+ $mimetype = explode('/', $file_mimetype);
+
+ switch ($mimetype[0]) {
+ case 'image':
+ return 'image';
+ break;
+ case 'video':
+ return 'video';
+ break;
+ case 'audio':
+ return 'audio';
+ break;
+ default:
+ return 'file';
+ }
+}
+
+/**
+ * It map language translations as language key and language value
+ *
+ * @param $translations
+ * @return mixed
+ */
+function map_language_translations($translations)
+{
+ return $translations->map(function ($string) {
+ return [$string->key => $string->value];
+ })->collapse();
+}
+
+/**
+ * Get file type from mimetype
+ *
+ * @param $mimetype
+ * @return mixed
+ */
+function get_file_type_from_mimetype($mimetype)
+{
+ return explode('/', $mimetype)[1];
+}
+
+/**
+ * Format pretty name file
+ *
+ * @param $basename
+ * @param $name
+ * @param $mimetype
+ * @return string
+ */
+function get_pretty_name($basename, $name, $mimetype)
+{
+ $file_extension = substr(strrchr($basename, '.'), 1);
+
+ if (strpos($name, $file_extension) !== false) {
+ return $name;
+ }
+
+ if ($file_extension) {
+ return $name . '.' . $file_extension;
+ }
+
+ return $name . '.' . $mimetype;
+}
+
+/**
+ * Get exif data from jpeg image
+ *
+ * @param $file
+ * @return array
+ */
+function get_image_meta_data($file)
+{
+ if (get_file_type_from_mimetype($file->getMimeType()) === 'jpeg') {
+
+ try {
+
+ // Try to get the exif data
+ return mb_convert_encoding(Image::make($file->getRealPath())->exif(), 'UTF8', 'UTF8');
+
+ } catch (\Exception $e) {
+
+ return null;
+
+ }
+ }
+}
+
+/**
+ * @return Collection
+ */
+function get_default_language_translations()
+{
+ return collect([
+ config("language-translations.extended"),
+ config("language-translations.regular"),
+ config("custom-language-translations")
+ ])->collapse();
+}
+
+/**
+ * Check if app is in dev mode
+ *
+ * @return bool
+ */
+function is_dev()
+{
+ return env('APP_ENV') === 'local';
+}
+
+/**
+ * @param $str
+ * @return bool
+ */
+function seems_utf8($str)
+{
+ $length = strlen($str);
+ for ($i = 0; $i < $length; $i++) {
+ $c = ord($str[$i]);
+ if ($c < 0x80) $n = 0; # 0bbbbbbb
+ elseif (($c & 0xE0) == 0xC0) $n = 1; # 110bbbbb
+ elseif (($c & 0xF0) == 0xE0) $n = 2; # 1110bbbb
+ elseif (($c & 0xF8) == 0xF0) $n = 3; # 11110bbb
+ elseif (($c & 0xFC) == 0xF8) $n = 4; # 111110bb
+ elseif (($c & 0xFE) == 0xFC) $n = 5; # 1111110b
+ else return false; # Does not match any model
+ for ($j = 0; $j < $n; $j++) { # n bytes matching 10bbbbbb follow ?
+ if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * Converts all accent characters to ASCII characters.
+ *
+ * If there are no accent characters, then the string given is just returned.
+ *
+ * @param string $string Text that might have accent characters
+ * @return string Filtered string with replaced "nice" characters.
+ */
+function remove_accents($string)
+{
+ if (!preg_match('/[\x80-\xff]/', $string))
+ return $string;
+
+ if (seems_utf8($string)) {
+ $chars = array(
+ // Decompositions for Latin-1 Supplement
+ chr(195) . chr(128) => 'A', chr(195) . chr(129) => 'A',
+ chr(195) . chr(130) => 'A', chr(195) . chr(131) => 'A',
+ chr(195) . chr(132) => 'A', chr(195) . chr(133) => 'A',
+ chr(195) . chr(135) => 'C', chr(195) . chr(136) => 'E',
+ chr(195) . chr(137) => 'E', chr(195) . chr(138) => 'E',
+ chr(195) . chr(139) => 'E', chr(195) . chr(140) => 'I',
+ chr(195) . chr(141) => 'I', chr(195) . chr(142) => 'I',
+ chr(195) . chr(143) => 'I', chr(195) . chr(145) => 'N',
+ chr(195) . chr(146) => 'O', chr(195) . chr(147) => 'O',
+ chr(195) . chr(148) => 'O', chr(195) . chr(149) => 'O',
+ chr(195) . chr(150) => 'O', chr(195) . chr(153) => 'U',
+ chr(195) . chr(154) => 'U', chr(195) . chr(155) => 'U',
+ chr(195) . chr(156) => 'U', chr(195) . chr(157) => 'Y',
+ chr(195) . chr(159) => 's', chr(195) . chr(160) => 'a',
+ chr(195) . chr(161) => 'a', chr(195) . chr(162) => 'a',
+ chr(195) . chr(163) => 'a', chr(195) . chr(164) => 'a',
+ chr(195) . chr(165) => 'a', chr(195) . chr(167) => 'c',
+ chr(195) . chr(168) => 'e', chr(195) . chr(169) => 'e',
+ chr(195) . chr(170) => 'e', chr(195) . chr(171) => 'e',
+ chr(195) . chr(172) => 'i', chr(195) . chr(173) => 'i',
+ chr(195) . chr(174) => 'i', chr(195) . chr(175) => 'i',
+ chr(195) . chr(177) => 'n', chr(195) . chr(178) => 'o',
+ chr(195) . chr(179) => 'o', chr(195) . chr(180) => 'o',
+ chr(195) . chr(181) => 'o', chr(195) . chr(182) => 'o',
+ chr(195) . chr(182) => 'o', chr(195) . chr(185) => 'u',
+ chr(195) . chr(186) => 'u', chr(195) . chr(187) => 'u',
+ chr(195) . chr(188) => 'u', chr(195) . chr(189) => 'y',
+ chr(195) . chr(191) => 'y',
+ // Decompositions for Latin Extended-A
+ chr(196) . chr(128) => 'A', chr(196) . chr(129) => 'a',
+ chr(196) . chr(130) => 'A', chr(196) . chr(131) => 'a',
+ chr(196) . chr(132) => 'A', chr(196) . chr(133) => 'a',
+ chr(196) . chr(134) => 'C', chr(196) . chr(135) => 'c',
+ chr(196) . chr(136) => 'C', chr(196) . chr(137) => 'c',
+ chr(196) . chr(138) => 'C', chr(196) . chr(139) => 'c',
+ chr(196) . chr(140) => 'C', chr(196) . chr(141) => 'c',
+ chr(196) . chr(142) => 'D', chr(196) . chr(143) => 'd',
+ chr(196) . chr(144) => 'D', chr(196) . chr(145) => 'd',
+ chr(196) . chr(146) => 'E', chr(196) . chr(147) => 'e',
+ chr(196) . chr(148) => 'E', chr(196) . chr(149) => 'e',
+ chr(196) . chr(150) => 'E', chr(196) . chr(151) => 'e',
+ chr(196) . chr(152) => 'E', chr(196) . chr(153) => 'e',
+ chr(196) . chr(154) => 'E', chr(196) . chr(155) => 'e',
+ chr(196) . chr(156) => 'G', chr(196) . chr(157) => 'g',
+ chr(196) . chr(158) => 'G', chr(196) . chr(159) => 'g',
+ chr(196) . chr(160) => 'G', chr(196) . chr(161) => 'g',
+ chr(196) . chr(162) => 'G', chr(196) . chr(163) => 'g',
+ chr(196) . chr(164) => 'H', chr(196) . chr(165) => 'h',
+ chr(196) . chr(166) => 'H', chr(196) . chr(167) => 'h',
+ chr(196) . chr(168) => 'I', chr(196) . chr(169) => 'i',
+ chr(196) . chr(170) => 'I', chr(196) . chr(171) => 'i',
+ chr(196) . chr(172) => 'I', chr(196) . chr(173) => 'i',
+ chr(196) . chr(174) => 'I', chr(196) . chr(175) => 'i',
+ chr(196) . chr(176) => 'I', chr(196) . chr(177) => 'i',
+ chr(196) . chr(178) => 'IJ', chr(196) . chr(179) => 'ij',
+ chr(196) . chr(180) => 'J', chr(196) . chr(181) => 'j',
+ chr(196) . chr(182) => 'K', chr(196) . chr(183) => 'k',
+ chr(196) . chr(184) => 'k', chr(196) . chr(185) => 'L',
+ chr(196) . chr(186) => 'l', chr(196) . chr(187) => 'L',
+ chr(196) . chr(188) => 'l', chr(196) . chr(189) => 'L',
+ chr(196) . chr(190) => 'l', chr(196) . chr(191) => 'L',
+ chr(197) . chr(128) => 'l', chr(197) . chr(129) => 'L',
+ chr(197) . chr(130) => 'l', chr(197) . chr(131) => 'N',
+ chr(197) . chr(132) => 'n', chr(197) . chr(133) => 'N',
+ chr(197) . chr(134) => 'n', chr(197) . chr(135) => 'N',
+ chr(197) . chr(136) => 'n', chr(197) . chr(137) => 'N',
+ chr(197) . chr(138) => 'n', chr(197) . chr(139) => 'N',
+ chr(197) . chr(140) => 'O', chr(197) . chr(141) => 'o',
+ chr(197) . chr(142) => 'O', chr(197) . chr(143) => 'o',
+ chr(197) . chr(144) => 'O', chr(197) . chr(145) => 'o',
+ chr(197) . chr(146) => 'OE', chr(197) . chr(147) => 'oe',
+ chr(197) . chr(148) => 'R', chr(197) . chr(149) => 'r',
+ chr(197) . chr(150) => 'R', chr(197) . chr(151) => 'r',
+ chr(197) . chr(152) => 'R', chr(197) . chr(153) => 'r',
+ chr(197) . chr(154) => 'S', chr(197) . chr(155) => 's',
+ chr(197) . chr(156) => 'S', chr(197) . chr(157) => 's',
+ chr(197) . chr(158) => 'S', chr(197) . chr(159) => 's',
+ chr(197) . chr(160) => 'S', chr(197) . chr(161) => 's',
+ chr(197) . chr(162) => 'T', chr(197) . chr(163) => 't',
+ chr(197) . chr(164) => 'T', chr(197) . chr(165) => 't',
+ chr(197) . chr(166) => 'T', chr(197) . chr(167) => 't',
+ chr(197) . chr(168) => 'U', chr(197) . chr(169) => 'u',
+ chr(197) . chr(170) => 'U', chr(197) . chr(171) => 'u',
+ chr(197) . chr(172) => 'U', chr(197) . chr(173) => 'u',
+ chr(197) . chr(174) => 'U', chr(197) . chr(175) => 'u',
+ chr(197) . chr(176) => 'U', chr(197) . chr(177) => 'u',
+ chr(197) . chr(178) => 'U', chr(197) . chr(179) => 'u',
+ chr(197) . chr(180) => 'W', chr(197) . chr(181) => 'w',
+ chr(197) . chr(182) => 'Y', chr(197) . chr(183) => 'y',
+ chr(197) . chr(184) => 'Y', chr(197) . chr(185) => 'Z',
+ chr(197) . chr(186) => 'z', chr(197) . chr(187) => 'Z',
+ chr(197) . chr(188) => 'z', chr(197) . chr(189) => 'Z',
+ chr(197) . chr(190) => 'z', chr(197) . chr(191) => 's',
+ // Euro Sign
+ chr(226) . chr(130) . chr(172) => 'E',
+ // GBP (Pound) Sign
+ chr(194) . chr(163) => '');
+
+ $string = strtr($string, $chars);
+ } else {
+ // Assume ISO-8859-1 if not UTF-8
+ $chars['in'] = chr(128) . chr(131) . chr(138) . chr(142) . chr(154) . chr(158)
+ . chr(159) . chr(162) . chr(165) . chr(181) . chr(192) . chr(193) . chr(194)
+ . chr(195) . chr(196) . chr(197) . chr(199) . chr(200) . chr(201) . chr(202)
+ . chr(203) . chr(204) . chr(205) . chr(206) . chr(207) . chr(209) . chr(210)
+ . chr(211) . chr(212) . chr(213) . chr(214) . chr(216) . chr(217) . chr(218)
+ . chr(219) . chr(220) . chr(221) . chr(224) . chr(225) . chr(226) . chr(227)
+ . chr(228) . chr(229) . chr(231) . chr(232) . chr(233) . chr(234) . chr(235)
+ . chr(236) . chr(237) . chr(238) . chr(239) . chr(241) . chr(242) . chr(243)
+ . chr(244) . chr(245) . chr(246) . chr(248) . chr(249) . chr(250) . chr(251)
+ . chr(252) . chr(253) . chr(255);
+
+ $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
+
+ $string = strtr($string, $chars['in'], $chars['out']);
+ $double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
+ $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
+ $string = str_replace($double_chars['in'], $double_chars['out'], $string);
+ }
+
+ return $string;
+}
+
+/**
+ * Get all files from folder and get their folder location in VueFileManager directories
+ *
+ * @param $folders
+ * @param null $files
+ * @param array $path
+ * @return array
+ */
+function get_files_for_zip($folders, $files, $path = [])
+{
+ // Return file list
+ if (!isset($folders->folders)) {
+ return $files->unique()->values()->all();
+ }
+
+ // Push file path
+ array_push($path, $folders->name);
+
+ // Push file to collection
+ $folders->files->each(function ($file) use ($files, $path) {
+ $files->push([
+ 'name' => $file->name,
+ 'basename' => $file->basename,
+ 'mimetype' => $file->mimetype,
+ 'folder_path' => implode('/', $path),
+ ]);
+ });
+
+ // Get all children folders and folders within
+ if ($folders->folders->isNotEmpty()) {
+ $folders->folders->map(function ($folder) use ($files, $path) {
+ return get_files_for_zip($folder, $files, $path);
+ });
+ }
+
+ return get_files_for_zip($folders->folders->first(), $files, $path);
+}
+
+/**
+ * Set time by user timezone GMT
+ *
+ * @param $time
+ * @return Carbon
+ */
+function set_time_by_user_timezone($time)
+{
+ $user = Auth::user();
+
+ if ($user) {
+
+ // Get the value of timezone if user have some
+ $time_zone = intval($user->settings->timezone * 60 ?? null);
+
+ return Carbon::parse($time)->addMinutes($time_zone ?? null);
+ }
+
+ return Carbon::parse($time);
+}
+
+/**
+ * Translate the given message.
+ *
+ * @param $key
+ * @param null $values
+ * @return string|string[]
+ */
+function __t($key, $values = null)
+{
+ // Get current locale
+ $locale = cache()->rememberForever('language', function () {
+ return get_setting('language') ?? 'en';
+ });
+
+ $strings = cache()->rememberForever("language-translations-$locale", function () use ($locale) {
+ return Language::whereLocale($locale)->first()->languageTranslations ?? get_default_language_translations();
+ });
+
+ // Find the string by key
+ $string = $strings->get($key)
+ ? $strings->get($key)
+ : $strings->firstWhere('key', $key)->value;
+
+ if ($values) {
+ return replace_occurrence($string, collect($values));
+ }
+
+ return $string;
+}
+
+/**
+ * Replace string occurrence in __t() by their values
+ *
+ * @param $string
+ * @param $values
+ * @return string|string[]
+ */
+function replace_occurrence($string, $values)
+{
+ $occurrences = $values->map(function ($message, $key) {
+ return [
+ 'key' => ":$key",
+ 'message' => $message,
+ ];
+ });
+
+ return str_ireplace(
+ $occurrences->pluck('key')->toArray(), $occurrences->pluck('message')->toArray(), $string
+ );
+}
diff --git a/app/Invoice.php b/app/Invoice.php
deleted file mode 100644
index 7bcc7b62..00000000
--- a/app/Invoice.php
+++ /dev/null
@@ -1,64 +0,0 @@
- 'array',
- 'client' => 'array',
- 'bag' => 'array',
- ];
-
- /**
- * Get user instance
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasOne
- */
- public function user() {
- return $this->hasOne(User::class, 'id', 'user_id');
- }
-}
diff --git a/app/Models/File.php b/app/Models/File.php
new file mode 100644
index 00000000..3a75fca2
--- /dev/null
+++ b/app/Models/File.php
@@ -0,0 +1,213 @@
+ 'array',
+ ];
+
+ protected $hidden = [
+ 'author_id'
+ ];
+
+ /**
+ * Sortable columns
+ *
+ * @var string[]
+ */
+ public $sortable = [
+ 'name',
+ 'created_at',
+ ];
+
+ public $incrementing = false;
+
+ protected $keyType = 'string';
+
+ /**
+ * Set routes with public access
+ *
+ * @param $token
+ */
+ public function setPublicUrl($token)
+ {
+ $this->public_access = $token;
+ }
+
+ /**
+ * Format created at date
+ *
+ * @return string
+ */
+ public function getCreatedAtAttribute()
+ {
+ return format_date(set_time_by_user_timezone($this->attributes['created_at']), __t('time'));
+ }
+
+ /**
+ * Form\a\t created at date reformat
+ *
+ * @return string
+ */
+ public function getDeletedAtAttribute()
+ {
+ if (!$this->attributes['deleted_at']) return null;
+
+ return format_date(set_time_by_user_timezone($this->attributes['deleted_at']), __t('time'));
+ }
+
+ /**
+ * Format fileSize
+ *
+ * @return string
+ */
+ public function getFilesizeAttribute()
+ {
+ return Metric::bytes($this->attributes['filesize'])->format();
+ }
+
+ /**
+ * Format thumbnail url
+ *
+ * @return string
+ */
+ public function getThumbnailAttribute()
+ {
+ // Get thumbnail from external storage
+ if ($this->attributes['thumbnail'] && ! is_storage_driver(['local'])) {
+
+ return Storage::temporaryUrl('files/' . $this->attributes['thumbnail'], now()->addHour());
+ }
+
+ // Get thumbnail from local storage
+ if ($this->attributes['thumbnail']) {
+
+ // Thumbnail route
+ $route = route('thumbnail', ['name' => $this->attributes['thumbnail']]);
+
+ if ($this->public_access) {
+ return "$route/$this->public_access";
+ }
+
+ return $route;
+ }
+
+ return null;
+ }
+
+ /**
+ * Format file url
+ *
+ * @return string
+ */
+ public function getFileUrlAttribute()
+ {
+ // Get file from external storage
+ if (! is_storage_driver(['local'])) {
+
+ $file_pretty_name = is_storage_driver('backblaze')
+ ? Str::snake(mb_strtolower($this->attributes['name']))
+ : get_pretty_name($this->attributes['basename'], $this->attributes['name'], $this->attributes['mimetype']);
+
+ $header = [
+ "ResponseAcceptRanges" => "bytes",
+ "ResponseContentType" => $this->attributes['mimetype'],
+ "ResponseContentLength" => $this->attributes['filesize'],
+ "ResponseContentRange" => "bytes 0-600/" . $this->attributes['filesize'],
+ 'ResponseContentDisposition' => 'attachment; filename=' . $file_pretty_name,
+ ];
+
+ return Storage::temporaryUrl('files/' . $this->attributes['basename'], now()->addDay(), $header);
+ }
+
+ // Get thumbnail from local storage
+ $route = route('file', ['name' => $this->attributes['basename']]);
+
+ if ($this->public_access) {
+ return "$route/$this->public_access";
+ }
+
+ return $route;
+ }
+
+ /**
+ * Index file
+ *
+ * @return array
+ */
+ public function toSearchableArray()
+ {
+ $array = $this->toArray();
+ $name = Str::slug($array['name'], ' ');
+
+ return [
+ 'id' => $this->id,
+ 'name' => $name,
+ 'nameNgrams' => utf8_encode((new TNTIndexer)->buildTrigrams(implode(', ', [$name]))),
+ ];
+ }
+
+ /**
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function parent()
+ {
+ return $this->belongsTo(Folder::class, 'folder_id', 'id');
+ }
+
+ /**
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
+ */
+ public function folder()
+ {
+ return $this->hasOne(Folder::class, 'id', 'folder_id');
+ }
+
+ /**
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
+ */
+ public function shared()
+ {
+ return $this->hasOne(Share::class, 'item_id', 'id');
+ }
+
+ /**
+ * Model events
+ */
+ protected static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($file) {
+ $file->id = (string)Str::uuid();
+ });
+ }
+}
diff --git a/app/Models/Folder.php b/app/Models/Folder.php
new file mode 100644
index 00000000..a12314e9
--- /dev/null
+++ b/app/Models/Folder.php
@@ -0,0 +1,250 @@
+ 'array',
+ ];
+
+ protected $hidden = [
+ 'author_id'
+ ];
+
+ /**
+ * Sortable columns
+ *
+ * @var string[]
+ */
+ public $sortable = [
+ 'name',
+ 'created_at',
+ ];
+
+ public $incrementing = false;
+
+ protected $keyType = 'string';
+
+ public function getTypeAttribute()
+ {
+ return 'folder';
+ }
+
+ /**
+ * Index folder
+ *
+ * @return array
+ */
+ public function toSearchableArray()
+ {
+ $array = $this->toArray();
+ $name = Str::slug($array['name'], ' ');
+
+ return [
+ 'id' => $this->id,
+ 'name' => $name,
+ 'nameNgrams' => utf8_encode((new TNTIndexer)->buildTrigrams(implode(', ', [$name]))),
+ ];
+ }
+
+ /**
+ * Counts how many folder have items
+ *
+ * @return int
+ */
+ public function getItemsAttribute()
+ {
+ $folders = $this->folders()->count();
+ $files = $this->files()->count();
+
+ return $folders + $files;
+ }
+
+ /**
+ * Counts how many folder have items
+ *
+ * @return int
+ */
+ public function getTrashedItemsAttribute()
+ {
+ $folders = $this->trashed_folders()->count();
+ $files = $this->trashed_files()->count();
+
+ return $folders + $files;
+ }
+
+ /**
+ * Format created at date reformat
+ *
+ * @return string
+ */
+ public function getCreatedAtAttribute()
+ {
+ return format_date(set_time_by_user_timezone($this->attributes['created_at']), __t('time'));
+ }
+
+ /**
+ * Format created at date reformat
+ *
+ * @return string
+ */
+ public function getDeletedAtAttribute()
+ {
+ if (!$this->attributes['deleted_at']) return null;
+
+ return format_date(set_time_by_user_timezone($this->attributes['deleted_at']), __t('time'));
+ }
+
+ /**
+ * Get parent
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
+ */
+ public function parent()
+ {
+ return $this->belongsTo(Folder::class, 'parent_id', 'id');
+ }
+
+ public function folderIds()
+ {
+ return $this->children()->with('folderIds')->select(['id', 'parent_id']);
+ }
+
+ /**
+ * Get all files
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function files()
+ {
+ return $this->hasMany(File::class, 'folder_id', 'id');
+ }
+
+ /**
+ * Get all trashed files
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function trashed_files()
+ {
+
+ return $this->hasMany(File::class, 'folder_id', 'id')->withTrashed();
+ }
+
+ /**
+ * Get all folders
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function folders()
+ {
+ return $this->children()->with('folders');
+ }
+
+ /**
+ * Get all trashed folders
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function trashed_folders()
+ {
+ return $this->children()->with('trashed_folders')->withTrashed()->select(['parent_id', 'id', 'name']);
+ }
+
+ /**
+ * Get childrens
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function children()
+ {
+ return $this->hasMany(Folder::class, 'parent_id', 'id');
+ }
+
+ /**
+ * Get trashed childrens
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function trashed_children()
+ {
+ return $this->hasMany(Folder::class, 'parent_id', 'id')->withTrashed();
+ }
+
+ /**
+ * Get sharing attributes
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
+ */
+ public function shared()
+ {
+ return $this->hasOne(Share::class, 'item_id', 'id');
+ }
+
+ // Delete all folder children
+ public static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($model) {
+ $model->id = (string)Str::uuid();
+ });
+
+ static::deleting(function ($item) {
+
+ if ($item->isForceDeleting()) {
+
+ $item->trashed_children()->each(function ($folder) {
+ $folder->forceDelete();
+ });
+
+ } else {
+
+ $item->children()->each(function ($folder) {
+ $folder->delete();
+ });
+
+ $item->files()->each(function ($file) {
+ $file->delete();
+ });
+ }
+ });
+
+ static::restoring(function ($item) {
+
+ // Restore children folders
+ $item->trashed_children()->each(function ($folder) {
+ $folder->restore();
+ });
+
+ // Restore children files
+ $item->trashed_files()->each(function ($files) {
+ $files->restore();
+ });
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php
new file mode 100644
index 00000000..f663d49d
--- /dev/null
+++ b/app/Models/Invoice.php
@@ -0,0 +1,25 @@
+ 'array',
+ 'client' => 'array',
+ 'bag' => 'array',
+ ];
+
+ /**
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
+ */
+ public function user() {
+ return $this->hasOne(User::class, 'id', 'user_id');
+ }
+}
diff --git a/app/Models/Language.php b/app/Models/Language.php
new file mode 100644
index 00000000..ade8035b
--- /dev/null
+++ b/app/Models/Language.php
@@ -0,0 +1,62 @@
+hasMany(LanguageTranslation::class, 'lang', 'locale');
+ }
+
+ protected static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($language) {
+ $language->id = Str::uuid();
+
+ resolve(HelperService::class)
+ ->create_default_language_translations(
+ get_setting('license') ?? 'extended', $language->locale
+ );
+ });
+
+ static::updating(function ($language) {
+ cache()->forget("language-translations-$language->locale");
+ });
+
+ static::deleting(function ($language) {
+ DB::table('language_translations')
+ ->whereLang($language->locale)
+ ->delete();
+
+ cache()->forget("language-translations-$language->locale");
+ });
+ }
+}
diff --git a/app/Models/LanguageTranslation.php b/app/Models/LanguageTranslation.php
new file mode 100644
index 00000000..c6fe28b4
--- /dev/null
+++ b/app/Models/LanguageTranslation.php
@@ -0,0 +1,18 @@
+ 'boolean'
+ ];
+
+ /**
+ * Generate share link
+ *
+ * @return string
+ */
+ public function getLinkAttribute()
+ {
+ return url('/share', ['token' => $this->attributes['token']]);
+ }
+
+ public function user()
+ {
+ return $this->hasOne(User::class, 'id', 'user_id');
+ }
+
+ /**
+ * Model events
+ */
+ protected static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($shared) {
+ $shared->id = (string)Str::uuid();
+ $shared->token = Str::random(16);
+ });
+ }
+}
diff --git a/app/Models/Traffic.php b/app/Models/Traffic.php
new file mode 100644
index 00000000..f236446f
--- /dev/null
+++ b/app/Models/Traffic.php
@@ -0,0 +1,34 @@
+id = (string)Str::uuid();
+ });
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
new file mode 100644
index 00000000..d9b6ae6e
--- /dev/null
+++ b/app/Models/User.php
@@ -0,0 +1,274 @@
+ 'string',
+ 'email_verified_at' => 'datetime',
+ ];
+
+ protected $appends = [
+ 'used_capacity',
+ 'storage'
+ ];
+
+ public $sortable = [
+ 'id',
+ 'name',
+ 'role',
+ 'created_at',
+ 'storage_capacity',
+ ];
+
+ public $incrementing = false;
+
+ protected $keyType = 'string';
+
+ /**
+ * Get tax rate id for user
+ *
+ * @return array
+ */
+ public function taxRates()
+ {
+ // Get tax rates
+ $rates = collect(resolve(StripeService::class)->getTaxRates());
+
+ // Find tax rate
+ $user_tax_rate = $rates->first(function ($item) {
+ return $item['country'] === $this->settings->country && $item['active'];
+ });
+
+ return $user_tax_rate ? [$user_tax_rate['id']] : [];
+ }
+
+ /**
+ * Get user used storage details
+ *
+ * @return mixed
+ */
+ public function getStorageAttribute()
+ {
+ // Get storage limitation setup
+ $storage_limitation = get_setting('storage_limitation');
+ $is_storage_limit = $storage_limitation ? $storage_limitation : 1;
+
+ // Get user storage usage
+ if (!$is_storage_limit) {
+
+ return [
+ 'used' => $this->used_capacity,
+ 'used_formatted' => Metric::bytes($this->used_capacity)->format(),
+ ];
+ }
+
+ return [
+ 'used' => (float)get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity),
+ 'used_formatted' => get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity) . '%',
+ 'capacity' => $this->settings->storage_capacity,
+ 'capacity_formatted' => format_gigabytes($this->settings->storage_capacity),
+ ];
+ }
+
+ /**
+ * Get user used storage capacity in bytes
+ *
+ * @return mixed
+ */
+ public function getUsedCapacityAttribute()
+ {
+ $user_capacity = $this->files_with_trashed->map(function ($item) {
+ return $item->getRawOriginal();
+ })->sum('filesize');
+
+ return $user_capacity;
+ }
+
+ /**
+ * Get user full folder tree
+ *
+ * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
+ */
+ public function getFolderTreeAttribute()
+ {
+ return Folder::with(['folders.shared', 'shared:token,id,item_id,permission,is_protected,expire_in'])
+ ->where('parent_id', null)
+ ->where('user_id', $this->id)
+ ->sortable()
+ ->get();
+ }
+
+ /**
+ * Set user billing info
+ *
+ * @param $billing
+ * @return UserSettings
+ */
+ public function setBilling($billing)
+ {
+ $this->settings()->update([
+ 'address' => $billing['billing_address'],
+ 'city' => $billing['billing_city'],
+ 'country' => $billing['billing_country'],
+ 'name' => $billing['billing_name'],
+ 'phone_number' => $billing['billing_phone_number'],
+ 'postal_code' => $billing['billing_postal_code'],
+ 'state' => $billing['billing_state'],
+ ]);
+
+ return $this->settings;
+ }
+
+ /**
+ * Send the password reset notification.
+ *
+ * @param string $token
+ * @return void
+ */
+ public function sendPasswordResetNotification($token)
+ {
+ $this->notify(new ResetPassword($token));
+ }
+
+ /**
+ * Record user upload filesize
+ *
+ * @param $file_size
+ */
+ public function record_upload($file_size)
+ {
+ $now = now();
+
+ $record = Traffic::whereYear('created_at', '=', $now->year)
+ ->whereMonth('created_at', '=', $now->month)
+ ->firstOrCreate([
+ 'user_id' => $this->id,
+ ]);
+
+ $record->update([
+ 'upload' => $record->upload + $file_size
+ ]);
+ }
+
+ /**
+ * Record user download filesize
+ *
+ * @param $file_size
+ */
+ public function record_download($file_size)
+ {
+ $now = now();
+
+ $record = Traffic::whereYear('created_at', '=', $now->year)
+ ->whereMonth('created_at', '=', $now->month)
+ ->firstOrCreate([
+ 'user_id' => $this->id,
+ ]);
+
+ $record->update([
+ 'download' => $record->download + $file_size
+ ]);
+ }
+
+ /**
+ * Get user favourites folder
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function favouriteFolders()
+ {
+ return $this->belongsToMany(Folder::class, 'favourite_folder', 'user_id', 'folder_id', 'id', 'id')
+ ->with('shared:token,id,item_id,permission,is_protected,expire_in');
+ }
+
+ /**
+ * Get 5 latest uploads
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder
+ */
+ public function latest_uploads()
+ {
+ return $this->hasMany(File::class)->with(['parent:id,name'])->take(40);
+ }
+
+ /**
+ * Get all user files
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function files()
+ {
+ return $this->hasMany(File::class);
+ }
+
+ /**
+ * Get all user files
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasMany
+ */
+ public function files_with_trashed()
+ {
+ return $this->hasMany(File::class)->withTrashed();
+ }
+
+ /**
+ * Get user attributes
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\HasOne
+ */
+ public function settings()
+ {
+ return $this->hasOne(UserSettings::class);
+ }
+
+ /**
+ * Model Events
+ */
+ protected static function boot()
+ {
+ parent::boot();
+
+ static::creating(function ($user) {
+ $user->id = Str::uuid();
+
+ // Create user directory for his files
+ Storage::makeDirectory("files/$user->id");
+ });
+
+ static::deleted(function ($user) {
+ resolve(HelperService::class)
+ ->erase_user_data($user);
+ });
+ }
+}
diff --git a/app/Models/UserSettings.php b/app/Models/UserSettings.php
new file mode 100644
index 00000000..4cebe231
--- /dev/null
+++ b/app/Models/UserSettings.php
@@ -0,0 +1,36 @@
+attributes['avatar'] && is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
+ return Storage::temporaryUrl($this->attributes['avatar'], now()->addDay());
+ }
+
+ // Get avatar from local storage
+ if ($this->attributes['avatar']) {
+ return url('/' . $this->attributes['avatar']);
+ }
+
+ return url('/assets/images/' . 'default-avatar.png');
+ }
+}
diff --git a/app/Zip.php b/app/Models/Zip.php
similarity index 64%
rename from app/Zip.php
rename to app/Models/Zip.php
index 55b1454c..0bca6e7e 100644
--- a/app/Zip.php
+++ b/app/Models/Zip.php
@@ -1,20 +1,28 @@
hasOne(User::class, 'id', 'user_id');
+ }
+
/**
- * Generate uuid
+ * Model events
*/
protected static function boot()
{
diff --git a/app/Notifications/ResetPassword.php b/app/Notifications/ResetPassword.php
index 74320caa..8225c344 100644
--- a/app/Notifications/ResetPassword.php
+++ b/app/Notifications/ResetPassword.php
@@ -41,14 +41,15 @@ class ResetPassword extends Notification
public function toMail($notifiable)
{
$reset_url = url('/create-new-password?token=' . $this->token);
+ $app_name = get_setting('app_title') ?? 'VueFileManager';
return (new MailMessage)
- ->subject(__('vuefilemanager.reset_password_subject') . config('vuefilemanager.app_name'))
- ->greeting(__('vuefilemanager.reset_password_greeting'))
- ->line(__('vuefilemanager.reset_password_line_1'))
- ->action(__('vuefilemanager.reset_password_action'), $reset_url)
- ->line(__('vuefilemanager.reset_password_line_2'))
- ->salutation(__('vuefilemanager.salutation') . ', ' . config('vuefilemanager.app_name'));
+ ->subject(__t('reset_password_subject') . $app_name)
+ ->greeting(__t('reset_password_greeting'))
+ ->line(__t('reset_password_line_1'))
+ ->action(__t('reset_password_action'), $reset_url)
+ ->line(__t('reset_password_line_2'))
+ ->salutation(__t('salutation') . ', ' . $app_name);
}
/**
diff --git a/app/Notifications/SharedSendViaEmail.php b/app/Notifications/SharedSendViaEmail.php
index 7cd1a2b5..adb8f9a2 100644
--- a/app/Notifications/SharedSendViaEmail.php
+++ b/app/Notifications/SharedSendViaEmail.php
@@ -43,10 +43,11 @@ class SharedSendViaEmail extends Notification
public function toMail($notifiable)
{
return (new MailMessage)
- ->subject(__('vuefilemanager.shared_link_email_subject' , ['user' => $this->user->name]))
- ->greeting(__('vuefilemanager.shared_link_email_greeting'))
- ->line(__('vuefilemanager.shared_link_email_user', ['user' => $this->user->name, 'email' => $this->user->email]))
- ->action(__('vuefilemanager.shared_link_email_link'), url('/shared', ['token' => $this->token]));
+ ->subject(__t('shared_link_email_subject', ['user' => $this->user->name]))
+ ->greeting(__t('shared_link_email_greeting'))
+ ->line(__t('shared_link_email_user', ['user' => $this->user->name, 'email' => $this->user->email]))
+ ->action(__t('shared_link_email_link'), url('/shared', ['token' => $this->token]))
+ ->salutation(__t('shared_link_email_salutation', ['app_name' => get_setting('app_title') ?? 'VueFileManager']));
}
/**
diff --git a/app/Page.php b/app/Page.php
deleted file mode 100644
index 11c54f38..00000000
--- a/app/Page.php
+++ /dev/null
@@ -1,45 +0,0 @@
-commands([
- InstallCommand::class,
- ClientCommand::class,
- KeysCommand::class,
- ]);
+ // Get all migrations with all directories
+ $this->loadMigrationsFrom(
+ $this->get_migration_paths()
+ );
+ }
+
+ /**
+ * @return array
+ */
+ private function get_migration_paths(): array
+ {
+ $mainPath = database_path('migrations');
+ $directories = glob($mainPath . '/*', GLOB_ONLYDIR);
+
+ return array_merge([$mainPath], $directories);
}
}
diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php
index 407365cc..11bcf1d6 100644
--- a/app/Providers/AuthServiceProvider.php
+++ b/app/Providers/AuthServiceProvider.php
@@ -4,7 +4,7 @@ namespace App\Providers;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
-use Laravel\Passport\Passport;
+//use Laravel\Passport\Passport;
class AuthServiceProvider extends ServiceProvider
{
@@ -30,19 +30,5 @@ class AuthServiceProvider extends ServiceProvider
Gate::define('admin-settings', function ($user) {
return $user->role === 'admin';
});
-
- Passport::routes();
-
- Passport::tokensCan([
- 'master' => 'Master',
- 'editor' => 'Editor',
- 'visitor' => 'Visitor',
- ]);
-
- Passport::setDefaultScope([
- 'master',
- 'editor',
- 'visitor',
- ]);
}
}
diff --git a/app/Providers/FortifyServiceProvider.php b/app/Providers/FortifyServiceProvider.php
new file mode 100644
index 00000000..0e901392
--- /dev/null
+++ b/app/Providers/FortifyServiceProvider.php
@@ -0,0 +1,47 @@
+by($request->email.$request->ip());
+ });
+
+ RateLimiter::for('two-factor', function (Request $request) {
+ return Limit::perMinute(5)->by($request->session()->get('login.id'));
+ });
+ }
+}
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
index 527eee34..62414734 100644
--- a/app/Providers/RouteServiceProvider.php
+++ b/app/Providers/RouteServiceProvider.php
@@ -30,8 +30,6 @@ class RouteServiceProvider extends ServiceProvider
*/
public function boot()
{
- //
-
parent::boot();
}
@@ -44,9 +42,19 @@ class RouteServiceProvider extends ServiceProvider
{
$this->mapApiRoutes();
- $this->mapWebRoutes();
+ $this->mapShareRoutes();
- //
+ $this->mapAdminApiRoutes();
+
+ $this->mapSetupWizardApiRoutes();
+
+ $this->mapUserApiRoutes();
+
+ $this->mapMaintenanceRoutes();
+
+ $this->mapFileRoutes();
+
+ $this->mapWebRoutes();
}
/**
@@ -59,8 +67,22 @@ class RouteServiceProvider extends ServiceProvider
protected function mapWebRoutes()
{
Route::middleware('web')
- ->namespace($this->namespace)
- ->group(base_path('routes/web.php'));
+ ->namespace($this->namespace)
+ ->group(base_path('routes/web.php'));
+ }
+
+ protected function mapMaintenanceRoutes()
+ {
+ Route::middleware('web')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/maintenance.php'));
+ }
+
+ protected function mapFileRoutes()
+ {
+ Route::middleware('web')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/file.php'));
}
/**
@@ -73,8 +95,40 @@ class RouteServiceProvider extends ServiceProvider
protected function mapApiRoutes()
{
Route::prefix('api')
- ->middleware('api')
- ->namespace($this->namespace)
- ->group(base_path('routes/api.php'));
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/api.php'));
+ }
+
+ protected function mapShareRoutes()
+ {
+ Route::prefix('api')
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/share.php'));
+ }
+
+ protected function mapAdminApiRoutes()
+ {
+ Route::prefix('api/admin')
+ ->middleware(['api', 'auth:sanctum'])
+ ->namespace($this->namespace)
+ ->group(base_path('routes/admin.php'));
+ }
+
+ protected function mapUserApiRoutes()
+ {
+ Route::prefix('api/user')
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/user.php'));
+ }
+
+ protected function mapSetupWizardApiRoutes()
+ {
+ Route::prefix('api/setup')
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/setup.php'));
}
}
diff --git a/app/Http/Tools/Demo.php b/app/Services/DemoService.php
similarity index 53%
rename from app/Http/Tools/Demo.php
rename to app/Services/DemoService.php
index 573b06c3..2060f9f5 100644
--- a/app/Http/Tools/Demo.php
+++ b/app/Services/DemoService.php
@@ -1,13 +1,13 @@
user() ? $request->user()->token()->scopes[0] : 'editor';
- $name = $request->has('name') ? $request->input('name') : 'New Folder';
-
return [
'user_id' => 1,
- 'id' => random_int(1000, 9999),
+ 'id' => Str::uuid(),
'parent_id' => random_int(1000, 9999),
- 'name' => $name,
+ 'name' => $request->name,
'type' => 'folder',
- 'unique_id' => random_int(1000, 9999),
- 'user_scope' => $user_scope,
+ 'author' => $request->user() ? 'user' : 'visitor',
'items' => '0',
- 'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
- 'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
+ 'color' => isset($request->icon['color']) ? $request->icon['color'] : null,
+ 'emoji' => isset($request->icon['emoji']) ? $request->icon['emoji'] : null,
+ 'updated_at' => now()->format('j M Y \a\t H:i'),
+ 'created_at' => now()->format('j M Y \a\t H:i'),
];
}
@@ -51,38 +48,38 @@ class Demo
* Rename item name
*
* @param RenameItemRequest $request
- * @param $unique_id
+ * @param $id
* @return mixed
*/
- public static function rename_item($request, $unique_id)
+ function rename_item($request, $id)
{
// Get item
if ($request->type === 'folder') {
- $item = FileManagerFolder::where('unique_id', $unique_id)
+ $item = Folder::where('id', $id)
->where('user_id', 1)
->first();
} else {
- $item = FileManagerFile::where('unique_id', $unique_id)
+ $item = File::where('id', $id)
->where('user_id', 1)
->first();
}
if ($item) {
$item->name = $request->name;
- $item->icon_emoji = $request->folder_icon['emoji'] ?? null;
- $item->icon_color = $request->folder_icon['color'] ?? null;
+ $item->emoji = $request->icon['emoji'] ?? null;
+ $item->color = $request->icon['color'] ?? null;
return $item;
} else {
return [
- 'unique_id' => $request->unique_id,
- 'name' => $request->name,
- 'type' => $request->type,
+ 'id' => $request->id,
+ 'name' => $request->name,
+ 'type' => $request->type,
];
}
}
@@ -94,11 +91,8 @@ class Demo
* @return array
* @throws \Exception
*/
- public static function upload($request)
+ function upload($request)
{
- // Get user data
- $user_scope = $request->user() ? $request->user()->token()->scopes[0] : 'editor';
-
// File
$file = $request->file('file');
$filename = Str::random() . '-' . str_replace(' ', '', $file->getClientOriginalName());
@@ -107,8 +101,7 @@ class Demo
$filetype = get_file_type($file->getMimeType());
return [
- 'id' => random_int(1000, 9999),
- 'unique_id' => random_int(1000, 9999),
+ 'id' => Str::uuid(),
'folder_id' => $request->parent_id,
'thumbnail' => 'data:' . $request->file('file')->getMimeType() . ';base64, ' . base64_encode(file_get_contents($request->file('file'))),
'name' => $file->getClientOriginalName(),
@@ -117,31 +110,20 @@ class Demo
'filesize' => Metric::bytes($filesize)->format(),
'type' => $filetype,
'file_url' => 'https://vuefilemanager.hi5ve.digital/assets/vue-file-manager-preview.jpg',
- 'user_scope' => $user_scope,
- 'created_at' => Carbon::now()->format('j M Y \a\t H:i'),
- 'updated_at' => Carbon::now()->format('j M Y \a\t H:i'),
+ 'author' => $request->user() ? 'user' : 'visitor',
+ 'created_at' => now()->format('j M Y \a\t H:i'),
+ 'updated_at' => now()->format('j M Y \a\t H:i'),
];
}
/**
* Return 204 status
*
+ * @param $user
* @return ResponseFactory|\Illuminate\Http\Response
*/
- public static function response_204()
+ function favourites($user)
{
-
- return response('Done!', 204);
- }
-
- /**
- * Return 204 status
- *
- * @return ResponseFactory|\Illuminate\Http\Response
- */
- public static function favourites($user)
- {
-
- return $user->favourite_folders->makeHidden(['pivot']);
+ return $user->favouriteFolders->makeHidden(['pivot']);
}
}
\ No newline at end of file
diff --git a/app/Services/FileManagerService.php b/app/Services/FileManagerService.php
new file mode 100644
index 00000000..b7b2a90a
--- /dev/null
+++ b/app/Services/FileManagerService.php
@@ -0,0 +1,469 @@
+helper = resolve(HelperService::class);
+ }
+
+ /**
+ * Zip requested folder
+ *
+ * @param $id
+ * @param $shared
+ * @return mixed
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function zip_folder($id, $shared = null)
+ {
+ // Get folder
+ $requested_folder = Folder::with(['folders.files', 'files'])
+ ->where('id', $id)
+ ->where('user_id', Auth::id() ?? $shared->user_id)
+ ->with('folders')
+ ->first();
+
+ $files = get_files_for_zip($requested_folder, collect([]));
+
+ // Local storage instance
+ $disk_local = Storage::disk('local');
+
+ // Move file to local storage from external storage service
+ if (!is_storage_driver('local')) {
+ $files->each(function ($file) use ($disk_local) {
+ try {
+ $disk_local->put("temp/$file->basename", Storage::get("files/$file->user_id/$file->basename"));
+ } catch (FileNotFoundException $e) {
+ throw new HttpException(404, 'File not found');
+ }
+ });
+ }
+
+ // Get zip path
+ $zip_name = Str::random(16) . '-' . Str::slug($requested_folder->name) . '.zip';
+
+ // Create zip
+ $zip = Madzipper::make($disk_local->path("zip/$zip_name"));
+
+ // Get files folder on local storage drive
+ $directory = is_storage_driver('local') ? 'files' : 'temp';
+
+ // Add files to zip
+ foreach ($files as $file) {
+ $zip
+ ->folder($file['folder_path'])
+ ->addString(
+ "{$file['name']}.{$file['mimetype']}",
+ File::get($disk_local->path("/$directory/$requested_folder->user_id/{$file['basename']}"))
+ );
+ }
+
+ // Close zip
+ $zip->close();
+
+ // Delete temporary files
+ if (!is_storage_driver('local')) {
+
+ foreach ($files as $file) {
+ $disk_local->delete('temp/' . $file['basename']);
+ }
+ }
+
+ // Store zip record
+ return Zip::create([
+ 'user_id' => $shared->user_id ?? Auth::id(),
+ 'shared_token' => $shared->token ?? null,
+ 'basename' => $zip_name,
+ ]);
+ }
+
+ /**
+ * Zip selected files, store it in /zip folder and retrieve zip record
+ *
+ * @param $files
+ * @param null $shared
+ * @return mixed
+ * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
+ */
+ public function zip_files($files, $shared = null)
+ {
+ // Local storage instance
+ $disk_local = Storage::disk('local');
+
+ // Move file to local storage from external storage service
+ if (!is_storage_driver('local')) {
+ $files->each(function ($file) use ($disk_local) {
+ try {
+ $disk_local->put("temp/$file->basename", Storage::get("files/$file->user_id/$file->basename"));
+ } catch (FileNotFoundException $e) {
+ throw new HttpException(404, 'File not found');
+ }
+ });
+ }
+
+ // Get zip path
+ $zip_name = Str::random(16) . '.zip';
+
+ // Create zip
+ $zip = Madzipper::make($disk_local->path("zip/$zip_name"));
+
+ // Get files folder on local storage drive
+ $directory = is_storage_driver('local') ? 'files' : 'temp';
+
+ // Add files to zip
+ $files->each(function ($file) use ($zip, $directory, $disk_local) {
+ $zip->addString(
+ "$file->name.$file->mimetype",
+ File::get($disk_local->path("/$directory/$file->user_id/$file->basename")));
+ });
+
+ // Close zip
+ $zip->close();
+
+ // Delete temporary files
+ if (!is_storage_driver('local')) {
+ $files->each(function ($file) use ($disk_local) {
+ $disk_local->delete("temp/$file->basename");
+ });
+ }
+
+ // Store zip record
+ return Zip::create([
+ 'user_id' => $shared->user_id ?? Auth::id(),
+ 'shared_token' => $shared->token ?? null,
+ 'basename' => $zip_name,
+ ]);
+ }
+
+ /**
+ * Create new directory
+ *
+ * @param $request
+ * @param null $shared
+ * @return Folder|\Illuminate\Database\Eloquent\Model
+ */
+ public function create_folder($request, $shared = null)
+ {
+ return Folder::create([
+ 'parent_id' => $request->parent_id,
+ 'author' => $shared ? 'visitor' : 'user',
+ 'user_id' => $shared ? $shared->user_id : Auth::id(),
+ 'name' => $request->name,
+ 'color' => $request->color ?? null,
+ 'emoji' => $request->emoji ?? null,
+ ]);;
+ }
+
+ /**
+ * Rename item name
+ *
+ * @param RenameItemRequest $request
+ * @param $id
+ * @param null $shared
+ * @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
+ * @throws \Exception
+ */
+ public function rename_item($request, $id, $shared = null)
+ {
+ // Get user id
+ $user_id = $shared ? $shared->user_id : Auth::id();
+
+ // Get item
+ $item = get_item($request->type, $id, $user_id);
+
+ // Rename item
+ $item->update([
+ 'name' => $request->name
+ ]);
+
+ // Return updated item
+ return $item;
+ }
+
+ /**
+ * Delete file or folder
+ *
+ * @param $item
+ * @param $id
+ * @param null $shared
+ * @throws \Exception
+ */
+ public function delete_item($item, $id, $shared = null)
+ {
+ // Delete folder
+ if ($item['type'] === 'folder') {
+
+ // Get folder
+ $folder = Folder::withTrashed()
+ ->with('folders')
+ ->find($id);
+
+ // Get folder shared record
+ $shared = Share::where('type', 'folder')
+ ->where('item_id', $id)
+ ->first();
+
+ // Delete folder shared record
+ if ($shared) {
+ $shared->delete();
+ }
+
+ // Remove folder from user favourites
+ DB::table('favourite_folder')
+ ->where('folder_id', $folder->id)
+ ->delete();
+
+ // Soft delete items
+ if (!$item['force_delete']) {
+
+ // Soft delete folder record
+ $folder->delete();
+ }
+
+ // Force delete children files
+ if ($item['force_delete']) {
+
+ // Get children folder ids
+ $child_folders = filter_folders_ids($folder->trashed_folders, 'id');
+
+ // Get children files
+ $files = UserFile::onlyTrashed()
+ ->whereIn('folder_id', Arr::flatten([$id, $child_folders]))
+ ->get();
+
+ // Remove all children files
+ foreach ($files as $file) {
+
+ // Delete file
+ Storage::delete("/files/$file->user_id/$file->basename");
+
+ // Delete thumbnail if exist
+ if ($file->thumbnail) {
+ Storage::delete(
+ "/files/$file->user_id/{$file->getRawOriginal('thumbnail')}"
+ );
+ }
+
+ // Delete file permanently
+ $file->forceDelete();
+ }
+
+ // Delete folder record
+ $folder->forceDelete();
+ }
+ }
+
+ // Delete item
+ if ($item['type'] !== 'folder') {
+
+ // Get file
+ $file = UserFile::withTrashed()
+ ->find($id);
+
+ // Get folder shared record
+ $shared = Share::where('type', 'file')
+ ->where('item_id', $id)
+ ->first();
+
+ // Delete file shared record
+ if ($shared) {
+ $shared->delete();
+ }
+
+ // Force delete file
+ if ($item['force_delete']) {
+
+ // Delete file
+ Storage::delete("/files/$file->user_id/$file->basename");
+
+ // Delete thumbnail if exist
+ if ($file->thumbnail) {
+ Storage::delete(
+ "/files/$file->user_id/{$file->getRawOriginal('thumbnail')}"
+ );
+ }
+
+ // Delete file permanently
+ $file->forceDelete();
+ }
+
+ // Soft delete file
+ if (!$item['force_delete']) {
+
+ // Soft delete file
+ $file->delete();
+ }
+ }
+ }
+
+ /**
+ * Move folder or file to new location
+ *
+ * @param $request
+ * @param $to_id
+ */
+ public function move($request, $to_id)
+ {
+ foreach ($request->items as $item) {
+
+ // Move folder
+ if ($item['type'] === 'folder') {
+
+ Folder::find($item['id'])
+ ->update([
+ 'parent_id' => $to_id
+ ]);
+ }
+
+ // Move file
+ if ($item['type'] !== 'folder') {
+ UserFile::find($item['id'])
+ ->update([
+ 'folder_id' => $to_id
+ ]);
+ }
+ }
+ }
+
+ /**
+ * Upload file
+ *
+ * @param $request
+ * @param null $shared
+ * @return File|\Illuminate\Database\Eloquent\Model
+ * @throws \Exception
+ */
+ public function upload($request, $shared = null)
+ {
+ // Get parent_id from request
+ $file = $request->file('file');
+
+ // File name
+ $user_file_name = basename('chunks/' . substr($file->getClientOriginalName(), 17), '.part');
+ $disk_file_name = basename('chunks/' . $file->getClientOriginalName(), '.part');
+ $temp_filename = $file->getClientOriginalName();
+
+ // File Path
+ $file_path = Storage::disk('local')->path('chunks/' . $temp_filename);
+
+ // Generate file
+ File::append($file_path, $file->get());
+
+ // Size of file
+ $file_size = File::size($file_path);
+
+ // Size of limit
+ $limit = get_setting('upload_limit');
+
+ // File size handling
+ if ($limit && $file_size > format_bytes($limit)) abort(413);
+
+ // If last then process file
+ if ($request->boolean('is_last')) {
+
+ $metadata = get_image_meta_data($file);
+
+ $disk_local = Storage::disk('local');
+
+ // Get user data
+ $user_id = $shared ? $shared->user_id : Auth::id();
+
+ // File Info
+ $file_size = $disk_local->size('chunks/' . $temp_filename);
+
+ $file_mimetype = $disk_local->mimeType('chunks/' . $temp_filename);
+
+ // Check if user has enough space to upload file
+ $this->helper->check_user_storage_capacity($user_id, $file_size, $temp_filename);
+
+ // Create thumbnail
+ $thumbnail = $this->helper->create_image_thumbnail('chunks/' . $temp_filename, $disk_file_name, $user_id);
+
+ // Move finished file from chunk to file-manager directory
+ $disk_local->move('chunks/' . $temp_filename, "files/$user_id/$disk_file_name");
+
+ // Move files to external storage
+ if (!is_storage_driver(['local'])) {
+
+ // Move file to external storage service
+ $this->helper->move_file_to_external_storage($disk_file_name, $thumbnail);
+ }
+
+ // Store user upload size
+ User::find($user_id)
+ ->record_upload($file_size);
+
+ // Return new file
+ return UserFile::create([
+ 'mimetype' => get_file_type_from_mimetype($file_mimetype),
+ 'type' => get_file_type($file_mimetype),
+ 'folder_id' => $request->folder_id,
+ 'metadata' => $metadata,
+ 'name' => $user_file_name,
+ 'basename' => $disk_file_name,
+ 'author' => $shared ? 'visitor' : 'user',
+ 'thumbnail' => $thumbnail,
+ 'filesize' => $file_size,
+ 'user_id' => $user_id,
+ ]);
+ }
+ }
+
+ /**
+ * Store folder icon
+ *
+ * @param $request
+ * @param $id
+ */
+ public function edit_folder_properties($request, $id)
+ {
+ // Get folder
+ $folder = Folder::find($id);
+
+ // Set default folder icon
+ if ($request->emoji === 'default') {
+ $folder->update([
+ 'emoji' => null,
+ 'color' => null,
+ ]);
+ }
+
+ // Set emoji
+ if ($request->filled('emoji')) {
+ $folder->update([
+ 'emoji' => $request->emoji,
+ 'color' => null,
+ ]);
+ }
+
+ // Set color
+ if ($request->filled('color')) {
+ $folder->update([
+ 'emoji' => null,
+ 'color' => $request->color,
+ ]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/Services/HelperService.php b/app/Services/HelperService.php
new file mode 100644
index 00000000..cbfac7e8
--- /dev/null
+++ b/app/Services/HelperService.php
@@ -0,0 +1,357 @@
+settings->getRawOriginal('avatar')) {
+ Storage::delete($user->settings->getRawOriginal('avatar'));
+ }
+
+ // Delete all user files
+ Storage::deleteDirectory("files/$user->id");
+
+ // Delete all user records in database
+ collect(['folders', 'files', 'user_settings', 'shares', 'favourite_folder', 'zips'])
+ ->each(function ($table) use ($user) {
+ DB::table($table)
+ ->whereUserId($user->id)
+ ->delete();
+ });
+ }
+
+ /**
+ * Check access to requested directory
+ *
+ * @param integer|array $requested_id
+ * @param string $shared Shared record detail
+ */
+ public function check_item_access($requested_id, $shared)
+ {
+ // Get all children folders
+ $foldersIds = Folder::with('folders:id,parent_id,id,name')
+ ->where('user_id', $shared->user_id)
+ ->where('parent_id', $shared->item_id)
+ ->get();
+
+ // Get all authorized parent folders by shared folder as root of tree
+ $accessible_folder_ids = Arr::flatten([filter_folders_ids($foldersIds), $shared->item_id]);
+
+ // Check user access
+ if (is_array($requested_id)) {
+ foreach ($requested_id as $id) {
+ if (!in_array($id, $accessible_folder_ids))
+ abort(403);
+ }
+ }
+
+ if (!is_array($requested_id)) {
+ if (!in_array($requested_id, $accessible_folder_ids))
+ abort(403);
+ }
+ }
+
+ /**
+ * Check user file access
+ *
+ * @param $shared
+ * @param $file
+ */
+ public function check_guest_access_to_shared_items($shared, $file): void
+ {
+ // Check by parent folder permission
+ if ($shared->type === 'folder') {
+ $this->check_item_access($file->folder_id, $shared);
+ }
+
+ // Check by single file permission
+ if ($shared->type === 'file') {
+ if ($shared->item_id !== $file->id) {
+ abort(403);
+ }
+ }
+ }
+
+ /**
+ * Check if user has enough space to upload file
+ *
+ * @param $user_id
+ * @param int $file_size
+ * @param $temp_filename
+ */
+ public function check_user_storage_capacity($user_id, int $file_size, $temp_filename): void
+ {
+ // Get user storage percentage and get storage_limitation setting
+ $user_storage_used = user_storage_percentage($user_id, $file_size);
+
+ // Check if user can upload
+ if (get_setting('storage_limitation') && $user_storage_used >= 100) {
+
+ // Delete file
+ Storage::disk('local')
+ ->delete("chunks/$temp_filename");
+
+ // Abort uploading
+ // TODO: test pre exceed storage limit
+ abort(423, 'You exceed your storage limit!');
+ }
+ }
+
+ /**
+ * Move file to external storage if is set
+ *
+ * @param string $filename
+ * @param string|null $thumbnail
+ */
+ function move_file_to_external_storage($filename, $thumbnail = null): void
+ {
+ $disk_local = Storage::disk('local');
+
+ foreach ([$filename, $thumbnail] as $file) {
+
+ // Check if file exist
+ if (!$file) continue;
+
+ // Get file size
+ $filesize = $disk_local->size('files/' . $file);
+
+ // If file is bigger than 5.2MB then run multipart upload
+ if ($filesize > 5242880) {
+
+ // Get driver
+ $driver = \Storage::getDriver();
+
+ // Get adapter
+ $adapter = $driver->getAdapter();
+
+ // Get client
+ $client = $adapter->getClient();
+
+ // Prepare the upload parameters.
+ // TODO: replace local files with temp folder
+ $uploader = new MultipartUploader($client, config('filesystems.disks.local.root') . '/files/' . $file, [
+ 'bucket' => $adapter->getBucket(),
+ 'key' => 'files/' . $file
+ ]);
+
+ try {
+
+ // Upload content
+ $uploader->upload();
+
+ } catch (MultipartUploadException $e) {
+
+ // Write error log
+ Log::error($e->getMessage());
+
+ // Delete file after error
+ $disk_local->delete('files/' . $file);
+
+ throw new HttpException(409, $e->getMessage());
+ }
+
+ } else {
+
+ // Stream file object to s3
+ // TODO: replace local files with temp folder
+ Storage::putFileAs('files', config('filesystems.disks.local.root') . '/files/' . $file, $file, 'private');
+ }
+
+ // Delete file after upload
+ $disk_local->delete('files/' . $file);
+ }
+ }
+
+ /**
+ * Create image thumbnail from gif, jpeg, jpg, png, webp or svg
+ *
+ * @param string $file_path
+ * @param string $filename
+ * @param string $user_id
+ * @return string|null
+ */
+ function create_image_thumbnail($file_path, $filename, $user_id)
+ {
+ $local_disk = Storage::disk('local');
+
+ // Create thumbnail from image
+ if (in_array($local_disk->mimeType($file_path), ['image/gif', 'image/jpeg', 'image/jpg', 'image/png', 'image/webp'])) {
+
+ // Get thumbnail name
+ $thumbnail = "thumbnail-$filename";
+
+ // Create intervention image
+ $image = Image::make($local_disk->path($file_path))
+ ->orientate();
+
+ // Resize image
+ $image->resize(512, null, function ($constraint) {
+ $constraint->aspectRatio();
+ })->stream();
+
+ // Store thumbnail to disk
+ $local_disk->put("files/$user_id/$thumbnail", $image);
+ }
+
+ // Return thumbnail as svg file
+ if ($local_disk->mimeType($file_path) === 'image/svg+xml') {
+
+ $thumbnail = $filename;
+ }
+
+ return $thumbnail ?? null;
+ }
+
+ /**
+ * Call and download file
+ *
+ * @param $file
+ * @param $user_id
+ * @return mixed
+ */
+ function download_file($file, $user_id)
+ {
+ // Get file path
+ $path = "files/$user_id/$file->basename";
+
+ // Check if file exist
+ if (!Storage::exists($path)) {
+ abort(404);
+ }
+
+ // Get pretty name
+ $pretty_name = get_pretty_name($file->basename, $file->name, $file->mimetype);
+
+ return response()
+ ->download(Storage::path($path), $pretty_name, [
+ "Accept-Ranges" => "bytes",
+ "Content-Type" => Storage::mimeType($path),
+ "Content-Length" => Storage::size($path),
+ "Content-Range" => "bytes 0-600/" . Storage::size($path),
+ "Content-Disposition" => "attachment; filename=$pretty_name",
+ ]);
+ }
+
+ /**
+ * Get image thumbnail for browser
+ *
+ * @param $file
+ * @param $user_id
+ * @return mixed
+ */
+ function download_thumbnail_file($file, $user_id)
+ {
+ // Get file path
+ $path = "/files/$user_id/{$file->getRawOriginal('thumbnail')}";
+
+ // Check if file exist
+ if (!Storage::exists($path)) abort(404);
+
+ // Return image thumbnail
+ return Storage::download($path, $file->getRawOriginal('thumbnail'));
+ }
+
+ /**
+ * Get all folders and files under the share record
+ *
+ * @param $id
+ * @param $shared
+ * @return array
+ */
+ function get_items_under_shared_by_folder_id($id, $shared): array
+ {
+ $folders = Folder::where('user_id', $shared->user_id)
+ ->where('parent_id', $id)
+ ->sortable()
+ ->get();
+
+ $files = File::where('user_id', $shared->user_id)
+ ->where('folder_id', $id)
+ ->sortable()
+ ->get();
+
+ return [$folders, $files];
+ }
+
+ /**
+ * @param Share $shared
+ */
+ function check_protected_share_record(Share $shared): void
+ {
+ if ($shared->is_protected) {
+
+ $abort_message = "Sorry, you don't have permission";
+
+ if (!request()->hasCookie('share_session')) {
+ abort(403, $abort_message);
+ }
+
+ // Get shared session
+ $share_session = json_decode(
+ request()->cookie('share_session')
+ );
+
+ // Check if is requested same share record
+ if ($share_session->token !== $shared->token) {
+ abort(403, $abort_message);
+ }
+
+ // Check if share record was authenticated previously via ShareController@authenticate
+ if (!$share_session->authenticated) {
+ abort(403, $abort_message);
+ }
+ }
+ }
+
+ /**
+ * @param $license
+ * @param $locale
+ */
+ function create_default_language_translations($license, $locale)
+ {
+ $translations = [
+ 'extended' => collect([
+ config("language-translations.extended"),
+ config("language-translations.regular"),
+ config("custom-language-translations")
+ ])->collapse(),
+ 'regular' => collect([
+ config("language-translations.regular"),
+ config("custom-language-translations")
+ ])->collapse(),
+ ];
+
+ $translations = $translations[strtolower($license)]
+ ->map(function ($value, $key) use ($locale) {
+ return [
+ 'lang' => $locale,
+ 'value' => $value,
+ 'key' => $key,
+ ];
+ })->toArray();
+
+ DB::table('language_translations')
+ ->insert($translations);
+ }
+}
\ No newline at end of file
diff --git a/app/Services/SchedulerService.php b/app/Services/SchedulerService.php
new file mode 100644
index 00000000..168a8a5e
--- /dev/null
+++ b/app/Services/SchedulerService.php
@@ -0,0 +1,84 @@
+subDay()->toDateTimeString())
+ ->get()
+ ->each(function ($zip) {
+
+ // Delete zip file
+ \Storage::disk('local')->delete("zip/$zip->basename");
+
+ // Delete zip record
+ $zip->delete();
+ });
+ }
+
+ /**
+ * Get and delete expired shared links
+ */
+ public function delete_expired_shared_links(): void
+ {
+ Share::whereNotNull('expire_in')
+ ->get()
+ ->each(function ($share) {
+
+ // Get dates
+ $created_at = Carbon::parse($share->created_at);
+
+ // If time was over, then delete share record
+ if ($created_at->diffInHours(now()) >= $share->expire_in) {
+ $share->delete();
+ }
+ });
+ }
+
+ /**
+ * Get and delete failed files older than 24 hours
+ */
+ public function delete_failed_files(): void
+ {
+ $local_disk = Storage::disk('local');
+
+ // Get all files from storage
+ $files = collect([
+ //$local_disk->allFiles('files'),
+ $local_disk->allFiles('chunks')
+ ])->collapse();
+
+ $files->each(function ($file) use ($local_disk) {
+
+ // Get the file's last modification time.
+ $last_modified = $local_disk
+ ->lastModified($file);
+
+ // Get diffInHours
+ $diff = Carbon::parse($last_modified)
+ ->diffInHours(now());
+
+ // Delete if file is in local storage more than 24 hours
+ if ($diff >= 24) {
+
+ Log::info("Failed file or chunk $file deleted.");
+
+ // Delete file from local storage
+ $local_disk->delete($file);
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/app/Services/SetupService.php b/app/Services/SetupService.php
new file mode 100644
index 00000000..2dd4c6a5
--- /dev/null
+++ b/app/Services/SetupService.php
@@ -0,0 +1,70 @@
+each(function ($directory) {
+
+ // Create directory for local driver
+ Storage::disk('local')
+ ->makeDirectory($directory);
+
+ // Create directory for external driver
+ Storage::makeDirectory($directory);
+ });
+ }
+
+ /**
+ * Store default pages content like Terms of Service, Privacy Policy and Cookie Policy into database
+ */
+ public function seed_default_pages()
+ {
+ collect(config('content.pages'))
+ ->each(function ($page) {
+ Page::updateOrCreate($page);
+ });
+ }
+
+ /**
+ * Store default VueFileManager settings into database
+ *
+ * @param $license
+ */
+ public function seed_default_settings($license)
+ {
+ collect(config('content.content.' . strtolower($license)))
+ ->each(function ($content) {
+ Setting::forceCreate($content);
+ });
+ }
+
+ /**
+ * Store default VueFileManager settings into database
+ *
+ * @param $license
+ */
+ public function seed_default_language()
+ {
+ Language::create([
+ 'name' => 'English',
+ 'locale' => 'en'
+ ]);
+
+ Setting::create([
+ 'name' => 'language',
+ 'value' => 'en',
+ ]);
+ }
+}
\ No newline at end of file
diff --git a/app/Services/StripeService.php b/app/Services/StripeService.php
index 25d4f717..299e88a2 100644
--- a/app/Services/StripeService.php
+++ b/app/Services/StripeService.php
@@ -3,10 +3,11 @@
namespace App\Services;
-use App\User;
-use Artisan;
+use App\Models\User;
use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
+use Laravel\Cashier\Cashier;
use Laravel\Cashier\Exceptions\IncompletePayment;
use Laravel\Cashier\Exceptions\PaymentActionRequired;
use Stripe;
@@ -22,18 +23,6 @@ class StripeService
$this->stripe = Stripe::make(config('cashier.secret'), '2020-03-02');
}
- /**
- * Get Stripe account details
- *
- * @return mixed
- */
- public function getAccountDetails()
- {
- $account = $this->stripe->account()->details();
-
- return $account;
- }
-
/**
* Get setup intent
*
@@ -55,9 +44,39 @@ class StripeService
*/
public function getTaxRates()
{
- $tax_rates = $this->stripe->taxRates()->all();
+ return $this->stripe
+ ->taxRates()
+ ->all()['data'];
+ }
- return $tax_rates['data'];
+ /**
+ * Get plan tax rates
+ *
+ * @param $amount
+ * @return array
+ */
+ public function get_tax_rates($amount): array
+ {
+ $rates_public = [];
+
+ foreach ($this->getTaxRates() as $rate) {
+
+ // Continue when is not active
+ if (!$rate['active']) continue;
+
+ // Calculate tax
+ $tax = $amount * ($rate['percentage'] / 100);
+
+ array_push($rates_public, [
+ 'id' => $rate['id'],
+ 'active' => $rate['active'],
+ 'country' => $rate['country'],
+ 'percentage' => $rate['percentage'],
+ 'plan_price_formatted' => Cashier::formatAmount(round($amount + $tax)),
+ ]);
+ }
+
+ return $rates_public;
}
/**
@@ -171,14 +190,17 @@ class StripeService
public function updateCustomerDetails($user)
{
$user->updateStripeCustomer([
- 'name' => $user->settings->billing_name,
- 'phone' => $user->settings->billing_phone_number,
+ 'name' => $user->settings->name,
+ 'phone' => $user->settings->phone_number,
'address' => [
- 'line1' => $user->settings->billing_address,
- 'city' => $user->settings->billing_city,
- 'country' => $user->settings->billing_country,
- 'postal_code' => $user->settings->billing_postal_code,
- 'state' => $user->settings->billing_state,
+ 'line1' => $user->settings->address,
+ 'city' => $user->settings->city,
+ 'country' => $user->settings->country,
+ 'postal_code' => $user->settings->postal_code,
+ 'state' => $user->settings->state,
+ ],
+ 'preferred_locales' => [
+ $user->settings->country, 'en'
]
]);
}
@@ -254,10 +276,20 @@ class StripeService
*/
public function getPlan($id)
{
- $plan = $this->stripe->plans()->find($id);
- $product = $this->stripe->products()->find($plan['product']);
+ if (Cache::has("plan-$id")) {
+ return Cache::get("plan-$id");
+ }
- return compact('plan', 'product');
+ return Cache::rememberForever("plan-$id", function () use ($id) {
+
+ $plan = $this->stripe->plans()->find($id);
+ $product = $this->stripe->products()->find($plan['product']);
+
+ return [
+ 'plan' => $plan,
+ 'product' => $product,
+ ];
+ });
}
/**
@@ -346,7 +378,10 @@ class StripeService
*/
public function deletePlan($slug)
{
- $this->stripe->plans()->delete($slug);
+ $this
+ ->stripe
+ ->plans()
+ ->delete($slug);
}
/**
@@ -357,20 +392,22 @@ class StripeService
*/
public function getUserInvoices($user)
{
- return $user->invoices();
+ return $user
+ ->invoices();
}
/**
* Get user invoice by id
*
+ * @param $customer
* @param $id
* @return \Laravel\Cashier\Invoice|null
*/
public function getUserInvoice($customer, $id)
{
- $user = User::where('stripe_id', $customer)->firstOrFail();
-
- return $user->findInvoice($id);
+ return User::whereStripeId($customer)
+ ->firstOrFail()
+ ->findInvoice($id);
}
/**
@@ -380,8 +417,11 @@ class StripeService
*/
public function getInvoices()
{
- return $this->stripe->invoices()->all([
- 'limit' => 20
- ]);
+ return $this
+ ->stripe
+ ->invoices()
+ ->all([
+ 'limit' => 20
+ ]);
}
}
\ No newline at end of file
diff --git a/app/Setting.php b/app/Setting.php
deleted file mode 100644
index 1984500b..00000000
--- a/app/Setting.php
+++ /dev/null
@@ -1,26 +0,0 @@
- $this->attributes['token']]);
- }
-}
diff --git a/app/Traffic.php b/app/Traffic.php
deleted file mode 100644
index baa3fae8..00000000
--- a/app/Traffic.php
+++ /dev/null
@@ -1,30 +0,0 @@
- 'datetime',
- ];
-
- protected $appends = [
- 'used_capacity', 'storage'
- ];
-
- /**
- * Sortable columns
- *
- * @var string[]
- */
- public $sortable = [
- 'id',
- 'name',
- 'role',
- 'created_at',
- 'storage_capacity',
- ];
-
- /**
- * Get tax rate id for user
- *
- * @return array
- */
- public function taxRates()
- {
- $stripe = resolve('App\Services\StripeService');
-
- // Get tax rates
- $rates = collect($stripe->getTaxRates());
-
- // Find tax rate
- $user_tax_rate = $rates->first(function ($item) {
- return $item['jurisdiction'] === $this->settings->billing_country && $item['active'];
- });
-
- return $user_tax_rate ? [$user_tax_rate['id']] : [];
- }
-
- /**
- * Get user used storage details
- *
- * @return mixed
- */
- public function getStorageAttribute()
- {
- // Get storage limitation setup
- $storage_limitation = get_setting('storage_limitation');
- $is_storage_limit = $storage_limitation ? $storage_limitation : 1;
-
- // Get user storage usage
- if (!$is_storage_limit) {
-
- return [
- 'used' => $this->used_capacity,
- 'used_formatted' => Metric::bytes($this->used_capacity)->format(),
- ];
- }
-
- return [
- 'used' => (float)get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity),
- 'used_formatted' => get_storage_fill_percentage($this->used_capacity, $this->settings->storage_capacity) . '%',
- 'capacity' => $this->settings->storage_capacity,
- 'capacity_formatted' => format_gigabytes($this->settings->storage_capacity),
- ];
- }
-
- /**
- * Get user used storage capacity in bytes
- *
- * @return mixed
- */
- public function getUsedCapacityAttribute()
- {
- $user_capacity = $this->files_with_trashed->map(function ($item) {
- return $item->getRawOriginal();
- })->sum('filesize');
-
- return $user_capacity;
- }
-
- /**
- * Get user full folder tree
- *
- * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection
- */
- public function getFolderTreeAttribute()
- {
- // Get sorting setup
-
- return FileManagerFolder::with(['folders.shared', 'shared:token,id,item_id,permission,protected,expire_in'])
- ->where('parent_id', 0)
- ->where('user_id', $this->id)
- ->sortable()
- ->get();
- }
-
- /**
- * Format avatar to full url
- *
- * @return \Illuminate\Contracts\Routing\UrlGenerator|string
- */
- public function getAvatarAttribute()
- {
- // Get avatar from external storage
- if ($this->attributes['avatar'] && is_storage_driver(['s3', 'spaces', 'wasabi', 'backblaze'])) {
- return Storage::temporaryUrl($this->attributes['avatar'], now()->addDay());
- }
-
- // Get avatar from local storage
- if ($this->attributes['avatar']) {
- return url('/' . $this->attributes['avatar']);
- }
-
- return url('/assets/images/' . 'default-avatar.png');
- }
-
- /**
- * Set user billing info
- *
- * @param $billing
- * @return UserSettings
- */
- public function setBilling($billing)
- {
- $this->settings()->update([
- 'billing_address' => $billing['billing_address'],
- 'billing_city' => $billing['billing_city'],
- 'billing_country' => $billing['billing_country'],
- 'billing_name' => $billing['billing_name'],
- 'billing_phone_number' => $billing['billing_phone_number'],
- 'billing_postal_code' => $billing['billing_postal_code'],
- 'billing_state' => $billing['billing_state'],
- ]);
-
- return $this->settings;
- }
-
- /**
- * Send the password reset notification.
- *
- * @param string $token
- * @return void
- */
- public function sendPasswordResetNotification($token)
- {
- $this->notify(new ResetPassword($token));
- }
-
- /**
- * Record user upload filesize
- *
- * @param $file_size
- */
- public function record_upload($file_size)
- {
- $now = Carbon::now();
-
- $record = Traffic::whereYear('created_at', '=', $now->year)
- ->whereMonth('created_at', '=', $now->month)
- ->firstOrCreate([
- 'user_id' => $this->id,
- ]);
-
- $record->update([
- 'upload' => $record->upload + $file_size
- ]);
- }
-
- /**
- * Record user download filesize
- *
- * @param $file_size
- */
- public function record_download($file_size)
- {
- $now = Carbon::now();
-
- $record = Traffic::whereYear('created_at', '=', $now->year)
- ->whereMonth('created_at', '=', $now->month)
- ->firstOrCreate([
- 'user_id' => $this->id,
- ]);
-
- $record->update([
- 'download' => $record->download + $file_size
- ]);
- }
-
- /**
- * Get user favourites folder
- *
- * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
- */
- public function favourite_folders()
- {
- return $this->belongsToMany(FileManagerFolder::class, 'favourite_folder', 'user_id', 'folder_unique_id', 'id', 'unique_id')->with('shared:token,id,item_id,permission,protected,expire_in');
- }
-
- /**
- * Get 5 latest uploads
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany|\Illuminate\Database\Query\Builder
- */
- public function latest_uploads()
- {
- return $this->hasMany(FileManagerFile::class)->with(['parent'])->take(40);
- }
-
- /**
- * Get all user files
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function files()
- {
- return $this->hasMany(FileManagerFile::class);
- }
-
- /**
- * Get all user files
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasMany
- */
- public function files_with_trashed()
- {
- return $this->hasMany(FileManagerFile::class)->withTrashed();
- }
-
- /**
- * Get user attributes
- *
- * @return \Illuminate\Database\Eloquent\Relations\HasOne
- */
- public function settings()
- {
- return $this->hasOne(UserSettings::class);
- }
-}
diff --git a/app/UserSettings.php b/app/UserSettings.php
deleted file mode 100644
index 4bffb5ad..00000000
--- a/app/UserSettings.php
+++ /dev/null
@@ -1,40 +0,0 @@
-=5.5.9",
+ "php": "^7.0|^8.0",
"symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0",
"symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0"
},
"require-dev": {
- "phpunit/phpunit": "^5.0 || ^4.8.10",
- "squizlabs/php_codesniffer": "^2.3"
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
"psr-4": {
- "Asm89\\Stack\\": "src/Asm89/Stack/"
+ "Asm89\\Stack\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -56,20 +56,20 @@
"cors",
"stack"
],
- "time": "2019-12-24T22:41:47+00:00"
+ "time": "2020-10-29T16:03:21+00:00"
},
{
"name": "aws/aws-sdk-php",
- "version": "3.149.0",
+ "version": "3.173.21",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
- "reference": "0ab4ac60f94d53d55f2c7374deb75d9a58961970"
+ "reference": "914c68fb45bd4d1141d6c48ca9c88e0e9f426611"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0ab4ac60f94d53d55f2c7374deb75d9a58961970",
- "reference": "0ab4ac60f94d53d55f2c7374deb75d9a58961970",
+ "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/914c68fb45bd4d1141d6c48ca9c88e0e9f426611",
+ "reference": "914c68fb45bd4d1141d6c48ca9c88e0e9f426611",
"shasum": ""
},
"require": {
@@ -77,9 +77,9 @@
"ext-pcre": "*",
"ext-simplexml": "*",
"guzzlehttp/guzzle": "^5.3.3|^6.2.1|^7.0",
- "guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.4.1",
- "mtdowling/jmespath.php": "^2.5",
+ "guzzlehttp/promises": "^1.4.0",
+ "guzzlehttp/psr7": "^1.7.0",
+ "mtdowling/jmespath.php": "^2.6",
"php": ">=5.5"
},
"require-dev": {
@@ -141,30 +141,155 @@
"s3",
"sdk"
],
- "time": "2020-08-13T18:10:50+00:00"
+ "time": "2021-03-03T19:19:53+00:00"
},
{
- "name": "brick/math",
- "version": "0.8.15",
+ "name": "bacon/bacon-qr-code",
+ "version": "2.0.3",
"source": {
"type": "git",
- "url": "https://github.com/brick/math.git",
- "reference": "9b08d412b9da9455b210459ff71414de7e6241cd"
+ "url": "https://github.com/Bacon/BaconQrCode.git",
+ "reference": "3e9d791b67d0a2912922b7b7c7312f4b37af41e4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/brick/math/zipball/9b08d412b9da9455b210459ff71414de7e6241cd",
- "reference": "9b08d412b9da9455b210459ff71414de7e6241cd",
+ "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/3e9d791b67d0a2912922b7b7c7312f4b37af41e4",
+ "reference": "3e9d791b67d0a2912922b7b7c7312f4b37af41e4",
+ "shasum": ""
+ },
+ "require": {
+ "dasprid/enum": "^1.0.3",
+ "ext-iconv": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "phly/keep-a-changelog": "^1.4",
+ "phpunit/phpunit": "^7 | ^8 | ^9",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "suggest": {
+ "ext-imagick": "to generate QR code images"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "BaconQrCode\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Ben Scholzen 'DASPRiD'",
+ "email": "mail@dasprids.de",
+ "homepage": "https://dasprids.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "BaconQrCode is a QR code generator for PHP.",
+ "homepage": "https://github.com/Bacon/BaconQrCode",
+ "time": "2020-10-30T02:02:47+00:00"
+ },
+ {
+ "name": "brianium/paratest",
+ "version": "v6.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paratestphp/paratest.git",
+ "reference": "9a94366983ce32c7724fc92e3b544327d4adb9be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paratestphp/paratest/zipball/9a94366983ce32c7724fc92e3b544327d4adb9be",
+ "reference": "9a94366983ce32c7724fc92e3b544327d4adb9be",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-simplexml": "*",
+ "php": "^7.3 || ^8.0",
+ "phpunit/php-code-coverage": "^9.2.5",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-timer": "^5.0.3",
+ "phpunit/phpunit": "^9.5.1",
+ "sebastian/environment": "^5.1.3",
+ "symfony/console": "^4.4 || ^5.2",
+ "symfony/process": "^4.4 || ^5.2"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.2.0",
+ "ekino/phpstan-banned-code": "^0.3.1",
+ "ergebnis/phpstan-rules": "^0.15.3",
+ "ext-posix": "*",
+ "infection/infection": "^0.20.2",
+ "phpstan/phpstan": "^0.12.70",
+ "phpstan/phpstan-deprecation-rules": "^0.12.6",
+ "phpstan/phpstan-phpunit": "^0.12.17",
+ "phpstan/phpstan-strict-rules": "^0.12.9",
+ "squizlabs/php_codesniffer": "^3.5.8",
+ "symfony/filesystem": "^5.2.2",
+ "thecodingmachine/phpstan-strict-rules": "^0.12.1",
+ "vimeo/psalm": "^4.4.1"
+ },
+ "bin": [
+ "bin/paratest"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParaTest\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Scaturro",
+ "email": "scaturrob@gmail.com",
+ "homepage": "http://brianscaturro.com",
+ "role": "Lead"
+ }
+ ],
+ "description": "Parallel testing for PHP",
+ "homepage": "https://github.com/paratestphp/paratest",
+ "keywords": [
+ "concurrent",
+ "parallel",
+ "phpunit",
+ "testing"
+ ],
+ "time": "2021-01-29T15:25:31+00:00"
+ },
+ {
+ "name": "brick/math",
+ "version": "0.9.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/brick/math.git",
+ "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0",
+ "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0",
"shasum": ""
},
"require": {
"ext-json": "*",
- "php": "^7.1|^8.0"
+ "php": "^7.1 || ^8.0"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.2",
- "phpunit/phpunit": "^7.5.15|^8.5",
- "vimeo/psalm": "^3.5"
+ "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
+ "vimeo/psalm": "4.3.2"
},
"type": "library",
"autoload": {
@@ -187,20 +312,26 @@
"brick",
"math"
],
- "time": "2020-04-15T15:59:35+00:00"
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/brick/math",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-20T22:51:39+00:00"
},
{
"name": "cartalyst/stripe",
- "version": "v2.4.2",
+ "version": "v2.4.4",
"source": {
"type": "git",
"url": "https://github.com/cartalyst/stripe.git",
- "reference": "c6ee8fc4b1881e5688fab728523b5fdd10d0a3bf"
+ "reference": "f07e9f35effa5fe7aa27e0f7a87dce52e37b8fdf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cartalyst/stripe/zipball/c6ee8fc4b1881e5688fab728523b5fdd10d0a3bf",
- "reference": "c6ee8fc4b1881e5688fab728523b5fdd10d0a3bf",
+ "url": "https://api.github.com/repos/cartalyst/stripe/zipball/f07e9f35effa5fe7aa27e0f7a87dce52e37b8fdf",
+ "reference": "f07e9f35effa5fe7aa27e0f7a87dce52e37b8fdf",
"shasum": ""
},
"require": {
@@ -208,8 +339,8 @@
"php": ">=5.5.9"
},
"require-dev": {
- "mockery/mockery": "~0.9",
- "phpunit/phpunit": "~4.8"
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
@@ -240,26 +371,26 @@
"php",
"stripe"
],
- "time": "2020-07-26T14:59:01+00:00"
+ "time": "2021-02-18T12:04:45+00:00"
},
{
"name": "cartalyst/stripe-laravel",
- "version": "v12.0.0",
+ "version": "v13.1.0",
"source": {
"type": "git",
"url": "https://github.com/cartalyst/stripe-laravel.git",
- "reference": "e171e6721e3491daa7eaa8d85ca6d4536086c327"
+ "reference": "2f2b2b4e0de0fc0bce61a95134031ec2c732f999"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/cartalyst/stripe-laravel/zipball/e171e6721e3491daa7eaa8d85ca6d4536086c327",
- "reference": "e171e6721e3491daa7eaa8d85ca6d4536086c327",
+ "url": "https://api.github.com/repos/cartalyst/stripe-laravel/zipball/2f2b2b4e0de0fc0bce61a95134031ec2c732f999",
+ "reference": "2f2b2b4e0de0fc0bce61a95134031ec2c732f999",
"shasum": ""
},
"require": {
"cartalyst/stripe": "^2.0",
- "illuminate/support": "^7.0",
- "php": "^7.2.5"
+ "illuminate/support": "^8.0",
+ "php": "^7.3 || ^8.0"
},
"require-dev": {
"cartalyst/php-cs-fixer-config": "^1.0",
@@ -269,7 +400,7 @@
"extra": {
"component": "implementation",
"branch-alias": {
- "dev-master": "12.0.x-dev"
+ "dev-master": "13.0.x-dev"
},
"laravel": {
"providers": [
@@ -296,77 +427,57 @@
"homepage": "https://cartalyst.com"
}
],
- "description": "Laravel 7 integration for the Cartalyst Stripe package.",
+ "description": "Laravel 8 integration for the Cartalyst Stripe package.",
"keywords": [
"cartalyst",
"laravel",
"php",
"stripe"
],
- "time": "2020-03-03T18:50:48+00:00"
+ "time": "2020-12-23T13:33:41+00:00"
},
{
- "name": "defuse/php-encryption",
- "version": "v2.2.1",
+ "name": "dasprid/enum",
+ "version": "1.0.3",
"source": {
"type": "git",
- "url": "https://github.com/defuse/php-encryption.git",
- "reference": "0f407c43b953d571421e0020ba92082ed5fb7620"
+ "url": "https://github.com/DASPRiD/Enum.git",
+ "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/defuse/php-encryption/zipball/0f407c43b953d571421e0020ba92082ed5fb7620",
- "reference": "0f407c43b953d571421e0020ba92082ed5fb7620",
+ "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2",
+ "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2",
"shasum": ""
},
- "require": {
- "ext-openssl": "*",
- "paragonie/random_compat": ">= 2",
- "php": ">=5.4.0"
- },
"require-dev": {
- "nikic/php-parser": "^2.0|^3.0|^4.0",
- "phpunit/phpunit": "^4|^5"
+ "phpunit/phpunit": "^7 | ^8 | ^9",
+ "squizlabs/php_codesniffer": "^3.4"
},
- "bin": [
- "bin/generate-defuse-key"
- ],
"type": "library",
"autoload": {
"psr-4": {
- "Defuse\\Crypto\\": "src"
+ "DASPRiD\\Enum\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-2-Clause"
],
"authors": [
{
- "name": "Taylor Hornby",
- "email": "taylor@defuse.ca",
- "homepage": "https://defuse.ca/"
- },
- {
- "name": "Scott Arciszewski",
- "email": "info@paragonie.com",
- "homepage": "https://paragonie.com"
+ "name": "Ben Scholzen 'DASPRiD'",
+ "email": "mail@dasprids.de",
+ "homepage": "https://dasprids.de/",
+ "role": "Developer"
}
],
- "description": "Secure PHP Encryption Library",
+ "description": "PHP 7.1 enum implementation",
"keywords": [
- "aes",
- "authenticated encryption",
- "cipher",
- "crypto",
- "cryptography",
- "encrypt",
- "encryption",
- "openssl",
- "security",
- "symmetric key cryptography"
+ "enum",
+ "map"
],
- "time": "2018-07-24T23:27:56+00:00"
+ "time": "2020-10-02T16:03:48+00:00"
},
{
"name": "dnoegel/php-xdg-base-dir",
@@ -485,32 +596,32 @@
},
{
"name": "doctrine/dbal",
- "version": "2.10.2",
+ "version": "2.12.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
- "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8"
+ "reference": "adce7a954a1c2f14f85e94aed90c8489af204086"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/dbal/zipball/aab745e7b6b2de3b47019da81e7225e14dcfdac8",
- "reference": "aab745e7b6b2de3b47019da81e7225e14dcfdac8",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/adce7a954a1c2f14f85e94aed90c8489af204086",
+ "reference": "adce7a954a1c2f14f85e94aed90c8489af204086",
"shasum": ""
},
"require": {
"doctrine/cache": "^1.0",
"doctrine/event-manager": "^1.0",
"ext-pdo": "*",
- "php": "^7.2"
+ "php": "^7.3 || ^8"
},
"require-dev": {
- "doctrine/coding-standard": "^6.0",
+ "doctrine/coding-standard": "^8.1",
"jetbrains/phpstorm-stubs": "^2019.1",
- "nikic/php-parser": "^4.4",
- "phpstan/phpstan": "^0.12",
- "phpunit/phpunit": "^8.4.1",
+ "phpstan/phpstan": "^0.12.40",
+ "phpunit/phpunit": "^9.4",
+ "psalm/plugin-phpunit": "^0.10.0",
"symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
- "vimeo/psalm": "^3.11"
+ "vimeo/psalm": "^3.17.2"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
@@ -521,8 +632,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.10.x-dev",
- "dev-develop": "3.0.x-dev"
+ "dev-master": "4.0.x-dev"
}
},
"autoload": {
@@ -575,7 +685,21 @@
"sqlserver",
"sqlsrv"
],
- "time": "2020-04-20T17:19:26+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-14T20:26:58+00:00"
},
{
"name": "doctrine/event-manager",
@@ -744,6 +868,71 @@
],
"time": "2020-05-29T15:13:26+00:00"
},
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.0",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-10T18:47:58+00:00"
+ },
{
"name": "doctrine/lexer",
"version": "1.2.1",
@@ -808,33 +997,35 @@
},
{
"name": "dompdf/dompdf",
- "version": "v0.8.5",
+ "version": "v1.0.2",
"source": {
"type": "git",
"url": "https://github.com/dompdf/dompdf.git",
- "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56"
+ "reference": "8768448244967a46d6e67b891d30878e0e15d25c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dompdf/dompdf/zipball/6782abfc090b132134cd6cea0ec6d76f0fce2c56",
- "reference": "6782abfc090b132134cd6cea0ec6d76f0fce2c56",
+ "url": "https://api.github.com/repos/dompdf/dompdf/zipball/8768448244967a46d6e67b891d30878e0e15d25c",
+ "reference": "8768448244967a46d6e67b891d30878e0e15d25c",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-mbstring": "*",
- "phenx/php-font-lib": "^0.5.1",
+ "phenx/php-font-lib": "^0.5.2",
"phenx/php-svg-lib": "^0.3.3",
- "php": "^7.1"
+ "php": "^7.1 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^7.5",
+ "mockery/mockery": "^1.3",
+ "phpunit/phpunit": "^7.5 || ^8 || ^9",
"squizlabs/php_codesniffer": "^3.5"
},
"suggest": {
"ext-gd": "Needed to process images",
"ext-gmagick": "Improves image processing performance",
- "ext-imagick": "Improves image processing performance"
+ "ext-imagick": "Improves image processing performance",
+ "ext-zlib": "Needed for pdf stream compression"
},
"type": "library",
"extra": {
@@ -870,34 +1061,36 @@
],
"description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter",
"homepage": "https://github.com/dompdf/dompdf",
- "time": "2020-02-20T03:52:51+00:00"
+ "time": "2021-01-08T14:18:52+00:00"
},
{
"name": "dragonmantank/cron-expression",
- "version": "v2.3.0",
+ "version": "v3.1.0",
"source": {
"type": "git",
"url": "https://github.com/dragonmantank/cron-expression.git",
- "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27"
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/72b6fbf76adb3cf5bc0db68559b33d41219aba27",
- "reference": "72b6fbf76adb3cf5bc0db68559b33d41219aba27",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
"shasum": ""
},
"require": {
- "php": "^7.0"
+ "php": "^7.2|^8.0",
+ "webmozart/assert": "^1.7.0"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
},
"require-dev": {
- "phpunit/phpunit": "^6.4|^7.0"
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-webmozart-assert": "^0.12.7",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.3-dev"
- }
- },
"autoload": {
"psr-4": {
"Cron\\": "src/Cron/"
@@ -908,11 +1101,6 @@
"MIT"
],
"authors": [
- {
- "name": "Michael Dowling",
- "email": "mtdowling@gmail.com",
- "homepage": "https://github.com/mtdowling"
- },
{
"name": "Chris Tankersley",
"email": "chris@ctankersley.com",
@@ -924,20 +1112,26 @@
"cron",
"schedule"
],
- "time": "2019-03-31T00:38:28+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-24T19:55:57+00:00"
},
{
"name": "egulias/email-validator",
- "version": "2.1.19",
+ "version": "2.1.25",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "840d5603eb84cc81a6a0382adac3293e57c1c64c"
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/840d5603eb84cc81a6a0382adac3293e57c1c64c",
- "reference": "840d5603eb84cc81a6a0382adac3293e57c1c64c",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
"shasum": ""
},
"require": {
@@ -982,28 +1176,34 @@
"validation",
"validator"
],
- "time": "2020-08-08T21:28:19+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2020-12-29T14:50:06+00:00"
},
{
"name": "fideloper/proxy",
- "version": "4.4.0",
+ "version": "4.4.1",
"source": {
"type": "git",
"url": "https://github.com/fideloper/TrustedProxy.git",
- "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8"
+ "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8",
- "reference": "9beebf48a1c344ed67c1d36bb1b8709db7c3c1a8",
+ "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0",
+ "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0",
"shasum": ""
},
"require": {
- "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0",
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
"php": ">=5.4.0"
},
"require-dev": {
- "illuminate/http": "^5.0|^6.0|^7.0|^8.0",
+ "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
"mockery/mockery": "^1.0",
"phpunit/phpunit": "^6.0"
},
@@ -1036,91 +1236,40 @@
"proxy",
"trusted proxy"
],
- "time": "2020-06-23T01:36:47+00:00"
- },
- {
- "name": "firebase/php-jwt",
- "version": "v5.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/firebase/php-jwt.git",
- "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/feb0e820b8436873675fd3aca04f3728eb2185cb",
- "reference": "feb0e820b8436873675fd3aca04f3728eb2185cb",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": ">=4.8 <=9"
- },
- "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",
- "keywords": [
- "jwt",
- "php"
- ],
- "time": "2020-03-25T18:49:23+00:00"
+ "time": "2020-10-22T13:48:01+00:00"
},
{
"name": "fruitcake/laravel-cors",
- "version": "v1.0.6",
+ "version": "v2.0.3",
"source": {
"type": "git",
"url": "https://github.com/fruitcake/laravel-cors.git",
- "reference": "1d127dbec313e2e227d65e0c483765d8d7559bf6"
+ "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/1d127dbec313e2e227d65e0c483765d8d7559bf6",
- "reference": "1d127dbec313e2e227d65e0c483765d8d7559bf6",
+ "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/01de0fe5f71c70d1930ee9a80385f9cc28e0f63a",
+ "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a",
"shasum": ""
},
"require": {
- "asm89/stack-cors": "^1.3",
- "illuminate/contracts": "^5.5|^6.0|^7.0|^8.0",
- "illuminate/support": "^5.5|^6.0|^7.0|^8.0",
- "php": ">=7",
- "symfony/http-foundation": "^3.3|^4.0|^5.0",
- "symfony/http-kernel": "^3.3|^4.0|^5.0"
+ "asm89/stack-cors": "^2.0.1",
+ "illuminate/contracts": "^6|^7|^8|^9",
+ "illuminate/support": "^6|^7|^8|^9",
+ "php": ">=7.2",
+ "symfony/http-foundation": "^4|^5",
+ "symfony/http-kernel": "^4.3.4|^5"
},
"require-dev": {
- "laravel/framework": "^5.5|^6.0|^7.0|^8.0",
- "orchestra/testbench": "^3.5|^4.0|^5.0|^6.0",
- "phpro/grumphp": "^0.16|^0.17",
- "phpunit/phpunit": "^6.0|^7.0|^8.0",
+ "laravel/framework": "^6|^7|^8",
+ "orchestra/testbench-dusk": "^4|^5|^6",
+ "phpunit/phpunit": "^6|^7|^8",
"squizlabs/php_codesniffer": "^3.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-master": "2.0-dev"
},
"laravel": {
"providers": [
@@ -1154,7 +1303,13 @@
"crossdomain",
"laravel"
],
- "time": "2020-04-28T08:47:37+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-22T13:57:20+00:00"
},
{
"name": "gabrielelana/byte-units",
@@ -1209,38 +1364,106 @@
"time": "2018-01-11T10:40:03+00:00"
},
{
- "name": "guzzlehttp/guzzle",
- "version": "6.5.5",
+ "name": "graham-campbell/result-type",
+ "version": "v1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/guzzle/guzzle.git",
- "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e"
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
- "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0|^8.0",
+ "phpoption/phpoption": "^1.7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-04-13T13:17:36+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79",
+ "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79",
"shasum": ""
},
"require": {
"ext-json": "*",
- "guzzlehttp/promises": "^1.0",
- "guzzlehttp/psr7": "^1.6.1",
- "php": ">=5.5",
- "symfony/polyfill-intl-idn": "^1.17.0"
+ "guzzlehttp/promises": "^1.4",
+ "guzzlehttp/psr7": "^1.7",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
},
"require-dev": {
"ext-curl": "*",
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.5.5 || ^9.3.5",
"psr/log": "^1.1"
},
"suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "6.5-dev"
+ "dev-master": "7.1-dev"
}
},
"autoload": {
@@ -1260,6 +1483,11 @@
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
}
],
"description": "Guzzle is a PHP HTTP client library",
@@ -1270,30 +1498,50 @@
"framework",
"http",
"http client",
+ "psr-18",
+ "psr-7",
"rest",
"web service"
],
- "time": "2020-06-16T21:01:06+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/alexeyshockov",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/gmponos",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-10T11:47:56+00:00"
},
{
"name": "guzzlehttp/promises",
- "version": "v1.3.1",
+ "version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ "reference": "60d379c243457e073cff02bc323a2a86cb355631"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
- "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631",
+ "reference": "60d379c243457e073cff02bc323a2a86cb355631",
"shasum": ""
},
"require": {
- "php": ">=5.5.0"
+ "php": ">=5.5"
},
"require-dev": {
- "phpunit/phpunit": "^4.0"
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
},
"type": "library",
"extra": {
@@ -1324,20 +1572,20 @@
"keywords": [
"promise"
],
- "time": "2016-12-20T10:07:11+00:00"
+ "time": "2020-09-30T07:37:28+00:00"
},
{
"name": "guzzlehttp/psr7",
- "version": "1.6.1",
+ "version": "1.7.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "239400de7a173fe9901b9ac7c06497751f00727a"
+ "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
- "reference": "239400de7a173fe9901b9ac7c06497751f00727a",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3",
+ "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3",
"shasum": ""
},
"require": {
@@ -1350,15 +1598,15 @@
},
"require-dev": {
"ext-zlib": "*",
- "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
"suggest": {
- "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.6-dev"
+ "dev-master": "1.7-dev"
}
},
"autoload": {
@@ -1395,7 +1643,7 @@
"uri",
"url"
],
- "time": "2019-07-01T23:21:34+00:00"
+ "time": "2020-09-30T07:37:11+00:00"
},
{
"name": "intervention/image",
@@ -1469,24 +1717,23 @@
},
{
"name": "jaybizzle/crawler-detect",
- "version": "v1.2.98",
+ "version": "v1.2.105",
"source": {
"type": "git",
"url": "https://github.com/JayBizzle/Crawler-Detect.git",
- "reference": "02b24e5d4dc347737577f48c688ee14c3b5dfd4f"
+ "reference": "719c1ed49224857800c3dc40838b6b761d046105"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/02b24e5d4dc347737577f48c688ee14c3b5dfd4f",
- "reference": "02b24e5d4dc347737577f48c688ee14c3b5dfd4f",
+ "url": "https://api.github.com/repos/JayBizzle/Crawler-Detect/zipball/719c1ed49224857800c3dc40838b6b761d046105",
+ "reference": "719c1ed49224857800c3dc40838b6b761d046105",
"shasum": ""
},
"require": {
"php": ">=5.3.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8|^5.5|^6.5",
- "satooshi/php-coveralls": "1.*"
+ "phpunit/phpunit": "^4.8|^5.5|^6.5|^9.4"
},
"type": "library",
"autoload": {
@@ -1514,7 +1761,7 @@
"crawlerdetect",
"php crawler detect"
],
- "time": "2020-08-20T18:36:15+00:00"
+ "time": "2021-03-03T20:55:48+00:00"
},
{
"name": "jaybizzle/laravel-crawler-detect",
@@ -1582,21 +1829,21 @@
},
{
"name": "kyslik/column-sortable",
- "version": "6.3.0",
+ "version": "6.4.0",
"source": {
"type": "git",
"url": "https://github.com/Kyslik/column-sortable.git",
- "reference": "9f2ddfabe5cfd9cfd67b15805e2d0de48429c995"
+ "reference": "9aef633bfe160c5a43d97e92e55983daa2696eb1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Kyslik/column-sortable/zipball/9f2ddfabe5cfd9cfd67b15805e2d0de48429c995",
- "reference": "9f2ddfabe5cfd9cfd67b15805e2d0de48429c995",
+ "url": "https://api.github.com/repos/Kyslik/column-sortable/zipball/9aef633bfe160c5a43d97e92e55983daa2696eb1",
+ "reference": "9aef633bfe160c5a43d97e92e55983daa2696eb1",
"shasum": ""
},
"require": {
- "illuminate/database": "5.8.*|^6.0|^7.0",
- "illuminate/support": "5.8.*|^6.0|^7.0",
+ "illuminate/database": "5.8.*|^6.0|^7.0|^8.0",
+ "illuminate/support": "5.8.*|^6.0|^7.0|^8.0",
"php": ">=7.2"
},
"require-dev": {
@@ -1635,183 +1882,43 @@
"sortable",
"sorting"
],
- "time": "2020-03-08T12:26:23+00:00"
- },
- {
- "name": "laminas/laminas-diactoros",
- "version": "2.3.1",
- "source": {
- "type": "git",
- "url": "https://github.com/laminas/laminas-diactoros.git",
- "reference": "2ffc7cc816f6207b27923ee15edf6fac668390aa"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/2ffc7cc816f6207b27923ee15edf6fac668390aa",
- "reference": "2ffc7cc816f6207b27923ee15edf6fac668390aa",
- "shasum": ""
- },
- "require": {
- "laminas/laminas-zendframework-bridge": "^1.0",
- "php": "^7.1",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.0"
- },
- "conflict": {
- "phpspec/prophecy": "<1.9.0"
- },
- "provide": {
- "psr/http-factory-implementation": "1.0",
- "psr/http-message-implementation": "1.0"
- },
- "replace": {
- "zendframework/zend-diactoros": "^2.2.1"
- },
- "require-dev": {
- "ext-curl": "*",
- "ext-dom": "*",
- "ext-libxml": "*",
- "http-interop/http-factory-tests": "^0.5.0",
- "laminas/laminas-coding-standard": "~1.0.0",
- "php-http/psr7-integration-tests": "^1.0",
- "phpunit/phpunit": "^7.5.18"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.3.x-dev",
- "dev-develop": "2.4.x-dev"
- },
- "laminas": {
- "config-provider": "Laminas\\Diactoros\\ConfigProvider",
- "module": "Laminas\\Diactoros"
- }
- },
- "autoload": {
- "files": [
- "src/functions/create_uploaded_file.php",
- "src/functions/marshal_headers_from_sapi.php",
- "src/functions/marshal_method_from_sapi.php",
- "src/functions/marshal_protocol_version_from_sapi.php",
- "src/functions/marshal_uri_from_sapi.php",
- "src/functions/normalize_server.php",
- "src/functions/normalize_uploaded_files.php",
- "src/functions/parse_cookie_header.php",
- "src/functions/create_uploaded_file.legacy.php",
- "src/functions/marshal_headers_from_sapi.legacy.php",
- "src/functions/marshal_method_from_sapi.legacy.php",
- "src/functions/marshal_protocol_version_from_sapi.legacy.php",
- "src/functions/marshal_uri_from_sapi.legacy.php",
- "src/functions/normalize_server.legacy.php",
- "src/functions/normalize_uploaded_files.legacy.php",
- "src/functions/parse_cookie_header.legacy.php"
- ],
- "psr-4": {
- "Laminas\\Diactoros\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "description": "PSR HTTP Message implementations",
- "homepage": "https://laminas.dev",
- "keywords": [
- "http",
- "laminas",
- "psr",
- "psr-17",
- "psr-7"
- ],
- "time": "2020-07-07T15:34:31+00:00"
- },
- {
- "name": "laminas/laminas-zendframework-bridge",
- "version": "1.0.4",
- "source": {
- "type": "git",
- "url": "https://github.com/laminas/laminas-zendframework-bridge.git",
- "reference": "fcd87520e4943d968557803919523772475e8ea3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/fcd87520e4943d968557803919523772475e8ea3",
- "reference": "fcd87520e4943d968557803919523772475e8ea3",
- "shasum": ""
- },
- "require": {
- "php": "^5.6 || ^7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1",
- "squizlabs/php_codesniffer": "^3.5"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev",
- "dev-develop": "1.1.x-dev"
- },
- "laminas": {
- "module": "Laminas\\ZendFrameworkBridge"
- }
- },
- "autoload": {
- "files": [
- "src/autoload.php"
- ],
- "psr-4": {
- "Laminas\\ZendFrameworkBridge\\": "src//"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "description": "Alias legacy ZF class names to Laminas Project equivalents.",
- "keywords": [
- "ZendFramework",
- "autoloading",
- "laminas",
- "zf"
- ],
- "time": "2020-05-20T16:45:56+00:00"
+ "time": "2020-09-11T21:17:32+00:00"
},
{
"name": "laravel/cashier",
- "version": "v12.2.0",
+ "version": "v12.9.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/cashier-stripe.git",
- "reference": "4331fd1444a4034a8088e8957a8200dd9673313b"
+ "reference": "3dbe65d30f08fea8a1cd5ae7323244ca68e56dc8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/cashier-stripe/zipball/4331fd1444a4034a8088e8957a8200dd9673313b",
- "reference": "4331fd1444a4034a8088e8957a8200dd9673313b",
+ "url": "https://api.github.com/repos/laravel/cashier-stripe/zipball/3dbe65d30f08fea8a1cd5ae7323244ca68e56dc8",
+ "reference": "3dbe65d30f08fea8a1cd5ae7323244ca68e56dc8",
"shasum": ""
},
"require": {
- "dompdf/dompdf": "^0.8.0",
+ "dompdf/dompdf": "^0.8.6|^1.0.1",
"ext-json": "*",
- "illuminate/contracts": "^6.0|^7.0",
- "illuminate/database": "^6.0|^7.0",
- "illuminate/http": "^6.0|^7.0",
- "illuminate/log": "^6.0|^7.0",
- "illuminate/notifications": "^6.0|^7.0",
- "illuminate/routing": "^6.0|^7.0",
- "illuminate/support": "^6.0|^7.0",
- "illuminate/view": "^6.0|^7.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0",
+ "illuminate/database": "^6.0|^7.0|^8.0",
+ "illuminate/http": "^6.0|^7.0|^8.0",
+ "illuminate/log": "^6.0|^7.0|^8.0",
+ "illuminate/notifications": "^6.0|^7.0|^8.0",
+ "illuminate/routing": "^6.0|^7.0|^8.0",
+ "illuminate/support": "^6.0|^7.0|^8.0",
+ "illuminate/view": "^6.0|^7.0|^8.0",
"moneyphp/money": "^3.2",
"nesbot/carbon": "^2.0",
- "php": "^7.2",
- "stripe/stripe-php": "^7.29",
+ "php": "^7.2.5|^8.0",
+ "stripe/stripe-php": "^7.39",
"symfony/http-kernel": "^4.3|^5.0",
"symfony/intl": "^4.3|^5.0"
},
"require-dev": {
"mockery/mockery": "^1.0",
- "orchestra/testbench": "^4.0|^5.0",
+ "orchestra/testbench": "^4.0|^5.0|^6.0",
"phpunit/phpunit": "^8.0|^9.0"
},
"suggest": {
@@ -1849,51 +1956,109 @@
"laravel",
"stripe"
],
- "time": "2020-07-21T15:04:05+00:00"
+ "time": "2021-02-23T20:22:29+00:00"
},
{
- "name": "laravel/framework",
- "version": "v7.25.0",
+ "name": "laravel/fortify",
+ "version": "v1.7.7",
"source": {
"type": "git",
- "url": "https://github.com/laravel/framework.git",
- "reference": "fdf3d4a40447eb286ba3820768306cae64bcc0b3"
+ "url": "https://github.com/laravel/fortify.git",
+ "reference": "e657d583f9b01ed794fc9b810f28a9a8632dcc13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/framework/zipball/fdf3d4a40447eb286ba3820768306cae64bcc0b3",
- "reference": "fdf3d4a40447eb286ba3820768306cae64bcc0b3",
+ "url": "https://api.github.com/repos/laravel/fortify/zipball/e657d583f9b01ed794fc9b810f28a9a8632dcc13",
+ "reference": "e657d583f9b01ed794fc9b810f28a9a8632dcc13",
+ "shasum": ""
+ },
+ "require": {
+ "bacon/bacon-qr-code": "^2.0",
+ "ext-json": "*",
+ "illuminate/support": "^8.0",
+ "php": "^7.3|^8.0",
+ "pragmarx/google2fa": "^7.0|^8.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "orchestra/testbench": "^6.0",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Fortify\\FortifyServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Fortify\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Backend controllers and scaffolding for Laravel authentication.",
+ "keywords": [
+ "auth",
+ "laravel"
+ ],
+ "time": "2021-02-23T20:32:10+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v8.30.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "ab7e1c19ee0403e15fc59983b7ccb86d85db45e6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/ab7e1c19ee0403e15fc59983b7ccb86d85db45e6",
+ "reference": "ab7e1c19ee0403e15fc59983b7ccb86d85db45e6",
"shasum": ""
},
"require": {
"doctrine/inflector": "^1.4|^2.0",
- "dragonmantank/cron-expression": "^2.0",
+ "dragonmantank/cron-expression": "^3.0.2",
"egulias/email-validator": "^2.1.10",
"ext-json": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"league/commonmark": "^1.3",
- "league/flysystem": "^1.0.34",
+ "league/flysystem": "^1.1",
"monolog/monolog": "^2.0",
- "nesbot/carbon": "^2.17",
- "opis/closure": "^3.1",
- "php": "^7.2.5",
+ "nesbot/carbon": "^2.31",
+ "opis/closure": "^3.6",
+ "php": "^7.3|^8.0",
"psr/container": "^1.0",
"psr/simple-cache": "^1.0",
- "ramsey/uuid": "^3.7|^4.0",
+ "ramsey/uuid": "^4.0",
"swiftmailer/swiftmailer": "^6.0",
- "symfony/console": "^5.0",
- "symfony/error-handler": "^5.0",
- "symfony/finder": "^5.0",
- "symfony/http-foundation": "^5.0",
- "symfony/http-kernel": "^5.0",
- "symfony/mime": "^5.0",
- "symfony/polyfill-php73": "^1.17",
- "symfony/process": "^5.0",
- "symfony/routing": "^5.0",
- "symfony/var-dumper": "^5.0",
+ "symfony/console": "^5.1.4",
+ "symfony/error-handler": "^5.1.4",
+ "symfony/finder": "^5.1.4",
+ "symfony/http-foundation": "^5.1.4",
+ "symfony/http-kernel": "^5.1.4",
+ "symfony/mime": "^5.1.4",
+ "symfony/process": "^5.1.4",
+ "symfony/routing": "^5.1.4",
+ "symfony/var-dumper": "^5.1.4",
"tijsverkoyen/css-to-inline-styles": "^2.2.2",
- "vlucas/phpdotenv": "^4.0",
+ "vlucas/phpdotenv": "^5.2",
"voku/portable-ascii": "^1.4.8"
},
"conflict": {
@@ -1907,6 +2072,7 @@
"illuminate/broadcasting": "self.version",
"illuminate/bus": "self.version",
"illuminate/cache": "self.version",
+ "illuminate/collections": "self.version",
"illuminate/config": "self.version",
"illuminate/console": "self.version",
"illuminate/container": "self.version",
@@ -1919,6 +2085,7 @@
"illuminate/hashing": "self.version",
"illuminate/http": "self.version",
"illuminate/log": "self.version",
+ "illuminate/macroable": "self.version",
"illuminate/mail": "self.version",
"illuminate/notifications": "self.version",
"illuminate/pagination": "self.version",
@@ -1934,60 +2101,66 @@
"illuminate/view": "self.version"
},
"require-dev": {
- "aws/aws-sdk-php": "^3.0",
- "doctrine/dbal": "^2.6",
- "filp/whoops": "^2.4",
- "guzzlehttp/guzzle": "^6.3.1|^7.0",
+ "aws/aws-sdk-php": "^3.155",
+ "doctrine/dbal": "^2.6|^3.0",
+ "filp/whoops": "^2.8",
+ "guzzlehttp/guzzle": "^6.5.5|^7.0.1",
"league/flysystem-cached-adapter": "^1.0",
- "mockery/mockery": "^1.3.1",
- "moontoast/math": "^1.1",
- "orchestra/testbench-core": "^5.0",
+ "mockery/mockery": "^1.4.2",
+ "orchestra/testbench-core": "^6.8",
"pda/pheanstalk": "^4.0",
- "phpunit/phpunit": "^8.4|^9.0",
+ "phpunit/phpunit": "^8.5.8|^9.3.3",
"predis/predis": "^1.1.1",
- "symfony/cache": "^5.0"
+ "symfony/cache": "^5.1.4"
},
"suggest": {
- "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.0).",
- "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6).",
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).",
+ "brianium/paratest": "Required to run tests in parallel (^6.0).",
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).",
"ext-ftp": "Required to use the Flysystem FTP driver.",
"ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
"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 (^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 HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.3.1|^7.0).",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "filp/whoops": "Required for friendly error pages in development (^2.8).",
+ "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).",
"laravel/tinker": "Required to use the tinker console command (^2.0).",
"league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
"league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
"league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
- "mockery/mockery": "Required to use mocking (^1.3.1).",
- "moontoast/math": "Required to use ordered UUIDs (^1.1).",
+ "mockery/mockery": "Required to use mocking (^1.4.2).",
"nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
"pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
- "phpunit/phpunit": "Required to use assertions and run tests (^8.4|^9.0).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^8.5.8|^9.3.3).",
+ "predis/predis": "Required to use the predis connector (^1.1.2).",
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
- "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).",
- "symfony/cache": "Required to PSR-6 cache bridge (^5.0).",
- "symfony/filesystem": "Required to create relative storage directory symbolic links (^5.0).",
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).",
"symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).",
"wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "7.x-dev"
+ "dev-master": "8.x-dev"
}
},
"autoload": {
"files": [
+ "src/Illuminate/Collections/helpers.php",
+ "src/Illuminate/Events/functions.php",
"src/Illuminate/Foundation/helpers.php",
"src/Illuminate/Support/helpers.php"
],
"psr-4": {
- "Illuminate\\": "src/Illuminate/"
+ "Illuminate\\": "src/Illuminate/",
+ "Illuminate\\Support\\": [
+ "src/Illuminate/Macroable/",
+ "src/Illuminate/Collections/"
+ ]
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2006,61 +2179,48 @@
"framework",
"laravel"
],
- "time": "2020-08-11T13:43:10+00:00"
+ "time": "2021-03-03T14:59:13+00:00"
},
{
- "name": "laravel/passport",
- "version": "v8.5.0",
+ "name": "laravel/sanctum",
+ "version": "v2.9.0",
"source": {
"type": "git",
- "url": "https://github.com/laravel/passport.git",
- "reference": "6affa6ed600c5f8909385fbae7cf6f8af3db2d39"
+ "url": "https://github.com/laravel/sanctum.git",
+ "reference": "eb191ddfc3ec04bbead33593bf982e871095f25c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/passport/zipball/6affa6ed600c5f8909385fbae7cf6f8af3db2d39",
- "reference": "6affa6ed600c5f8909385fbae7cf6f8af3db2d39",
+ "url": "https://api.github.com/repos/laravel/sanctum/zipball/eb191ddfc3ec04bbead33593bf982e871095f25c",
+ "reference": "eb191ddfc3ec04bbead33593bf982e871095f25c",
"shasum": ""
},
"require": {
"ext-json": "*",
- "firebase/php-jwt": "^3.0|^4.0|^5.0",
- "guzzlehttp/guzzle": "^6.0",
- "illuminate/auth": "^6.0|^7.0",
- "illuminate/console": "^6.0|^7.0",
- "illuminate/container": "^6.0|^7.0",
- "illuminate/contracts": "^6.0|^7.0",
- "illuminate/cookie": "^6.0|^7.0",
- "illuminate/database": "^6.0|^7.0",
- "illuminate/encryption": "^6.0|^7.0",
- "illuminate/http": "^6.0|^7.0",
- "illuminate/support": "^6.0|^7.0",
- "laminas/laminas-diactoros": "^2.2",
- "league/oauth2-server": "^8.0",
- "nyholm/psr7": "^1.0",
- "php": "^7.2",
- "phpseclib/phpseclib": "^2.0",
- "symfony/psr-http-message-bridge": "^2.0"
+ "illuminate/contracts": "^6.9|^7.0|^8.0",
+ "illuminate/database": "^6.9|^7.0|^8.0",
+ "illuminate/support": "^6.9|^7.0|^8.0",
+ "php": "^7.2|^8.0"
},
"require-dev": {
"mockery/mockery": "^1.0",
- "orchestra/testbench": "^4.4|^5.0",
- "phpunit/phpunit": "^8.0"
+ "orchestra/testbench": "^4.0|^5.0|^6.0",
+ "phpunit/phpunit": "^8.0|^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "8.x-dev"
+ "dev-master": "2.x-dev"
},
"laravel": {
"providers": [
- "Laravel\\Passport\\PassportServiceProvider"
+ "Laravel\\Sanctum\\SanctumServiceProvider"
]
}
},
"autoload": {
"psr-4": {
- "Laravel\\Passport\\": "src/"
+ "Laravel\\Sanctum\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -2073,41 +2233,41 @@
"email": "taylor@laravel.com"
}
],
- "description": "Laravel Passport provides OAuth2 server support to Laravel.",
+ "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.",
"keywords": [
+ "auth",
"laravel",
- "oauth",
- "passport"
+ "sanctum"
],
- "time": "2020-05-05T14:25:53+00:00"
+ "time": "2021-01-26T19:47:38+00:00"
},
{
"name": "laravel/scout",
- "version": "v7.2.1",
+ "version": "v8.6.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/scout.git",
- "reference": "733f334cc2487c6ac85a557ae5eefd29f6bb1ba3"
+ "reference": "54070f7b68fed15f25e61e68884c4110496b8aa1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/scout/zipball/733f334cc2487c6ac85a557ae5eefd29f6bb1ba3",
- "reference": "733f334cc2487c6ac85a557ae5eefd29f6bb1ba3",
+ "url": "https://api.github.com/repos/laravel/scout/zipball/54070f7b68fed15f25e61e68884c4110496b8aa1",
+ "reference": "54070f7b68fed15f25e61e68884c4110496b8aa1",
"shasum": ""
},
"require": {
- "illuminate/bus": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
- "illuminate/contracts": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
- "illuminate/database": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
- "illuminate/pagination": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
- "illuminate/queue": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
- "illuminate/support": "~5.4.0|~5.5.0|~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0",
- "php": "^7.1.3"
+ "illuminate/bus": "^6.0|^7.0|^8.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0",
+ "illuminate/database": "^6.0|^7.0|^8.0",
+ "illuminate/http": "^6.0|^7.0|^8.0",
+ "illuminate/pagination": "^6.0|^7.0|^8.0",
+ "illuminate/queue": "^6.0|^7.0|^8.0",
+ "illuminate/support": "^6.0|^7.0|^8.0",
+ "php": "^7.2|^8.0"
},
"require-dev": {
- "algolia/algoliasearch-client-php": "^2.2",
"mockery/mockery": "^1.0",
- "phpunit/phpunit": "^6.0|^7.0|^8.0"
+ "phpunit/phpunit": "^8.0|^9.3"
},
"suggest": {
"algolia/algoliasearch-client-php": "Required to use the Algolia engine (^2.2)."
@@ -2115,7 +2275,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "7.0-dev"
+ "dev-master": "8.x-dev"
},
"laravel": {
"providers": [
@@ -2144,33 +2304,33 @@
"laravel",
"search"
],
- "time": "2019-09-24T21:06:28+00:00"
+ "time": "2021-01-19T15:30:52+00:00"
},
{
"name": "laravel/tinker",
- "version": "v2.4.2",
+ "version": "v2.6.1",
"source": {
"type": "git",
"url": "https://github.com/laravel/tinker.git",
- "reference": "58424c24e8aec31c3a3ac54eb3adb15e8a0a067b"
+ "reference": "04ad32c1a3328081097a181875733fa51f402083"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/tinker/zipball/58424c24e8aec31c3a3ac54eb3adb15e8a0a067b",
- "reference": "58424c24e8aec31c3a3ac54eb3adb15e8a0a067b",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/04ad32c1a3328081097a181875733fa51f402083",
+ "reference": "04ad32c1a3328081097a181875733fa51f402083",
"shasum": ""
},
"require": {
"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.10.3",
- "symfony/var-dumper": "^4.3|^5.0"
+ "php": "^7.2.5|^8.0",
+ "psy/psysh": "^0.10.4",
+ "symfony/var-dumper": "^4.3.4|^5.0"
},
"require-dev": {
- "mockery/mockery": "^1.3.1",
- "phpunit/phpunit": "^8.4|^9.0"
+ "mockery/mockery": "~1.3.3|^1.4.2",
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
},
"suggest": {
"illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)."
@@ -2208,34 +2368,33 @@
"laravel",
"psysh"
],
- "time": "2020-08-11T19:28:08+00:00"
+ "time": "2021-03-02T16:53:12+00:00"
},
{
"name": "laravel/ui",
- "version": "v2.1.0",
+ "version": "v3.2.0",
"source": {
"type": "git",
"url": "https://github.com/laravel/ui.git",
- "reference": "da9350533d0da60d5dc42fb7de9c561c72129bba"
+ "reference": "a1f82c6283c8373ea1958b8a27c3d5c98cade351"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/laravel/ui/zipball/da9350533d0da60d5dc42fb7de9c561c72129bba",
- "reference": "da9350533d0da60d5dc42fb7de9c561c72129bba",
+ "url": "https://api.github.com/repos/laravel/ui/zipball/a1f82c6283c8373ea1958b8a27c3d5c98cade351",
+ "reference": "a1f82c6283c8373ea1958b8a27c3d5c98cade351",
"shasum": ""
},
"require": {
- "illuminate/console": "^7.0",
- "illuminate/filesystem": "^7.0",
- "illuminate/support": "^7.0",
- "php": "^7.2.5"
- },
- "require-dev": {
- "mockery/mockery": "^1.0",
- "phpunit/phpunit": "^8.0"
+ "illuminate/console": "^8.0",
+ "illuminate/filesystem": "^8.0",
+ "illuminate/support": "^8.0",
+ "php": "^7.3|^8.0"
},
"type": "library",
"extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ },
"laravel": {
"providers": [
"Laravel\\Ui\\UiServiceProvider"
@@ -2263,75 +2422,20 @@
"laravel",
"ui"
],
- "time": "2020-06-30T20:56:33+00:00"
- },
- {
- "name": "lcobucci/jwt",
- "version": "3.3.2",
- "source": {
- "type": "git",
- "url": "https://github.com/lcobucci/jwt.git",
- "reference": "56f10808089e38623345e28af2f2d5e4eb579455"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/lcobucci/jwt/zipball/56f10808089e38623345e28af2f2d5e4eb579455",
- "reference": "56f10808089e38623345e28af2f2d5e4eb579455",
- "shasum": ""
- },
- "require": {
- "ext-mbstring": "*",
- "ext-openssl": "*",
- "php": "^5.6 || ^7.0"
- },
- "require-dev": {
- "mikey179/vfsstream": "~1.5",
- "phpmd/phpmd": "~2.2",
- "phpunit/php-invoker": "~1.1",
- "phpunit/phpunit": "^5.7 || ^7.3",
- "squizlabs/php_codesniffer": "~2.3"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Lcobucci\\JWT\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Luís Otávio Cobucci Oblonczyk",
- "email": "lcobucci@gmail.com",
- "role": "Developer"
- }
- ],
- "description": "A simple library to work with JSON Web Token and JSON Web Signature",
- "keywords": [
- "JWS",
- "jwt"
- ],
- "time": "2020-05-22T08:21:12+00:00"
+ "time": "2021-01-06T19:20:22+00:00"
},
{
"name": "league/commonmark",
- "version": "1.5.3",
+ "version": "1.5.7",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/commonmark.git",
- "reference": "2574454b97e4103dc4e36917bd783b25624aefcd"
+ "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2574454b97e4103dc4e36917bd783b25624aefcd",
- "reference": "2574454b97e4103dc4e36917bd783b25624aefcd",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/11df9b36fd4f1d2b727a73bf14931d81373b9a54",
+ "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54",
"shasum": ""
},
"require": {
@@ -2343,7 +2447,7 @@
},
"require-dev": {
"cebe/markdown": "~1.0",
- "commonmark/commonmark.js": "0.29.1",
+ "commonmark/commonmark.js": "0.29.2",
"erusev/parsedown": "~1.0",
"ext-json": "*",
"github/gfm": "0.29.0",
@@ -2413,70 +2517,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-19T22:47:30+00:00"
- },
- {
- "name": "league/event",
- "version": "2.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/event.git",
- "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/event/zipball/d2cc124cf9a3fab2bb4ff963307f60361ce4d119",
- "reference": "d2cc124cf9a3fab2bb4ff963307f60361ce4d119",
- "shasum": ""
- },
- "require": {
- "php": ">=5.4.0"
- },
- "require-dev": {
- "henrikbjorn/phpspec-code-coverage": "~1.0.1",
- "phpspec/phpspec": "^2.2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.2-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "League\\Event\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Frank de Jonge",
- "email": "info@frenky.net"
- }
- ],
- "description": "Event package",
- "keywords": [
- "emitter",
- "event",
- "listener"
- ],
- "time": "2018-11-26T11:52:41+00:00"
+ "time": "2020-10-31T13:49:32+00:00"
},
{
"name": "league/flysystem",
- "version": "1.1.1",
+ "version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem.git",
- "reference": "6e96f54d82e71f71c4108da33ee96a7f57083710"
+ "reference": "9be3b16c877d477357c015cec057548cf9b2a14a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/6e96f54d82e71f71c4108da33ee96a7f57083710",
- "reference": "6e96f54d82e71f71c4108da33ee96a7f57083710",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a",
+ "reference": "9be3b16c877d477357c015cec057548cf9b2a14a",
"shasum": ""
},
"require": {
@@ -2554,24 +2608,24 @@
"type": "other"
}
],
- "time": "2020-08-12T14:23:41+00:00"
+ "time": "2020-08-23T07:39:11+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
- "version": "1.0.25",
+ "version": "1.0.29",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
- "reference": "d409b97a50bf85fbde30cbc9fc10237475e696ea"
+ "reference": "4e25cc0582a36a786c31115e419c6e40498f6972"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/d409b97a50bf85fbde30cbc9fc10237475e696ea",
- "reference": "d409b97a50bf85fbde30cbc9fc10237475e696ea",
+ "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/4e25cc0582a36a786c31115e419c6e40498f6972",
+ "reference": "4e25cc0582a36a786c31115e419c6e40498f6972",
"shasum": ""
},
"require": {
- "aws/aws-sdk-php": "^3.0.0",
+ "aws/aws-sdk-php": "^3.20.0",
"league/flysystem": "^1.0.40",
"php": ">=5.5.0"
},
@@ -2601,7 +2655,7 @@
}
],
"description": "Flysystem adapter for the AWS S3 SDK v3.x",
- "time": "2020-06-02T18:41:58+00:00"
+ "time": "2020-10-08T18:58:37+00:00"
},
{
"name": "league/flysystem-cached-adapter",
@@ -2652,16 +2706,16 @@
},
{
"name": "league/mime-type-detection",
- "version": "1.4.0",
+ "version": "1.7.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/mime-type-detection.git",
- "reference": "fda190b62b962d96a069fcc414d781db66d65b69"
+ "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/fda190b62b962d96a069fcc414d781db66d65b69",
- "reference": "fda190b62b962d96a069fcc414d781db66d65b69",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
+ "reference": "3b9dff8aaf7323590c1d2e443db701eb1f9aa0d3",
"shasum": ""
},
"require": {
@@ -2669,8 +2723,9 @@
"php": "^7.2 || ^8.0"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.36",
- "phpunit/phpunit": "^8.5.8"
+ "friendsofphp/php-cs-fixer": "^2.18",
+ "phpstan/phpstan": "^0.12.68",
+ "phpunit/phpunit": "^8.5.8 || ^9.3"
},
"type": "library",
"autoload": {
@@ -2699,84 +2754,7 @@
"type": "tidelift"
}
],
- "time": "2020-08-09T10:34:01+00:00"
- },
- {
- "name": "league/oauth2-server",
- "version": "8.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/thephpleague/oauth2-server.git",
- "reference": "09f22e8121fa1832962dba18213b80d4267ef8a3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/09f22e8121fa1832962dba18213b80d4267ef8a3",
- "reference": "09f22e8121fa1832962dba18213b80d4267ef8a3",
- "shasum": ""
- },
- "require": {
- "defuse/php-encryption": "^2.2.1",
- "ext-json": "*",
- "ext-openssl": "*",
- "lcobucci/jwt": "^3.3.1",
- "league/event": "^2.2",
- "php": ">=7.2.0",
- "psr/http-message": "^1.0.1"
- },
- "replace": {
- "league/oauth2server": "*",
- "lncd/oauth2": "*"
- },
- "require-dev": {
- "laminas/laminas-diactoros": "^2.3.0",
- "phpstan/phpstan": "^0.11.19",
- "phpstan/phpstan-phpunit": "^0.11.2",
- "phpunit/phpunit": "^8.5.4 || ^9.1.3",
- "roave/security-advisories": "dev-master"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "League\\OAuth2\\Server\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Alex Bilbie",
- "email": "hello@alexbilbie.com",
- "homepage": "http://www.alexbilbie.com",
- "role": "Developer"
- },
- {
- "name": "Andy Millington",
- "email": "andrew@noexceptions.io",
- "homepage": "https://www.noexceptions.io",
- "role": "Developer"
- }
- ],
- "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.",
- "homepage": "https://oauth2.thephpleague.com/",
- "keywords": [
- "Authentication",
- "api",
- "auth",
- "authorisation",
- "authorization",
- "oauth",
- "oauth 2",
- "oauth 2.0",
- "oauth2",
- "protect",
- "resource",
- "secure",
- "server"
- ],
- "time": "2020-07-01T11:33:50+00:00"
+ "time": "2021-01-18T20:58:21+00:00"
},
{
"name": "madnest/madzipper",
@@ -2918,16 +2896,16 @@
},
{
"name": "monolog/monolog",
- "version": "2.1.1",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5"
+ "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/f9eee5cec93dfb313a38b6b288741e84e53f02d5",
- "reference": "f9eee5cec93dfb313a38b6b288741e84e53f02d5",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084",
+ "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084",
"shasum": ""
},
"require": {
@@ -2940,16 +2918,17 @@
"require-dev": {
"aws/aws-sdk-php": "^2.4.9 || ^3.0",
"doctrine/couchdb": "~1.0@dev",
- "elasticsearch/elasticsearch": "^6.0",
+ "elasticsearch/elasticsearch": "^7",
"graylog2/gelf-php": "^1.4.2",
+ "mongodb/mongodb": "^1.8",
"php-amqplib/php-amqplib": "~2.4",
"php-console/php-console": "^3.1.3",
- "php-parallel-lint/php-parallel-lint": "^1.0",
"phpspec/prophecy": "^1.6.1",
+ "phpstan/phpstan": "^0.12.59",
"phpunit/phpunit": "^8.5",
"predis/predis": "^1.1",
"rollbar/rollbar": "^1.3",
- "ruflin/elastica": ">=0.90 <3.0",
+ "ruflin/elastica": ">=0.90 <7.0.1",
"swiftmailer/swiftmailer": "^5.3|^6.0"
},
"suggest": {
@@ -2969,7 +2948,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.x-dev"
+ "dev-main": "2.x-dev"
}
},
"autoload": {
@@ -2985,11 +2964,11 @@
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "homepage": "https://seld.be"
}
],
"description": "Sends your logs to files, sockets, inboxes, databases and various web services",
- "homepage": "http://github.com/Seldaek/monolog",
+ "homepage": "https://github.com/Seldaek/monolog",
"keywords": [
"log",
"logging",
@@ -3005,7 +2984,7 @@
"type": "tidelift"
}
],
- "time": "2020-07-23T08:41:23+00:00"
+ "time": "2020-12-14T13:15:25+00:00"
},
{
"name": "mtdowling/jmespath.php",
@@ -3065,17 +3044,71 @@
"time": "2020-07-31T21:01:56+00:00"
},
{
- "name": "nesbot/carbon",
- "version": "2.38.0",
+ "name": "myclabs/deep-copy",
+ "version": "1.10.2",
"source": {
"type": "git",
- "url": "https://github.com/briannesbitt/Carbon.git",
- "reference": "d8f6a6a91d1eb9304527b040500f61923e97674b"
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d8f6a6a91d1eb9304527b040500f61923e97674b",
- "reference": "d8f6a6a91d1eb9304527b040500f61923e97674b",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T09:40:50+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "2.45.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "528783b188bdb853eb21239b1722831e0f000a8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/528783b188bdb853eb21239b1722831e0f000a8d",
+ "reference": "528783b188bdb853eb21239b1722831e0f000a8d",
"shasum": ""
},
"require": {
@@ -3088,10 +3121,10 @@
"doctrine/orm": "^2.7",
"friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
"kylekatarnls/multi-tester": "^2.0",
- "phpmd/phpmd": "^2.8",
+ "phpmd/phpmd": "^2.9",
"phpstan/extension-installer": "^1.0",
- "phpstan/phpstan": "^0.12.35",
- "phpunit/phpunit": "^7.5 || ^8.0",
+ "phpstan/phpstan": "^0.12.54",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14",
"squizlabs/php_codesniffer": "^3.4"
},
"bin": [
@@ -3151,20 +3184,20 @@
"type": "tidelift"
}
],
- "time": "2020-08-04T19:12:46+00:00"
+ "time": "2021-02-11T18:30:17+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v4.8.0",
+ "version": "v4.10.4",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "8c58eb4cd4f3883f82611abeac2efbc3dbed787e"
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8c58eb4cd4f3883f82611abeac2efbc3dbed787e",
- "reference": "8c58eb4cd4f3883f82611abeac2efbc3dbed787e",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
"shasum": ""
},
"require": {
@@ -3172,7 +3205,7 @@
"php": ">=7.0"
},
"require-dev": {
- "ircmaxell/php-yacc": "^0.0.6",
+ "ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
@@ -3181,7 +3214,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.8-dev"
+ "dev-master": "4.9-dev"
}
},
"autoload": {
@@ -3203,96 +3236,33 @@
"parser",
"php"
],
- "time": "2020-08-09T10:23:20+00:00"
- },
- {
- "name": "nyholm/psr7",
- "version": "1.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/Nyholm/psr7.git",
- "reference": "c17f4f73985f62054a331cbc4ffdf9868c4ef256"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Nyholm/psr7/zipball/c17f4f73985f62054a331cbc4ffdf9868c4ef256",
- "reference": "c17f4f73985f62054a331cbc4ffdf9868c4ef256",
- "shasum": ""
- },
- "require": {
- "php": "^7.1",
- "php-http/message-factory": "^1.0",
- "psr/http-factory": "^1.0",
- "psr/http-message": "^1.0"
- },
- "provide": {
- "psr/http-factory-implementation": "1.0",
- "psr/http-message-implementation": "1.0"
- },
- "require-dev": {
- "http-interop/http-factory-tests": "dev-master",
- "php-http/psr7-integration-tests": "^1.0",
- "phpunit/phpunit": "^7.5",
- "symfony/error-handler": "^4.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Nyholm\\Psr7\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Tobias Nyholm",
- "email": "tobias.nyholm@gmail.com"
- },
- {
- "name": "Martijn van der Ven",
- "email": "martijn@vanderven.se"
- }
- ],
- "description": "A fast PHP7 implementation of PSR-7",
- "homepage": "http://tnyholm.se",
- "keywords": [
- "psr-17",
- "psr-7"
- ],
- "time": "2020-05-23T11:29:07+00:00"
+ "time": "2020-12-20T10:01:03+00:00"
},
{
"name": "opis/closure",
- "version": "3.5.6",
+ "version": "3.6.1",
"source": {
"type": "git",
"url": "https://github.com/opis/closure.git",
- "reference": "e8d34df855b0a0549a300cb8cb4db472556e8aa9"
+ "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/opis/closure/zipball/e8d34df855b0a0549a300cb8cb4db472556e8aa9",
- "reference": "e8d34df855b0a0549a300cb8cb4db472556e8aa9",
+ "url": "https://api.github.com/repos/opis/closure/zipball/943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5",
+ "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5",
"shasum": ""
},
"require": {
- "php": "^5.4 || ^7.0"
+ "php": "^5.4 || ^7.0 || ^8.0"
},
"require-dev": {
"jeremeamia/superclosure": "^2.0",
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.5.x-dev"
+ "dev-master": "3.6.x-dev"
}
},
"autoload": {
@@ -3327,33 +3297,35 @@
"serialization",
"serialize"
],
- "time": "2020-08-11T08:46:50+00:00"
+ "time": "2020-11-07T02:01:34+00:00"
},
{
- "name": "paragonie/random_compat",
- "version": "v9.99.99",
+ "name": "paragonie/constant_time_encoding",
+ "version": "v2.4.0",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
+ "url": "https://github.com/paragonie/constant_time_encoding.git",
+ "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
- "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
+ "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
+ "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c",
"shasum": ""
},
"require": {
- "php": "^7"
+ "php": "^7|^8"
},
"require-dev": {
- "phpunit/phpunit": "4.*|5.*",
- "vimeo/psalm": "^1"
- },
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "vimeo/psalm": "^1|^2|^3|^4"
},
"type": "library",
+ "autoload": {
+ "psr-4": {
+ "ParagonIE\\ConstantTime\\": "src/"
+ }
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
@@ -3362,17 +3334,135 @@
{
"name": "Paragon Initiative Enterprises",
"email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
+ "homepage": "https://paragonie.com",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Steve 'Sc00bz' Thomas",
+ "email": "steve@tobtu.com",
+ "homepage": "https://www.tobtu.com",
+ "role": "Original Developer"
}
],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
"keywords": [
- "csprng",
- "polyfill",
- "pseudorandom",
- "random"
+ "base16",
+ "base32",
+ "base32_decode",
+ "base32_encode",
+ "base64",
+ "base64_decode",
+ "base64_encode",
+ "bin2hex",
+ "encoding",
+ "hex",
+ "hex2bin",
+ "rfc4648"
],
- "time": "2018-07-02T15:55:56+00:00"
+ "time": "2020-12-06T15:14:20+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2020-06-27T14:33:11+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
+ "reference": "bae7c545bef187884426f042434e561ab1ddb182",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2021-02-23T14:00:09+00:00"
},
{
"name": "phenx/php-font-lib",
@@ -3452,32 +3542,31 @@
"time": "2019-09-11T20:02:13+00:00"
},
{
- "name": "php-http/message-factory",
- "version": "v1.0.2",
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
"source": {
"type": "git",
- "url": "https://github.com/php-http/message-factory.git",
- "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1"
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-http/message-factory/zipball/a478cb11f66a6ac48d8954216cfed9aa06a501a1",
- "reference": "a478cb11f66a6ac48d8954216cfed9aa06a501a1",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"shasum": ""
},
"require": {
- "php": ">=5.4",
- "psr/http-message": "^1.0"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-2.x": "2.x-dev"
}
},
"autoload": {
"psr-4": {
- "Http\\Message\\": "src/"
+ "phpDocumentor\\Reflection\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3486,20 +3575,117 @@
],
"authors": [
{
- "name": "Márk Sági-Kazár",
- "email": "mark.sagikazar@gmail.com"
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
}
],
- "description": "Factory interfaces for PSR-7 HTTP Message",
- "homepage": "http://php-http.org",
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
"keywords": [
- "factory",
- "http",
- "message",
- "stream",
- "uri"
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
],
- "time": "2015-12-19T14:08:53+00:00"
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "shasum": ""
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2020-09-03T19:13:55+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "time": "2020-09-17T18:55:26+00:00"
},
{
"name": "phpoption/phpoption",
@@ -3567,41 +3753,39 @@
"time": "2020-07-20T17:29:33+00:00"
},
{
- "name": "phpseclib/phpseclib",
- "version": "2.0.28",
+ "name": "phpspec/prophecy",
+ "version": "1.12.2",
"source": {
"type": "git",
- "url": "https://github.com/phpseclib/phpseclib.git",
- "reference": "d1ca58cf33cb21046d702ae3a7b14fdacd9f3260"
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "245710e971a030f42e08f4912863805570f23d39"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/d1ca58cf33cb21046d702ae3a7b14fdacd9f3260",
- "reference": "d1ca58cf33cb21046d702ae3a7b14fdacd9f3260",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39",
+ "reference": "245710e971a030f42e08f4912863805570f23d39",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2 || ~8.0, <8.1",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
},
"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."
+ "phpspec/phpspec": "^6.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11.x-dev"
+ }
+ },
"autoload": {
- "files": [
- "phpseclib/bootstrap.php"
- ],
"psr-4": {
- "phpseclib\\": "phpseclib/"
+ "Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3610,53 +3794,471 @@
],
"authors": [
{
- "name": "Jim Wigginton",
- "email": "terrafrost@php.net",
- "role": "Lead Developer"
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
},
{
- "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"
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
}
],
- "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
- "homepage": "http://phpseclib.sourceforge.net",
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
"keywords": [
- "BigInteger",
- "aes",
- "asn.1",
- "asn1",
- "blowfish",
- "crypto",
- "cryptography",
- "encryption",
- "rsa",
- "security",
- "sftp",
- "signature",
- "signing",
- "ssh",
- "twofish",
- "x.509",
- "x509"
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
],
- "time": "2020-07-08T09:08:33+00:00"
+ "time": "2020-12-19T10:15:11+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1",
+ "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.10.2",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:44:49+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:57:25+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f661659747f2f87f9e72095bb207bceb0f151cb4",
+ "reference": "f661659747f2f87f9e72095bb207bceb0f151cb4",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.1",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2.3",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^2.3",
+ "sebastian/version": "^3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*",
+ "phpspec/prophecy-phpunit": "^2.0.1"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-02-02T14:45:58+00:00"
+ },
+ {
+ "name": "pragmarx/google2fa",
+ "version": "8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/antonioribeiro/google2fa.git",
+ "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/26c4c5cf30a2844ba121760fd7301f8ad240100b",
+ "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/constant_time_encoding": "^1.0|^2.0",
+ "php": "^7.1|^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.18",
+ "phpunit/phpunit": "^7.5.15|^8.5|^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PragmaRX\\Google2FA\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Antonio Carlos Ribeiro",
+ "email": "acr@antoniocarlosribeiro.com",
+ "role": "Creator & Designer"
+ }
+ ],
+ "description": "A One Time Password Authentication package, compatible with Google Authenticator.",
+ "keywords": [
+ "2fa",
+ "Authentication",
+ "Two Factor Authentication",
+ "google2fa"
+ ],
+ "time": "2020-04-05T10:47:18+00:00"
},
{
"name": "psr/cache",
@@ -3800,21 +4402,21 @@
"time": "2019-01-08T18:20:26+00:00"
},
{
- "name": "psr/http-factory",
+ "name": "psr/http-client",
"version": "1.0.1",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/http-factory.git",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be"
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
- "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
"shasum": ""
},
"require": {
- "php": ">=7.0.0",
+ "php": "^7.0 || ^8.0",
"psr/http-message": "^1.0"
},
"type": "library",
@@ -3825,7 +4427,7 @@
},
"autoload": {
"psr-4": {
- "Psr\\Http\\Message\\": "src/"
+ "Psr\\Http\\Client\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -3838,18 +4440,15 @@
"homepage": "http://www.php-fig.org/"
}
],
- "description": "Common interfaces for PSR-7 HTTP message factories",
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
"keywords": [
- "factory",
"http",
- "message",
+ "http-client",
"psr",
- "psr-17",
- "psr-7",
- "request",
- "response"
+ "psr-18"
],
- "time": "2019-04-30T12:38:16+00:00"
+ "time": "2020-06-29T06:28:15+00:00"
},
{
"name": "psr/http-message",
@@ -3998,16 +4597,16 @@
},
{
"name": "psy/psysh",
- "version": "v0.10.4",
+ "version": "v0.10.6",
"source": {
"type": "git",
"url": "https://github.com/bobthecow/psysh.git",
- "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560"
+ "reference": "6f990c19f91729de8b31e639d6e204ea59f19cf3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/bobthecow/psysh/zipball/a8aec1b2981ab66882a01cce36a49b6317dc3560",
- "reference": "a8aec1b2981ab66882a01cce36a49b6317dc3560",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/6f990c19f91729de8b31e639d6e204ea59f19cf3",
+ "reference": "6f990c19f91729de8b31e639d6e204ea59f19cf3",
"shasum": ""
},
"require": {
@@ -4036,7 +4635,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "0.10.x-dev"
+ "dev-main": "0.10.x-dev"
}
},
"autoload": {
@@ -4066,7 +4665,7 @@
"interactive",
"shell"
],
- "time": "2020-05-03T19:32:03+00:00"
+ "time": "2021-01-18T15:53:43+00:00"
},
{
"name": "ralouphie/getallheaders",
@@ -4110,16 +4709,16 @@
},
{
"name": "ramsey/collection",
- "version": "1.1.0",
+ "version": "1.1.3",
"source": {
"type": "git",
"url": "https://github.com/ramsey/collection.git",
- "reference": "044184884e3c803e4cbb6451386cb71562939b18"
+ "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/collection/zipball/044184884e3c803e4cbb6451386cb71562939b18",
- "reference": "044184884e3c803e4cbb6451386cb71562939b18",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1",
+ "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1",
"shasum": ""
},
"require": {
@@ -4129,19 +4728,19 @@
"captainhook/captainhook": "^5.3",
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
"ergebnis/composer-normalize": "^2.6",
- "fzaninotto/faker": "^1.5",
+ "fakerphp/faker": "^1.5",
"hamcrest/hamcrest-php": "^2",
- "jangregor/phpstan-prophecy": "^0.6",
+ "jangregor/phpstan-prophecy": "^0.8",
"mockery/mockery": "^1.3",
"phpstan/extension-installer": "^1",
"phpstan/phpstan": "^0.12.32",
"phpstan/phpstan-mockery": "^0.12.5",
"phpstan/phpstan-phpunit": "^0.12.11",
- "phpunit/phpunit": "^8.5",
+ "phpunit/phpunit": "^8.5 || ^9",
"psy/psysh": "^0.10.4",
"slevomat/coding-standard": "^6.3",
"squizlabs/php_codesniffer": "^3.5",
- "vimeo/psalm": "^3.12.2"
+ "vimeo/psalm": "^4.4"
},
"type": "library",
"autoload": {
@@ -4173,26 +4772,30 @@
{
"url": "https://github.com/ramsey",
"type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+ "type": "tidelift"
}
],
- "time": "2020-08-11T00:57:21+00:00"
+ "time": "2021-01-21T17:40:04+00:00"
},
{
"name": "ramsey/uuid",
- "version": "4.1.0",
+ "version": "4.1.1",
"source": {
"type": "git",
"url": "https://github.com/ramsey/uuid.git",
- "reference": "988dbefc7878d0a35f12afb4df1f7dd0bd153c43"
+ "reference": "cd4032040a750077205918c86049aa0f43d22947"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ramsey/uuid/zipball/988dbefc7878d0a35f12afb4df1f7dd0bd153c43",
- "reference": "988dbefc7878d0a35f12afb4df1f7dd0bd153c43",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947",
"shasum": ""
},
"require": {
- "brick/math": "^0.8",
+ "brick/math": "^0.8 || ^0.9",
"ext-json": "*",
"php": "^7.2 || ^8",
"ramsey/collection": "^1.0",
@@ -4262,7 +4865,7 @@
"type": "github"
}
],
- "time": "2020-07-28T16:51:01+00:00"
+ "time": "2020-08-18T17:17:46+00:00"
},
{
"name": "sabberworm/php-css-parser",
@@ -4310,17 +4913,984 @@
"time": "2020-06-01T09:10:00+00:00"
},
{
- "name": "stripe/stripe-php",
- "version": "v7.47.0",
+ "name": "scssphp/scssphp",
+ "version": "v1.4.1",
"source": {
"type": "git",
- "url": "https://github.com/stripe/stripe-php.git",
- "reference": "b51656cb398d081fcee53a76f6edb8fd5c1a5306"
+ "url": "https://github.com/scssphp/scssphp.git",
+ "reference": "ba86c963b94ec7ebd6e19d90cdab90d89667dbf7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/stripe/stripe-php/zipball/b51656cb398d081fcee53a76f6edb8fd5c1a5306",
- "reference": "b51656cb398d081fcee53a76f6edb8fd5c1a5306",
+ "url": "https://api.github.com/repos/scssphp/scssphp/zipball/ba86c963b94ec7ebd6e19d90cdab90d89667dbf7",
+ "reference": "ba86c963b94ec7ebd6e19d90cdab90d89667dbf7",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-json": "*",
+ "php": ">=5.6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3 || ^9.4",
+ "sass/sass-spec": "2020.12.29",
+ "squizlabs/php_codesniffer": "~3.5",
+ "symfony/phpunit-bridge": "^5.1",
+ "twbs/bootstrap": "~4.3",
+ "zurb/foundation": "~6.5"
+ },
+ "bin": [
+ "bin/pscss"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "ScssPhp\\ScssPhp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Anthon Pang",
+ "email": "apang@softwaredevelopment.ca",
+ "homepage": "https://github.com/robocoder"
+ },
+ {
+ "name": "Cédric Morin",
+ "email": "cedric@yterium.com",
+ "homepage": "https://github.com/Cerdic"
+ }
+ ],
+ "description": "scssphp is a compiler for SCSS written in PHP.",
+ "homepage": "http://scssphp.github.io/scssphp/",
+ "keywords": [
+ "css",
+ "less",
+ "sass",
+ "scss",
+ "stylesheet"
+ ],
+ "support": {
+ "issues": "https://github.com/scssphp/scssphp/issues",
+ "source": "https://github.com/scssphp/scssphp/tree/v1.4.1"
+ },
+ "time": "2021-01-04T13:23:23+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:49:45+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:52:38+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:24:23+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:55:19+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:18:59+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "stripe/stripe-php",
+ "version": "v7.75.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/stripe/stripe-php.git",
+ "reference": "d377a667cd789b99ccab768441a5a2160cc4ea80"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/stripe/stripe-php/zipball/d377a667cd789b99ccab768441a5a2160cc4ea80",
+ "reference": "d377a667cd789b99ccab768441a5a2160cc4ea80",
"shasum": ""
},
"require": {
@@ -4330,7 +5900,7 @@
"php": ">=5.6.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "2.16.1",
+ "friendsofphp/php-cs-fixer": "2.17.1",
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5.7",
"squizlabs/php_codesniffer": "^3.3",
@@ -4364,36 +5934,35 @@
"payment processing",
"stripe"
],
- "time": "2020-08-13T22:35:56+00:00"
+ "time": "2021-02-22T14:31:21+00:00"
},
{
"name": "swiftmailer/swiftmailer",
- "version": "v6.2.3",
+ "version": "v6.2.5",
"source": {
"type": "git",
"url": "https://github.com/swiftmailer/swiftmailer.git",
- "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9"
+ "reference": "698a6a9f54d7eb321274de3ad19863802c879fb7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9",
- "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/698a6a9f54d7eb321274de3ad19863802c879fb7",
+ "reference": "698a6a9f54d7eb321274de3ad19863802c879fb7",
"shasum": ""
},
"require": {
- "egulias/email-validator": "~2.0",
+ "egulias/email-validator": "^2.0",
"php": ">=7.0.0",
"symfony/polyfill-iconv": "^1.0",
"symfony/polyfill-intl-idn": "^1.10",
"symfony/polyfill-mbstring": "^1.0"
},
"require-dev": {
- "mockery/mockery": "~0.9.1",
- "symfony/phpunit-bridge": "^3.4.19|^4.1.8"
+ "mockery/mockery": "^1.0",
+ "symfony/phpunit-bridge": "^4.4|^5.0"
},
"suggest": {
- "ext-intl": "Needed to support internationalized email addresses",
- "true/punycode": "Needed to support internationalized email addresses, if ext-intl is not installed"
+ "ext-intl": "Needed to support internationalized email addresses"
},
"type": "library",
"extra": {
@@ -4426,20 +5995,30 @@
"mail",
"mailer"
],
- "time": "2019-11-12T09:31:26+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-12T09:35:59+00:00"
},
{
"name": "symfony/console",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "2226c68009627934b8cfc01260b4d287eab070df"
+ "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/2226c68009627934b8cfc01260b4d287eab070df",
- "reference": "2226c68009627934b8cfc01260b4d287eab070df",
+ "url": "https://api.github.com/repos/symfony/console/zipball/89d4b176d12a2946a1ae4e34906a025b7b6b135a",
+ "reference": "89d4b176d12a2946a1ae4e34906a025b7b6b135a",
"shasum": ""
},
"require": {
@@ -4476,11 +6055,6 @@
"symfony/process": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Console\\": ""
@@ -4503,8 +6077,14 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Console Component",
+ "description": "Eases the creation of beautiful and testable command line interfaces",
"homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
"funding": [
{
"url": "https://symfony.com/sponsor",
@@ -4519,31 +6099,26 @@
"type": "tidelift"
}
],
- "time": "2020-07-06T13:23:11+00:00"
+ "time": "2021-01-28T22:06:19+00:00"
},
{
"name": "symfony/css-selector",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/css-selector.git",
- "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9"
+ "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/css-selector/zipball/e544e24472d4c97b2d11ade7caacd446727c6bf9",
- "reference": "e544e24472d4c97b2d11ade7caacd446727c6bf9",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/f65f217b3314504a1ec99c2d6ef69016bb13490f",
+ "reference": "f65f217b3314504a1ec99c2d6ef69016bb13490f",
"shasum": ""
},
"require": {
"php": ">=7.2.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\CssSelector\\": ""
@@ -4570,7 +6145,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony CssSelector Component",
+ "description": "Converts CSS selectors to XPath expressions",
"homepage": "https://symfony.com",
"funding": [
{
@@ -4586,20 +6161,20 @@
"type": "tidelift"
}
],
- "time": "2020-05-20T17:43:50+00:00"
+ "time": "2021-01-27T10:01:46+00:00"
},
{
"name": "symfony/deprecation-contracts",
- "version": "v2.1.3",
+ "version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14"
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5e20b83385a77593259c9f8beb2c43cd03b2ac14",
- "reference": "5e20b83385a77593259c9f8beb2c43cd03b2ac14",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665",
"shasum": ""
},
"require": {
@@ -4608,7 +6183,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1-dev"
+ "dev-master": "2.2-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -4636,20 +6211,34 @@
],
"description": "A generic function and convention to trigger deprecation notices",
"homepage": "https://symfony.com",
- "time": "2020-06-06T08:49:21+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
},
{
"name": "symfony/error-handler",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
- "reference": "4a0d1673a4731c3cb2dea3580c73a676ecb9ed4b"
+ "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/4a0d1673a4731c3cb2dea3580c73a676ecb9ed4b",
- "reference": "4a0d1673a4731c3cb2dea3580c73a676ecb9ed4b",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/48f18b3609e120ea66d59142c23dc53e9562c26d",
+ "reference": "48f18b3609e120ea66d59142c23dc53e9562c26d",
"shasum": ""
},
"require": {
@@ -4664,11 +6253,6 @@
"symfony/serializer": "^4.4|^5.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\ErrorHandler\\": ""
@@ -4691,7 +6275,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony ErrorHandler Component",
+ "description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"funding": [
{
@@ -4707,20 +6291,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-23T08:36:24+00:00"
+ "time": "2021-01-28T22:06:19+00:00"
},
{
"name": "symfony/event-dispatcher",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "7827d55911f91c070fc293ea51a06eec80797d76"
+ "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7827d55911f91c070fc293ea51a06eec80797d76",
- "reference": "7827d55911f91c070fc293ea51a06eec80797d76",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4f9760f8074978ad82e2ce854dff79a71fe45367",
+ "reference": "4f9760f8074978ad82e2ce854dff79a71fe45367",
"shasum": ""
},
"require": {
@@ -4740,6 +6324,7 @@
"psr/log": "~1.0",
"symfony/config": "^4.4|^5.0",
"symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/error-handler": "^4.4|^5.0",
"symfony/expression-language": "^4.4|^5.0",
"symfony/http-foundation": "^4.4|^5.0",
"symfony/service-contracts": "^1.1|^2",
@@ -4750,11 +6335,6 @@
"symfony/http-kernel": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\EventDispatcher\\": ""
@@ -4777,7 +6357,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony EventDispatcher Component",
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"funding": [
{
@@ -4793,20 +6373,20 @@
"type": "tidelift"
}
],
- "time": "2020-06-18T18:24:02+00:00"
+ "time": "2021-01-27T10:36:42+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
- "version": "v2.1.3",
+ "version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "f6f613d74cfc5a623fc36294d3451eb7fa5a042b"
+ "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f6f613d74cfc5a623fc36294d3451eb7fa5a042b",
- "reference": "f6f613d74cfc5a623fc36294d3451eb7fa5a042b",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2",
+ "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2",
"shasum": ""
},
"require": {
@@ -4819,7 +6399,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1-dev"
+ "dev-master": "2.2-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -4855,31 +6435,40 @@
"interoperability",
"standards"
],
- "time": "2020-07-06T13:23:11+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
},
{
"name": "symfony/finder",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187"
+ "reference": "4adc8d172d602008c204c2e16956f99257248e03"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/4298870062bfc667cb78d2b379be4bf5dec5f187",
- "reference": "4298870062bfc667cb78d2b379be4bf5dec5f187",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/4adc8d172d602008c204c2e16956f99257248e03",
+ "reference": "4adc8d172d602008c204c2e16956f99257248e03",
"shasum": ""
},
"require": {
"php": ">=7.2.5"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Finder\\": ""
@@ -4902,7 +6491,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Finder Component",
+ "description": "Finds files and directories via an intuitive fluent interface",
"homepage": "https://symfony.com",
"funding": [
{
@@ -4918,20 +6507,96 @@
"type": "tidelift"
}
],
- "time": "2020-05-20T17:43:50+00:00"
+ "time": "2021-01-28T22:06:19+00:00"
},
{
- "name": "symfony/http-foundation",
- "version": "v5.1.3",
+ "name": "symfony/http-client-contracts",
+ "version": "v2.3.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-foundation.git",
- "reference": "1f0d6627e680591c61e9176f04a0dc887b4e6702"
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "41db680a15018f9c1d4b23516059633ce280ca33"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/1f0d6627e680591c61e9176f04a0dc887b4e6702",
- "reference": "1f0d6627e680591c61e9176f04a0dc887b4e6702",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33",
+ "reference": "41db680a15018f9c1d4b23516059633ce280ca33",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/http-client-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-version": "2.3",
+ "branch-alias": {
+ "dev-main": "2.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-14T17:08:19+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v5.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/20c554c0f03f7cde5ce230ed248470cccbc34c36",
+ "reference": "20c554c0f03f7cde5ce230ed248470cccbc34c36",
"shasum": ""
},
"require": {
@@ -4950,11 +6615,6 @@
"symfony/mime": "To use the file extension guesser"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\HttpFoundation\\": ""
@@ -4977,7 +6637,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpFoundation Component",
+ "description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"funding": [
{
@@ -4993,20 +6653,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-23T10:04:31+00:00"
+ "time": "2021-02-03T04:42:09+00:00"
},
{
"name": "symfony/http-kernel",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
- "reference": "d6dd8f6420e377970ddad0d6317d4ce4186fc6b3"
+ "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/d6dd8f6420e377970ddad0d6317d4ce4186fc6b3",
- "reference": "d6dd8f6420e377970ddad0d6317d4ce4186fc6b3",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05",
+ "reference": "89bac04f29e7b0b52f9fa6a4288ca7a8f90a1a05",
"shasum": ""
},
"require": {
@@ -5015,6 +6675,7 @@
"symfony/deprecation-contracts": "^2.1",
"symfony/error-handler": "^4.4|^5.0",
"symfony/event-dispatcher": "^5.0",
+ "symfony/http-client-contracts": "^1.1|^2",
"symfony/http-foundation": "^4.4|^5.0",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-php73": "^1.9",
@@ -5025,7 +6686,7 @@
"symfony/cache": "<5.0",
"symfony/config": "<5.0",
"symfony/console": "<4.4",
- "symfony/dependency-injection": "<4.4",
+ "symfony/dependency-injection": "<5.1.8",
"symfony/doctrine-bridge": "<5.0",
"symfony/form": "<5.0",
"symfony/http-client": "<5.0",
@@ -5034,7 +6695,7 @@
"symfony/translation": "<5.0",
"symfony/twig-bridge": "<5.0",
"symfony/validator": "<5.0",
- "twig/twig": "<2.4"
+ "twig/twig": "<2.13"
},
"provide": {
"psr/log-implementation": "1.0"
@@ -5045,7 +6706,7 @@
"symfony/config": "^5.0",
"symfony/console": "^4.4|^5.0",
"symfony/css-selector": "^4.4|^5.0",
- "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.1.8",
"symfony/dom-crawler": "^4.4|^5.0",
"symfony/expression-language": "^4.4|^5.0",
"symfony/finder": "^4.4|^5.0",
@@ -5054,7 +6715,7 @@
"symfony/stopwatch": "^4.4|^5.0",
"symfony/translation": "^4.4|^5.0",
"symfony/translation-contracts": "^1.1|^2",
- "twig/twig": "^2.4|^3.0"
+ "twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"symfony/browser-kit": "",
@@ -5063,11 +6724,6 @@
"symfony/dependency-injection": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\HttpKernel\\": ""
@@ -5090,7 +6746,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony HttpKernel Component",
+ "description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"funding": [
{
@@ -5106,20 +6762,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-24T04:22:56+00:00"
+ "time": "2021-02-03T04:51:58+00:00"
},
{
"name": "symfony/intl",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/intl.git",
- "reference": "7299f8c95ffd2623986c976fb8c48beb4c4cb44d"
+ "reference": "930f17689729cc47d2ce18be21ed403bcbeeb6a9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/intl/zipball/7299f8c95ffd2623986c976fb8c48beb4c4cb44d",
- "reference": "7299f8c95ffd2623986c976fb8c48beb4c4cb44d",
+ "url": "https://api.github.com/repos/symfony/intl/zipball/930f17689729cc47d2ce18be21ed403bcbeeb6a9",
+ "reference": "930f17689729cc47d2ce18be21ed403bcbeeb6a9",
"shasum": ""
},
"require": {
@@ -5134,11 +6790,6 @@
"ext-intl": "to use the component with locales other than \"en\""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Intl\\": ""
@@ -5172,7 +6823,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.",
+ "description": "Provides a PHP replacement layer for the C intl extension that includes additional data from the ICU library",
"homepage": "https://symfony.com",
"keywords": [
"i18n",
@@ -5196,41 +6847,43 @@
"type": "tidelift"
}
],
- "time": "2020-06-18T18:24:02+00:00"
+ "time": "2021-01-27T10:01:46+00:00"
},
{
"name": "symfony/mime",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/mime.git",
- "reference": "149fb0ad35aae3c7637b496b38478797fa6a7ea6"
+ "reference": "7dee6a43493f39b51ff6c5bb2bd576fe40a76c86"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/149fb0ad35aae3c7637b496b38478797fa6a7ea6",
- "reference": "149fb0ad35aae3c7637b496b38478797fa6a7ea6",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/7dee6a43493f39b51ff6c5bb2bd576fe40a76c86",
+ "reference": "7dee6a43493f39b51ff6c5bb2bd576fe40a76c86",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
"symfony/polyfill-intl-idn": "^1.10",
"symfony/polyfill-mbstring": "^1.0",
"symfony/polyfill-php80": "^1.15"
},
"conflict": {
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
"symfony/mailer": "<4.4"
},
"require-dev": {
"egulias/email-validator": "^2.1.10",
- "symfony/dependency-injection": "^4.4|^5.0"
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/property-access": "^4.4|^5.1",
+ "symfony/property-info": "^4.4|^5.1",
+ "symfony/serializer": "^5.2"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Mime\\": ""
@@ -5253,7 +6906,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "A library to manipulate MIME messages",
+ "description": "Allows manipulating MIME messages",
"homepage": "https://symfony.com",
"keywords": [
"mime",
@@ -5273,24 +6926,24 @@
"type": "tidelift"
}
],
- "time": "2020-07-23T10:04:31+00:00"
+ "time": "2021-02-02T06:10:15+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
- "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
+ "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"suggest": {
"ext-ctype": "For best performance"
@@ -5298,7 +6951,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5349,24 +7002,24 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-07T16:49:33+00:00"
},
{
"name": "symfony/polyfill-iconv",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-iconv.git",
- "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36"
+ "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36",
- "reference": "6c2f78eb8f5ab8eaea98f6d414a5915f2e0fce36",
+ "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/06fb361659649bcfd6a208a0f1fcaf4e827ad342",
+ "reference": "06fb361659649bcfd6a208a0f1fcaf4e827ad342",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"suggest": {
"ext-iconv": "For best performance"
@@ -5374,7 +7027,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5426,24 +7079,24 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5"
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b740103edbdcc39602239ee8860f0f45a8eb9aa5",
- "reference": "b740103edbdcc39602239ee8860f0f45a8eb9aa5",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5601e09b69f26c1828b13b6bb87cb07cddba3170",
+ "reference": "5601e09b69f26c1828b13b6bb87cb07cddba3170",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
@@ -5451,7 +7104,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5504,33 +7157,32 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-intl-icu",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-icu.git",
- "reference": "4e45a6e39041a9cc78835b11abc47874ae302a55"
+ "reference": "af1842919c7e7364aaaa2798b29839e3ba168588"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/4e45a6e39041a9cc78835b11abc47874ae302a55",
- "reference": "4e45a6e39041a9cc78835b11abc47874ae302a55",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/af1842919c7e7364aaaa2798b29839e3ba168588",
+ "reference": "af1842919c7e7364aaaa2798b29839e3ba168588",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "symfony/intl": "~2.3|~3.0|~4.0|~5.0"
+ "php": ">=7.1"
},
"suggest": {
- "ext-intl": "For best performance"
+ "ext-intl": "For best performance and support of other locales than \"en\""
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5540,6 +7192,15 @@
"autoload": {
"files": [
"bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Icu\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -5580,26 +7241,25 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-intl-idn",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251"
+ "reference": "2d63434d922daf7da8dd863e7907e67ee3031483"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251",
- "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/2d63434d922daf7da8dd863e7907e67ee3031483",
+ "reference": "2d63434d922daf7da8dd863e7907e67ee3031483",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
+ "php": ">=7.1",
"symfony/polyfill-intl-normalizer": "^1.10",
- "symfony/polyfill-php70": "^1.10",
"symfony/polyfill-php72": "^1.10"
},
"suggest": {
@@ -5608,7 +7268,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5665,24 +7325,24 @@
"type": "tidelift"
}
],
- "time": "2020-08-04T06:02:08+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e"
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e",
- "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/43a0283138253ed1d48d352ab6d0bdb3f809f248",
+ "reference": "43a0283138253ed1d48d352ab6d0bdb3f809f248",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"suggest": {
"ext-intl": "For best performance"
@@ -5690,7 +7350,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5746,24 +7406,24 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a"
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a",
- "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
+ "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"suggest": {
"ext-mbstring": "For best performance"
@@ -5771,7 +7431,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5823,106 +7483,29 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
- },
- {
- "name": "symfony/polyfill-php70",
- "version": "v1.18.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-php70.git",
- "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3",
- "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3",
- "shasum": ""
- },
- "require": {
- "paragonie/random_compat": "~1.0|~2.0|~9.99",
- "php": ">=5.3.3"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.18-dev"
- },
- "thanks": {
- "name": "symfony/polyfill",
- "url": "https://github.com/symfony/polyfill"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Php70\\": ""
- },
- "files": [
- "bootstrap.php"
- ],
- "classmap": [
- "Resources/stubs"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-22T09:19:47+00:00"
},
{
"name": "symfony/polyfill-php72",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "639447d008615574653fb3bc60d1986d7172eaae"
+ "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae",
- "reference": "639447d008615574653fb3bc60d1986d7172eaae",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9",
+ "reference": "cc6e6f9b39fe8075b3dabfbaf5b5f645ae1340c9",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -5973,29 +7556,29 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-07T16:49:33+00:00"
},
{
"name": "symfony/polyfill-php73",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca"
+ "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fffa1a52a023e782cdcc221d781fe1ec8f87fcca",
- "reference": "fffa1a52a023e782cdcc221d781fe1ec8f87fcca",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
+ "reference": "a678b42e92f86eca04b7fa4c0f6f19d097fb69e2",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -6049,29 +7632,29 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-07T16:49:33+00:00"
},
{
"name": "symfony/polyfill-php80",
- "version": "v1.18.1",
+ "version": "v1.22.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981"
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/d87d5766cbf48d72388a9f6b85f280c8ad51f981",
- "reference": "d87d5766cbf48d72388a9f6b85f280c8ad51f981",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
+ "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
"shasum": ""
},
"require": {
- "php": ">=7.0.8"
+ "php": ">=7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.22-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -6129,20 +7712,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2021-01-07T16:49:33+00:00"
},
{
"name": "symfony/process",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "1864216226af21eb76d9477f691e7cbf198e0402"
+ "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/1864216226af21eb76d9477f691e7cbf198e0402",
- "reference": "1864216226af21eb76d9477f691e7cbf198e0402",
+ "url": "https://api.github.com/repos/symfony/process/zipball/313a38f09c77fbcdc1d223e57d368cea76a2fd2f",
+ "reference": "313a38f09c77fbcdc1d223e57d368cea76a2fd2f",
"shasum": ""
},
"require": {
@@ -6150,11 +7733,6 @@
"symfony/polyfill-php80": "^1.15"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Process\\": ""
@@ -6177,7 +7755,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Process Component",
+ "description": "Executes commands in sub-processes",
"homepage": "https://symfony.com",
"funding": [
{
@@ -6193,84 +7771,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-23T08:36:24+00:00"
- },
- {
- "name": "symfony/psr-http-message-bridge",
- "version": "v2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/psr-http-message-bridge.git",
- "reference": "e44f249afab496b4e8c0f7461fb8140eaa4b24d2"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/e44f249afab496b4e8c0f7461fb8140eaa4b24d2",
- "reference": "e44f249afab496b4e8c0f7461fb8140eaa4b24d2",
- "shasum": ""
- },
- "require": {
- "php": ">=7.1",
- "psr/http-message": "^1.0",
- "symfony/http-foundation": "^4.4 || ^5.0"
- },
- "require-dev": {
- "nyholm/psr7": "^1.1",
- "symfony/phpunit-bridge": "^4.4 || ^5.0"
- },
- "suggest": {
- "nyholm/psr7": "For a super lightweight PSR-7/17 implementation"
- },
- "type": "symfony-bridge",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Bridge\\PsrHttpMessage\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "http://symfony.com/contributors"
- }
- ],
- "description": "PSR HTTP message bridge",
- "homepage": "http://symfony.com",
- "keywords": [
- "http",
- "http-message",
- "psr-17",
- "psr-7"
- ],
- "time": "2020-06-25T08:21:47+00:00"
+ "time": "2021-01-27T10:15:41+00:00"
},
{
"name": "symfony/routing",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
- "reference": "08c9a82f09d12ee048f85e76e0d783f82844eb5d"
+ "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/08c9a82f09d12ee048f85e76e0d783f82844eb5d",
- "reference": "08c9a82f09d12ee048f85e76e0d783f82844eb5d",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/348b5917e56546c6d96adbf21d7f92c9ef563661",
+ "reference": "348b5917e56546c6d96adbf21d7f92c9ef563661",
"shasum": ""
},
"require": {
@@ -6284,7 +7798,7 @@
"symfony/yaml": "<4.4"
},
"require-dev": {
- "doctrine/annotations": "~1.2",
+ "doctrine/annotations": "^1.10.4",
"psr/log": "~1.0",
"symfony/config": "^5.0",
"symfony/dependency-injection": "^4.4|^5.0",
@@ -6300,11 +7814,6 @@
"symfony/yaml": "For using the YAML loader"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Routing\\": ""
@@ -6327,7 +7836,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Routing Component",
+ "description": "Maps an HTTP request to a set of configuration variables",
"homepage": "https://symfony.com",
"keywords": [
"router",
@@ -6349,20 +7858,20 @@
"type": "tidelift"
}
],
- "time": "2020-06-18T18:24:02+00:00"
+ "time": "2021-01-27T10:15:41+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v2.1.3",
+ "version": "v2.2.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442"
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/58c7475e5457c5492c26cc740cc0ad7464be9442",
- "reference": "58c7475e5457c5492c26cc740cc0ad7464be9442",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
"shasum": ""
},
"require": {
@@ -6375,7 +7884,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1-dev"
+ "dev-master": "2.2-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -6411,20 +7920,34 @@
"interoperability",
"standards"
],
- "time": "2020-07-06T13:23:11+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
},
{
"name": "symfony/string",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f629ba9b611c76224feb21fe2bcbf0b6f992300b"
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f629ba9b611c76224feb21fe2bcbf0b6f992300b",
- "reference": "f629ba9b611c76224feb21fe2bcbf0b6f992300b",
+ "url": "https://api.github.com/repos/symfony/string/zipball/c95468897f408dd0aca2ff582074423dd0455122",
+ "reference": "c95468897f408dd0aca2ff582074423dd0455122",
"shasum": ""
},
"require": {
@@ -6442,11 +7965,6 @@
"symfony/var-exporter": "^4.4|^5.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\String\\": ""
@@ -6472,7 +7990,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony String component",
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
"homepage": "https://symfony.com",
"keywords": [
"grapheme",
@@ -6496,27 +8014,27 @@
"type": "tidelift"
}
],
- "time": "2020-07-08T08:27:49+00:00"
+ "time": "2021-01-25T15:14:59+00:00"
},
{
"name": "symfony/translation",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "4b9bf719f0fa5b05253c37fc7b335337ec7ec427"
+ "reference": "c021864d4354ee55160ddcfd31dc477a1bc77949"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/4b9bf719f0fa5b05253c37fc7b335337ec7ec427",
- "reference": "4b9bf719f0fa5b05253c37fc7b335337ec7ec427",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/c021864d4354ee55160ddcfd31dc477a1bc77949",
+ "reference": "c021864d4354ee55160ddcfd31dc477a1bc77949",
"shasum": ""
},
"require": {
"php": ">=7.2.5",
"symfony/polyfill-mbstring": "~1.0",
"symfony/polyfill-php80": "^1.15",
- "symfony/translation-contracts": "^2"
+ "symfony/translation-contracts": "^2.3"
},
"conflict": {
"symfony/config": "<4.4",
@@ -6545,12 +8063,10 @@
"symfony/yaml": ""
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
"psr-4": {
"Symfony\\Component\\Translation\\": ""
},
@@ -6572,7 +8088,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Translation Component",
+ "description": "Provides tools to internationalize your application",
"homepage": "https://symfony.com",
"funding": [
{
@@ -6588,20 +8104,20 @@
"type": "tidelift"
}
],
- "time": "2020-06-30T17:42:22+00:00"
+ "time": "2021-01-27T10:15:41+00:00"
},
{
"name": "symfony/translation-contracts",
- "version": "v2.1.3",
+ "version": "v2.3.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
- "reference": "616a9773c853097607cf9dd6577d5b143ffdcd63"
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/616a9773c853097607cf9dd6577d5b143ffdcd63",
- "reference": "616a9773c853097607cf9dd6577d5b143ffdcd63",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105",
"shasum": ""
},
"require": {
@@ -6613,7 +8129,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1-dev"
+ "dev-master": "2.3-dev"
},
"thanks": {
"name": "symfony/contracts",
@@ -6649,20 +8165,34 @@
"interoperability",
"standards"
],
- "time": "2020-07-06T13:23:11+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-28T13:05:58+00:00"
},
{
"name": "symfony/var-dumper",
- "version": "v5.1.3",
+ "version": "v5.2.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-dumper.git",
- "reference": "2ebe1c7bb52052624d6dc1250f4abe525655d75a"
+ "reference": "72ca213014a92223a5d18651ce79ef441c12b694"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/2ebe1c7bb52052624d6dc1250f4abe525655d75a",
- "reference": "2ebe1c7bb52052624d6dc1250f4abe525655d75a",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72ca213014a92223a5d18651ce79ef441c12b694",
+ "reference": "72ca213014a92223a5d18651ce79ef441c12b694",
"shasum": ""
},
"require": {
@@ -6678,7 +8208,7 @@
"ext-iconv": "*",
"symfony/console": "^4.4|^5.0",
"symfony/process": "^4.4|^5.0",
- "twig/twig": "^2.4|^3.0"
+ "twig/twig": "^2.13|^3.0.4"
},
"suggest": {
"ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
@@ -6689,11 +8219,6 @@
"Resources/bin/var-dump-server"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"files": [
"Resources/functions/dump.php"
@@ -6719,7 +8244,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
"homepage": "https://symfony.com",
"keywords": [
"debug",
@@ -6739,36 +8264,36 @@
"type": "tidelift"
}
],
- "time": "2020-06-24T13:36:18+00:00"
+ "time": "2021-01-27T10:15:41+00:00"
},
{
"name": "teamtnt/laravel-scout-tntsearch-driver",
- "version": "v8.3.0",
+ "version": "v11.1.0",
"source": {
"type": "git",
"url": "https://github.com/teamtnt/laravel-scout-tntsearch-driver.git",
- "reference": "a13b7cfe78a70feaf061071a4b681d449b59d875"
+ "reference": "a9c27a68dc2bd74fb354165633520de95708215d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/teamtnt/laravel-scout-tntsearch-driver/zipball/a13b7cfe78a70feaf061071a4b681d449b59d875",
- "reference": "a13b7cfe78a70feaf061071a4b681d449b59d875",
+ "url": "https://api.github.com/repos/teamtnt/laravel-scout-tntsearch-driver/zipball/a9c27a68dc2bd74fb354165633520de95708215d",
+ "reference": "a9c27a68dc2bd74fb354165633520de95708215d",
"shasum": ""
},
"require": {
- "illuminate/bus": "~5.4|^6.0|^7.0",
- "illuminate/contracts": "~5.4|^6.0|^7.0",
- "illuminate/database": "~5.4|^6.0|^7.0",
- "illuminate/pagination": "~5.4|^6.0|^7.0",
- "illuminate/queue": "~5.4|^6.0|^7.0",
- "illuminate/support": "~5.4|^6.0|^7.0",
- "laravel/scout": "7.*|^8.0",
+ "illuminate/bus": "~5.4|^6.0|^7.0|^8.0",
+ "illuminate/contracts": "~5.4|^6.0|^7.0|^8.0",
+ "illuminate/database": "~5.4|^6.0|^7.0|^8.0",
+ "illuminate/pagination": "~5.4|^6.0|^7.0|^8.0",
+ "illuminate/queue": "~5.4|^6.0|^7.0|^8.0",
+ "illuminate/support": "~5.4|^6.0|^7.0|^8.0",
+ "laravel/scout": "7.*|^8.0|^8.3",
"php": ">=7.1",
"teamtnt/tntsearch": "2.*"
},
"require-dev": {
- "mockery/mockery": "~0.9",
- "phpunit/phpunit": "~5.0"
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^8.0|^9.3"
},
"suggest": {
"teamtnt/tntsearch": "Required to use the TNTSearch engine."
@@ -6806,27 +8331,27 @@
"search",
"tntsearch"
],
- "time": "2020-05-12T16:42:57+00:00"
+ "time": "2020-11-11T11:17:48+00:00"
},
{
"name": "teamtnt/tntsearch",
- "version": "v2.3.0",
+ "version": "v2.6.0",
"source": {
"type": "git",
"url": "https://github.com/teamtnt/tntsearch.git",
- "reference": "01bb54c35a0c47eb41b145f76c384ef83b5a5852"
+ "reference": "d9b2d764491c87f03ec214ed8dbc27336cf0c0e4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/teamtnt/tntsearch/zipball/01bb54c35a0c47eb41b145f76c384ef83b5a5852",
- "reference": "01bb54c35a0c47eb41b145f76c384ef83b5a5852",
+ "url": "https://api.github.com/repos/teamtnt/tntsearch/zipball/d9b2d764491c87f03ec214ed8dbc27336cf0c0e4",
+ "reference": "d9b2d764491c87f03ec214ed8dbc27336cf0c0e4",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"ext-pdo_sqlite": "*",
"ext-sqlite3": "*",
- "php": "~7.1"
+ "php": "~7.1|^8"
},
"require-dev": {
"phpunit/phpunit": "7.*"
@@ -6856,13 +8381,76 @@
"homepage": "https://github.com/teamtnt/tntsearch",
"keywords": [
"Fuzzy search",
+ "bm25",
"fulltext",
"geosearch",
"search",
+ "stemming",
"teamtnt",
+ "text classification",
"tntsearch"
],
- "time": "2020-04-03T10:22:24+00:00"
+ "funding": [
+ {
+ "url": "https://ko-fi.com/nticaric",
+ "type": "ko_fi"
+ },
+ {
+ "url": "https://opencollective.com/tntsearch",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/nticaric",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-12-21T09:11:54+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-12T23:59:07+00:00"
},
{
"name": "tijsverkoyen/css-to-inline-styles",
@@ -6915,37 +8503,39 @@
},
{
"name": "vlucas/phpdotenv",
- "version": "v4.1.8",
+ "version": "v5.3.0",
"source": {
"type": "git",
"url": "https://github.com/vlucas/phpdotenv.git",
- "reference": "572af79d913627a9d70374d27a6f5d689a35de32"
+ "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/572af79d913627a9d70374d27a6f5d689a35de32",
- "reference": "572af79d913627a9d70374d27a6f5d689a35de32",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
+ "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
"shasum": ""
},
"require": {
- "php": "^5.5.9 || ^7.0 || ^8.0",
- "phpoption/phpoption": "^1.7.3",
- "symfony/polyfill-ctype": "^1.17"
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.0.1",
+ "php": "^7.1.3 || ^8.0",
+ "phpoption/phpoption": "^1.7.4",
+ "symfony/polyfill-ctype": "^1.17",
+ "symfony/polyfill-mbstring": "^1.17",
+ "symfony/polyfill-php80": "^1.17"
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4.1",
"ext-filter": "*",
- "ext-pcre": "*",
- "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0"
+ "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1"
},
"suggest": {
- "ext-filter": "Required to use the boolean validator.",
- "ext-pcre": "Required to use most of the library."
+ "ext-filter": "Required to use the boolean validator."
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.1-dev"
+ "dev-master": "5.3-dev"
}
},
"autoload": {
@@ -6985,27 +8575,27 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T19:22:52+00:00"
+ "time": "2021-01-20T15:23:13+00:00"
},
{
"name": "voku/portable-ascii",
- "version": "1.5.3",
+ "version": "1.5.6",
"source": {
"type": "git",
"url": "https://github.com/voku/portable-ascii.git",
- "reference": "25bcbf01678930251fd572891447d9e318a6e2b8"
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/voku/portable-ascii/zipball/25bcbf01678930251fd572891447d9e318a6e2b8",
- "reference": "25bcbf01678930251fd572891447d9e318a6e2b8",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
"shasum": ""
},
"require": {
"php": ">=7.0.0"
},
"require-dev": {
- "phpunit/phpunit": "~6.0 || ~7.0"
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
},
"suggest": {
"ext-intl": "Use Intl for transliterator_transliterate() support"
@@ -7055,48 +8645,99 @@
"type": "tidelift"
}
],
- "time": "2020-07-22T23:32:04+00:00"
+ "time": "2020-11-12T00:07:28+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozarts/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2020-07-08T17:02:28+00:00"
}
],
"packages-dev": [
{
"name": "barryvdh/laravel-ide-helper",
- "version": "v2.8.0",
+ "version": "v2.9.0",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-ide-helper.git",
- "reference": "ba95d18ef55c91295250ae8b7bfa73d8fb866b9b"
+ "reference": "64a6b902583802c162cdccf7e76dc8619368bf1a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/ba95d18ef55c91295250ae8b7bfa73d8fb866b9b",
- "reference": "ba95d18ef55c91295250ae8b7bfa73d8fb866b9b",
+ "url": "https://api.github.com/repos/barryvdh/laravel-ide-helper/zipball/64a6b902583802c162cdccf7e76dc8619368bf1a",
+ "reference": "64a6b902583802c162cdccf7e76dc8619368bf1a",
"shasum": ""
},
"require": {
"barryvdh/reflection-docblock": "^2.0.6",
- "composer/composer": "^1.6 || ^2.0@dev",
- "doctrine/dbal": "~2.3",
- "illuminate/console": "^5.5 || ^6 || ^7",
- "illuminate/filesystem": "^5.5 || ^6 || ^7",
- "illuminate/support": "^5.5 || ^6 || ^7",
- "php": ">=7.2",
+ "composer/composer": "^1.6 || ^2",
+ "doctrine/dbal": "^2.6 || ^3",
+ "ext-json": "*",
+ "illuminate/console": "^8",
+ "illuminate/filesystem": "^8",
+ "illuminate/support": "^8",
+ "php": "^7.3 || ^8.0",
"phpdocumentor/type-resolver": "^1.1.0"
},
"require-dev": {
- "illuminate/config": "^5.5 || ^6 || ^7",
- "illuminate/view": "^5.5 || ^6 || ^7",
- "mockery/mockery": "^1.3",
- "orchestra/testbench": "^3.5 || ^4 || ^5",
- "phpro/grumphp": "^0.19.0",
- "spatie/phpunit-snapshot-assertions": "^1.4 || ^2.2 || ^3",
- "squizlabs/php_codesniffer": "^3.5",
+ "ext-pdo_sqlite": "*",
+ "friendsofphp/php-cs-fixer": "^2",
+ "illuminate/config": "^8",
+ "illuminate/view": "^8",
+ "mockery/mockery": "^1.4",
+ "orchestra/testbench": "^6",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "spatie/phpunit-snapshot-assertions": "^3 || ^4",
"vimeo/psalm": "^3.12"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.7-dev"
+ "dev-master": "2.9-dev"
},
"laravel": {
"providers": [
@@ -7137,7 +8778,7 @@
"type": "github"
}
],
- "time": "2020-08-10T08:22:48+00:00"
+ "time": "2020-12-29T10:11:05+00:00"
},
{
"name": "barryvdh/reflection-docblock",
@@ -7190,16 +8831,16 @@
},
{
"name": "composer/ca-bundle",
- "version": "1.2.7",
+ "version": "1.2.9",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd"
+ "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/95c63ab2117a72f48f5a55da9740a3273d45b7fd",
- "reference": "95c63ab2117a72f48f5a55da9740a3273d45b7fd",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
+ "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
"shasum": ""
},
"require": {
@@ -7208,14 +8849,15 @@
"php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
+ "phpstan/phpstan": "^0.12.55",
"psr/log": "^1.0",
+ "symfony/phpunit-bridge": "^4.2 || ^5",
"symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-main": "1.x-dev"
}
},
"autoload": {
@@ -7242,43 +8884,55 @@
"ssl",
"tls"
],
- "time": "2020-04-08T08:27:21+00:00"
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2021-01-12T12:10:35+00:00"
},
{
"name": "composer/composer",
- "version": "1.10.10",
+ "version": "2.0.11",
"source": {
"type": "git",
"url": "https://github.com/composer/composer.git",
- "reference": "32966a3b1d48bc01472a8321fd6472b44fad033a"
+ "reference": "a5a5632da0b1c2d6fa9a3b65f1f4e90d1f04abb9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/composer/zipball/32966a3b1d48bc01472a8321fd6472b44fad033a",
- "reference": "32966a3b1d48bc01472a8321fd6472b44fad033a",
+ "url": "https://api.github.com/repos/composer/composer/zipball/a5a5632da0b1c2d6fa9a3b65f1f4e90d1f04abb9",
+ "reference": "a5a5632da0b1c2d6fa9a3b65f1f4e90d1f04abb9",
"shasum": ""
},
"require": {
"composer/ca-bundle": "^1.0",
- "composer/semver": "^1.0",
+ "composer/semver": "^3.0",
"composer/spdx-licenses": "^1.2",
"composer/xdebug-handler": "^1.1",
"justinrainbow/json-schema": "^5.2.10",
- "php": "^5.3.2 || ^7.0",
+ "php": "^5.3.2 || ^7.0 || ^8.0",
"psr/log": "^1.0",
+ "react/promise": "^1.2 || ^2.7",
"seld/jsonlint": "^1.4",
"seld/phar-utils": "^1.0",
- "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0",
- "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0",
- "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0",
- "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0"
- },
- "conflict": {
- "symfony/console": "2.8.38"
+ "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
+ "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
+ "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0",
+ "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0"
},
"require-dev": {
"phpspec/prophecy": "^1.10",
- "symfony/phpunit-bridge": "^4.2"
+ "symfony/phpunit-bridge": "^4.2 || ^5.0"
},
"suggest": {
"ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
@@ -7291,7 +8945,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.10-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -7307,12 +8961,12 @@
{
"name": "Nils Adermann",
"email": "naderman@naderman.de",
- "homepage": "http://www.naderman.de"
+ "homepage": "https://www.naderman.de"
},
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "homepage": "https://seld.be"
}
],
"description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
@@ -7336,32 +8990,33 @@
"type": "tidelift"
}
],
- "time": "2020-08-03T09:35:19+00:00"
+ "time": "2021-02-24T13:57:23+00:00"
},
{
"name": "composer/semver",
- "version": "1.5.1",
+ "version": "3.2.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
- "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de"
+ "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
- "reference": "c6bea70230ef4dd483e6bbcab6005f682ed3a8de",
+ "url": "https://api.github.com/repos/composer/semver/zipball/a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
+ "reference": "a02fdf930a3c1c3ed3a49b5f63859c0c20e10464",
"shasum": ""
},
"require": {
- "php": "^5.3.2 || ^7.0"
+ "php": "^5.3.2 || ^7.0 || ^8.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.5 || ^5.0.5"
+ "phpstan/phpstan": "^0.12.54",
+ "symfony/phpunit-bridge": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-main": "3.x-dev"
}
},
"autoload": {
@@ -7397,20 +9052,34 @@
"validation",
"versioning"
],
- "time": "2020-01-13T12:06:48+00:00"
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T08:59:24+00:00"
},
{
"name": "composer/spdx-licenses",
- "version": "1.5.4",
+ "version": "1.5.5",
"source": {
"type": "git",
"url": "https://github.com/composer/spdx-licenses.git",
- "reference": "6946f785871e2314c60b4524851f3702ea4f2223"
+ "reference": "de30328a7af8680efdc03e396aad24befd513200"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/6946f785871e2314c60b4524851f3702ea4f2223",
- "reference": "6946f785871e2314c60b4524851f3702ea4f2223",
+ "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/de30328a7af8680efdc03e396aad24befd513200",
+ "reference": "de30328a7af8680efdc03e396aad24befd513200",
"shasum": ""
},
"require": {
@@ -7422,7 +9091,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-main": "1.x-dev"
}
},
"autoload": {
@@ -7471,20 +9140,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-15T15:35:07+00:00"
+ "time": "2020-12-03T16:04:16+00:00"
},
{
"name": "composer/xdebug-handler",
- "version": "1.4.2",
+ "version": "1.4.5",
"source": {
"type": "git",
"url": "https://github.com/composer/xdebug-handler.git",
- "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51"
+ "reference": "f28d44c286812c714741478d968104c5e604a1d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51",
- "reference": "fa2aaf99e2087f013a14f7432c1cd2dd7d8f1f51",
+ "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/f28d44c286812c714741478d968104c5e604a1d4",
+ "reference": "f28d44c286812c714741478d968104c5e604a1d4",
"shasum": ""
},
"require": {
@@ -7515,43 +9184,46 @@
"Xdebug",
"performance"
],
- "time": "2020-06-04T11:16:35+00:00"
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T08:04:11+00:00"
},
{
- "name": "doctrine/instantiator",
- "version": "1.3.1",
+ "name": "evenement/evenement",
+ "version": "v3.0.1",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "f350df0268e904597e3bd9c4685c53e0e333feea"
+ "url": "https://github.com/igorw/evenement.git",
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f350df0268e904597e3bd9c4685c53e0e333feea",
- "reference": "f350df0268e904597e3bd9c4685c53e0e333feea",
+ "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
+ "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": ">=7.0"
},
"require-dev": {
- "doctrine/coding-standard": "^6.0",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpbench/phpbench": "^0.13",
- "phpstan/phpstan-phpunit": "^0.11",
- "phpstan/phpstan-shim": "^0.11",
- "phpunit/phpunit": "^7.0"
+ "phpunit/phpunit": "^6.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.2.x-dev"
- }
- },
"autoload": {
- "psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ "psr-0": {
+ "Evenement": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -7560,44 +9232,45 @@
],
"authors": [
{
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "http://ocramius.github.com/"
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
}
],
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "description": "Événement is a very simple event dispatching library for PHP",
"keywords": [
- "constructor",
- "instantiate"
+ "event-dispatcher",
+ "event-emitter"
],
- "time": "2020-05-29T17:27:14+00:00"
+ "support": {
+ "issues": "https://github.com/igorw/evenement/issues",
+ "source": "https://github.com/igorw/evenement/tree/master"
+ },
+ "time": "2017-07-23T21:35:13+00:00"
},
{
"name": "facade/flare-client-php",
- "version": "1.3.4",
+ "version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/facade/flare-client-php.git",
- "reference": "0eeb0de4fc1078433f0915010bd8f41e998adcb4"
+ "reference": "ef0f5bce23b30b32d98fd9bb49c6fa37b40eb546"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/facade/flare-client-php/zipball/0eeb0de4fc1078433f0915010bd8f41e998adcb4",
- "reference": "0eeb0de4fc1078433f0915010bd8f41e998adcb4",
+ "url": "https://api.github.com/repos/facade/flare-client-php/zipball/ef0f5bce23b30b32d98fd9bb49c6fa37b40eb546",
+ "reference": "ef0f5bce23b30b32d98fd9bb49c6fa37b40eb546",
"shasum": ""
},
"require": {
"facade/ignition-contracts": "~1.0",
- "illuminate/pipeline": "^5.5|^6.0|^7.0",
- "php": "^7.1",
+ "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0",
+ "php": "^7.1|^8.0",
"symfony/http-foundation": "^3.3|^4.1|^5.0",
"symfony/mime": "^3.4|^4.0|^5.1",
"symfony/var-dumper": "^3.4|^4.0|^5.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.14",
- "larapack/dd": "^1.1",
"phpunit/phpunit": "^7.5.16",
"spatie/phpunit-snapshot-assertions": "^2.0"
},
@@ -7633,39 +9306,38 @@
"type": "github"
}
],
- "time": "2020-07-13T23:25:57+00:00"
+ "time": "2021-02-16T12:42:06+00:00"
},
{
"name": "facade/ignition",
- "version": "2.3.6",
+ "version": "2.5.14",
"source": {
"type": "git",
"url": "https://github.com/facade/ignition.git",
- "reference": "d7d05dba5a0bdbf018a2cb7be268f22f5d73eb81"
+ "reference": "17097f7a83e200d90d1cf9f4d1b35c1001513a47"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/facade/ignition/zipball/d7d05dba5a0bdbf018a2cb7be268f22f5d73eb81",
- "reference": "d7d05dba5a0bdbf018a2cb7be268f22f5d73eb81",
+ "url": "https://api.github.com/repos/facade/ignition/zipball/17097f7a83e200d90d1cf9f4d1b35c1001513a47",
+ "reference": "17097f7a83e200d90d1cf9f4d1b35c1001513a47",
"shasum": ""
},
"require": {
"ext-json": "*",
"ext-mbstring": "*",
- "facade/flare-client-php": "^1.0",
- "facade/ignition-contracts": "^1.0",
+ "facade/flare-client-php": "^1.3.7",
+ "facade/ignition-contracts": "^1.0.2",
"filp/whoops": "^2.4",
"illuminate/support": "^7.0|^8.0",
"monolog/monolog": "^2.0",
- "php": "^7.2.5",
- "scrivo/highlight.php": "^9.15",
+ "php": "^7.2.5|^8.0",
"symfony/console": "^5.0",
"symfony/var-dumper": "^5.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.14",
"mockery/mockery": "^1.3",
- "orchestra/testbench": "5.0",
+ "orchestra/testbench": "^5.0|^6.0",
"psalm/plugin-laravel": "^1.2"
},
"suggest": {
@@ -7705,29 +9377,29 @@
"laravel",
"page"
],
- "time": "2020-08-10T13:50:38+00:00"
+ "time": "2021-03-04T08:48:01+00:00"
},
{
"name": "facade/ignition-contracts",
- "version": "1.0.1",
+ "version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/facade/ignition-contracts.git",
- "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b"
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/aeab1ce8b68b188a43e81758e750151ad7da796b",
- "reference": "aeab1ce8b68b188a43e81758e750151ad7da796b",
+ "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
"shasum": ""
},
"require": {
- "php": "^7.1"
+ "php": "^7.3|^8.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^2.14",
- "phpunit/phpunit": "^7.5|^8.0",
- "vimeo/psalm": "^3.12"
+ "friendsofphp/php-cs-fixer": "^v2.15.8",
+ "phpunit/phpunit": "^9.3.11",
+ "vimeo/psalm": "^3.17.1"
},
"type": "library",
"autoload": {
@@ -7754,29 +9426,29 @@
"flare",
"ignition"
],
- "time": "2020-07-14T10:10:28+00:00"
+ "time": "2020-10-16T08:27:54+00:00"
},
{
"name": "filp/whoops",
- "version": "2.7.3",
+ "version": "2.9.2",
"source": {
"type": "git",
"url": "https://github.com/filp/whoops.git",
- "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d"
+ "reference": "df7933820090489623ce0be5e85c7e693638e536"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/filp/whoops/zipball/5d5fe9bb3d656b514d455645b3addc5f7ba7714d",
- "reference": "5d5fe9bb3d656b514d455645b3addc5f7ba7714d",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/df7933820090489623ce0be5e85c7e693638e536",
+ "reference": "df7933820090489623ce0be5e85c7e693638e536",
"shasum": ""
},
"require": {
- "php": "^5.5.9 || ^7.0",
+ "php": "^5.5.9 || ^7.0 || ^8.0",
"psr/log": "^1.0.1"
},
"require-dev": {
"mockery/mockery": "^0.9 || ^1.0",
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
"symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
},
"suggest": {
@@ -7786,7 +9458,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.6-dev"
+ "dev-master": "2.7-dev"
}
},
"autoload": {
@@ -7815,20 +9487,26 @@
"throwable",
"whoops"
],
- "time": "2020-06-14T09:00:00+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/denis-sokolov",
+ "type": "github"
+ }
+ ],
+ "time": "2021-01-24T12:00:00+00:00"
},
{
"name": "fzaninotto/faker",
- "version": "v1.9.1",
+ "version": "v1.9.2",
"source": {
"type": "git",
"url": "https://github.com/fzaninotto/Faker.git",
- "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f"
+ "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/fc10d778e4b84d5bd315dad194661e091d307c6f",
- "reference": "fc10d778e4b84d5bd315dad194661e091d307c6f",
+ "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
+ "reference": "848d8125239d7dbf8ab25cb7f054f1a630e68c2e",
"shasum": ""
},
"require": {
@@ -7866,7 +9544,7 @@
"fixtures"
],
"abandoned": true,
- "time": "2019-12-12T13:22:17+00:00"
+ "time": "2020-12-11T09:56:16+00:00"
},
{
"name": "hamcrest/hamcrest-php",
@@ -7983,16 +9661,16 @@
},
{
"name": "mockery/mockery",
- "version": "1.4.2",
+ "version": "1.4.3",
"source": {
"type": "git",
"url": "https://github.com/mockery/mockery.git",
- "reference": "20cab678faed06fac225193be281ea0fddb43b93"
+ "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mockery/mockery/zipball/20cab678faed06fac225193be281ea0fddb43b93",
- "reference": "20cab678faed06fac225193be281ea0fddb43b93",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/d1339f64479af1bee0e82a0413813fe5345a54ea",
+ "reference": "d1339f64479af1bee0e82a0413813fe5345a54ea",
"shasum": ""
},
"require": {
@@ -8047,87 +9725,39 @@
"test double",
"testing"
],
- "time": "2020-08-11T18:10:13+00:00"
- },
- {
- "name": "myclabs/deep-copy",
- "version": "1.10.1",
- "source": {
- "type": "git",
- "url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
- "reference": "969b211f9a51aa1f6c01d1d2aef56d3bd91598e5",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0"
- },
- "replace": {
- "myclabs/deep-copy": "self.version"
- },
- "require-dev": {
- "doctrine/collections": "^1.0",
- "doctrine/common": "^2.6",
- "phpunit/phpunit": "^7.1"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "DeepCopy\\": "src/DeepCopy/"
- },
- "files": [
- "src/DeepCopy/deep_copy.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Create deep copies (clones) of your objects",
- "keywords": [
- "clone",
- "copy",
- "duplicate",
- "object",
- "object graph"
- ],
- "time": "2020-06-29T13:22:24+00:00"
+ "time": "2021-02-24T09:51:49+00:00"
},
{
"name": "nunomaduro/collision",
- "version": "v4.2.0",
+ "version": "v5.3.0",
"source": {
"type": "git",
"url": "https://github.com/nunomaduro/collision.git",
- "reference": "d50490417eded97be300a92cd7df7badc37a9018"
+ "reference": "aca63581f380f63a492b1e3114604e411e39133a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nunomaduro/collision/zipball/d50490417eded97be300a92cd7df7badc37a9018",
- "reference": "d50490417eded97be300a92cd7df7badc37a9018",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/aca63581f380f63a492b1e3114604e411e39133a",
+ "reference": "aca63581f380f63a492b1e3114604e411e39133a",
"shasum": ""
},
"require": {
"facade/ignition-contracts": "^1.0",
- "filp/whoops": "^2.4",
- "php": "^7.2.5",
+ "filp/whoops": "^2.7.2",
+ "php": "^7.3 || ^8.0",
"symfony/console": "^5.0"
},
"require-dev": {
- "facade/ignition": "^2.0",
- "fideloper/proxy": "^4.2",
- "friendsofphp/php-cs-fixer": "^2.16",
- "fruitcake/laravel-cors": "^1.0",
- "laravel/framework": "^7.0",
- "laravel/tinker": "^2.0",
- "nunomaduro/larastan": "^0.5",
- "orchestra/testbench": "^5.0",
- "phpstan/phpstan": "^0.12.3",
- "phpunit/phpunit": "^8.5.1 || ^9.0"
+ "brianium/paratest": "^6.1",
+ "fideloper/proxy": "^4.4.1",
+ "friendsofphp/php-cs-fixer": "^2.17.3",
+ "fruitcake/laravel-cors": "^2.0.3",
+ "laravel/framework": "^9.0",
+ "nunomaduro/larastan": "^0.6.2",
+ "nunomaduro/mock-final-classes": "^1.0",
+ "orchestra/testbench": "^7.0",
+ "phpstan/phpstan": "^0.12.64",
+ "phpunit/phpunit": "^9.5.0"
},
"type": "library",
"extra": {
@@ -8165,136 +9795,47 @@
"php",
"symfony"
],
- "time": "2020-04-04T19:56:08+00:00"
+ "funding": [
+ {
+ "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-01-25T15:34:13+00:00"
},
{
- "name": "phar-io/manifest",
- "version": "1.0.3",
+ "name": "react/cache",
+ "version": "v1.1.1",
"source": {
"type": "git",
- "url": "https://github.com/phar-io/manifest.git",
- "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
+ "url": "https://github.com/reactphp/cache.git",
+ "reference": "4bf736a2cccec7298bdf745db77585966fc2ca7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
- "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+ "url": "https://api.github.com/repos/reactphp/cache/zipball/4bf736a2cccec7298bdf745db77585966fc2ca7e",
+ "reference": "4bf736a2cccec7298bdf745db77585966fc2ca7e",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-phar": "*",
- "phar-io/version": "^2.0",
- "php": "^5.6 || ^7.0"
+ "php": ">=5.3.0",
+ "react/promise": "^3.0 || ^2.0 || ^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "Developer"
- }
- ],
- "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
- "time": "2018-07-08T19:23:20+00:00"
- },
- {
- "name": "phar-io/version",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/phar-io/version.git",
- "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
- "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
- "shasum": ""
- },
- "require": {
- "php": "^5.6 || ^7.0"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Heuer",
- "email": "sebastian@phpeople.de",
- "role": "Developer"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "Developer"
- }
- ],
- "description": "Library for handling version information and constraints",
- "time": "2018-07-08T19:19:57+00:00"
- },
- {
- "name": "phpdocumentor/reflection-common",
- "version": "2.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
+ "React\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -8303,103 +9844,78 @@
],
"authors": [
{
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
+ },
+ {
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
+ "description": "Async, Promise-based cache interface for ReactPHP",
"keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
+ "cache",
+ "caching",
+ "promise",
+ "reactphp"
],
- "time": "2020-06-27T09:03:43+00:00"
- },
- {
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "3170448f5769fe19f456173d833734e0ff1b84df"
+ "support": {
+ "issues": "https://github.com/reactphp/cache/issues",
+ "source": "https://github.com/reactphp/cache/tree/v1.1.1"
},
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/3170448f5769fe19f456173d833734e0ff1b84df",
- "reference": "3170448f5769fe19f456173d833734e0ff1b84df",
- "shasum": ""
- },
- "require": {
- "ext-filter": "*",
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.3",
- "webmozart/assert": "^1.9.1"
- },
- "require-dev": {
- "mockery/mockery": "~1.3.2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
+ "funding": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "url": "https://github.com/WyriHaximus",
+ "type": "github"
},
{
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
+ "url": "https://github.com/clue",
+ "type": "github"
}
],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "time": "2020-07-20T20:05:34+00:00"
+ "time": "2021-02-02T06:47:52+00:00"
},
{
- "name": "phpdocumentor/type-resolver",
- "version": "1.3.0",
+ "name": "react/dns",
+ "version": "v1.5.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "e878a14a65245fbe78f8080eba03b47c3b705651"
+ "url": "https://github.com/reactphp/dns.git",
+ "reference": "b22b0b20278e8535e633ab71a52472c5bf620aa1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/e878a14a65245fbe78f8080eba03b47c3b705651",
- "reference": "e878a14a65245fbe78f8080eba03b47c3b705651",
+ "url": "https://api.github.com/repos/reactphp/dns/zipball/b22b0b20278e8535e633ab71a52472c5bf620aa1",
+ "reference": "b22b0b20278e8535e633ab71a52472c5bf620aa1",
"shasum": ""
},
"require": {
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.0"
+ "php": ">=5.3.0",
+ "react/cache": "^1.0 || ^0.6 || ^0.5",
+ "react/event-loop": "^1.0 || ^0.5",
+ "react/promise": "^3.0 || ^2.7 || ^1.2.1",
+ "react/promise-timer": "^1.2"
},
"require-dev": {
- "ext-tokenizer": "*"
+ "clue/block-react": "^1.2",
+ "phpunit/phpunit": "^9.3 || ^4.8.35"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-1.x": "1.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "phpDocumentor\\Reflection\\": "src"
+ "React\\Dns\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -8408,1108 +9924,344 @@
],
"authors": [
{
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- }
- ],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
- "time": "2020-06-27T10:12:23+00:00"
- },
- {
- "name": "phpspec/prophecy",
- "version": "1.11.1",
- "source": {
- "type": "git",
- "url": "https://github.com/phpspec/prophecy.git",
- "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b20034be5efcdab4fb60ca3a29cba2949aead160",
- "reference": "b20034be5efcdab4fb60ca3a29cba2949aead160",
- "shasum": ""
- },
- "require": {
- "doctrine/instantiator": "^1.2",
- "php": "^7.2",
- "phpdocumentor/reflection-docblock": "^5.0",
- "sebastian/comparator": "^3.0 || ^4.0",
- "sebastian/recursion-context": "^3.0 || ^4.0"
- },
- "require-dev": {
- "phpspec/phpspec": "^6.0",
- "phpunit/phpunit": "^8.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.11.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Prophecy\\": "src/Prophecy"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
},
{
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "https://github.com/phpspec/prophecy",
+ "description": "Async DNS resolver for ReactPHP",
"keywords": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
+ "async",
+ "dns",
+ "dns-resolver",
+ "reactphp"
],
- "time": "2020-07-08T12:44:21+00:00"
+ "support": {
+ "issues": "https://github.com/reactphp/dns/issues",
+ "source": "https://github.com/reactphp/dns/tree/v1.5.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/WyriHaximus",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2021-03-05T12:16:50+00:00"
},
{
- "name": "phpunit/php-code-coverage",
- "version": "7.0.10",
+ "name": "react/event-loop",
+ "version": "v1.1.1",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf"
+ "url": "https://github.com/reactphp/event-loop.git",
+ "reference": "6d24de090cd59cfc830263cfba965be77b563c13"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1884187926fbb755a9aaf0b3836ad3165b478bf",
- "reference": "f1884187926fbb755a9aaf0b3836ad3165b478bf",
+ "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13",
+ "reference": "6d24de090cd59cfc830263cfba965be77b563c13",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-xmlwriter": "*",
- "php": "^7.2",
- "phpunit/php-file-iterator": "^2.0.2",
- "phpunit/php-text-template": "^1.2.1",
- "phpunit/php-token-stream": "^3.1.1",
- "sebastian/code-unit-reverse-lookup": "^1.0.1",
- "sebastian/environment": "^4.2.2",
- "sebastian/version": "^2.0.1",
- "theseer/tokenizer": "^1.1.3"
+ "php": ">=5.3.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.2.2"
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
},
"suggest": {
- "ext-xdebug": "^2.7.2"
+ "ext-event": "~1.0 for ExtEventLoop",
+ "ext-pcntl": "For signal handling support when using the StreamSelectLoop",
+ "ext-uv": "* for ExtUvLoop"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "7.0-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\EventLoop\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
- "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.",
"keywords": [
- "coverage",
- "testing",
- "xunit"
+ "asynchronous",
+ "event-loop"
],
- "time": "2019-11-20T13:55:58+00:00"
+ "support": {
+ "issues": "https://github.com/reactphp/event-loop/issues",
+ "source": "https://github.com/reactphp/event-loop/tree/v1.1.1"
+ },
+ "time": "2020-01-01T18:39:52+00:00"
},
{
- "name": "phpunit/php-file-iterator",
- "version": "2.0.2",
+ "name": "react/promise",
+ "version": "v2.8.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "050bedf145a257b1ff02746c31894800e5122946"
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
- "reference": "050bedf145a257b1ff02746c31894800e5122946",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/f3cff96a19736714524ca0dd1d4130de73dbbbc4",
+ "reference": "f3cff96a19736714524ca0dd1d4130de73dbbbc4",
"shasum": ""
},
"require": {
- "php": "^7.1"
+ "php": ">=5.4.0"
},
"require-dev": {
- "phpunit/phpunit": "^7.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "FilterIterator implementation that filters files based on a list of suffixes.",
- "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
- "keywords": [
- "filesystem",
- "iterator"
- ],
- "time": "2018-09-13T20:33:42+00:00"
- },
- {
- "name": "phpunit/php-text-template",
- "version": "1.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.3"
+ "phpunit/phpunit": "^7.0 || ^6.5 || ^5.7 || ^4.8.36"
},
"type": "library",
"autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Simple template engine.",
- "homepage": "https://github.com/sebastianbergmann/php-text-template/",
- "keywords": [
- "template"
- ],
- "time": "2015-06-21T13:50:34+00:00"
- },
- {
- "name": "phpunit/php-timer",
- "version": "2.1.2",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
- "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
- "shasum": ""
- },
- "require": {
- "php": "^7.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^7.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.1-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Utility class for timing",
- "homepage": "https://github.com/sebastianbergmann/php-timer/",
- "keywords": [
- "timer"
- ],
- "time": "2019-06-07T04:22:29+00:00"
- },
- {
- "name": "phpunit/php-token-stream",
- "version": "3.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
- "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
- "shasum": ""
- },
- "require": {
- "ext-tokenizer": "*",
- "php": "^7.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^7.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Wrapper around PHP's tokenizer extension.",
- "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
- "keywords": [
- "tokenizer"
- ],
- "abandoned": true,
- "time": "2019-09-17T06:23:10+00:00"
- },
- {
- "name": "phpunit/phpunit",
- "version": "8.5.8",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/34c18baa6a44f1d1fbf0338907139e9dce95b997",
- "reference": "34c18baa6a44f1d1fbf0338907139e9dce95b997",
- "shasum": ""
- },
- "require": {
- "doctrine/instantiator": "^1.2.0",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-xml": "*",
- "ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.9.1",
- "phar-io/manifest": "^1.0.3",
- "phar-io/version": "^2.0.1",
- "php": "^7.2",
- "phpspec/prophecy": "^1.8.1",
- "phpunit/php-code-coverage": "^7.0.7",
- "phpunit/php-file-iterator": "^2.0.2",
- "phpunit/php-text-template": "^1.2.1",
- "phpunit/php-timer": "^2.1.2",
- "sebastian/comparator": "^3.0.2",
- "sebastian/diff": "^3.0.2",
- "sebastian/environment": "^4.2.2",
- "sebastian/exporter": "^3.1.1",
- "sebastian/global-state": "^3.0.0",
- "sebastian/object-enumerator": "^3.0.3",
- "sebastian/resource-operations": "^2.0.1",
- "sebastian/type": "^1.1.3",
- "sebastian/version": "^2.0.1"
- },
- "require-dev": {
- "ext-pdo": "*"
- },
- "suggest": {
- "ext-soap": "*",
- "ext-xdebug": "*",
- "phpunit/php-invoker": "^2.0.0"
- },
- "bin": [
- "phpunit"
- ],
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "8.5-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "The PHP Unit Testing framework.",
- "homepage": "https://phpunit.de/",
- "keywords": [
- "phpunit",
- "testing",
- "xunit"
- ],
- "time": "2020-06-22T07:06:58+00:00"
- },
- {
- "name": "scrivo/highlight.php",
- "version": "v9.18.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/scrivo/highlight.php.git",
- "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/scrivo/highlight.php/zipball/52fc21c99fd888e33aed4879e55a3646f8d40558",
- "reference": "52fc21c99fd888e33aed4879e55a3646f8d40558",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "ext-mbstring": "*",
- "php": ">=5.4"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8|^5.7",
- "sabberworm/php-css-parser": "^8.3",
- "symfony/finder": "^2.8|^3.4",
- "symfony/var-dumper": "^2.8|^3.4"
- },
- "suggest": {
- "ext-dom": "Needed to make use of the features in the utilities namespace"
- },
- "type": "library",
- "autoload": {
- "psr-0": {
- "Highlight\\": "",
- "HighlightUtilities\\": ""
+ "psr-4": {
+ "React\\Promise\\": "src/"
},
"files": [
- "HighlightUtilities/functions.php"
+ "src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Geert Bergman",
- "homepage": "http://www.scrivo.org/",
- "role": "Project Author"
- },
- {
- "name": "Vladimir Jimenez",
- "homepage": "https://allejo.io",
- "role": "Maintainer"
- },
- {
- "name": "Martin Folkers",
- "homepage": "https://twobrain.io",
- "role": "Contributor"
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com"
}
],
- "description": "Server side syntax highlighter that supports 185 languages. It's a PHP port of highlight.js",
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
"keywords": [
- "code",
- "highlight",
- "highlight.js",
- "highlight.php",
- "syntax"
+ "promise",
+ "promises"
],
- "time": "2020-03-02T05:59:21+00:00"
+ "time": "2020-05-12T15:16:56+00:00"
},
{
- "name": "sebastian/code-unit-reverse-lookup",
- "version": "1.0.1",
+ "name": "react/promise-timer",
+ "version": "v1.6.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ "url": "https://github.com/reactphp/promise-timer.git",
+ "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
- "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
+ "reference": "daee9baf6ef30c43ea4c86399f828bb5f558f6e6",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": ">=5.3",
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5",
+ "react/promise": "^3.0 || ^2.7.0 || ^1.2.1"
},
"require-dev": {
- "phpunit/phpunit": "^5.7 || ^6.0"
+ "phpunit/phpunit": "^9.0 || ^5.7 || ^4.8.35"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.0.x-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
+ "psr-4": {
+ "React\\Promise\\Timer\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Christian Lück",
+ "email": "christian@lueck.tv"
}
],
- "description": "Looks up which function or method a line of code belongs to",
- "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
- "time": "2017-03-04T06:30:41+00:00"
- },
- {
- "name": "sebastian/comparator",
- "version": "3.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
- "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
- "shasum": ""
- },
- "require": {
- "php": "^7.1",
- "sebastian/diff": "^3.0",
- "sebastian/exporter": "^3.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^7.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Volker Dusch",
- "email": "github@wallbash.com"
- },
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Provides the functionality to compare PHP values for equality",
- "homepage": "https://github.com/sebastianbergmann/comparator",
+ "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.",
+ "homepage": "https://github.com/reactphp/promise-timer",
"keywords": [
- "comparator",
- "compare",
- "equality"
+ "async",
+ "event-loop",
+ "promise",
+ "reactphp",
+ "timeout",
+ "timer"
],
- "time": "2018-07-12T15:12:46+00:00"
+ "support": {
+ "issues": "https://github.com/reactphp/promise-timer/issues",
+ "source": "https://github.com/reactphp/promise-timer/tree/v1.6.0"
+ },
+ "time": "2020-07-10T12:18:06+00:00"
},
{
- "name": "sebastian/diff",
- "version": "3.0.2",
+ "name": "react/socket",
+ "version": "v1.6.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
+ "url": "https://github.com/reactphp/socket.git",
+ "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
- "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+ "url": "https://api.github.com/repos/reactphp/socket/zipball/e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
+ "reference": "e2b96b23a13ca9b41ab343268dbce3f8ef4d524a",
"shasum": ""
},
"require": {
- "php": "^7.1"
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.0",
+ "react/dns": "^1.1",
+ "react/event-loop": "^1.0 || ^0.5",
+ "react/promise": "^2.6.0 || ^1.2.1",
+ "react/promise-timer": "^1.4.0",
+ "react/stream": "^1.1"
},
"require-dev": {
- "phpunit/phpunit": "^7.5 || ^8.0",
- "symfony/process": "^2 || ^3.3 || ^4"
+ "clue/block-react": "^1.2",
+ "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35",
+ "react/promise-stream": "^1.2"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\Socket\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
+ "name": "Christian Lück",
+ "email": "christian@clue.engineering",
+ "homepage": "https://clue.engineering/"
},
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "name": "Cees-Jan Kiewiet",
+ "email": "reactphp@ceesjankiewiet.nl",
+ "homepage": "https://wyrihaximus.net/"
+ },
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@gmail.com",
+ "homepage": "https://sorgalla.com/"
+ },
+ {
+ "name": "Chris Boden",
+ "email": "cboden@gmail.com",
+ "homepage": "https://cboden.dev/"
}
],
- "description": "Diff implementation",
- "homepage": "https://github.com/sebastianbergmann/diff",
+ "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP",
"keywords": [
- "diff",
- "udiff",
- "unidiff",
- "unified diff"
+ "Connection",
+ "Socket",
+ "async",
+ "reactphp",
+ "stream"
],
- "time": "2019-02-04T06:01:07+00:00"
+ "support": {
+ "issues": "https://github.com/reactphp/socket/issues",
+ "source": "https://github.com/reactphp/socket/tree/v1.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/WyriHaximus",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/clue",
+ "type": "github"
+ }
+ ],
+ "time": "2020-08-28T12:49:05+00:00"
},
{
- "name": "sebastian/environment",
- "version": "4.2.3",
+ "name": "react/stream",
+ "version": "v1.1.1",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
+ "url": "https://github.com/reactphp/stream.git",
+ "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
- "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+ "url": "https://api.github.com/repos/reactphp/stream/zipball/7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
+ "reference": "7c02b510ee3f582c810aeccd3a197b9c2f52ff1a",
"shasum": ""
},
"require": {
- "php": "^7.1"
+ "evenement/evenement": "^3.0 || ^2.0 || ^1.0",
+ "php": ">=5.3.8",
+ "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5"
},
"require-dev": {
- "phpunit/phpunit": "^7.5"
- },
- "suggest": {
- "ext-posix": "*"
+ "clue/stream-filter": "~1.2",
+ "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "4.2-dev"
- }
- },
"autoload": {
- "classmap": [
- "src/"
- ]
+ "psr-4": {
+ "React\\Stream\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Provides functionality to handle HHVM/PHP environments",
- "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP",
"keywords": [
- "Xdebug",
- "environment",
- "hhvm"
+ "event-driven",
+ "io",
+ "non-blocking",
+ "pipe",
+ "reactphp",
+ "readable",
+ "stream",
+ "writable"
],
- "time": "2019-11-20T08:46:58+00:00"
- },
- {
- "name": "sebastian/exporter",
- "version": "3.1.2",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
+ "support": {
+ "issues": "https://github.com/reactphp/stream/issues",
+ "source": "https://github.com/reactphp/stream/tree/v1.1.1"
},
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
- "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
- "shasum": ""
- },
- "require": {
- "php": "^7.0",
- "sebastian/recursion-context": "^3.0"
- },
- "require-dev": {
- "ext-mbstring": "*",
- "phpunit/phpunit": "^6.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.1.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Volker Dusch",
- "email": "github@wallbash.com"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
- },
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
- }
- ],
- "description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
- "keywords": [
- "export",
- "exporter"
- ],
- "time": "2019-09-14T09:02:43+00:00"
- },
- {
- "name": "sebastian/global-state",
- "version": "3.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
- "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
- "shasum": ""
- },
- "require": {
- "php": "^7.2",
- "sebastian/object-reflector": "^1.1.1",
- "sebastian/recursion-context": "^3.0"
- },
- "require-dev": {
- "ext-dom": "*",
- "phpunit/phpunit": "^8.0"
- },
- "suggest": {
- "ext-uopz": "*"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Snapshotting of global state",
- "homepage": "http://www.github.com/sebastianbergmann/global-state",
- "keywords": [
- "global state"
- ],
- "time": "2019-02-01T05:30:01+00:00"
- },
- {
- "name": "sebastian/object-enumerator",
- "version": "3.0.3",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
- "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
- "shasum": ""
- },
- "require": {
- "php": "^7.0",
- "sebastian/object-reflector": "^1.1.1",
- "sebastian/recursion-context": "^3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Traverses array structures and object graphs to enumerate all referenced objects",
- "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
- "time": "2017-08-03T12:35:26+00:00"
- },
- {
- "name": "sebastian/object-reflector",
- "version": "1.1.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "773f97c67f28de00d397be301821b06708fca0be"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
- "reference": "773f97c67f28de00d397be301821b06708fca0be",
- "shasum": ""
- },
- "require": {
- "php": "^7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Allows reflection of object attributes, including inherited and non-public ones",
- "homepage": "https://github.com/sebastianbergmann/object-reflector/",
- "time": "2017-03-29T09:07:27+00:00"
- },
- {
- "name": "sebastian/recursion-context",
- "version": "3.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
- "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
- "shasum": ""
- },
- "require": {
- "php": "^7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
- {
- "name": "Adam Harvey",
- "email": "aharvey@php.net"
- }
- ],
- "description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
- "time": "2017-03-03T06:23:57+00:00"
- },
- {
- "name": "sebastian/resource-operations",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
- "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
- "shasum": ""
- },
- "require": {
- "php": "^7.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- }
- ],
- "description": "Provides a list of PHP built-in functions that operate on resources",
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
- "time": "2018-10-04T04:07:39+00:00"
- },
- {
- "name": "sebastian/type",
- "version": "1.1.3",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/type.git",
- "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
- "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
- "shasum": ""
- },
- "require": {
- "php": "^7.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.1-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Collection of value objects that represent the types of the PHP type system",
- "homepage": "https://github.com/sebastianbergmann/type",
- "time": "2019-07-02T08:10:15+00:00"
- },
- {
- "name": "sebastian/version",
- "version": "2.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/version.git",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
- "shasum": ""
- },
- "require": {
- "php": ">=5.6"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de",
- "role": "lead"
- }
- ],
- "description": "Library that helps with managing the version number of Git-hosted PHP projects",
- "homepage": "https://github.com/sebastianbergmann/version",
- "time": "2016-10-03T07:35:21+00:00"
+ "time": "2020-05-04T10:17:57+00:00"
},
{
"name": "seld/jsonlint",
- "version": "1.8.1",
+ "version": "1.8.3",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/jsonlint.git",
- "reference": "3d5eb71705adfa34bd34b993400622932b2f62fd"
+ "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/3d5eb71705adfa34bd34b993400622932b2f62fd",
- "reference": "3d5eb71705adfa34bd34b993400622932b2f62fd",
+ "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
+ "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57",
"shasum": ""
},
"require": {
@@ -9555,7 +10307,7 @@
"type": "tidelift"
}
],
- "time": "2020-08-13T09:07:59+00:00"
+ "time": "2020-11-11T09:19:24+00:00"
},
{
"name": "seld/phar-utils",
@@ -9602,17 +10354,86 @@
"time": "2020-07-07T18:42:57+00:00"
},
{
- "name": "symfony/filesystem",
- "version": "v5.1.3",
+ "name": "supliu/laravel-query-monitor",
+ "version": "1.0.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/filesystem.git",
- "reference": "6e4320f06d5f2cce0d96530162491f4465179157"
+ "url": "https://github.com/supliu/laravel-query-monitor.git",
+ "reference": "f609e30cfc544a3621b8b4799aef6908f89c1ae8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/6e4320f06d5f2cce0d96530162491f4465179157",
- "reference": "6e4320f06d5f2cce0d96530162491f4465179157",
+ "url": "https://api.github.com/repos/supliu/laravel-query-monitor/zipball/f609e30cfc544a3621b8b4799aef6908f89c1ae8",
+ "reference": "f609e30cfc544a3621b8b4799aef6908f89c1ae8",
+ "shasum": ""
+ },
+ "require": {
+ "laravel/framework": "^5.6 || ^6.0 || ^7.0 || ^8.0",
+ "php": "^7.3",
+ "react/socket": "^1.4"
+ },
+ "require-dev": {
+ "orchestra/testbench": "^3.6 || ^4.0 || ^5.0 || ^6.0",
+ "phpunit/phpunit": "^9.2@dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Supliu\\LaravelQueryMonitor\\ServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Supliu\\LaravelQueryMonitor\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jansen Felipe",
+ "email": "jansen.felipe@gmail.com"
+ }
+ ],
+ "description": "Laravel Query Monitor",
+ "keywords": [
+ "eloquent",
+ "laravel",
+ "monitor",
+ "query",
+ "sql"
+ ],
+ "support": {
+ "issues": "https://github.com/supliu/laravel-query-monitor/issues",
+ "source": "https://github.com/supliu/laravel-query-monitor/tree/1.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://www.patreon.com/supliutech",
+ "type": "patreon"
+ }
+ ],
+ "time": "2021-03-04T14:35:53+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v5.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "262d033b57c73e8b59cd6e68a45c528318b15038"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/262d033b57c73e8b59cd6e68a45c528318b15038",
+ "reference": "262d033b57c73e8b59cd6e68a45c528318b15038",
"shasum": ""
},
"require": {
@@ -9620,11 +10441,6 @@
"symfony/polyfill-ctype": "~1.8"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.1-dev"
- }
- },
"autoload": {
"psr-4": {
"Symfony\\Component\\Filesystem\\": ""
@@ -9647,7 +10463,7 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Filesystem Component",
+ "description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"funding": [
{
@@ -9663,102 +10479,7 @@
"type": "tidelift"
}
],
- "time": "2020-05-30T20:35:19+00:00"
- },
- {
- "name": "theseer/tokenizer",
- "version": "1.2.0",
- "source": {
- "type": "git",
- "url": "https://github.com/theseer/tokenizer.git",
- "reference": "75a63c33a8577608444246075ea0af0d052e452a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
- "reference": "75a63c33a8577608444246075ea0af0d052e452a",
- "shasum": ""
- },
- "require": {
- "ext-dom": "*",
- "ext-tokenizer": "*",
- "ext-xmlwriter": "*",
- "php": "^7.2 || ^8.0"
- },
- "type": "library",
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Arne Blankerts",
- "email": "arne@blankerts.de",
- "role": "Developer"
- }
- ],
- "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
- "funding": [
- {
- "url": "https://github.com/theseer",
- "type": "github"
- }
- ],
- "time": "2020-07-12T23:59:07+00:00"
- },
- {
- "name": "webmozart/assert",
- "version": "1.9.1",
- "source": {
- "type": "git",
- "url": "https://github.com/webmozart/assert.git",
- "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
- "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
- "shasum": ""
- },
- "require": {
- "php": "^5.3.3 || ^7.0 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
- },
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<3.9.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.36 || ^7.5.13"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Webmozart\\Assert\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
- }
- ],
- "description": "Assertions to validate method input/output with nice error messages.",
- "keywords": [
- "assert",
- "check",
- "validate"
- ],
- "time": "2020-07-08T17:02:28+00:00"
+ "time": "2021-01-27T10:01:46+00:00"
}
],
"aliases": [],
@@ -9767,8 +10488,11 @@
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^7.2"
+ "php": "^7.3",
+ "ext-json": "*"
},
- "platform-dev": [],
- "plugin-api-version": "1.1.0"
+ "platform-dev": {
+ "ext-json": "*"
+ },
+ "plugin-api-version": "2.0.0"
}
diff --git a/config/app.php b/config/app.php
index 00d4ec4c..eed216b8 100644
--- a/config/app.php
+++ b/config/app.php
@@ -164,8 +164,8 @@ return [
TeamTNT\Scout\TNTSearchScoutServiceProvider::class,
Intervention\Image\ImageServiceProvider::class,
- Laravel\Passport\PassportServiceProvider::class,
Madnest\Madzipper\MadzipperServiceProvider::class,
+ App\Providers\FortifyServiceProvider::class,
/*
* Package Service Providers...
diff --git a/config/auth.php b/config/auth.php
index 309d7646..ba1a4d8c 100644
--- a/config/auth.php
+++ b/config/auth.php
@@ -42,8 +42,9 @@ return [
],
'api' => [
- 'driver' => 'passport',
+ 'driver' => 'token',
'provider' => 'users',
+ 'hash' => false,
],
],
@@ -67,7 +68,7 @@ return [
'providers' => [
'users' => [
'driver' => 'eloquent',
- 'model' => App\User::class,
+ 'model' => App\Models\User::class,
],
// 'users' => [
diff --git a/config/cashier.php b/config/cashier.php
index 07cd7c26..bb2fd137 100644
--- a/config/cashier.php
+++ b/config/cashier.php
@@ -57,7 +57,7 @@ return [
|
*/
- 'model' => env('CASHIER_MODEL', App\User::class),
+ 'model' => env('CASHIER_MODEL', App\Models\User::class),
/*
|--------------------------------------------------------------------------
diff --git a/config/content.php b/config/content.php
index 64830320..83596404 100644
--- a/config/content.php
+++ b/config/content.php
@@ -1,176 +1,182 @@
[
+ 'pages' => [
[
- 'visibility' => 0,
+ 'visibility' => 1,
'title' => 'Terms of Service',
'slug' => 'terms-of-service',
'content' => 'Laoreet cum hendrerit iaculis arcu phasellus congue et elementum, pharetra risus imperdiet aptent posuere rutrum parturient blandit, dapibus tellus ridiculus potenti aliquam sociis turpis. Nullam commodo eget laoreet risus cursus vel placerat, in dapibus sociis gravida faucibus sodales, fringilla potenti elit semper iaculis ullamcorper. Dignissim vulputate pretium montes pellentesque mollis, consectetur adipiscing curabitur semper sem rhoncus, litora viverra curae proin.',
],
[
- 'visibility' => 0,
+ 'visibility' => 1,
'title' => 'Privacy Policy',
'slug' => 'privacy-policy',
'content' => 'Sit orci justo augue maecenas laoreet consectetur natoque magnis in viverra sagittis, himenaeos urna facilisis mus proin primis diam accumsan tristique inceptos. Primis quisque posuere sit praesent lobortis feugiat semper convallis facilisis, vivamus gravida ligula nostra curae eu donec duis parturient senectus, arcu dolor viverra penatibus natoque cum nisi commodo. Litora sociis mauris justo nullam suspendisse mattis maecenas nascetur congue phasellus cras ultricies posuere donec, dapibus egestas diam lacus ornare montes senectus tincidunt eu taciti sed consequat.',
],
[
- 'visibility' => 0,
+ 'visibility' => 1,
'title' => 'Cookie Policy',
'slug' => 'cookie-policy',
'content' => 'Metus penatibus ligula dolor natoque non habitasse laoreet facilisis, libero vivamus eget semper vulputate interdum integer, phasellus lorem enim blandit consectetur nullam sollicitudin. Hendrerit interdum luctus ut in molestie himenaeos eros cum laoreet parturient est, eu lectus hac et netus viverra dictumst congue elit sem senectus litora, fames scelerisque adipiscing inceptos fringilla montes sociosqu suscipit auctor potenti. Elementum lacus vulputate viverra ac morbi ligula ipsum facilisi, sit eu imperdiet lacinia congue dis vitae.',
],
],
- 'content_regular' => [
- [
- 'name' => 'section_features',
- 'value' => 0,
- ],
- [
- 'name' => 'section_feature_boxes',
- 'value' => 0,
- ],
- [
- 'name' => 'section_get_started',
- 'value' => 0,
- ],
- [
- 'name' => 'header_title',
- 'value' => 'Simple & Powerful Personal Cloud Storage',
- ],
- [
- 'name' => 'header_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'features_title',
- 'value' => 'The Fastest Growing File Manager on the CodeCanyon Market',
- ],
- [
- 'name' => 'features_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'feature_title_1',
- 'value' => 'Truly Freedom',
- ],
- [
- 'name' => 'feature_description_1',
- 'value' => 'You have full control over VueFileManager, no third authorities will control your service or usage, only you.',
- ],
- [
- 'name' => 'feature_title_2',
- 'value' => 'The Sky is the Limit',
- ],
- [
- 'name' => 'feature_description_2',
- 'value' => 'VueFileManager is cloud storage software. You have to install and running application on your own server hosting.',
- ],
- [
- 'name' => 'feature_title_3',
- 'value' => 'No Monthly Fees',
- ],
- [
- 'name' => 'feature_description_3',
- 'value' => 'When you running VueFileManager on your own server hosting, anybody can\'t control your content or resell your user data. Your data is safe.',
- ],
- [
- 'name' => 'get_started_title',
- 'value' => 'Ready to Get Started With Us?',
- ],
- [
- 'name' => 'get_started_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'footer_content',
- 'value' => '© 2021 Simple & Powerful Personal Cloud Storage. Developed by Hi5Ve.Digital ',
- ],
- [
- 'name' => 'allow_homepage',
- 'value' => 1,
- ],
- ],
- 'content_extended' => [
- [
- 'name' => 'section_features',
- 'value' => '1',
- ],
- [
- 'name' => 'section_feature_boxes',
- 'value' => '1',
- ],
- [
- 'name' => 'section_pricing_content',
- 'value' => '1',
- ],
- [
- 'name' => 'section_get_started',
- 'value' => '1',
- ],
- [
- 'name' => 'header_title',
- 'value' => 'Simple & Powerful Personal Cloud Storage',
- ],
- [
- 'name' => 'header_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'features_title',
- 'value' => 'The Fastest Growing File Manager on the CodeCanyon Market',
- ],
- [
- 'name' => 'features_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'feature_title_1',
- 'value' => 'Truly Freedom',
- ],
- [
- 'name' => 'feature_description_1',
- 'value' => 'You have full control over VueFileManager, no third authorities will control your service or usage, only you.',
- ],
- [
- 'name' => 'feature_title_2',
- 'value' => 'The Sky is the Limit',
- ],
- [
- 'name' => 'feature_description_2',
- 'value' => 'VueFileManager is cloud storage software. You have to install and running application on your own server hosting.',
- ],
- [
- 'name' => 'feature_title_3',
- 'value' => 'No Monthly Fees',
- ],
- [
- 'name' => 'feature_description_3',
- 'value' => 'When you running VueFileManager on your own server hosting, anybody can\'t control your content or resell your user data. Your data is safe.',
- ],
- [
- 'name' => 'pricing_title',
- 'value' => 'Pick the Best Plan For Your Needs',
- ],
- [
- 'name' => 'pricing_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'get_started_title',
- 'value' => 'Ready to Get Started With Us?',
- ],
- [
- 'name' => 'get_started_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'footer_content',
- 'value' => '© 2021 Simple & Powerful Personal Cloud Storage. Developed by Hi5Ve.Digital ',
- ],
- [
- 'name' => 'allow_homepage',
- 'value' => 1,
+ 'content' => [
+ 'regular' => [
+ [
+ 'name' => 'section_features',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'section_feature_boxes',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'section_get_started',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'header_title',
+ 'value' => 'Simple & Powerful Personal Cloud Storage',
+ ],
+ [
+ 'name' => 'header_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'features_title',
+ 'value' => 'The Fastest Growing File Manager on the CodeCanyon Market',
+ ],
+ [
+ 'name' => 'features_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'feature_title_1',
+ 'value' => 'Truly Freedom',
+ ],
+ [
+ 'name' => 'feature_description_1',
+ 'value' => 'You have full control over VueFileManager, no third authorities will control your service or usage, only you.',
+ ],
+ [
+ 'name' => 'feature_title_2',
+ 'value' => 'The Sky is the Limit',
+ ],
+ [
+ 'name' => 'feature_description_2',
+ 'value' => 'VueFileManager is cloud storage software. You have to install and running application on your own server hosting.',
+ ],
+ [
+ 'name' => 'feature_title_3',
+ 'value' => 'No Monthly Fees',
+ ],
+ [
+ 'name' => 'feature_description_3',
+ 'value' => 'When you running VueFileManager on your own server hosting, anybody can\'t control your content or resell your user data. Your data is safe.',
+ ],
+ [
+ 'name' => 'get_started_title',
+ 'value' => 'Ready to Get Started With Us?',
+ ],
+ [
+ 'name' => 'get_started_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'footer_content',
+ 'value' => '© 2021 Simple & Powerful Personal Cloud Storage. Developed by Hi5Ve.Digital ',
+ ],
+ [
+ 'name' => 'allow_homepage',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'app_color',
+ 'value' => '#00BC7E',
+ ],
],
+ 'extended' => [
+ [
+ 'name' => 'section_features',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'section_feature_boxes',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'section_pricing_content',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'section_get_started',
+ 'value' => 1,
+ ],
+ [
+ 'name' => 'header_title',
+ 'value' => 'Simple & Powerful Personal Cloud Storage',
+ ],
+ [
+ 'name' => 'header_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'features_title',
+ 'value' => 'The Fastest Growing File Manager on the CodeCanyon Market',
+ ],
+ [
+ 'name' => 'features_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'feature_title_1',
+ 'value' => 'Truly Freedom',
+ ],
+ [
+ 'name' => 'feature_description_1',
+ 'value' => 'You have full control over VueFileManager, no third authorities will control your service or usage, only you.',
+ ],
+ [
+ 'name' => 'feature_title_2',
+ 'value' => 'The Sky is the Limit',
+ ],
+ [
+ 'name' => 'feature_description_2',
+ 'value' => 'VueFileManager is cloud storage software. You have to install and running application on your own server hosting.',
+ ],
+ [
+ 'name' => 'feature_title_3',
+ 'value' => 'No Monthly Fees',
+ ],
+ [
+ 'name' => 'feature_description_3',
+ 'value' => 'When you running VueFileManager on your own server hosting, anybody can\'t control your content or resell your user data. Your data is safe.',
+ ],
+ [
+ 'name' => 'pricing_title',
+ 'value' => 'Pick the Best Plan For Your Needs',
+ ],
+ [
+ 'name' => 'pricing_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'get_started_title',
+ 'value' => 'Ready to Get Started With Us?',
+ ],
+ [
+ 'name' => 'get_started_description',
+ 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
+ ],
+ [
+ 'name' => 'footer_content',
+ 'value' => '© 2021 Simple & Powerful Personal Cloud Storage. Developed by Hi5Ve.Digital ',
+ ],
+ [
+ 'name' => 'app_color',
+ 'value' => '#00BC7E',
+ ],
+ ]
],
];
\ No newline at end of file
diff --git a/config/custom-language-translations.php b/config/custom-language-translations.php
new file mode 100644
index 00000000..ef245a23
--- /dev/null
+++ b/config/custom-language-translations.php
@@ -0,0 +1,11 @@
+ 'translation'
+];
\ No newline at end of file
diff --git a/config/fortify.php b/config/fortify.php
new file mode 100644
index 00000000..b76f3538
--- /dev/null
+++ b/config/fortify.php
@@ -0,0 +1,145 @@
+ 'web',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Fortify Password Broker
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which password broker Fortify can use when a user
+ | is resetting their password. This configured value should match one
+ | of your password brokers setup in your "auth" configuration file.
+ |
+ */
+
+ 'passwords' => 'users',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Username / Email
+ |--------------------------------------------------------------------------
+ |
+ | This value defines which model attribute should be considered as your
+ | application's "username" field. Typically, this might be the email
+ | address of the users but you are free to change this value here.
+ |
+ | Out of the box, Fortify expects forgot password and reset password
+ | requests to have a field named 'email'. If the application uses
+ | another name for the field you may define it below as needed.
+ |
+ */
+
+ 'username' => 'email',
+
+ 'email' => 'email',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Home Path
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the path where users will get redirected during
+ | authentication or password reset when the operations are successful
+ | and the user is authenticated. You are free to change this value.
+ |
+ */
+
+ 'home' => RouteServiceProvider::HOME,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Fortify Routes Prefix / Subdomain
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which prefix Fortify will assign to all the routes
+ | that it registers with the application. If necessary, you may change
+ | subdomain under which all of the Fortify routes will be available.
+ |
+ */
+
+ 'prefix' => '',
+
+ 'domain' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Fortify Routes Middleware
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify which middleware Fortify will assign to the routes
+ | that it registers with the application. If necessary, you may change
+ | these middleware but typically this provided default is preferred.
+ |
+ */
+
+ 'middleware' => ['web'],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Rate Limiting
+ |--------------------------------------------------------------------------
+ |
+ | By default, Fortify will throttle logins to five requests per minute for
+ | every email and IP address combination. However, if you would like to
+ | specify a custom rate limiter to call then you may specify it here.
+ |
+ */
+
+ 'limiters' => [
+ 'login' => 'login',
+ 'two-factor' => 'two-factor',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Register View Routes
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify if the routes returning views should be disabled as
+ | you may not need them when building your own application. This may be
+ | especially true if you're writing a custom single-page application.
+ |
+ */
+
+ 'views' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Features
+ |--------------------------------------------------------------------------
+ |
+ | Some of the Fortify features are optional. You may disable the features
+ | by removing them from this array. You're free to only remove some of
+ | these features or you can even remove all of these if you need to.
+ |
+ */
+
+ 'features' => [
+ Features::registration(),
+ //Features::resetPasswords(),
+ // Features::emailVerification(),
+ Features::updateProfileInformation(),
+ //Features::updatePasswords(),
+ /*Features::twoFactorAuthentication([
+ 'confirmPassword' => true,
+ ]),*/
+ ],
+
+];
diff --git a/config/language-translations.php b/config/language-translations.php
new file mode 100644
index 00000000..ea7f4ba1
--- /dev/null
+++ b/config/language-translations.php
@@ -0,0 +1,681 @@
+ [
+ "activation.stripe.button" => "Set up your Stripe account",
+ "activation.stripe.description" => "To charge your users, please set up your Stripe account credentials.",
+ "activation.stripe.title" => "Your Stripe account is not set",
+ "admin_menu.invoices" => "Invoices",
+ "admin_menu.plans" => "Plans",
+ "admin_page_dashboard.w_total_premium.link" => "Show All Plans",
+ "admin_page_dashboard.w_total_premium.title" => "Total Premium Users",
+ "admin_page_invoices.empty.description" => "All customers invoices will be showed here.",
+ "admin_page_invoices.empty.title" => "You don’t have any invoices yet",
+ "admin_page_invoices.table.number" => "Invoice Number",
+ "admin_page_invoices.table.payed" => "Payed",
+ "admin_page_invoices.table.plan" => "Plan",
+ "admin_page_invoices.table.total" => "Total",
+ "admin_page_invoices.table.user" => "User",
+ "admin_page_plans.create_plan_button" => "Create Plan",
+ "admin_page_plans.delete_plan_button" => "Delete Plan",
+ "admin_page_plans.disclaimer_delete_plan" => "You can delete this plan, but, pay attention! Your plan will be deleted, but users who are subscribed with this plan, will be still charged unless they cancel subscription.",
+ "admin_page_plans.disclaimer_edit_price" => "Price change for your plan is not available due to Stripe service design. If you wish change your price plan, please, create new plan.",
+ "admin_page_plans.empty.button" => "Create New Plan",
+ "admin_page_plans.empty.description" => "For create new plan, click on button below.",
+ "admin_page_plans.empty.title" => "You don’t have any plan yet",
+ "admin_page_plans.form.description" => "Description (optional)",
+ "admin_page_plans.form.description_plac" => "Plan description",
+ "admin_page_plans.form.name" => "Name",
+ "admin_page_plans.form.name_delete_plac" => "Type plan name",
+ "admin_page_plans.form.name_plac" => "Plan name",
+ "admin_page_plans.form.price" => "Price",
+ "admin_page_plans.form.price_plac" => "Plan price",
+ "admin_page_plans.form.status" => "Status",
+ "admin_page_plans.form.status_help" => "Status of your plan availability on website.",
+ "admin_page_plans.form.storage" => "Storage Capacity in GB",
+ "admin_page_plans.form.storage_helper" => "You have to type only number e.g. value '5' means, user will have 5GB of storage capacity.",
+ "admin_page_plans.form.storage_plac" => "Storage capacity",
+ "admin_page_plans.form.title_delete" => "Delete Plan",
+ "admin_page_plans.form.title_details" => "Plan Details",
+ "admin_page_plans.form.title_pricing" => "Plan Pricing",
+ "admin_page_plans.subscribers.empty" => "There is no any subscriber yet.",
+ "admin_page_plans.table.name" => "Plan Name",
+ "admin_page_plans.table.price" => "Price",
+ "admin_page_plans.table.status" => "Status",
+ "admin_page_plans.table.storage_capacity" => "Storage Capacity",
+ "admin_page_plans.table.subscribers" => "Subscribers",
+ "admin_page_plans.tabs.delete" => "Delete Plan",
+ "admin_page_plans.tabs.settings" => "Settings",
+ "admin_page_plans.tabs.subscribers" => "Subscribers",
+ "admin_page_user.subscription.empty" => "User don't have any subscription yet.",
+ "admin_page_user.subscription.interval_mo" => "Monthly",
+ "admin_page_user.table.plan" => "Subscription Plan",
+ "admin_page_user.tabs.invoices" => "Invoices",
+ "admin_page_user.tabs.subscription" => "Subscription",
+ "admin_settings.billings.address" => "Billing Address",
+ "admin_settings.billings.address_plac" => "Type your billing address",
+ "admin_settings.billings.city" => "Billing City",
+ "admin_settings.billings.city_plac" => "Type your billing city",
+ "admin_settings.billings.company_name" => "Company Name",
+ "admin_settings.billings.company_name_plac" => "Type your company name",
+ "admin_settings.billings.country" => "Billing Country",
+ "admin_settings.billings.country_plac" => "Select your billing country",
+ "admin_settings.billings.phone_number" => "Billing Phone Number (optional)",
+ "admin_settings.billings.phone_number_plac" => "Type your billing phone number",
+ "admin_settings.billings.postal_code" => "Billing Postal Code",
+ "admin_settings.billings.postal_code_plac" => "Type your billing postal code",
+ "admin_settings.billings.section_billing" => "Billing Information",
+ "admin_settings.billings.section_company" => "Company Information",
+ "admin_settings.billings.state" => "Billing State",
+ "admin_settings.billings.state_plac" => "Type your billing state",
+ "admin_settings.billings.vat" => "VAT Number",
+ "admin_settings.billings.vat_plac" => "Type your VAT number",
+ "admin_settings.payments.allow_payments" => "Allow Subscription Payments",
+ "admin_settings.payments.button_submit" => "Test and Save Stripe",
+ "admin_settings.payments.button_testing" => "Testing Stripe Connection",
+ "admin_settings.payments.credentials_disclaimer" => "Your Stripe credentials is not showed because these values are secret and must not be revealed by stranger. You can change your Stripe credentials in your .env file.",
+ "admin_settings.payments.section_payments" => "Stripe Payments",
+ "admin_settings.payments.stripe_create_acc" => "If you don’t have stripe account, please register here and get your Publishable Key, Secret Key and create your webhook.",
+ "admin_settings.payments.stripe_create_webhook" => "You have to create webhook endpoint in your Stripe Dashboard. You can find it in Dashboard -> Developers -> Webhooks -> Add Endpoint . In Endpoint URL please copy and paste url bellow. Make sure, this url is your public domain, not localhost. In events section, please click on receive all events . That's all.",
+ "admin_settings.payments.stripe_currency" => "Stripe Currency",
+ "admin_settings.payments.stripe_currency_plac" => "Select your Stripe currency",
+ "admin_settings.payments.stripe_pub_key" => "Publishable Key",
+ "admin_settings.payments.stripe_pub_key_plac" => "Paste your publishable key",
+ "admin_settings.payments.stripe_sec_key" => "Secret Key",
+ "admin_settings.payments.stripe_sec_key_plac" => "Paste your secret key",
+ "admin_settings.payments.stripe_setup" => "Stripe Setup",
+ "admin_settings.payments.stripe_webhook_key_plac" => "Paste your stripe webhook secret",
+ "admin_settings.payments.webhook_url" => "Stripe webhook URL",
+ "admin_settings.tabs.billings" => "Billings",
+ "admin_settings.tabs.payments" => "Payments",
+ "global.monthly_ac" => "Mo.",
+ "global.premium" => "Premium",
+ "global.saas" => "Services",
+ "global.subscription" => "Subscription",
+ "global.upgrade_plan" => "Upgrade Plan",
+ "incomplete_payment.description" => "Your latest payment is incomplete. {0}",
+ "incomplete_payment.href" => "Please confirm your payment.",
+ "menu.invoices" => "Invoices",
+ "menu.payment_cards" => "Payment Cards",
+ "menu.subscription" => "Subscription",
+ "notice.stripe_activation" => "Your Stripe account is not set. To charging your users please {0}.",
+ "notice.stripe_activation_button" => "set up your Stripe account",
+ "page_pricing_tables.description" => "Choose plan witch perfect fit your needs. All plans is billed monthly automatically via your credit card.",
+ "page_pricing_tables.storage_capacity" => "Of Storage Capacity",
+ "page_pricing_tables.title" => "Choose Your Plan",
+ "page_pricing_tables.vat_excluded" => "Price displayed excludes VAT.",
+ "page_upgrade_account.change_payment.change_payment" => "change your default payment method",
+ "page_upgrade_account.change_payment.pay_by_new_card" => "pay by new credit card",
+ "page_upgrade_account.change_payment.you_can" => "Also you can",
+ "page_upgrade_account.desription" => "To finish your order, please fill your payment method and set billing informations",
+ "page_upgrade_account.errors.pay_by_another_card" => "Please pay by another payment card",
+ "page_upgrade_account.section_billing" => "Billing Information",
+ "page_upgrade_account.section_card" => "Payment Card",
+ "page_upgrade_account.section_summary" => "Order Summary",
+ "page_upgrade_account.summary.period" => "Billed monthly",
+ "page_upgrade_account.summary.submit_button" => "Pay with credit card",
+ "page_upgrade_account.summary.submit_disclaimer" => "By submit form, you agree to save the payment method and billing information in your {app} account.",
+ "page_upgrade_account.summary.total_with_vat" => "Total with VAT",
+ "page_upgrade_account.summary.vat" => "VAT",
+ "page_upgrade_account.title" => "Choose Payment Method",
+ "popup_delete_card.message" => "This event is irreversible and your payment card will be delete forever",
+ "popup_delete_card.title" => "Are you sure?",
+ "popup_deleted_plan.message" => "Your plan was successfully deleted.",
+ "popup_deleted_plan.title" => "Plan was deleted",
+ "popup_set_card.message" => "Your card will be set as default and will be always charged for the next billings.",
+ "popup_set_card.title" => "Set as default card?",
+ "popup_subscription_cancel.button" => "I'm done",
+ "popup_subscription_cancel.message" => "You'll continue to have access to the features you've paid for until the end of your billing cycle.",
+ "popup_subscription_cancel.title" => "Subscription Was Canceled",
+ "popup_subscription_resumed.button" => "That's awesome!",
+ "popup_subscription_resumed.message" => "Your subscription was re-activated, and they will be billed on the original billing cycle.",
+ "popup_subscription_resumed.title" => "Subscription Was Resumed",
+ "routes_title.billings" => "Billings",
+ "routes_title.invoices" => "Invoices",
+ "routes_title.payment_methods" => "Payment Methods",
+ "routes_title.payments" => "Payments",
+ "routes_title.plan" => "Plan",
+ "routes_title.plan_create" => "Create Plan",
+ "routes_title.plan_delete" => "Plan Delete",
+ "routes_title.plan_settings" => "Plan Settings",
+ "routes_title.pricing_plans" => "Pricing Plans",
+ "routes_title.subscribers" => "Subscribers",
+ "routes_title.subscription" => "Subscription",
+ "routes_title.upgrade_billing" => "Billing",
+ "routes_title.upgrade_plan" => "Upgrade Plan",
+ "rows.card.expiration" => "Expiration Date",
+ "rows.card.number" => "Card Number",
+ "rows.card.status" => "Status",
+ "rows.invoice.number" => "Invoice Number",
+ "rows.invoice.payed" => "Payed",
+ "rows.invoice.plan" => "Plan",
+ "rows.invoice.total" => "Total",
+ "toaster.account_upgraded" => "Your account was successfully upgraded.",
+ "toaster.card_deleted" => "Your card was successfully deleted.",
+ "toaster.card_new_add" => "Your card was successfully added",
+ "toaster.card_set" => "Your card was successfully set as default.",
+ "toaster.plan_created" => "Your plan was successfully created!",
+ "toaster.stripe_set" => "Your Stripe account was successfully set!",
+ "user_invoices.empty" => "You don't have any invoices yet.",
+ "user_invoices.title" => "Invoices",
+ "user_payments.add_card" => "Add Payment Card",
+ "user_payments.card_field_title" => "Credit Card",
+ "user_payments.delete_card" => "Delete card",
+ "user_payments.empty" => "You don't have any payment cards yet.",
+ "user_payments.field_loading" => "Loading card field...",
+ "user_payments.set_as_default" => "Set as default card",
+ "user_payments.store_card" => "Store Payment Card",
+ "user_payments.title" => "Payment Methods",
+ "user_subscription.title" => "Subscription",
+ "user_subscription.billed" => "Billed",
+ "user_subscription.cancel_plan" => "Cancel Plan",
+ "user_subscription.canceled_at" => "Canceled At",
+ "user_subscription.created_at" => "Created At",
+ "user_subscription.empty" => "You don't have any subscription yet.",
+ "user_subscription.ends_at" => "Ends At",
+ "user_subscription.plan" => "Plan",
+ "user_subscription.renews_at" => "Renews At",
+ "user_subscription.resume_plan" => "Resume Plan",
+ "user_subscription.status" => "Status",
+ 'print_button' => 'Print Document',
+ 'vat' => 'VAT',
+ 'vat_included' => 'incl.',
+ 'subtotal' => 'Subtotal',
+ 'tax_exempted' => 'Tax is exempted',
+ 'tax_be_paid_reverse' => 'Tax to be paid on reverse charge basis',
+ 'invoice_title' => 'Invoice',
+ 'date' => 'Date',
+ 'product' => 'Product',
+ 'subscription' => 'Subscription',
+ 'invoice_number' => 'Invoice Number',
+ 'seller' => 'Seller',
+ 'client' => 'Client',
+ 'seller_vat' => 'VAT number',
+ 'seller_name' => 'Name',
+ 'seller_phone' => 'Phone',
+ 'name' => 'Name',
+ 'phone' => 'Phone',
+ 'address' => 'Address',
+ 'city' => 'City',
+ 'state' => 'State',
+ 'postal_code' => 'Postal code',
+ 'country' => 'Country',
+ 'col_description' => 'Description',
+ 'col_date' => 'Date',
+ 'col_amount' => 'Amount',
+ 'total' => 'Total',
+ ],
+ 'regular' => [
+ "actions.close" => "Close",
+ "actions.create_folder" => "Create folder",
+ "actions.delete" => "Delete item",
+ "actions.download" => "Download item",
+ "actions.info_panel" => "Info panel",
+ "actions.move" => "Move item",
+ "actions.preview" => "Change preview",
+ "actions.print" => "Print item",
+ "actions.share" => "Share item",
+ "actions.sorting_view" => "Sorting and View",
+ "actions.upload" => "Upload file",
+ "admin_menu.dashboard" => "Dashboard",
+ "admin_menu.pages" => "Pages",
+ "admin_menu.settings" => "Settings",
+ "admin_menu.users" => "Users",
+ "admin_menu.languages" => "Languages",
+ "admin_page_dashboard.backer_button" => "Help Us Improve",
+ "admin_page_dashboard.license" => "License",
+ "admin_page_dashboard.version" => "Version",
+ "admin_page_dashboard.w_latest_users.title" => "Latest Registrations",
+ "admin_page_dashboard.w_total_space.link" => "Show All Users",
+ "admin_page_dashboard.w_total_space.title" => "Total Space Used",
+ "admin_page_dashboard.w_total_users.link" => "Show All Users",
+ "admin_page_dashboard.w_total_users.title" => "Total Users",
+ "admin_page_user.change_capacity" => "Change Capacity",
+ "admin_page_user.create_user.avatar" => "Avatar",
+ "admin_page_user.create_user.group_details" => "Account Details",
+ "admin_page_user.create_user.group_settings" => "Account Settings",
+ "admin_page_user.create_user.label_conf_pass" => "Confirm password",
+ "admin_page_user.create_user.label_email" => "Type E-mail",
+ "admin_page_user.create_user.label_name" => "Type full name",
+ "admin_page_user.create_user.submit" => "Create User",
+ "admin_page_user.delete_user" => "Delete User",
+ "admin_page_user.invoices.empty" => "User don't have any invoices yet.",
+ "admin_page_user.label_change_capacity" => "Type storage capacity in GB",
+ "admin_page_user.label_delete_user" => "Type with Case Sensitive user name ‘{user}‘",
+ "admin_page_user.label_person_info" => "Personal Information",
+ "admin_page_user.placeholder_delete_user" => "Type here",
+ "admin_page_user.save_role" => "Save Role",
+ "admin_page_user.select_role" => "Select user role",
+ "admin_page_user.send_password_link" => "Send Password Reset Link",
+ "admin_page_user.table.action" => "Action",
+ "admin_page_user.table.created_at" => "Registered",
+ "admin_page_user.table.name" => "User",
+ "admin_page_user.table.role" => "Role",
+ "admin_page_user.table.storage_capacity" => "Storage Capacity",
+ "admin_page_user.table.storage_used" => "Storage Used",
+ "admin_page_user.tabs.delete" => "Delete User",
+ "admin_page_user.tabs.detail" => "Detail",
+ "admin_page_user.tabs.password" => "Password",
+ "admin_page_user.tabs.storage" => "Storage Usage",
+ "admin_pages.form.content" => "Content",
+ "admin_pages.form.content_plac" => "Type your content here...",
+ "admin_pages.form.slug" => "Slug",
+ "admin_pages.form.title" => "Title",
+ "admin_pages.form.title_plac" => "Title name",
+ "admin_pages.form.visibility" => "Visibility",
+ "admin_pages.form.visibility_help" => "Status of your page visibility on website.",
+ "admin_pages.table.page" => "Page",
+ "admin_pages.table.slug" => "Slug",
+ "admin_pages.table.status" => "Status",
+ "admin_settings.appearance.description" => "App Description",
+ "admin_settings.appearance.description_plac" => "Type your app description",
+ "admin_settings.appearance.favicon" => "App Favicon (optional)",
+ "admin_settings.appearance.logo" => "App Logo (optional)",
+ "admin_settings.appearance.logo_horizontal" => "App Logo Horizontal (optional)",
+ "admin_settings.appearance.section_appearance" => "Appearance",
+ "admin_settings.appearance.section_general" => "General Settings",
+ "admin_settings.appearance.title" => "App Title",
+ "admin_settings.appearance.title_plac" => "Type your app title",
+ "admin_settings.email.driver" => "Mail Driver",
+ "admin_settings.email.driver_plac" => "Type your mail driver",
+ "admin_settings.email.email_disclaimer" => "This form is not fully pre-filled for security reasons. Your email settings is available in your .env file. For apply new Email settings, please confirm your options by button at the end of formular.",
+ "admin_settings.email.encryption" => "Mail Encryption",
+ "admin_settings.email.encryption_plac" => "Select your mail encryption",
+ "admin_settings.email.host" => "Mail Host",
+ "admin_settings.email.host_plac" => "Type your mail host",
+ "admin_settings.email.password" => "Mail Password",
+ "admin_settings.email.password_plac" => "Type your mail password",
+ "admin_settings.email.port" => "Mail Port",
+ "admin_settings.email.port_plac" => "Type your mail port",
+ "admin_settings.email.save_button" => "Save Email Settings",
+ "admin_settings.email.section_email" => "Email Setup",
+ "admin_settings.email.username" => "Mail Username",
+ "admin_settings.email.username_plac" => "Type your mail username",
+ "admin_settings.others.allow_registration" => "Allow User Registration",
+ "admin_settings.others.allow_registration_help" => "You can disable public registration for new users. You will still able to create new users in administration panel.",
+ "admin_settings.others.cache_clear" => "Clear Cache",
+ "admin_settings.others.cache_disclaimer" => "Did you change anything in your .env file or change your Stripe credentials? Then clear your cache.",
+ "admin_settings.others.contact_email" => "Contact Email",
+ "admin_settings.others.contact_email_plac" => "Type your contact email",
+ "admin_settings.others.default_storage" => "Default Storage Space for User Accounts",
+ "admin_settings.others.default_storage_plac" => "Set default storage space in GB",
+ "admin_settings.others.google_analytics" => "Google Analytics Code (optional)",
+ "admin_settings.others.google_analytics_plac" => "Paste your Google Analytics Code",
+ "admin_settings.others.mimetypes_blacklist" => "Mimetypes Blacklist",
+ "admin_settings.others.mimetypes_blacklist_help" => "If you want to prevent upload some type of files, just add them to blacklist like this: x-php,mp3,jpeg Use a comma between each mimetype. Don't use a dot before mimetypes.",
+ "admin_settings.others.mimetypes_blacklist_plac" => "Add mimetypes to Blacklist",
+ "admin_settings.others.section_cache" => "Application Cache",
+ "admin_settings.others.section_others" => "Others Settings",
+ "admin_settings.others.section_user" => "Users and Storage",
+ "admin_settings.others.storage_limit" => "Storage Limitation",
+ "admin_settings.others.storage_limit_help" => "If this value is off, all users will have infinity storage capacity and you won't be able to charge your users for storage plan.",
+ "admin_settings.others.upload_limit" => "Upload Limit",
+ "admin_settings.others.upload_limit_help" => "If you want to set max file size limit on single upload, add size of your limit in MB. E.g. 100 means 100 MB and 2 000 means 2 000 MB limit.",
+ "admin_settings.others.upload_limit_plac" => "Type your upload limit in MB",
+ "admin_settings.tabs.appearance" => "Appearance",
+ "admin_settings.tabs.email" => "Email",
+ "admin_settings.tabs.others" => "Application",
+ "alerts.error_confirm" => "That’s horrible!",
+ "alerts.leave_to_sign_in" => "Do you really want to leave?",
+ "alerts.success_confirm" => "Awesome!",
+ "context_menu.add_folder" => "Add Folder",
+ "context_menu.add_to_favourites" => "Add to Favourites",
+ "context_menu.create_folder" => "Create Folder",
+ "context_menu.delete" => "Delete",
+ "context_menu.detail" => "Detail",
+ "context_menu.download" => "Download",
+ "context_menu.empty_trash" => "Empty Trash",
+ "context_menu.log_out" => "Log Out",
+ "context_menu.move" => "Move",
+ "context_menu.no_options" => "No Options Available",
+ "context_menu.profile_settings" => "Profile Settings",
+ "context_menu.remove_from_favourites" => "Remove Favourite",
+ "context_menu.rename" => "Rename",
+ "context_menu.restore" => "Restore",
+ "context_menu.select" => "Select",
+ "context_menu.share" => "Share",
+ "context_menu.share_cancel" => "Cancel Sharing",
+ "context_menu.share_edit" => "Edit Sharing",
+ "context_menu.upload" => "Upload",
+ "context_menu.zip_folder" => "Zip and Download",
+ "cookie_disclaimer.button" => "cookies policy",
+ "cookie_disclaimer.description" => "By browsing this website you are agreeing to our {0}.",
+ "datatable.paginate_info" => "Showing 1 - {visible} from {total} records",
+ "empty_page.call_to_action" => "Upload Files",
+ "empty_page.description" => "Upload some files here easily via upload button.",
+ "empty_page.title" => "Upload Your First File",
+ "errors.capacity_digit" => "The storage capacity must be lower than 10 digit number.",
+ "file_detail.author" => "Author",
+ "file_detail.author_participant" => "Public Participant",
+ "file_detail.created_at" => "Created at",
+ "file_detail.items" => "Items",
+ "file_detail.selected_multiple" => "Selected Multiple Items",
+ "file_detail.shared" => "Shared",
+ "file_detail.size" => "Size",
+ "file_detail.where" => "Where",
+ "file_detail_meta.aperature" => "F Number",
+ "file_detail_meta.aperture_value" => "Aperture Value",
+ "file_detail_meta.author" => "Author",
+ "file_detail_meta.camera_lens" => "Camera Lens",
+ "file_detail_meta.color_space" => "Color Space",
+ "file_detail_meta.dimension" => "Dimensions",
+ "file_detail_meta.exposure" => "Exposure Time",
+ "file_detail_meta.focal" => "Focal Length",
+ "file_detail_meta.iso" => "ISO",
+ "file_detail_meta.latitude" => "Latitude",
+ "file_detail_meta.longitude" => "Longitude",
+ "file_detail_meta.make" => "Camera",
+ "file_detail_meta.meta_data" => "Metadata",
+ "file_detail_meta.model" => "Model",
+ "file_detail_meta.resolution" => "Resolution",
+ "file_detail_meta.time_data" => "Content Created",
+ "folder.empty" => "Empty",
+ "folder.item_counts" => "{count} Item | {count} Items",
+ "global.active" => "Active",
+ "global.admin" => "Admin",
+ "global.cancel" => "Cancel",
+ "global.canceled" => "Canceled",
+ "global.confirm_action" => "Yes, I'm sure",
+ "global.default" => "Default",
+ "global.free" => "Free",
+ "global.get_it" => "Get It",
+ "global.incomplete" => "Incomplete",
+ "global.menu" => "Menu",
+ "global.or" => "or",
+ "global.total" => "Total",
+ "input_image.supported" => "Supported formats are .png, .jpg, .jpeg.",
+ "input_image.title" => "Upload Image",
+ "inputs.placeholder_search_files" => "Search files or folders...",
+ "item_thumbnail.deleted_at" => "Deleted {time}",
+ "item_thumbnail.original_location" => "Original Location",
+ "locations.home" => "Files",
+ "locations.logout" => "Log Out",
+ "locations.profile" => "Profile",
+ "locations.settings" => "Settings",
+ "locations.shared" => "Shared",
+ "locations.trash" => "Trash",
+ "menu.admin" => "Administration",
+ "menu.files" => "Files",
+ "menu.latest" => "Recent Uploads",
+ "menu.logout" => "Log Out",
+ "menu.password" => "Password",
+ "menu.profile" => "Profile Settings",
+ "menu.settings" => "Settings",
+ "menu.shared" => "Shared Files",
+ "menu.storage" => "Storage",
+ "menu.trash" => "Trash",
+ "messages.nothing_from_participants" => "You don't have any uploads from other users.",
+ "messages.nothing_to_preview" => "There is nothing to preview.",
+ "messages.nothing_was_found" => "Nothing was found.",
+ "mobile_selecting.deselect_all" => "Deselect All",
+ "mobile_selecting.done" => "Done",
+ "mobile_selecting.select_all" => "Select All",
+ "page_contact_us.description" => "Do you have any questions? Get in touch with us.",
+ "page_contact_us.error_message" => "Something went wrong, please try it again.",
+ "page_contact_us.form.email" => "Email",
+ "page_contact_us.form.email_plac" => "Type your email",
+ "page_contact_us.form.message" => "Message",
+ "page_contact_us.form.message_plac" => "Type your message here...",
+ "page_contact_us.form.submit_button" => "Send Message",
+ "page_contact_us.success_message" => "Your message was send successfully.",
+ "page_contact_us.title" => "Contact Us",
+ "page_create_password.button_update" => "Update Password",
+ "page_create_password.label_confirm_pass" => "Confirm password",
+ "page_create_password.label_email" => "Email",
+ "page_create_password.label_new_pass" => "New password",
+ "page_create_password.subtitle" => "Create your new password here",
+ "page_create_password.title" => "Only One Step to Log In",
+ "page_forgotten_password.button_get_link" => "Get Link",
+ "page_forgotten_password.pass_reseted_signin" => "Sign In",
+ "page_forgotten_password.pass_reseted_subtitle" => "Your password was reset successfully.",
+ "page_forgotten_password.pass_reseted_title" => "Awesome!",
+ "page_forgotten_password.pass_sennded_subtitle" => "We have e-mailed your password reset link!",
+ "page_forgotten_password.pass_sennded_title" => "Thank you!",
+ "page_forgotten_password.password_remember_button" => "Log In.",
+ "page_forgotten_password.password_remember_text" => "Remember your password?",
+ "page_forgotten_password.subtitle" => "Get reset link with your email",
+ "page_forgotten_password.title" => "Forgotten Password?",
+ "page_index.get_started_button" => "Sign Up Now",
+ "page_index.menu.contact_us" => "Contact Us",
+ "page_index.menu.log_in" => "Log In",
+ "page_index.menu.pricing" => "Pricing",
+ "page_index.menu.sign_in" => "Sign Up",
+ "page_index.sign_feature_1" => "No credit card required",
+ "page_index.sign_feature_2" => "{defaultSpace} Free storage space",
+ "page_index.sign_up_button" => "Sign Up Now",
+ "page_login.button_next" => "Next Step",
+ "page_login.placeholder_email" => "Type your E-mail",
+ "page_login.registration_button" => "Register account.",
+ "page_login.registration_text" => "Don’t have an account?",
+ "page_login.subtitle" => "Please type your email to log in",
+ "page_login.title" => "Welcome Back!",
+ "page_registration.agreement" => "By clicking on 'Create Account' button I agree to the {0} and {1}.",
+ "page_registration.button_create_account" => "Create Account",
+ "page_registration.have_an_account" => "Do you have an account?",
+ "page_registration.label_confirm_pass" => "Confirm password",
+ "page_registration.label_email" => "Email",
+ "page_registration.label_name" => "Full Name",
+ "page_registration.label_pass" => "Create password",
+ "page_registration.placeholder_confirm_pass" => "Confirm your new password",
+ "page_registration.placeholder_email" => "Type your E-mail",
+ "page_registration.placeholder_name" => "Type your full name",
+ "page_registration.placeholder_pass" => "New password",
+ "page_registration.subtitle" => "Please fill registration to create account",
+ "page_registration.title" => "Create New Account",
+ "page_shared.download_file" => "Download File",
+ "page_shared.placeholder_pass" => "Type password",
+ "page_shared.submit" => "Submit",
+ "page_shared.subtitle" => "Please type the password to get shared content",
+ "page_shared.title" => "Your Share Link is Protected",
+ "page_shared_404.subtitle" => "The content you are finding was probably deleted.",
+ "page_shared_404.title" => "Not Found :(",
+ "page_sign_in.button_log_in" => "Log In",
+ "page_sign_in.password_reset_button" => "Reset Password.",
+ "page_sign_in.password_reset_text" => "Forgotten your password?",
+ "page_sign_in.placeholder_password" => "Type your password",
+ "page_sign_in.subtitle" => "Confirm you by your password",
+ "page_sign_in.title" => "Are You {name}?",
+ "popup_create_folder.folder_default_name" => "New Folder",
+ "popup_create_folder.label" => "Type Name",
+ "popup_create_folder.placeholder" => "Type your name",
+ "popup_create_folder.title" => "Create Folder",
+ "popup_deleted_user.message" => "Your user was deleted with all user data content.",
+ "popup_deleted_user.title" => "User was deleted",
+ "popup_deleted_user_aborted.message" => "You can't delete this account while user have active subscription.",
+ "popup_deleted_user_aborted.title" => "User wasn't deleted",
+ "popup_error.message" => "Something went wrong and we can't continue. Please contact us.",
+ "popup_error.title" => "Whooops, something went wrong!",
+ "popup_exceed_limit.message" => "Please contact your administrator to change your limit.",
+ "popup_exceed_limit.title" => "Whooops, you exceed storage limit :(",
+ "popup_mimetypes_blacklist.message" => "File of this type ({mimetype}) is not allowed to upload.",
+ "popup_mimetypes_blacklist.title" => "You are trying to upload unsupported file type",
+ "popup_move_item.cancel" => "Cancel",
+ "popup_move_item.submit" => "Move Item",
+ "popup_move_item.title" => "Move Item",
+ "popup_pass_changed.message" => "So now, you have awesome new password.",
+ "popup_pass_changed.title" => "Your password was changed!",
+ "popup_paylod_error.message" => "Sorry, your file is too large and can't be uploaded",
+ "popup_paylod_error.title" => "File is too large",
+ "popup_rename.select_emoji_label" => "Pick Your Emoji Icon",
+ "popup_rename.color_pick_label" => "Pick Your Color",
+ "popup_rename.emoji_list_not_found" => "Not Found",
+ "popup_rename.label" => "Edit Name",
+ "popup_rename.placeholder" => "Type your title",
+ "popup_rename.search_emoji_input_placeholder" => "Search your emoji...",
+ "popup_rename.set_emoji_input_placeholder" => "Emojis List...",
+ "popup_rename.tab_color_title" => "Folder Color",
+ "popup_rename.tab_emoji_title" => "Emoji as an Icon",
+ "popup_rename.title" => "Rename Your {item}",
+ "popup_share_create.title" => "Share Your {item}",
+ "popup_share_edit.change_pass" => "Change Password",
+ "popup_share_edit.confirm" => "Confirm",
+ "popup_share_edit.go_back" => "Go Back",
+ "popup_share_edit.save" => "Save Changes",
+ "popup_share_edit.send_to_recipients" => "Send to Recipients",
+ "popup_share_edit.stop" => "Cancel Sharing",
+ "popup_share_edit.title" => "Update sharing options",
+ "popup_signup_error.message" => "Please check your database connection if everything works correctly.",
+ "popup_signup_error.title" => "Server Error",
+ "popup_upload_limit.message" => "Size of your uploaded file exceed the upload limit ({uploadLimit}).",
+ "popup_upload_limit.title" => "You exceed upload limit on single file",
+ "popup_zipping.message" => "Please wait until your files start downloading.",
+ "popup_zipping.title" => "Zipping Your Files...",
+ "preview_sorting.grid_view" => "Grid View",
+ "preview_sorting.list_view" => "List View",
+ "preview_sorting.preview_sorting_button" => "View",
+ "preview_sorting.sort_alphabet" => "Sort By Aplhabet",
+ "preview_sorting.sort_date" => "Sort By Date",
+ "profile.change_pass" => "Change Password",
+ "profile.profile_info" => "Profile Information",
+ "profile.store_pass" => "Store New Password",
+ "pronouns.of" => "of",
+ "roles.admin" => "Admin",
+ "roles.user" => "User",
+ "routes.create_new_password" => "create-new-password",
+ "routes_title.appearance" => "Appearance",
+ "routes_title.dashboard" => "Dashboard",
+ "routes_title.email" => "Email",
+ "routes_title.languages" => "Languages",
+ "routes_title.others" => "Others",
+ "routes_title.page_edit" => "Edit Page",
+ "routes_title.pages" => "Pages",
+ "routes_title.profile" => "My Profile",
+ "routes_title.profile_settings" => "Profile Settings",
+ "routes_title.settings" => "Settings",
+ "routes_title.settings_mobile" => "Settings",
+ "routes_title.settings_password" => "Change Password",
+ "routes_title.settings_storage" => "Storage",
+ "routes_title.user_create" => "Create User",
+ "routes_title.users_delete" => "Delete User",
+ "routes_title.users_detail" => "Detail",
+ "routes_title.users_list" => "User Management",
+ "routes_title.users_password" => "Password",
+ "routes_title.users_storage_usage" => "Storage Usage",
+ "routes_title.users_user" => "User",
+ "shared.can_download" => "Can download file",
+ "shared.editor" => "Can edit and upload files",
+ "shared.empty_shared" => "You haven't shared anything yet.",
+ "shared.visitor" => "Can only view and download",
+ "shared_form.button_close_options" => "Close Options",
+ "shared_form.button_done" => "Awesome, I’m done!",
+ "shared_form.button_folder_icon_open" => "Customize Folder Icon",
+ "shared_form.button_generate" => "Generate Link",
+ "shared_form.button_more_options" => "Set Expiration",
+ "shared_form.email_placeholder" => "Type your emails",
+ "shared_form.email_successfully_send_message" => "Your item was successfully sended to recipients emails.",
+ "shared_form.expiration_day" => "{value}d.",
+ "shared_form.expiration_hour" => "{value}h.",
+ "shared_form.label_expiration" => "Link Expiration",
+ "shared_form.label_password_protection" => "Password Protected",
+ "shared_form.label_permission" => "Permission",
+ "shared_form.label_send_to_recipients" => "Send to Recipients",
+ "shared_form.label_share_vie_email" => "Get your link",
+ "shared_form.label_shared_url" => "Share url",
+ "shared_form.placeholder_permission" => "Select your permission",
+ "shared_form.recipients_label" => "Recipients",
+ "shared_form.share_by_email" => "Share by Email",
+ "shared_form.share_by_link" => "Share by Link",
+ "sidebar.favourites" => "Favourites",
+ "sidebar.favourites_empty" => "Drag here your favourite folder.",
+ "sidebar.folders_empty" => "Create some new folder.",
+ "sidebar.home" => "Files",
+ "sidebar.latest" => "Recent Uploads",
+ "sidebar.locations_title" => "Base",
+ "sidebar.my_shared" => "My Shared Items",
+ "sidebar.navigator_title" => "Navigator",
+ "sidebar.participant_uploads" => "Participant Uploads",
+ "sidebar.tools_title" => "Tools",
+ "storage.audios" => "Audios",
+ "storage.documents" => "Documents",
+ "storage.images" => "Images",
+ "storage.others" => "Others",
+ "storage.sec_capacity" => "Your disk Usage",
+ "storage.sec_details" => "Capacity Usage Details",
+ "storage.total_capacity" => "Your storage capacity is {capacity}",
+ "storage.total_used" => "Total used {used}",
+ "storage.videos" => "Videos",
+ "toaster.changed_capacity" => "You successfully changed user's storage size!",
+ "toaster.changed_user" => "You successfully changed user's role!",
+ "toaster.created_user" => "User was created successfully!",
+ "toaster.email_set" => "Your email settings was updated successfully",
+ "toaster.sended_password" => "You successfully send user email for reset password!",
+ "types.file" => "File",
+ "types.folder" => "Folder",
+ "upgrade_banner.button" => "Upgrade",
+ "upgrade_banner.description" => "You nearly reach your storage capacity.",
+ "upgrade_banner.title" => "You reach your storage capacity. Please upgrade.",
+ "uploading.cancel" => "Cancel Uploading",
+ "uploading.processing_file" => "Processing File...",
+ "uploading.progress" => "Uploading File {progress}% - {current}/{total}",
+ "uploading.progress_single_upload" => "Uploading File {progress}%",
+ "user_add_card.default_description" => "Your card will be charged for billing plans as first.",
+ "user_add_card.default_title" => "Set as Default Payment Method",
+ "user_box_delete.description" => "You can delete your user, but, pay attention! This event is irreversible and all user data include user files will be deleted.",
+ "user_box_delete.title" => "Delete User",
+ "user_box_password.description" => "You can send password reset email via button bellow. User will be redirected to page where he can update password for his account.",
+ "user_box_password.title" => "Change User Password",
+ "user_box_role.description" => "You can change role for current user. Admin role can edit or create new users, change storage capacity and any other application settings.",
+ "user_box_role.title" => "Change User Role",
+ "user_box_storage.description" => "Change user storage capacity by input bellow. You have to type only number e.g. value '5' means, user will have 5GB of storage capacity.",
+ "user_box_storage.title" => "Change User Storage Capacity",
+ "user_password.title" => "Change Your Password",
+ "user_settings.address" => "Address",
+ "user_settings.address_plac" => "Type your billing address",
+ "user_settings.city" => "City",
+ "user_settings.city_plac" => "Type your billing city",
+ "user_settings.country" => "Country",
+ "user_settings.country_plac" => "Select your billing country",
+ "user_settings.name" => "Name",
+ "user_settings.name_plac" => "Type your billing name",
+ "user_settings.phone_number" => "Phone Number",
+ "user_settings.phone_number_plac" => "Type your billing phone number",
+ "user_settings.postal_code" => "Postal Code",
+ "user_settings.postal_code_plac" => "Type your billing postal code",
+ "user_settings.state" => "State",
+ "user_settings.state_plac" => "Type your billing state",
+ "user_settings.timezone" => "Timezone",
+ "user_settings.timezone_plac" => "Select your timezone",
+ "user_settings.title_account" => "Account Information",
+ "user_settings.title_billing" => "Billing Information",
+ "validation_errors.incorrect_password" => "Sorry, you passed incorrect password :(",
+ "validation_errors.wrong_image" => "You may have uploaded the wrong file, try again!",
+ 'app_description' => 'Your self-hosted storage cloud software powered by Laravel and Vue',
+ 'user_not_fount' => 'We can\'t find a user with that e-mail address.',
+ 'incorrect_password' => 'Sorry, your password is incorrect.',
+ 'time' => '%d. %B. %Y at %H:%M',
+ 'home' => 'Home',
+ 'shared_link_email_subject' => '🙋 :user share some files with you. Look at it!',
+ 'shared_link_email_greeting' => 'Hello!',
+ 'shared_link_email_user' => ':user (:email) send you a link to shared files.',
+ 'shared_link_email_link' => 'Open your files',
+ 'shared_link_email_salutation' => 'Regards, :app_name',
+ 'reset_password_greeting' => 'Hello!',
+ 'reset_password_subject' => 'Reset password for your account on ',
+ 'reset_password_line_1' => 'You are receiving this email because we received a password reset request for your account.',
+ 'reset_password_line_2' => 'If you did not request a password reset, no further action is required.',
+ 'reset_password_action' => 'Reset Password',
+ 'salutation' => 'Regards',
+ 'user_sending' => ':name is sending you this file',
+ 'protected_file' => 'This link is protected by password',
+ 'routes_title.language' => 'Languages',
+ 'languages' => 'Languages',
+ 'add_language' => 'Add Language',
+ 'create_language' => 'Create Language',
+ 'edit_translations' => 'Edit Translations',
+ 'language_name' => 'Language Name',
+ 'set_as_default_language' => 'Set as Default Language',
+ 'language_settings' => 'Language Settings',
+ 'search_translations' => 'Search Language Translations...',
+ 'select_locale' => 'Select Locale',
+ 'locale_name' => 'Language Name',
+ 'select_language_locale' => 'Select Language Locale',
+ 'type_language_name' => 'Type Language Name',
+ 'go_to_files' => 'Go to Files',
+ 'color_theme' => 'Color Theme',
+ 'color_theme_description' => 'Your color change will be visible after app refresh.',
+ 'og_image' => 'OG Image',
+ 'og_image_description' => 'Image that appear when someone shares the content to Facebook or any other social medium. Preferred size is 1200x627',
+ 'app_touch_icon' => 'App Touch Icon',
+ 'app_touch_icon_description' => 'If user store bookmark on his phone screen, this icon appear in app thumbnail. Preferred size is 156x156',
+ ]
+];
\ No newline at end of file
diff --git a/config/laravel-query-monitor.php b/config/laravel-query-monitor.php
new file mode 100644
index 00000000..d3597eb7
--- /dev/null
+++ b/config/laravel-query-monitor.php
@@ -0,0 +1,7 @@
+ env('LARAVEL_QUERY_MONITOR', true),
+ 'host' => env('LARAVEL_QUERY_MONITOR_HOST', '0.0.0.0'),
+ 'port' => env('LARAVEL_QUERY_MONITOR_PORT', 8081),
+];
diff --git a/config/vuefilemanager.php b/config/vuefilemanager.php
index 581202ea..3139497d 100644
--- a/config/vuefilemanager.php
+++ b/config/vuefilemanager.php
@@ -2,8 +2,11 @@
return [
- 'version' => '1.8.2.3',
+ 'version' => '2.0',
- // Define size of chunk uploaded by MB. E.g. integer 128 means chunk size will be 128MB.
+ 'is_demo' => env('APP_DEMO', false),
+
+ // Define size of chunk uploaded by MB.
+ // E.g. integer 128 means chunk size will be 128MB.
'chunk_size' => env('CHUNK_SIZE', '128'),
];
diff --git a/database/factories/FileFactory.php b/database/factories/FileFactory.php
index 1adeb39d..503d8652 100644
--- a/database/factories/FileFactory.php
+++ b/database/factories/FileFactory.php
@@ -1,20 +1,43 @@
define(FileManagerFile::class, function (Faker $faker) {
- return [
- 'unique_id' => $faker->randomDigit,
- 'user_id' => 0,
- 'folder_id' => 0,
- 'name' => $faker->firstName,
- 'basename' => $faker->lastName,
- 'user_scope' => 'master',
- 'updated_at' => Carbon::now(),
- 'created_at' => Carbon::now()
- ];
-});
+class FileFactory extends Factory
+{
+ /**
+ * The name of the factory's corresponding model.
+ *
+ * @var string
+ */
+ protected $model = File::class;
+
+ /**
+ * Define the model's default state.
+ *
+ * @return array
+ */
+ public function definition()
+ {
+ return [
+ 'id' => $this->faker->uuid,
+ 'user_id' => $this->faker->uuid,
+ 'name' => $this->faker->word,
+ 'basename' => Str::slug($this->faker->name),
+ 'mimetype' => $this->faker->mimeType,
+ 'filesize' => $this->faker->numberBetween(10000, 99999),
+ 'type' => $this->faker->randomElement(
+ ['image', 'file', 'video', 'audio']
+ ),
+ 'author' => $this->faker->randomElement(
+ ['user', 'member', 'visitor']
+ ),
+ 'created_at' => $this->faker->dateTimeBetween(
+ $startDate = '-36 months', $endDate = 'now', $timezone = null
+ ),
+ ];
+ }
+}
diff --git a/database/factories/FolderFactory.php b/database/factories/FolderFactory.php
index cca6abbc..e39be4d7 100644
--- a/database/factories/FolderFactory.php
+++ b/database/factories/FolderFactory.php
@@ -1,17 +1,36 @@
define(FileManagerFolder::class, function (Faker $faker) {
- return [
- 'id' => $faker->randomDigit,
- 'unique_id' => $faker->randomDigit,
- 'user_id' => 1,
- 'parent_id' => 0,
- 'name' => $faker->sentence,
- 'type' => 'folder',
- ];
-});
+class FolderFactory extends Factory
+{
+ /**
+ * The name of the factory's corresponding model.
+ *
+ * @var string
+ */
+ protected $model = Folder::class;
+
+ /**
+ * Define the model's default state.
+ *
+ * @return array
+ */
+ public function definition()
+ {
+ return [
+ 'id' => $this->faker->uuid,
+ 'user_id' => $this->faker->uuid,
+ 'name' => $this->faker->word,
+ 'author' => $this->faker->randomElement(
+ ['user', 'member', 'visitor']
+ ),
+ 'created_at' => $this->faker->dateTimeBetween(
+ $startDate = '-36 months', $endDate = 'now', $timezone = null
+ ),
+ ];
+ }
+}
diff --git a/database/factories/SettingFactory.php b/database/factories/SettingFactory.php
deleted file mode 100644
index c18aeead..00000000
--- a/database/factories/SettingFactory.php
+++ /dev/null
@@ -1,12 +0,0 @@
-define(Setting::class, function (Faker $faker) {
- return [
- //
- ];
-});
diff --git a/database/factories/ShareFactory.php b/database/factories/ShareFactory.php
new file mode 100644
index 00000000..5c0d9078
--- /dev/null
+++ b/database/factories/ShareFactory.php
@@ -0,0 +1,37 @@
+ $this->faker->uuid,
+ 'user_id' => $this->faker->uuid,
+ 'item_id' => $this->faker->uuid,
+ 'token' => Str::random(16),
+ 'type' => $this->faker->randomElement(['file', 'folder']),
+ 'permission' => $this->faker->randomElement(['visitor', 'editor']),
+ 'is_protected' => $this->faker->boolean(20),
+ 'password' => bcrypt('secret'),
+ 'expire_in' => $this->faker->randomElement([1, 6, 12, 24]),
+ ];
+ }
+}
diff --git a/database/factories/UserFactory.php b/database/factories/UserFactory.php
index 741edead..174da426 100644
--- a/database/factories/UserFactory.php
+++ b/database/factories/UserFactory.php
@@ -1,28 +1,66 @@
define(User::class, function (Faker $faker) {
- return [
- 'name' => $faker->name,
- 'email' => $faker->unique()->safeEmail,
- 'email_verified_at' => now(),
- 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
- 'remember_token' => Str::random(10),
- ];
-});
+ /**
+ * Define the model's default state.
+ *
+ * @return array
+ */
+ public function definition()
+ {
+ return [
+ 'role' => $this->faker->randomElement(
+ ['user', 'admin']
+ ),
+ 'email' => $this->faker->unique()->safeEmail,
+ 'email_verified_at' => now(),
+ 'password' => bcrypt('secret'),
+ 'remember_token' => Str::random(10),
+ 'created_at' => $this->faker->dateTimeBetween(
+ $startDate = '-36 months', $endDate = 'now', $timezone = null
+ ),
+ ];
+ }
+
+ /**
+ * Configure the model factory.
+ *
+ * @return $this
+ */
+ public function configure()
+ {
+ return $this->afterCreating(function (User $user) {
+ $user
+ ->settings()
+ ->create([
+ 'storage_capacity' => $this->faker->randomNumber(1),
+ 'name' => $this->faker->name,
+ 'address' => $this->faker->address,
+ 'state' => $this->faker->state,
+ 'city' => $this->faker->city,
+ 'postal_code' => $this->faker->postcode,
+ 'country' => $this->faker->randomElement(
+ ['SK', 'CZ', 'DE', 'FR']
+ ),
+ 'phone_number' => $this->faker->phoneNumber,
+ 'timezone' => $this->faker->randomElement(
+ ['+1.0', '+2.0', '+3.0']
+ ),
+ ]);
+ });
+ }
+}
diff --git a/database/factories/ZipFactory.php b/database/factories/ZipFactory.php
new file mode 100644
index 00000000..03551230
--- /dev/null
+++ b/database/factories/ZipFactory.php
@@ -0,0 +1,32 @@
+ $this->faker->uuid,
+ 'user_id' => $this->faker->uuid,
+ 'shared_token' => Str::random(16),
+ 'basename' => $this->faker->word,
+ ];
+ }
+}
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 286eeb4d..fb4a281a 100644
--- a/database/migrations/2014_10_12_000000_create_users_table.php
+++ b/database/migrations/2014_10_12_000000_create_users_table.php
@@ -14,12 +14,11 @@ class CreateUsersTable extends Migration
public function up()
{
Schema::create('users', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->string('name');
- $table->string('email')->unique();
+ $table->uuid('id')->primary()->index();
+ $table->enum('role', ['admin', 'user'])->default('user');
+ $table->string('email')->unique()->index();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
- $table->string('avatar')->nullable();
$table->rememberToken();
$table->timestamps();
});
diff --git a/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php
new file mode 100644
index 00000000..f4500c98
--- /dev/null
+++ b/database/migrations/2014_10_12_200000_add_two_factor_columns_to_users_table.php
@@ -0,0 +1,38 @@
+text('two_factor_secret')
+ ->after('password')
+ ->nullable();
+
+ $table->text('two_factor_recovery_codes')
+ ->after('two_factor_secret')
+ ->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('users', function (Blueprint $table) {
+ $table->dropColumn('two_factor_secret', 'two_factor_recovery_codes');
+ });
+ }
+}
diff --git a/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php b/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php
deleted file mode 100644
index 6c47d247..00000000
--- a/database/migrations/2016_06_01_000001_create_oauth_auth_codes_table.php
+++ /dev/null
@@ -1,35 +0,0 @@
-string('id', 100)->primary();
- $table->unsignedBigInteger('user_id')->index();
- $table->unsignedBigInteger('client_id');
- $table->text('scopes')->nullable();
- $table->boolean('revoked');
- $table->dateTime('expires_at')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('oauth_auth_codes');
- }
-}
diff --git a/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php b/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php
deleted file mode 100644
index 00f00633..00000000
--- a/database/migrations/2016_06_01_000002_create_oauth_access_tokens_table.php
+++ /dev/null
@@ -1,37 +0,0 @@
-string('id', 100)->primary();
- $table->unsignedBigInteger('user_id')->nullable()->index();
- $table->unsignedBigInteger('client_id');
- $table->string('name')->nullable();
- $table->text('scopes')->nullable();
- $table->boolean('revoked');
- $table->timestamps();
- $table->dateTime('expires_at')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('oauth_access_tokens');
- }
-}
diff --git a/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php b/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php
deleted file mode 100644
index 858d0f6d..00000000
--- a/database/migrations/2016_06_01_000003_create_oauth_refresh_tokens_table.php
+++ /dev/null
@@ -1,33 +0,0 @@
-string('id', 100)->primary();
- $table->string('access_token_id', 100);
- $table->boolean('revoked');
- $table->dateTime('expires_at')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('oauth_refresh_tokens');
- }
-}
diff --git a/database/migrations/2016_06_01_000004_create_oauth_clients_table.php b/database/migrations/2016_06_01_000004_create_oauth_clients_table.php
deleted file mode 100644
index 1dc541a3..00000000
--- a/database/migrations/2016_06_01_000004_create_oauth_clients_table.php
+++ /dev/null
@@ -1,38 +0,0 @@
-bigIncrements('id');
- $table->unsignedBigInteger('user_id')->nullable()->index();
- $table->string('name');
- $table->string('secret', 100)->nullable();
- $table->text('redirect');
- $table->boolean('personal_access_client');
- $table->boolean('password_client');
- $table->boolean('revoked');
- $table->timestamps();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::dropIfExists('oauth_clients');
- }
-}
diff --git a/database/migrations/2019_05_03_000002_create_subscriptions_table.php b/database/migrations/2019_05_03_000002_create_subscriptions_table.php
index 92ac046a..7bc324d7 100644
--- a/database/migrations/2019_05_03_000002_create_subscriptions_table.php
+++ b/database/migrations/2019_05_03_000002_create_subscriptions_table.php
@@ -15,7 +15,7 @@ class CreateSubscriptionsTable extends Migration
{
Schema::create('subscriptions', function (Blueprint $table) {
$table->bigIncrements('id');
- $table->unsignedBigInteger('user_id');
+ $table->uuid('user_id');
$table->string('name');
$table->string('stripe_id');
$table->string('stripe_status');
diff --git a/database/migrations/2019_05_03_000003_create_subscription_items_table.php b/database/migrations/2019_05_03_000003_create_subscription_items_table.php
index 127eff6d..a9e82391 100644
--- a/database/migrations/2019_05_03_000003_create_subscription_items_table.php
+++ b/database/migrations/2019_05_03_000003_create_subscription_items_table.php
@@ -18,7 +18,7 @@ class CreateSubscriptionItemsTable extends Migration
$table->unsignedBigInteger('subscription_id');
$table->string('stripe_id')->index();
$table->string('stripe_plan');
- $table->integer('quantity');
+ $table->integer('quantity')->nullable();
$table->timestamps();
$table->unique(['subscription_id', 'stripe_plan']);
diff --git a/database/migrations/2019_08_15_171328_create_file_manager_folders.php b/database/migrations/2019_08_15_171328_create_file_manager_folders.php
index a3dbdc89..222a096c 100644
--- a/database/migrations/2019_08_15_171328_create_file_manager_folders.php
+++ b/database/migrations/2019_08_15_171328_create_file_manager_folders.php
@@ -13,14 +13,16 @@ class CreateFileManagerFolders extends Migration
*/
public function up()
{
- Schema::create('file_manager_folders', function (Blueprint $table) {
+ Schema::create('folders', function (Blueprint $table) {
+ $table->uuid('id')->primary()->index();
+ $table->uuid('user_id')->index();
+ $table->uuid('parent_id')->nullable();
+ $table->text('name');
+ $table->string('color')->nullable();
+ $table->longText('emoji')->nullable();
- $table->bigIncrements('id');
- $table->integer('unique_id');
- $table->integer('parent_id')->default(0);
-
- $table->text('name')->nullable();
- $table->text('type')->nullable();
+ $table->enum('author', ['user', 'member', 'visitor'])->default('user');
+ $table->uuid('author_id')->nullable();
$table->softDeletes();
$table->timestamps();
diff --git a/database/migrations/2019_08_15_171345_create_file_manager_files.php b/database/migrations/2019_08_15_171345_create_file_manager_files.php
index adfc7983..5ccaad72 100644
--- a/database/migrations/2019_08_15_171345_create_file_manager_files.php
+++ b/database/migrations/2019_08_15_171345_create_file_manager_files.php
@@ -13,20 +13,23 @@ class CreateFileManagerFiles extends Migration
*/
public function up()
{
- Schema::create('file_manager_files', function (Blueprint $table) {
-
- $table->bigIncrements('id');
- $table->integer('unique_id');
- $table->integer('folder_id')->default(0);
+ Schema::create('files', function (Blueprint $table) {
+ $table->uuid('id')->primary()->index();
+ $table->uuid('user_id')->index();
+ $table->uuid('folder_id')->nullable();
$table->text('thumbnail')->nullable();
- $table->text('name')->nullable();
- $table->text('basename')->nullable();
+ $table->text('name');
+ $table->string('basename')->index();
$table->text('mimetype')->nullable();
- $table->text('filesize')->nullable();
+ $table->text('filesize');
$table->text('type')->nullable();
+ $table->longText('metadata')->nullable();
+
+ $table->enum('author', ['user', 'member', 'visitor'])->default('user');
+ $table->uuid('author_id')->nullable();
$table->softDeletes();
$table->timestamps();
diff --git a/database/migrations/2020_03_03_065147_add_user_id_to_file_manager_files_table.php b/database/migrations/2020_03_03_065147_add_user_id_to_file_manager_files_table.php
deleted file mode 100644
index afce30e7..00000000
--- a/database/migrations/2020_03_03_065147_add_user_id_to_file_manager_files_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-bigInteger('user_id')->after('id')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('file_manager_files', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2020_03_03_065155_add_user_id_to_file_manager_folders_table.php b/database/migrations/2020_03_03_065155_add_user_id_to_file_manager_folders_table.php
deleted file mode 100644
index 022113c2..00000000
--- a/database/migrations/2020_03_03_065155_add_user_id_to_file_manager_folders_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-bigInteger('user_id')->after('id')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('file_manager_folders', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2020_03_03_070319_create_favourites_folders_table.php b/database/migrations/2020_03_03_070319_create_favourites_folders_table.php
index fe50e6c3..eb3f275b 100644
--- a/database/migrations/2020_03_03_070319_create_favourites_folders_table.php
+++ b/database/migrations/2020_03_03_070319_create_favourites_folders_table.php
@@ -14,8 +14,8 @@ class CreateFavouritesFoldersTable extends Migration
public function up()
{
Schema::create('favourite_folder', function (Blueprint $table) {
- $table->bigInteger('user_id');
- $table->bigInteger('folder_unique_id');
+ $table->uuid('user_id');
+ $table->uuid('folder_id');
});
}
diff --git a/database/migrations/2020_04_20_071047_create_shares_table.php b/database/migrations/2020_04_20_071047_create_shares_table.php
index ba542743..adfdb65a 100644
--- a/database/migrations/2020_04_20_071047_create_shares_table.php
+++ b/database/migrations/2020_04_20_071047_create_shares_table.php
@@ -14,14 +14,15 @@ class CreateSharesTable extends Migration
public function up()
{
Schema::create('shares', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->bigInteger('user_id');
- $table->string('token', 16)->unique();
- $table->bigInteger('item_id');
- $table->enum('type', ['file', 'files', 'folder']);
+ $table->uuid('id')->primary();
+ $table->uuid('user_id');
+ $table->uuid('item_id');
+ $table->string('token', 16)->unique()->index();
+ $table->enum('type', ['file', 'folder']);
$table->enum('permission', ['visitor', 'editor'])->nullable();
- $table->boolean('protected');
+ $table->boolean('is_protected')->default(0);
$table->string('password')->nullable();
+ $table->integer('expire_in')->nullable();
$table->timestamps();
});
}
diff --git a/database/migrations/2020_04_24_055817_add_user_scope_to_file_manager_files_table.php b/database/migrations/2020_04_24_055817_add_user_scope_to_file_manager_files_table.php
deleted file mode 100644
index ae0b3772..00000000
--- a/database/migrations/2020_04_24_055817_add_user_scope_to_file_manager_files_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-string('user_scope')->after('type')->default('master');
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('file_manager_files', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2020_04_24_080943_add_user_scope_to_file_manager_folders_table.php b/database/migrations/2020_04_24_080943_add_user_scope_to_file_manager_folders_table.php
deleted file mode 100644
index 99eb3230..00000000
--- a/database/migrations/2020_04_24_080943_add_user_scope_to_file_manager_folders_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-string('user_scope')->after('type')->default('master');
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('file_manager_folders', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2020_05_26_092649_create_user_settings_table.php b/database/migrations/2020_05_26_092649_create_user_settings_table.php
index 0cdbadf0..18fbfacf 100644
--- a/database/migrations/2020_05_26_092649_create_user_settings_table.php
+++ b/database/migrations/2020_05_26_092649_create_user_settings_table.php
@@ -14,9 +14,17 @@ class CreateUserSettingsTable extends Migration
public function up()
{
Schema::create('user_settings', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->integer('user_id');
+ $table->uuid('user_id')->index();
$table->integer('storage_capacity')->default(5);
+ $table->string('avatar')->nullable();
+ $table->text('name')->nullable();
+ $table->text('address')->nullable();
+ $table->text('state')->nullable();
+ $table->text('city')->nullable();
+ $table->text('postal_code')->nullable();
+ $table->text('country')->nullable();
+ $table->text('phone_number')->nullable();
+ $table->decimal('timezone', 10, 1)->nullable();
});
}
diff --git a/database/migrations/2020_06_02_073651_add_attributes_to_user_settings_table.php b/database/migrations/2020_06_02_073651_add_attributes_to_user_settings_table.php
deleted file mode 100644
index 5e4fd8b8..00000000
--- a/database/migrations/2020_06_02_073651_add_attributes_to_user_settings_table.php
+++ /dev/null
@@ -1,44 +0,0 @@
-text('billing_name')->nullable();
- $table->text('billing_address')->nullable();
- $table->text('billing_state')->nullable();
- $table->text('billing_city')->nullable();
- $table->text('billing_postal_code')->nullable();
- $table->text('billing_country')->nullable();
- $table->text('billing_phone_number')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('user_settings', function (Blueprint $table) {
- $table->dropColumn('billing_name');
- $table->dropColumn('billing_address');
- $table->dropColumn('billing_state');
- $table->dropColumn('billing_city');
- $table->dropColumn('billing_postal_code');
- $table->dropColumn('billing_country');
- $table->dropColumn('billing_phone_number');
- });
- }
-}
diff --git a/database/migrations/2020_06_25_142635_create_settings_table.php b/database/migrations/2020_06_25_142635_create_settings_table.php
index e9b8d2a1..73b57e7e 100644
--- a/database/migrations/2020_06_25_142635_create_settings_table.php
+++ b/database/migrations/2020_06_25_142635_create_settings_table.php
@@ -14,8 +14,7 @@ class CreateSettingsTable extends Migration
public function up()
{
Schema::create('settings', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->string('name')->unique();
+ $table->string('name')->unique()->primary()->index();
$table->longText('value')->nullable();
});
}
diff --git a/database/migrations/2020_07_08_080255_create_pages_table.php b/database/migrations/2020_07_08_080255_create_pages_table.php
index dbd3af42..1abf6484 100644
--- a/database/migrations/2020_07_08_080255_create_pages_table.php
+++ b/database/migrations/2020_07_08_080255_create_pages_table.php
@@ -14,10 +14,9 @@ class CreatePagesTable extends Migration
public function up()
{
Schema::create('pages', function (Blueprint $table) {
- $table->id();
- $table->boolean('visibility');
+ $table->string('slug')->index();
$table->string('title');
- $table->string('slug');
+ $table->boolean('visibility');
$table->longText('content');
});
}
diff --git a/database/migrations/2020_08_25_143449_add_expiration_at_attribute_to_shares_table.php b/database/migrations/2020_08_25_143449_add_expiration_at_attribute_to_shares_table.php
deleted file mode 100644
index a018f5de..00000000
--- a/database/migrations/2020_08_25_143449_add_expiration_at_attribute_to_shares_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-integer('expire_in')->after('password')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('shares', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2020_09_04_085714_add_exif_data_to_file_manager_files_table.php b/database/migrations/2020_09_04_085714_add_exif_data_to_file_manager_files_table.php
deleted file mode 100644
index 41f2e956..00000000
--- a/database/migrations/2020_09_04_085714_add_exif_data_to_file_manager_files_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-longText('metadata')->after('type')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('file_manager_files', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2020_11_22_101014_create_traffic_table.php b/database/migrations/2020_11_22_101014_create_traffic_table.php
index 9055d476..1b4ccf30 100644
--- a/database/migrations/2020_11_22_101014_create_traffic_table.php
+++ b/database/migrations/2020_11_22_101014_create_traffic_table.php
@@ -14,8 +14,8 @@ class CreateTrafficTable extends Migration
public function up()
{
Schema::create('traffic', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->bigInteger('user_id');
+ $table->uuid('id');
+ $table->uuid('user_id')->index();
$table->bigInteger('upload')->default(0);
$table->bigInteger('download')->default(0);
$table->timestamps();
diff --git a/database/migrations/2020_12_13_155309_create_zips_table.php b/database/migrations/2020_12_13_155309_create_zips_table.php
index 4e81c78e..ad8ac380 100644
--- a/database/migrations/2020_12_13_155309_create_zips_table.php
+++ b/database/migrations/2020_12_13_155309_create_zips_table.php
@@ -14,9 +14,9 @@ class CreateZipsTable extends Migration
public function up()
{
Schema::create('zips', function (Blueprint $table) {
- $table->uuid('id')->primary();
- $table->bigInteger('user_id');
- $table->string('shared_token')->nullable();
+ $table->uuid('id')->primary()->index();
+ $table->uuid('user_id')->index();
+ $table->string('shared_token')->nullable()->index();
$table->text('basename');
$table->timestamps();
});
diff --git a/database/migrations/2021_01_03_164426_add_timezone_to_user_settings_table.php b/database/migrations/2021_01_03_164426_add_timezone_to_user_settings_table.php
deleted file mode 100644
index b9782a54..00000000
--- a/database/migrations/2021_01_03_164426_add_timezone_to_user_settings_table.php
+++ /dev/null
@@ -1,32 +0,0 @@
-decimal('timezone', 10, 1)->after('billing_phone_number')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('user_settings', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php b/database/migrations/2021_01_09_130434_create_languages_table.php
similarity index 57%
rename from database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php
rename to database/migrations/2021_01_09_130434_create_languages_table.php
index 4b56435c..9323af05 100644
--- a/database/migrations/2016_06_01_000005_create_oauth_personal_access_clients_table.php
+++ b/database/migrations/2021_01_09_130434_create_languages_table.php
@@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
-class CreateOauthPersonalAccessClientsTable extends Migration
+class CreateLanguagesTable extends Migration
{
/**
* Run the migrations.
@@ -13,9 +13,10 @@ class CreateOauthPersonalAccessClientsTable extends Migration
*/
public function up()
{
- Schema::create('oauth_personal_access_clients', function (Blueprint $table) {
- $table->bigIncrements('id');
- $table->unsignedBigInteger('client_id');
+ Schema::create('languages', function (Blueprint $table) {
+ $table->uuid('id')->primary()->index();
+ $table->string('name');
+ $table->string('locale')->unique();
$table->timestamps();
});
}
@@ -27,6 +28,6 @@ class CreateOauthPersonalAccessClientsTable extends Migration
*/
public function down()
{
- Schema::dropIfExists('oauth_personal_access_clients');
+ Schema::dropIfExists('languages');
}
}
diff --git a/database/migrations/2020_05_26_062714_add_role_to_users_table.php b/database/migrations/2021_01_09_152048_create_language_strings.php
similarity index 56%
rename from database/migrations/2020_05_26_062714_add_role_to_users_table.php
rename to database/migrations/2021_01_09_152048_create_language_strings.php
index cdc03d9f..dd20d2a1 100644
--- a/database/migrations/2020_05_26_062714_add_role_to_users_table.php
+++ b/database/migrations/2021_01_09_152048_create_language_strings.php
@@ -4,7 +4,7 @@ use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
-class AddRoleToUsersTable extends Migration
+class CreateLanguageStrings extends Migration
{
/**
* Run the migrations.
@@ -13,8 +13,10 @@ class AddRoleToUsersTable extends Migration
*/
public function up()
{
- Schema::table('users', function (Blueprint $table) {
- $table->enum('role', ['admin', 'user'])->default('user')->after('id');
+ Schema::create('language_translations', function (Blueprint $table) {
+ $table->string('key');
+ $table->longText('value');
+ $table->string('lang');
});
}
@@ -25,8 +27,6 @@ class AddRoleToUsersTable extends Migration
*/
public function down()
{
- Schema::table('users', function (Blueprint $table) {
- //
- });
+ Schema::dropIfExists('language_translations');
}
}
diff --git a/database/migrations/2021_01_13_162117_add_folder_icon_options_to_file_manager_folders_table.php b/database/migrations/2021_01_13_162117_add_folder_icon_options_to_file_manager_folders_table.php
deleted file mode 100644
index 89bee859..00000000
--- a/database/migrations/2021_01_13_162117_add_folder_icon_options_to_file_manager_folders_table.php
+++ /dev/null
@@ -1,33 +0,0 @@
-string('icon_color')->after('user_scope')->nullable();
- $table->string('icon_emoji')->after('icon_color')->nullable();
- });
- }
-
- /**
- * Reverse the migrations.
- *
- * @return void
- */
- public function down()
- {
- Schema::table('file_manager_folders', function (Blueprint $table) {
- //
- });
- }
-}
diff --git a/database/seeds/ContentSeeder.php b/database/seeds/ContentSeeder.php
deleted file mode 100644
index f0bbf660..00000000
--- a/database/seeds/ContentSeeder.php
+++ /dev/null
@@ -1,98 +0,0 @@
- 'section_features',
- 'value' => '1',
- ],
- [
- 'name' => 'section_feature_boxes',
- 'value' => '1',
- ],
- [
- 'name' => 'section_pricing_content',
- 'value' => '1',
- ],
- [
- 'name' => 'section_get_started',
- 'value' => '1',
- ],
- [
- 'name' => 'header_title',
- 'value' => 'Simple & Powerful Personal Cloud Storage',
- ],
- [
- 'name' => 'header_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'features_title',
- 'value' => 'The Fastest Growing File Manager on the CodeCanyon Market',
- ],
- [
- 'name' => 'features_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'feature_title_1',
- 'value' => 'Truly Freedom',
- ],
- [
- 'name' => 'feature_description_1',
- 'value' => 'You have full control over VueFileManager, no third authorities will control your service or usage, only you.',
- ],
- [
- 'name' => 'feature_title_2',
- 'value' => 'The Sky is the Limit',
- ],
- [
- 'name' => 'feature_description_2',
- 'value' => 'VueFileManager is cloud storage software. You have to install and running application on your own server hosting.',
- ],
- [
- 'name' => 'feature_title_3',
- 'value' => 'No Monthly Fees',
- ],
- [
- 'name' => 'feature_description_3',
- 'value' => 'When you running VueFileManager on your own server hosting, anybody can\'t control your content or resell your user data. Your data is safe.',
- ],
- [
- 'name' => 'pricing_title',
- 'value' => 'Pick the Best Plan For Your Needs',
- ],
- [
- 'name' => 'pricing_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'get_started_title',
- 'value' => 'Ready to Get Started With Us?',
- ],
- [
- 'name' => 'get_started_description',
- 'value' => 'Your private cloud storage software build on Laravel & Vue.js. No limits & no monthly fees. Truly freedom.',
- ],
- [
- 'name' => 'footer_content',
- 'value' => '© 2020 Simple & Powerful Personal Cloud Storage. Developed by Hi5Ve.Digital ',
- ],
- ]);
-
- $columns->each(function ($content) {
- Setting::updateOrCreate($content);
- });
- }
-}
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
index d8136870..b7bb377b 100644
--- a/database/seeds/DatabaseSeeder.php
+++ b/database/seeds/DatabaseSeeder.php
@@ -11,7 +11,6 @@ class DatabaseSeeder extends Seeder
*/
public function run()
{
- $this->call(PageSeeder::class);
- $this->call(ContentSeeder::class);
+ //
}
}
diff --git a/database/seeds/PageSeeder.php b/database/seeds/PageSeeder.php
deleted file mode 100644
index 3a043a1b..00000000
--- a/database/seeds/PageSeeder.php
+++ /dev/null
@@ -1,40 +0,0 @@
- 1,
- 'title' => 'Terms of Service',
- 'slug' => 'terms-of-service',
- 'content' => 'Laoreet cum hendrerit iaculis arcu phasellus congue et elementum, pharetra risus imperdiet aptent posuere rutrum parturient blandit, dapibus tellus ridiculus potenti aliquam sociis turpis. Nullam commodo eget laoreet risus cursus vel placerat, in dapibus sociis gravida faucibus sodales, fringilla potenti elit semper iaculis ullamcorper. Dignissim vulputate pretium montes pellentesque mollis, consectetur adipiscing curabitur semper sem rhoncus, litora viverra curae proin.',
- ],
- [
- 'visibility' => 1,
- 'title' => 'Privacy Policy',
- 'slug' => 'privacy-policy',
- 'content' => 'Sit orci justo augue maecenas laoreet consectetur natoque magnis in viverra sagittis, himenaeos urna facilisis mus proin primis diam accumsan tristique inceptos. Primis quisque posuere sit praesent lobortis feugiat semper convallis facilisis, vivamus gravida ligula nostra curae eu donec duis parturient senectus, arcu dolor viverra penatibus natoque cum nisi commodo. Litora sociis mauris justo nullam suspendisse mattis maecenas nascetur congue phasellus cras ultricies posuere donec, dapibus egestas diam lacus ornare montes senectus tincidunt eu taciti sed consequat.',
- ],
- [
- 'visibility' => 1,
- 'title' => 'Cookie Policy',
- 'slug' => 'cookie-policy',
- 'content' => 'Metus penatibus ligula dolor natoque non habitasse laoreet facilisis, libero vivamus eget semper vulputate interdum integer, phasellus lorem enim blandit consectetur nullam sollicitudin. Hendrerit interdum luctus ut in molestie himenaeos eros cum laoreet parturient est, eu lectus hac et netus viverra dictumst congue elit sem senectus litora, fames scelerisque adipiscing inceptos fringilla montes sociosqu suscipit auctor potenti. Elementum lacus vulputate viverra ac morbi ligula ipsum facilisi, sit eu imperdiet lacinia congue dis vitae.',
- ],
- ]);
-
- $columns->each(function ($page) {
- Page::updateOrCreate($page);
- });
- }
-}
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..1ab5110b
--- /dev/null
+++ b/index.html
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/public/assets/emojis.json b/public/assets/emojis.json
index 1d2a287e..8c4983e3 100644
--- a/public/assets/emojis.json
+++ b/public/assets/emojis.json
@@ -1,14023 +1,14022 @@
{
-"emojisList" :
- [
- {
- "codes": "1F600",
- "char": "😀",
- "name": "grinning face",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F603",
- "char": "😃",
- "name": "grinning face with big eyes",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F604",
- "char": "😄",
- "name": "grinning face with smiling eyes",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F601",
- "char": "😁",
- "name": "beaming face with smiling eyes",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F606",
- "char": "😆",
- "name": "grinning squinting face",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F605",
- "char": "😅",
- "name": "grinning face with sweat",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F923",
- "char": "🤣",
- "name": "rolling on the floor laughing",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F602",
- "char": "😂",
- "name": "face with tears of joy",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F642",
- "char": "🙂",
- "name": "slightly smiling face",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F643",
- "char": "🙃",
- "name": "upside-down face",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F609",
- "char": "😉",
- "name": "winking face",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F60A",
- "char": "😊",
- "name": "smiling face with smiling eyes",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F607",
- "char": "😇",
- "name": "smiling face with halo",
- "category": "Smileys & Emotion (face-smiling)",
- "group": "Smileys & Emotion",
- "subgroup": "face-smiling"
- },
- {
- "codes": "1F970",
- "char": "🥰",
- "name": "smiling face with hearts",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F60D",
- "char": "😍",
- "name": "smiling face with heart-eyes",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F929",
- "char": "🤩",
- "name": "star-struck",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F618",
- "char": "😘",
- "name": "face blowing a kiss",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F617",
- "char": "😗",
- "name": "kissing face",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "263A",
- "char": "☺️",
- "name": "smiling face",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F61A",
- "char": "😚",
- "name": "kissing face with closed eyes",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F619",
- "char": "😙",
- "name": "kissing face with smiling eyes",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F972",
- "char": "🥲",
- "name": "smiling face with tear",
- "category": "Smileys & Emotion (face-affection)",
- "group": "Smileys & Emotion",
- "subgroup": "face-affection"
- },
- {
- "codes": "1F60B",
- "char": "😋",
- "name": "face savoring food",
- "category": "Smileys & Emotion (face-tongue)",
- "group": "Smileys & Emotion",
- "subgroup": "face-tongue"
- },
- {
- "codes": "1F61B",
- "char": "😛",
- "name": "face with tongue",
- "category": "Smileys & Emotion (face-tongue)",
- "group": "Smileys & Emotion",
- "subgroup": "face-tongue"
- },
- {
- "codes": "1F61C",
- "char": "😜",
- "name": "winking face with tongue",
- "category": "Smileys & Emotion (face-tongue)",
- "group": "Smileys & Emotion",
- "subgroup": "face-tongue"
- },
- {
- "codes": "1F92A",
- "char": "🤪",
- "name": "zany face",
- "category": "Smileys & Emotion (face-tongue)",
- "group": "Smileys & Emotion",
- "subgroup": "face-tongue"
- },
- {
- "codes": "1F61D",
- "char": "😝",
- "name": "squinting face with tongue",
- "category": "Smileys & Emotion (face-tongue)",
- "group": "Smileys & Emotion",
- "subgroup": "face-tongue"
- },
- {
- "codes": "1F911",
- "char": "🤑",
- "name": "money-mouth face",
- "category": "Smileys & Emotion (face-tongue)",
- "group": "Smileys & Emotion",
- "subgroup": "face-tongue"
- },
- {
- "codes": "1F917",
- "char": "🤗",
- "name": "hugging face",
- "category": "Smileys & Emotion (face-hand)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hand"
- },
- {
- "codes": "1F92D",
- "char": "🤭",
- "name": "face with hand over mouth",
- "category": "Smileys & Emotion (face-hand)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hand"
- },
- {
- "codes": "1F92B",
- "char": "🤫",
- "name": "shushing face",
- "category": "Smileys & Emotion (face-hand)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hand"
- },
- {
- "codes": "1F914",
- "char": "🤔",
- "name": "thinking face",
- "category": "Smileys & Emotion (face-hand)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hand"
- },
- {
- "codes": "1F910",
- "char": "🤐",
- "name": "zipper-mouth face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F928",
- "char": "🤨",
- "name": "face with raised eyebrow",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F610",
- "char": "😐",
- "name": "neutral face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F611",
- "char": "😑",
- "name": "expressionless face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F636",
- "char": "😶",
- "name": "face without mouth",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F60F",
- "char": "😏",
- "name": "smirking face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F612",
- "char": "😒",
- "name": "unamused face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F644",
- "char": "🙄",
- "name": "face with rolling eyes",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F62C",
- "char": "😬",
- "name": "grimacing face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F925",
- "char": "🤥",
- "name": "lying face",
- "category": "Smileys & Emotion (face-neutral-skeptical)",
- "group": "Smileys & Emotion",
- "subgroup": "face-neutral-skeptical"
- },
- {
- "codes": "1F60C",
- "char": "😌",
- "name": "relieved face",
- "category": "Smileys & Emotion (face-sleepy)",
- "group": "Smileys & Emotion",
- "subgroup": "face-sleepy"
- },
- {
- "codes": "1F614",
- "char": "😔",
- "name": "pensive face",
- "category": "Smileys & Emotion (face-sleepy)",
- "group": "Smileys & Emotion",
- "subgroup": "face-sleepy"
- },
- {
- "codes": "1F62A",
- "char": "😪",
- "name": "sleepy face",
- "category": "Smileys & Emotion (face-sleepy)",
- "group": "Smileys & Emotion",
- "subgroup": "face-sleepy"
- },
- {
- "codes": "1F924",
- "char": "🤤",
- "name": "drooling face",
- "category": "Smileys & Emotion (face-sleepy)",
- "group": "Smileys & Emotion",
- "subgroup": "face-sleepy"
- },
- {
- "codes": "1F634",
- "char": "😴",
- "name": "sleeping face",
- "category": "Smileys & Emotion (face-sleepy)",
- "group": "Smileys & Emotion",
- "subgroup": "face-sleepy"
- },
- {
- "codes": "1F637",
- "char": "😷",
- "name": "face with medical mask",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F912",
- "char": "🤒",
- "name": "face with thermometer",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F915",
- "char": "🤕",
- "name": "face with head-bandage",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F922",
- "char": "🤢",
- "name": "nauseated face",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F92E",
- "char": "🤮",
- "name": "face vomiting",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F927",
- "char": "🤧",
- "name": "sneezing face",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F975",
- "char": "🥵",
- "name": "hot face",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F976",
- "char": "🥶",
- "name": "cold face",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F974",
- "char": "🥴",
- "name": "woozy face",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F635",
- "char": "😵",
- "name": "knocked-out face",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F92F",
- "char": "🤯",
- "name": "exploding head",
- "category": "Smileys & Emotion (face-unwell)",
- "group": "Smileys & Emotion",
- "subgroup": "face-unwell"
- },
- {
- "codes": "1F920",
- "char": "🤠",
- "name": "cowboy hat face",
- "category": "Smileys & Emotion (face-hat)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hat"
- },
- {
- "codes": "1F973",
- "char": "🥳",
- "name": "partying face",
- "category": "Smileys & Emotion (face-hat)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hat"
- },
- {
- "codes": "1F978",
- "char": "🥸",
- "name": "disguised face",
- "category": "Smileys & Emotion (face-hat)",
- "group": "Smileys & Emotion",
- "subgroup": "face-hat"
- },
- {
- "codes": "1F60E",
- "char": "😎",
- "name": "smiling face with sunglasses",
- "category": "Smileys & Emotion (face-glasses)",
- "group": "Smileys & Emotion",
- "subgroup": "face-glasses"
- },
- {
- "codes": "1F913",
- "char": "🤓",
- "name": "nerd face",
- "category": "Smileys & Emotion (face-glasses)",
- "group": "Smileys & Emotion",
- "subgroup": "face-glasses"
- },
- {
- "codes": "1F9D0",
- "char": "🧐",
- "name": "face with monocle",
- "category": "Smileys & Emotion (face-glasses)",
- "group": "Smileys & Emotion",
- "subgroup": "face-glasses"
- },
- {
- "codes": "1F615",
- "char": "😕",
- "name": "confused face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F61F",
- "char": "😟",
- "name": "worried face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F641",
- "char": "🙁",
- "name": "slightly frowning face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "2639",
- "char": "☹",
- "name": "frowning face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F62E",
- "char": "😮",
- "name": "face with open mouth",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F62F",
- "char": "😯",
- "name": "hushed face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F632",
- "char": "😲",
- "name": "astonished face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F633",
- "char": "😳",
- "name": "flushed face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F97A",
- "char": "🥺",
- "name": "pleading face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F626",
- "char": "😦",
- "name": "frowning face with open mouth",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F627",
- "char": "😧",
- "name": "anguished face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F628",
- "char": "😨",
- "name": "fearful face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F630",
- "char": "😰",
- "name": "anxious face with sweat",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F625",
- "char": "😥",
- "name": "sad but relieved face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F622",
- "char": "😢",
- "name": "crying face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F62D",
- "char": "😭",
- "name": "loudly crying face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F631",
- "char": "😱",
- "name": "face screaming in fear",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F616",
- "char": "😖",
- "name": "confounded face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F623",
- "char": "😣",
- "name": "persevering face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F61E",
- "char": "😞",
- "name": "disappointed face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F613",
- "char": "😓",
- "name": "downcast face with sweat",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F629",
- "char": "😩",
- "name": "weary face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F62B",
- "char": "😫",
- "name": "tired face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F971",
- "char": "🥱",
- "name": "yawning face",
- "category": "Smileys & Emotion (face-concerned)",
- "group": "Smileys & Emotion",
- "subgroup": "face-concerned"
- },
- {
- "codes": "1F624",
- "char": "😤",
- "name": "face with steam from nose",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F621",
- "char": "😡",
- "name": "pouting face",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F620",
- "char": "😠",
- "name": "angry face",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F92C",
- "char": "🤬",
- "name": "face with symbols on mouth",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F608",
- "char": "😈",
- "name": "smiling face with horns",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F47F",
- "char": "👿",
- "name": "angry face with horns",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F480",
- "char": "💀",
- "name": "skull",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "2620",
- "char": "☠",
- "name": "skull and crossbones",
- "category": "Smileys & Emotion (face-negative)",
- "group": "Smileys & Emotion",
- "subgroup": "face-negative"
- },
- {
- "codes": "1F4A9",
- "char": "💩",
- "name": "pile of poo",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F921",
- "char": "🤡",
- "name": "clown face",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F479",
- "char": "👹",
- "name": "ogre",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F47A",
- "char": "👺",
- "name": "goblin",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F47B",
- "char": "👻",
- "name": "ghost",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F47D",
- "char": "👽",
- "name": "alien",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F47E",
- "char": "👾",
- "name": "alien monster",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F916",
- "char": "🤖",
- "name": "robot",
- "category": "Smileys & Emotion (face-costume)",
- "group": "Smileys & Emotion",
- "subgroup": "face-costume"
- },
- {
- "codes": "1F63A",
- "char": "😺",
- "name": "grinning cat",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F638",
- "char": "😸",
- "name": "grinning cat with smiling eyes",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F639",
- "char": "😹",
- "name": "cat with tears of joy",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F63B",
- "char": "😻",
- "name": "smiling cat with heart-eyes",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F63C",
- "char": "😼",
- "name": "cat with wry smile",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F63D",
- "char": "😽",
- "name": "kissing cat",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F640",
- "char": "🙀",
- "name": "weary cat",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F63F",
- "char": "😿",
- "name": "crying cat",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F63E",
- "char": "😾",
- "name": "pouting cat",
- "category": "Smileys & Emotion (cat-face)",
- "group": "Smileys & Emotion",
- "subgroup": "cat-face"
- },
- {
- "codes": "1F648",
- "char": "🙈",
- "name": "see-no-evil monkey",
- "category": "Smileys & Emotion (monkey-face)",
- "group": "Smileys & Emotion",
- "subgroup": "monkey-face"
- },
- {
- "codes": "1F649",
- "char": "🙉",
- "name": "hear-no-evil monkey",
- "category": "Smileys & Emotion (monkey-face)",
- "group": "Smileys & Emotion",
- "subgroup": "monkey-face"
- },
- {
- "codes": "1F64A",
- "char": "🙊",
- "name": "speak-no-evil monkey",
- "category": "Smileys & Emotion (monkey-face)",
- "group": "Smileys & Emotion",
- "subgroup": "monkey-face"
- },
- {
- "codes": "1F48B",
- "char": "💋",
- "name": "kiss mark",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F48C",
- "char": "💌",
- "name": "love letter",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F498",
- "char": "💘",
- "name": "heart with arrow",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F49D",
- "char": "💝",
- "name": "heart with ribbon",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F496",
- "char": "💖",
- "name": "sparkling heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F497",
- "char": "💗",
- "name": "growing heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F493",
- "char": "💓",
- "name": "beating heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F49E",
- "char": "💞",
- "name": "revolving hearts",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F495",
- "char": "💕",
- "name": "two hearts",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F49F",
- "char": "💟",
- "name": "heart decoration",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "2763",
- "char": "❣",
- "name": "heart exclamation",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F494",
- "char": "💔",
- "name": "broken heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "2764",
- "char": "❤",
- "name": "red heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F9E1",
- "char": "🧡",
- "name": "orange heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F49B",
- "char": "💛",
- "name": "yellow heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F49A",
- "char": "💚",
- "name": "green heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F499",
- "char": "💙",
- "name": "blue heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F49C",
- "char": "💜",
- "name": "purple heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F90E",
- "char": "🤎",
- "name": "brown heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F5A4",
- "char": "🖤",
- "name": "black heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F90D",
- "char": "🤍",
- "name": "white heart",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4AF",
- "char": "💯",
- "name": "hundred points",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4A2",
- "char": "💢",
- "name": "anger symbol",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4A5",
- "char": "💥",
- "name": "collision",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4AB",
- "char": "💫",
- "name": "dizzy",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4A6",
- "char": "💦",
- "name": "sweat droplets",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4A8",
- "char": "💨",
- "name": "dashing away",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F573",
- "char": "🕳",
- "name": "hole",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4A3",
- "char": "💣",
- "name": "bomb",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4AC",
- "char": "💬",
- "name": "speech balloon",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F441 200D 1F5E8",
- "char": "👁🗨",
- "name": "eye in speech bubble",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F5E8",
- "char": "🗨",
- "name": "left speech bubble",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F5EF",
- "char": "🗯",
- "name": "right anger bubble",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4AD",
- "char": "💭",
- "name": "thought balloon",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F4A4",
- "char": "💤",
- "name": "zzz",
- "category": "Smileys & Emotion (emotion)",
- "group": "Smileys & Emotion",
- "subgroup": "emotion"
- },
- {
- "codes": "1F44B",
- "char": "👋",
- "name": "waving hand",
- "category": "People & Body (hand-fingers-open)",
- "group": "People & Body",
- "subgroup": "hand-fingers-open"
- },
- {
- "codes": "1F91A",
- "char": "🤚",
- "name": "raised back of hand",
- "category": "People & Body (hand-fingers-open)",
- "group": "People & Body",
- "subgroup": "hand-fingers-open"
- },
- {
- "codes": "1F590",
- "char": "🖐",
- "name": "hand with fingers splayed",
- "category": "People & Body (hand-fingers-open)",
- "group": "People & Body",
- "subgroup": "hand-fingers-open"
- },
- {
- "codes": "270B",
- "char": "✋",
- "name": "raised hand",
- "category": "People & Body (hand-fingers-open)",
- "group": "People & Body",
- "subgroup": "hand-fingers-open"
- },
- {
- "codes": "1F596",
- "char": "🖖",
- "name": "vulcan salute",
- "category": "People & Body (hand-fingers-open)",
- "group": "People & Body",
- "subgroup": "hand-fingers-open"
- },
- {
- "codes": "1F44C",
- "char": "👌",
- "name": "OK hand",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F90C",
- "char": "🤌",
- "name": "pinched fingers",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F90F",
- "char": "🤏",
- "name": "pinching hand",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "270C",
- "char": "✌",
- "name": "victory hand",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F91E",
- "char": "🤞",
- "name": "crossed fingers",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F91F",
- "char": "🤟",
- "name": "love-you gesture",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F918",
- "char": "🤘",
- "name": "sign of the horns",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F919",
- "char": "🤙",
- "name": "call me hand",
- "category": "People & Body (hand-fingers-partial)",
- "group": "People & Body",
- "subgroup": "hand-fingers-partial"
- },
- {
- "codes": "1F448",
- "char": "👈",
- "name": "backhand index pointing left",
- "category": "People & Body (hand-single-finger)",
- "group": "People & Body",
- "subgroup": "hand-single-finger"
- },
- {
- "codes": "1F449",
- "char": "👉",
- "name": "backhand index pointing right",
- "category": "People & Body (hand-single-finger)",
- "group": "People & Body",
- "subgroup": "hand-single-finger"
- },
- {
- "codes": "1F446",
- "char": "👆",
- "name": "backhand index pointing up",
- "category": "People & Body (hand-single-finger)",
- "group": "People & Body",
- "subgroup": "hand-single-finger"
- },
- {
- "codes": "1F595",
- "char": "🖕",
- "name": "middle finger",
- "category": "People & Body (hand-single-finger)",
- "group": "People & Body",
- "subgroup": "hand-single-finger"
- },
- {
- "codes": "1F447",
- "char": "👇",
- "name": "backhand index pointing down",
- "category": "People & Body (hand-single-finger)",
- "group": "People & Body",
- "subgroup": "hand-single-finger"
- },
- {
- "codes": "261D",
- "char": "☝",
- "name": "index pointing up",
- "category": "People & Body (hand-single-finger)",
- "group": "People & Body",
- "subgroup": "hand-single-finger"
- },
- {
- "codes": "1F44D",
- "char": "👍",
- "name": "thumbs up",
- "category": "People & Body (hand-fingers-closed)",
- "group": "People & Body",
- "subgroup": "hand-fingers-closed"
- },
- {
- "codes": "1F44E",
- "char": "👎",
- "name": "thumbs down",
- "category": "People & Body (hand-fingers-closed)",
- "group": "People & Body",
- "subgroup": "hand-fingers-closed"
- },
- {
- "codes": "270A",
- "char": "✊",
- "name": "raised fist",
- "category": "People & Body (hand-fingers-closed)",
- "group": "People & Body",
- "subgroup": "hand-fingers-closed"
- },
- {
- "codes": "1F44A",
- "char": "👊",
- "name": "oncoming fist",
- "category": "People & Body (hand-fingers-closed)",
- "group": "People & Body",
- "subgroup": "hand-fingers-closed"
- },
- {
- "codes": "1F91B",
- "char": "🤛",
- "name": "left-facing fist",
- "category": "People & Body (hand-fingers-closed)",
- "group": "People & Body",
- "subgroup": "hand-fingers-closed"
- },
- {
- "codes": "1F91C",
- "char": "🤜",
- "name": "right-facing fist",
- "category": "People & Body (hand-fingers-closed)",
- "group": "People & Body",
- "subgroup": "hand-fingers-closed"
- },
- {
- "codes": "1F44F",
- "char": "👏",
- "name": "clapping hands",
- "category": "People & Body (hands)",
- "group": "People & Body",
- "subgroup": "hands"
- },
- {
- "codes": "1F64C",
- "char": "🙌",
- "name": "raising hands",
- "category": "People & Body (hands)",
- "group": "People & Body",
- "subgroup": "hands"
- },
- {
- "codes": "1F450",
- "char": "👐",
- "name": "open hands",
- "category": "People & Body (hands)",
- "group": "People & Body",
- "subgroup": "hands"
- },
- {
- "codes": "1F932",
- "char": "🤲",
- "name": "palms up together",
- "category": "People & Body (hands)",
- "group": "People & Body",
- "subgroup": "hands"
- },
- {
- "codes": "1F91D",
- "char": "🤝",
- "name": "handshake",
- "category": "People & Body (hands)",
- "group": "People & Body",
- "subgroup": "hands"
- },
- {
- "codes": "1F64F",
- "char": "🙏",
- "name": "folded hands",
- "category": "People & Body (hands)",
- "group": "People & Body",
- "subgroup": "hands"
- },
- {
- "codes": "270D",
- "char": "✍",
- "name": "writing hand",
- "category": "People & Body (hand-prop)",
- "group": "People & Body",
- "subgroup": "hand-prop"
- },
- {
- "codes": "1F485",
- "char": "💅",
- "name": "nail polish",
- "category": "People & Body (hand-prop)",
- "group": "People & Body",
- "subgroup": "hand-prop"
- },
- {
- "codes": "1F933",
- "char": "🤳",
- "name": "selfie",
- "category": "People & Body (hand-prop)",
- "group": "People & Body",
- "subgroup": "hand-prop"
- },
- {
- "codes": "1F4AA",
- "char": "💪",
- "name": "flexed biceps",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9BE",
- "char": "🦾",
- "name": "mechanical arm",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9BF",
- "char": "🦿",
- "name": "mechanical leg",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9B5",
- "char": "🦵",
- "name": "leg",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9B6",
- "char": "🦶",
- "name": "foot",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F442",
- "char": "👂",
- "name": "ear",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9BB",
- "char": "🦻",
- "name": "ear with hearing aid",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F443",
- "char": "👃",
- "name": "nose",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9E0",
- "char": "🧠",
- "name": "brain",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1FAC0",
- "char": "🫀",
- "name": "anatomical heart",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1FAC1",
- "char": "🫁",
- "name": "lungs",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9B7",
- "char": "🦷",
- "name": "tooth",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F9B4",
- "char": "🦴",
- "name": "bone",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F440",
- "char": "👀",
- "name": "eyes",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F441",
- "char": "👁",
- "name": "eye",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F445",
- "char": "👅",
- "name": "tongue",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F444",
- "char": "👄",
- "name": "mouth",
- "category": "People & Body (body-parts)",
- "group": "People & Body",
- "subgroup": "body-parts"
- },
- {
- "codes": "1F476",
- "char": "👶",
- "name": "baby",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F9D2",
- "char": "🧒",
- "name": "child",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F466",
- "char": "👦",
- "name": "boy",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F467",
- "char": "👧",
- "name": "girl",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F9D1",
- "char": "🧑",
- "name": "person",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F468",
- "char": "👨",
- "name": "man",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F469",
- "char": "👩",
- "name": "woman",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F9D3",
- "char": "🧓",
- "name": "older person",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F474",
- "char": "👴",
- "name": "old man",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F475",
- "char": "👵",
- "name": "old woman",
- "category": "People & Body (person)",
- "group": "People & Body",
- "subgroup": "person"
- },
- {
- "codes": "1F64D",
- "char": "🙍",
- "name": "person frowning",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64D 200D 2642 FE0F",
- "char": "🙍♂️",
- "name": "man frowning",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64D 200D 2640 FE0F",
- "char": "🙍♀️",
- "name": "woman frowning",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64E",
- "char": "🙎",
- "name": "person pouting",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64E 200D 2642 FE0F",
- "char": "🙎♂️",
- "name": "man pouting",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64E 200D 2640 FE0F",
- "char": "🙎♀️",
- "name": "woman pouting",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F645",
- "char": "🙅",
- "name": "person gesturing NO",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F645 200D 2642 FE0F",
- "char": "🙅♂️",
- "name": "man gesturing NO",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F645 200D 2640 FE0F",
- "char": "🙅♀️",
- "name": "woman gesturing NO",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F646",
- "char": "🙆",
- "name": "person gesturing OK",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F646 200D 2642 FE0F",
- "char": "🙆♂️",
- "name": "man gesturing OK",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F646 200D 2640 FE0F",
- "char": "🙆♀️",
- "name": "woman gesturing OK",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F481",
- "char": "💁",
- "name": "person tipping hand",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F481 200D 2642 FE0F",
- "char": "💁♂️",
- "name": "man tipping hand",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F481 200D 2640 FE0F",
- "char": "💁♀️",
- "name": "woman tipping hand",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64B",
- "char": "🙋",
- "name": "person raising hand",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64B 200D 2642 FE0F",
- "char": "🙋♂️",
- "name": "man raising hand",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F64B 200D 2640 FE0F",
- "char": "🙋♀️",
- "name": "woman raising hand",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F9CF",
- "char": "🧏",
- "name": "deaf person",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F9CF 200D 2642 FE0F",
- "char": "🧏♂️",
- "name": "deaf man",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F9CF 200D 2640 FE0F",
- "char": "🧏♀️",
- "name": "deaf woman",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F647",
- "char": "🙇",
- "name": "person bowing",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F647 200D 2642 FE0F",
- "char": "🙇♂️",
- "name": "man bowing",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F647 200D 2640 FE0F",
- "char": "🙇♀️",
- "name": "woman bowing",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F926",
- "char": "🤦",
- "name": "person facepalming",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F926 200D 2642 FE0F",
- "char": "🤦♂️",
- "name": "man facepalming",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F926 200D 2640 FE0F",
- "char": "🤦♀️",
- "name": "woman facepalming",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F937",
- "char": "🤷",
- "name": "person shrugging",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F937 200D 2642 FE0F",
- "char": "🤷♂️",
- "name": "man shrugging",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F937 200D 2640 FE0F",
- "char": "🤷♀️",
- "name": "woman shrugging",
- "category": "People & Body (person-gesture)",
- "group": "People & Body",
- "subgroup": "person-gesture"
- },
- {
- "codes": "1F9D1 200D 2695 FE0F",
- "char": "🧑⚕️",
- "name": "health worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 2695 FE0F",
- "char": "👨⚕️",
- "name": "man health worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 2695 FE0F",
- "char": "👩⚕️",
- "name": "woman health worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F393",
- "char": "🧑🎓",
- "name": "student",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F393",
- "char": "👨🎓",
- "name": "man student",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F393",
- "char": "👩🎓",
- "name": "woman student",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F3EB",
- "char": "🧑🏫",
- "name": "teacher",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F3EB",
- "char": "👨🏫",
- "name": "man teacher",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F3EB",
- "char": "👩🏫",
- "name": "woman teacher",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 2696 FE0F",
- "char": "🧑⚖️",
- "name": "judge",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 2696 FE0F",
- "char": "👨⚖️",
- "name": "man judge",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 2696 FE0F",
- "char": "👩⚖️",
- "name": "woman judge",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F33E",
- "char": "🧑🌾",
- "name": "farmer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F33E",
- "char": "👨🌾",
- "name": "man farmer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F33E",
- "char": "👩🌾",
- "name": "woman farmer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F373",
- "char": "🧑🍳",
- "name": "cook",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F373",
- "char": "👨🍳",
- "name": "man cook",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F373",
- "char": "👩🍳",
- "name": "woman cook",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F527",
- "char": "🧑🔧",
- "name": "mechanic",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F527",
- "char": "👨🔧",
- "name": "man mechanic",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F527",
- "char": "👩🔧",
- "name": "woman mechanic",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F3ED",
- "char": "🧑🏭",
- "name": "factory worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F3ED",
- "char": "👨🏭",
- "name": "man factory worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F3ED",
- "char": "👩🏭",
- "name": "woman factory worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F4BC",
- "char": "🧑💼",
- "name": "office worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F4BC",
- "char": "👨💼",
- "name": "man office worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F4BC",
- "char": "👩💼",
- "name": "woman office worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F52C",
- "char": "🧑🔬",
- "name": "scientist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F52C",
- "char": "👨🔬",
- "name": "man scientist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F52C",
- "char": "👩🔬",
- "name": "woman scientist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F4BB",
- "char": "🧑💻",
- "name": "technologist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F4BB",
- "char": "👨💻",
- "name": "man technologist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F4BB",
- "char": "👩💻",
- "name": "woman technologist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F3A4",
- "char": "🧑🎤",
- "name": "singer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F3A4",
- "char": "👨🎤",
- "name": "man singer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F3A4",
- "char": "👩🎤",
- "name": "woman singer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F3A8",
- "char": "🧑🎨",
- "name": "artist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F3A8",
- "char": "👨🎨",
- "name": "man artist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F3A8",
- "char": "👩🎨",
- "name": "woman artist",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 2708 FE0F",
- "char": "🧑✈️",
- "name": "pilot",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 2708 FE0F",
- "char": "👨✈️",
- "name": "man pilot",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 2708 FE0F",
- "char": "👩✈️",
- "name": "woman pilot",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F680",
- "char": "🧑🚀",
- "name": "astronaut",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F680",
- "char": "👨🚀",
- "name": "man astronaut",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F680",
- "char": "👩🚀",
- "name": "woman astronaut",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F692",
- "char": "🧑🚒",
- "name": "firefighter",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F692",
- "char": "👨🚒",
- "name": "man firefighter",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F692",
- "char": "👩🚒",
- "name": "woman firefighter",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F46E",
- "char": "👮",
- "name": "police officer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F46E 200D 2642 FE0F",
- "char": "👮♂️",
- "name": "man police officer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F46E 200D 2640 FE0F",
- "char": "👮♀️",
- "name": "woman police officer",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F575",
- "char": "🕵",
- "name": "detective",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F575 FE0F 200D 2642 FE0F",
- "char": "🕵️♂️",
- "name": "man detective",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F575 FE0F 200D 2640 FE0F",
- "char": "🕵️♀️",
- "name": "woman detective",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F482",
- "char": "💂",
- "name": "guard",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F482 200D 2642 FE0F",
- "char": "💂♂️",
- "name": "man guard",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F482 200D 2640 FE0F",
- "char": "💂♀️",
- "name": "woman guard",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F977",
- "char": "🥷",
- "name": "ninja",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F477",
- "char": "👷",
- "name": "construction worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F477 200D 2642 FE0F",
- "char": "👷♂️",
- "name": "man construction worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F477 200D 2640 FE0F",
- "char": "👷♀️",
- "name": "woman construction worker",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F934",
- "char": "🤴",
- "name": "prince",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F478",
- "char": "👸",
- "name": "princess",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F473",
- "char": "👳",
- "name": "person wearing turban",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F473 200D 2642 FE0F",
- "char": "👳♂️",
- "name": "man wearing turban",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F473 200D 2640 FE0F",
- "char": "👳♀️",
- "name": "woman wearing turban",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F472",
- "char": "👲",
- "name": "person with skullcap",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D5",
- "char": "🧕",
- "name": "woman with headscarf",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F935",
- "char": "🤵",
- "name": "person in tuxedo",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F935 200D 2642 FE0F",
- "char": "🤵♂️",
- "name": "man in tuxedo",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F935 200D 2640 FE0F",
- "char": "🤵♀️",
- "name": "woman in tuxedo",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F470",
- "char": "👰",
- "name": "person with veil",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F470 200D 2642 FE0F",
- "char": "👰♂️",
- "name": "man with veil",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F470 200D 2640 FE0F",
- "char": "👰♀️",
- "name": "woman with veil",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F930",
- "char": "🤰",
- "name": "pregnant woman",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F931",
- "char": "🤱",
- "name": "breast-feeding",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F469 200D 1F37C",
- "char": "👩🍼",
- "name": "woman feeding baby",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F468 200D 1F37C",
- "char": "👨🍼",
- "name": "man feeding baby",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F9D1 200D 1F37C",
- "char": "🧑🍼",
- "name": "person feeding baby",
- "category": "People & Body (person-role)",
- "group": "People & Body",
- "subgroup": "person-role"
- },
- {
- "codes": "1F47C",
- "char": "👼",
- "name": "baby angel",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F385",
- "char": "🎅",
- "name": "Santa Claus",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F936",
- "char": "🤶",
- "name": "Mrs. Claus",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9D1 200D 1F384",
- "char": "🧑🎄",
- "name": "mx claus",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9B8",
- "char": "🦸",
- "name": "superhero",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9B8 200D 2642 FE0F",
- "char": "🦸♂️",
- "name": "man superhero",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9B8 200D 2640 FE0F",
- "char": "🦸♀️",
- "name": "woman superhero",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9B9",
- "char": "🦹",
- "name": "supervillain",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9B9 200D 2642 FE0F",
- "char": "🦹♂️",
- "name": "man supervillain",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9B9 200D 2640 FE0F",
- "char": "🦹♀️",
- "name": "woman supervillain",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9D9",
- "char": "🧙",
- "name": "mage",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9D9 200D 2642 FE0F",
- "char": "🧙♂️",
- "name": "man mage",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9D9 200D 2640 FE0F",
- "char": "🧙♀️",
- "name": "woman mage",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DA",
- "char": "🧚",
- "name": "fairy",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DA 200D 2642 FE0F",
- "char": "🧚♂️",
- "name": "man fairy",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DA 200D 2640 FE0F",
- "char": "🧚♀️",
- "name": "woman fairy",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DB",
- "char": "🧛",
- "name": "vampire",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DB 200D 2642 FE0F",
- "char": "🧛♂️",
- "name": "man vampire",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DB 200D 2640 FE0F",
- "char": "🧛♀️",
- "name": "woman vampire",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DC",
- "char": "🧜",
- "name": "merperson",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DC 200D 2642 FE0F",
- "char": "🧜♂️",
- "name": "merman",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DC 200D 2640 FE0F",
- "char": "🧜♀️",
- "name": "mermaid",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DD",
- "char": "🧝",
- "name": "elf",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DD 200D 2642 FE0F",
- "char": "🧝♂️",
- "name": "man elf",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DD 200D 2640 FE0F",
- "char": "🧝♀️",
- "name": "woman elf",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DE",
- "char": "🧞",
- "name": "genie",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DE 200D 2642 FE0F",
- "char": "🧞♂️",
- "name": "man genie",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DE 200D 2640 FE0F",
- "char": "🧞♀️",
- "name": "woman genie",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DF",
- "char": "🧟",
- "name": "zombie",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DF 200D 2642 FE0F",
- "char": "🧟♂️",
- "name": "man zombie",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F9DF 200D 2640 FE0F",
- "char": "🧟♀️",
- "name": "woman zombie",
- "category": "People & Body (person-fantasy)",
- "group": "People & Body",
- "subgroup": "person-fantasy"
- },
- {
- "codes": "1F486",
- "char": "💆",
- "name": "person getting massage",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F486 200D 2642 FE0F",
- "char": "💆♂️",
- "name": "man getting massage",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F486 200D 2640 FE0F",
- "char": "💆♀️",
- "name": "woman getting massage",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F487",
- "char": "💇",
- "name": "person getting haircut",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F487 200D 2642 FE0F",
- "char": "💇♂️",
- "name": "man getting haircut",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F487 200D 2640 FE0F",
- "char": "💇♀️",
- "name": "woman getting haircut",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F6B6",
- "char": "🚶",
- "name": "person walking",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F6B6 200D 2642 FE0F",
- "char": "🚶♂️",
- "name": "man walking",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F6B6 200D 2640 FE0F",
- "char": "🚶♀️",
- "name": "woman walking",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9CD",
- "char": "🧍",
- "name": "person standing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9CD 200D 2642 FE0F",
- "char": "🧍♂️",
- "name": "man standing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9CD 200D 2640 FE0F",
- "char": "🧍♀️",
- "name": "woman standing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9CE",
- "char": "🧎",
- "name": "person kneeling",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9CE 200D 2642 FE0F",
- "char": "🧎♂️",
- "name": "man kneeling",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9CE 200D 2640 FE0F",
- "char": "🧎♀️",
- "name": "woman kneeling",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D1 200D 1F9AF",
- "char": "🧑🦯",
- "name": "person with white cane",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F468 200D 1F9AF",
- "char": "👨🦯",
- "name": "man with white cane",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F469 200D 1F9AF",
- "char": "👩🦯",
- "name": "woman with white cane",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D1 200D 1F9BC",
- "char": "🧑🦼",
- "name": "person in motorized wheelchair",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F468 200D 1F9BC",
- "char": "👨🦼",
- "name": "man in motorized wheelchair",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F469 200D 1F9BC",
- "char": "👩🦼",
- "name": "woman in motorized wheelchair",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D1 200D 1F9BD",
- "char": "🧑🦽",
- "name": "person in manual wheelchair",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F468 200D 1F9BD",
- "char": "👨🦽",
- "name": "man in manual wheelchair",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F469 200D 1F9BD",
- "char": "👩🦽",
- "name": "woman in manual wheelchair",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F3C3",
- "char": "🏃",
- "name": "person running",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F3C3 200D 2642 FE0F",
- "char": "🏃♂️",
- "name": "man running",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F3C3 200D 2640 FE0F",
- "char": "🏃♀️",
- "name": "woman running",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F483",
- "char": "💃",
- "name": "woman dancing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F57A",
- "char": "🕺",
- "name": "man dancing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F574",
- "char": "🕴",
- "name": "person in suit levitating",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F46F",
- "char": "👯",
- "name": "people with bunny ears",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F46F 200D 2642 FE0F",
- "char": "👯♂️",
- "name": "men with bunny ears",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F46F 200D 2640 FE0F",
- "char": "👯♀️",
- "name": "women with bunny ears",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D6",
- "char": "🧖",
- "name": "person in steamy room",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D6 200D 2642 FE0F",
- "char": "🧖♂️",
- "name": "man in steamy room",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D6 200D 2640 FE0F",
- "char": "🧖♀️",
- "name": "woman in steamy room",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D7",
- "char": "🧗",
- "name": "person climbing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D7 200D 2642 FE0F",
- "char": "🧗♂️",
- "name": "man climbing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F9D7 200D 2640 FE0F",
- "char": "🧗♀️",
- "name": "woman climbing",
- "category": "People & Body (person-activity)",
- "group": "People & Body",
- "subgroup": "person-activity"
- },
- {
- "codes": "1F93A",
- "char": "🤺",
- "name": "person fencing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3C7",
- "char": "🏇",
- "name": "horse racing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "26F7",
- "char": "⛷",
- "name": "skier",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3C2",
- "char": "🏂",
- "name": "snowboarder",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CC",
- "char": "🏌",
- "name": "person golfing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CC FE0F 200D 2642 FE0F",
- "char": "🏌️♂️",
- "name": "man golfing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CC FE0F 200D 2640 FE0F",
- "char": "🏌️♀️",
- "name": "woman golfing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3C4",
- "char": "🏄",
- "name": "person surfing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3C4 200D 2642 FE0F",
- "char": "🏄♂️",
- "name": "man surfing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3C4 200D 2640 FE0F",
- "char": "🏄♀️",
- "name": "woman surfing",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6A3",
- "char": "🚣",
- "name": "person rowing boat",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6A3 200D 2642 FE0F",
- "char": "🚣♂️",
- "name": "man rowing boat",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6A3 200D 2640 FE0F",
- "char": "🚣♀️",
- "name": "woman rowing boat",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CA",
- "char": "🏊",
- "name": "person swimming",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CA 200D 2642 FE0F",
- "char": "🏊♂️",
- "name": "man swimming",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CA 200D 2640 FE0F",
- "char": "🏊♀️",
- "name": "woman swimming",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "26F9",
- "char": "⛹",
- "name": "person bouncing ball",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "26F9 FE0F 200D 2642 FE0F",
- "char": "⛹️♂️",
- "name": "man bouncing ball",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "26F9 FE0F 200D 2640 FE0F",
- "char": "⛹️♀️",
- "name": "woman bouncing ball",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CB",
- "char": "🏋",
- "name": "person lifting weights",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CB FE0F 200D 2642 FE0F",
- "char": "🏋️♂️",
- "name": "man lifting weights",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F3CB FE0F 200D 2640 FE0F",
- "char": "🏋️♀️",
- "name": "woman lifting weights",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6B4",
- "char": "🚴",
- "name": "person biking",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6B4 200D 2642 FE0F",
- "char": "🚴♂️",
- "name": "man biking",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6B4 200D 2640 FE0F",
- "char": "🚴♀️",
- "name": "woman biking",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6B5",
- "char": "🚵",
- "name": "person mountain biking",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6B5 200D 2642 FE0F",
- "char": "🚵♂️",
- "name": "man mountain biking",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F6B5 200D 2640 FE0F",
- "char": "🚵♀️",
- "name": "woman mountain biking",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F938",
- "char": "🤸",
- "name": "person cartwheeling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F938 200D 2642 FE0F",
- "char": "🤸♂️",
- "name": "man cartwheeling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F938 200D 2640 FE0F",
- "char": "🤸♀️",
- "name": "woman cartwheeling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93C",
- "char": "🤼",
- "name": "people wrestling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93C 200D 2642 FE0F",
- "char": "🤼♂️",
- "name": "men wrestling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93C 200D 2640 FE0F",
- "char": "🤼♀️",
- "name": "women wrestling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93D",
- "char": "🤽",
- "name": "person playing water polo",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93D 200D 2642 FE0F",
- "char": "🤽♂️",
- "name": "man playing water polo",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93D 200D 2640 FE0F",
- "char": "🤽♀️",
- "name": "woman playing water polo",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93E",
- "char": "🤾",
- "name": "person playing handball",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93E 200D 2642 FE0F",
- "char": "🤾♂️",
- "name": "man playing handball",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F93E 200D 2640 FE0F",
- "char": "🤾♀️",
- "name": "woman playing handball",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F939",
- "char": "🤹",
- "name": "person juggling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F939 200D 2642 FE0F",
- "char": "🤹♂️",
- "name": "man juggling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F939 200D 2640 FE0F",
- "char": "🤹♀️",
- "name": "woman juggling",
- "category": "People & Body (person-sport)",
- "group": "People & Body",
- "subgroup": "person-sport"
- },
- {
- "codes": "1F9D8",
- "char": "🧘",
- "name": "person in lotus position",
- "category": "People & Body (person-resting)",
- "group": "People & Body",
- "subgroup": "person-resting"
- },
- {
- "codes": "1F9D8 200D 2642 FE0F",
- "char": "🧘♂️",
- "name": "man in lotus position",
- "category": "People & Body (person-resting)",
- "group": "People & Body",
- "subgroup": "person-resting"
- },
- {
- "codes": "1F9D8 200D 2640 FE0F",
- "char": "🧘♀️",
- "name": "woman in lotus position",
- "category": "People & Body (person-resting)",
- "group": "People & Body",
- "subgroup": "person-resting"
- },
- {
- "codes": "1F6C0",
- "char": "🛀",
- "name": "person taking bath",
- "category": "People & Body (person-resting)",
- "group": "People & Body",
- "subgroup": "person-resting"
- },
- {
- "codes": "1F6CC",
- "char": "🛌",
- "name": "person in bed",
- "category": "People & Body (person-resting)",
- "group": "People & Body",
- "subgroup": "person-resting"
- },
- {
- "codes": "1F9D1 200D 1F91D 200D 1F9D1",
- "char": "🧑🤝🧑",
- "name": "people holding hands",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F46D",
- "char": "👭",
- "name": "women holding hands",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F46B",
- "char": "👫",
- "name": "woman and man holding hands",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F46C",
- "char": "👬",
- "name": "men holding hands",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F48F",
- "char": "💏",
- "name": "kiss",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F491",
- "char": "💑",
- "name": "couple with heart",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F46A",
- "char": "👪",
- "name": "family",
- "category": "People & Body (family)",
- "group": "People & Body",
- "subgroup": "family"
- },
- {
- "codes": "1F5E3",
- "char": "🗣",
- "name": "speaking head",
- "category": "People & Body (person-symbol)",
- "group": "People & Body",
- "subgroup": "person-symbol"
- },
- {
- "codes": "1F464",
- "char": "👤",
- "name": "bust in silhouette",
- "category": "People & Body (person-symbol)",
- "group": "People & Body",
- "subgroup": "person-symbol"
- },
- {
- "codes": "1F465",
- "char": "👥",
- "name": "busts in silhouette",
- "category": "People & Body (person-symbol)",
- "group": "People & Body",
- "subgroup": "person-symbol"
- },
- {
- "codes": "1FAC2",
- "char": "🫂",
- "name": "people hugging",
- "category": "People & Body (person-symbol)",
- "group": "People & Body",
- "subgroup": "person-symbol"
- },
- {
- "codes": "1F463",
- "char": "👣",
- "name": "footprints",
- "category": "People & Body (person-symbol)",
- "group": "People & Body",
- "subgroup": "person-symbol"
- },
- {
- "codes": "1F435",
- "char": "🐵",
- "name": "monkey face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F412",
- "char": "🐒",
- "name": "monkey",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F98D",
- "char": "🦍",
- "name": "gorilla",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9A7",
- "char": "🦧",
- "name": "orangutan",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F436",
- "char": "🐶",
- "name": "dog face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F415",
- "char": "🐕",
- "name": "dog",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9AE",
- "char": "🦮",
- "name": "guide dog",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F415 200D 1F9BA",
- "char": "🐕🦺",
- "name": "service dog",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F429",
- "char": "🐩",
- "name": "poodle",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43A",
- "char": "🐺",
- "name": "wolf",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F98A",
- "char": "🦊",
- "name": "fox",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F99D",
- "char": "🦝",
- "name": "raccoon",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F431",
- "char": "🐱",
- "name": "cat face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F408",
- "char": "🐈",
- "name": "cat",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F408 200D 2B1B",
- "char": "🐈⬛",
- "name": "black cat",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F981",
- "char": "🦁",
- "name": "lion",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F42F",
- "char": "🐯",
- "name": "tiger face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F405",
- "char": "🐅",
- "name": "tiger",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F406",
- "char": "🐆",
- "name": "leopard",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F434",
- "char": "🐴",
- "name": "horse face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F40E",
- "char": "🐎",
- "name": "horse",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F984",
- "char": "🦄",
- "name": "unicorn",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F993",
- "char": "🦓",
- "name": "zebra",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F98C",
- "char": "🦌",
- "name": "deer",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9AC",
- "char": "🦬",
- "name": "bison",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F42E",
- "char": "🐮",
- "name": "cow face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F402",
- "char": "🐂",
- "name": "ox",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F403",
- "char": "🐃",
- "name": "water buffalo",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F404",
- "char": "🐄",
- "name": "cow",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F437",
- "char": "🐷",
- "name": "pig face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F416",
- "char": "🐖",
- "name": "pig",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F417",
- "char": "🐗",
- "name": "boar",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43D",
- "char": "🐽",
- "name": "pig nose",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F40F",
- "char": "🐏",
- "name": "ram",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F411",
- "char": "🐑",
- "name": "ewe",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F410",
- "char": "🐐",
- "name": "goat",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F42A",
- "char": "🐪",
- "name": "camel",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F42B",
- "char": "🐫",
- "name": "two-hump camel",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F999",
- "char": "🦙",
- "name": "llama",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F992",
- "char": "🦒",
- "name": "giraffe",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F418",
- "char": "🐘",
- "name": "elephant",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9A3",
- "char": "🦣",
- "name": "mammoth",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F98F",
- "char": "🦏",
- "name": "rhinoceros",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F99B",
- "char": "🦛",
- "name": "hippopotamus",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F42D",
- "char": "🐭",
- "name": "mouse face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F401",
- "char": "🐁",
- "name": "mouse",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F400",
- "char": "🐀",
- "name": "rat",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F439",
- "char": "🐹",
- "name": "hamster",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F430",
- "char": "🐰",
- "name": "rabbit face",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F407",
- "char": "🐇",
- "name": "rabbit",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43F",
- "char": "🐿",
- "name": "chipmunk",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9AB",
- "char": "🦫",
- "name": "beaver",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F994",
- "char": "🦔",
- "name": "hedgehog",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F987",
- "char": "🦇",
- "name": "bat",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43B",
- "char": "🐻",
- "name": "bear",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43B 200D 2744 FE0F",
- "char": "🐻❄️",
- "name": "polar bear",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F428",
- "char": "🐨",
- "name": "koala",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43C",
- "char": "🐼",
- "name": "panda",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9A5",
- "char": "🦥",
- "name": "sloth",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9A6",
- "char": "🦦",
- "name": "otter",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9A8",
- "char": "🦨",
- "name": "skunk",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F998",
- "char": "🦘",
- "name": "kangaroo",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F9A1",
- "char": "🦡",
- "name": "badger",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F43E",
- "char": "🐾",
- "name": "paw prints",
- "category": "Animals & Nature (animal-mammal)",
- "group": "Animals & Nature",
- "subgroup": "animal-mammal"
- },
- {
- "codes": "1F983",
- "char": "🦃",
- "name": "turkey",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F414",
- "char": "🐔",
- "name": "chicken",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F413",
- "char": "🐓",
- "name": "rooster",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F423",
- "char": "🐣",
- "name": "hatching chick",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F424",
- "char": "🐤",
- "name": "baby chick",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F425",
- "char": "🐥",
- "name": "front-facing baby chick",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F426",
- "char": "🐦",
- "name": "bird",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F427",
- "char": "🐧",
- "name": "penguin",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F54A",
- "char": "🕊",
- "name": "dove",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F985",
- "char": "🦅",
- "name": "eagle",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F986",
- "char": "🦆",
- "name": "duck",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F9A2",
- "char": "🦢",
- "name": "swan",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F989",
- "char": "🦉",
- "name": "owl",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F9A4",
- "char": "🦤",
- "name": "dodo",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1FAB6",
- "char": "🪶",
- "name": "feather",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F9A9",
- "char": "🦩",
- "name": "flamingo",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F99A",
- "char": "🦚",
- "name": "peacock",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F99C",
- "char": "🦜",
- "name": "parrot",
- "category": "Animals & Nature (animal-bird)",
- "group": "Animals & Nature",
- "subgroup": "animal-bird"
- },
- {
- "codes": "1F438",
- "char": "🐸",
- "name": "frog",
- "category": "Animals & Nature (animal-amphibian)",
- "group": "Animals & Nature",
- "subgroup": "animal-amphibian"
- },
- {
- "codes": "1F40A",
- "char": "🐊",
- "name": "crocodile",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F422",
- "char": "🐢",
- "name": "turtle",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F98E",
- "char": "🦎",
- "name": "lizard",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F40D",
- "char": "🐍",
- "name": "snake",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F432",
- "char": "🐲",
- "name": "dragon face",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F409",
- "char": "🐉",
- "name": "dragon",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F995",
- "char": "🦕",
- "name": "sauropod",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F996",
- "char": "🦖",
- "name": "T-Rex",
- "category": "Animals & Nature (animal-reptile)",
- "group": "Animals & Nature",
- "subgroup": "animal-reptile"
- },
- {
- "codes": "1F433",
- "char": "🐳",
- "name": "spouting whale",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F40B",
- "char": "🐋",
- "name": "whale",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F42C",
- "char": "🐬",
- "name": "dolphin",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F9AD",
- "char": "🦭",
- "name": "seal",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F41F",
- "char": "🐟",
- "name": "fish",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F420",
- "char": "🐠",
- "name": "tropical fish",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F421",
- "char": "🐡",
- "name": "blowfish",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F988",
- "char": "🦈",
- "name": "shark",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F419",
- "char": "🐙",
- "name": "octopus",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F41A",
- "char": "🐚",
- "name": "spiral shell",
- "category": "Animals & Nature (animal-marine)",
- "group": "Animals & Nature",
- "subgroup": "animal-marine"
- },
- {
- "codes": "1F40C",
- "char": "🐌",
- "name": "snail",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F98B",
- "char": "🦋",
- "name": "butterfly",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F41B",
- "char": "🐛",
- "name": "bug",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F41C",
- "char": "🐜",
- "name": "ant",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F41D",
- "char": "🐝",
- "name": "honeybee",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1FAB2",
- "char": "🪲",
- "name": "beetle",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F41E",
- "char": "🐞",
- "name": "lady beetle",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F997",
- "char": "🦗",
- "name": "cricket",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1FAB3",
- "char": "🪳",
- "name": "cockroach",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F577",
- "char": "🕷",
- "name": "spider",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F578",
- "char": "🕸",
- "name": "spider web",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F982",
- "char": "🦂",
- "name": "scorpion",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F99F",
- "char": "🦟",
- "name": "mosquito",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1FAB0",
- "char": "🪰",
- "name": "fly",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1FAB1",
- "char": "🪱",
- "name": "worm",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F9A0",
- "char": "🦠",
- "name": "microbe",
- "category": "Animals & Nature (animal-bug)",
- "group": "Animals & Nature",
- "subgroup": "animal-bug"
- },
- {
- "codes": "1F490",
- "char": "💐",
- "name": "bouquet",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F338",
- "char": "🌸",
- "name": "cherry blossom",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F4AE",
- "char": "💮",
- "name": "white flower",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F3F5",
- "char": "🏵",
- "name": "rosette",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F339",
- "char": "🌹",
- "name": "rose",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F940",
- "char": "🥀",
- "name": "wilted flower",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F33A",
- "char": "🌺",
- "name": "hibiscus",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F33B",
- "char": "🌻",
- "name": "sunflower",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F33C",
- "char": "🌼",
- "name": "blossom",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F337",
- "char": "🌷",
- "name": "tulip",
- "category": "Animals & Nature (plant-flower)",
- "group": "Animals & Nature",
- "subgroup": "plant-flower"
- },
- {
- "codes": "1F331",
- "char": "🌱",
- "name": "seedling",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1FAB4",
- "char": "🪴",
- "name": "potted plant",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F332",
- "char": "🌲",
- "name": "evergreen tree",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F333",
- "char": "🌳",
- "name": "deciduous tree",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F334",
- "char": "🌴",
- "name": "palm tree",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F335",
- "char": "🌵",
- "name": "cactus",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F33E",
- "char": "🌾",
- "name": "sheaf of rice",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F33F",
- "char": "🌿",
- "name": "herb",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "2618",
- "char": "☘",
- "name": "shamrock",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F340",
- "char": "🍀",
- "name": "four leaf clover",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F341",
- "char": "🍁",
- "name": "maple leaf",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F342",
- "char": "🍂",
- "name": "fallen leaf",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F343",
- "char": "🍃",
- "name": "leaf fluttering in wind",
- "category": "Animals & Nature (plant-other)",
- "group": "Animals & Nature",
- "subgroup": "plant-other"
- },
- {
- "codes": "1F347",
- "char": "🍇",
- "name": "grapes",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F348",
- "char": "🍈",
- "name": "melon",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F349",
- "char": "🍉",
- "name": "watermelon",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F34A",
- "char": "🍊",
- "name": "tangerine",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F34B",
- "char": "🍋",
- "name": "lemon",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F34C",
- "char": "🍌",
- "name": "banana",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F34D",
- "char": "🍍",
- "name": "pineapple",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F96D",
- "char": "🥭",
- "name": "mango",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F34E",
- "char": "🍎",
- "name": "red apple",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F34F",
- "char": "🍏",
- "name": "green apple",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F350",
- "char": "🍐",
- "name": "pear",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F351",
- "char": "🍑",
- "name": "peach",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F352",
- "char": "🍒",
- "name": "cherries",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F353",
- "char": "🍓",
- "name": "strawberry",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1FAD0",
- "char": "🫐",
- "name": "blueberries",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F95D",
- "char": "🥝",
- "name": "kiwi fruit",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F345",
- "char": "🍅",
- "name": "tomato",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1FAD2",
- "char": "🫒",
- "name": "olive",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F965",
- "char": "🥥",
- "name": "coconut",
- "category": "Food & Drink (food-fruit)",
- "group": "Food & Drink",
- "subgroup": "food-fruit"
- },
- {
- "codes": "1F951",
- "char": "🥑",
- "name": "avocado",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F346",
- "char": "🍆",
- "name": "eggplant",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F954",
- "char": "🥔",
- "name": "potato",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F955",
- "char": "🥕",
- "name": "carrot",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F33D",
- "char": "🌽",
- "name": "ear of corn",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F336",
- "char": "🌶",
- "name": "hot pepper",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1FAD1",
- "char": "🫑",
- "name": "bell pepper",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F952",
- "char": "🥒",
- "name": "cucumber",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F96C",
- "char": "🥬",
- "name": "leafy green",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F966",
- "char": "🥦",
- "name": "broccoli",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F9C4",
- "char": "🧄",
- "name": "garlic",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F9C5",
- "char": "🧅",
- "name": "onion",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F344",
- "char": "🍄",
- "name": "mushroom",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F95C",
- "char": "🥜",
- "name": "peanuts",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F330",
- "char": "🌰",
- "name": "chestnut",
- "category": "Food & Drink (food-vegetable)",
- "group": "Food & Drink",
- "subgroup": "food-vegetable"
- },
- {
- "codes": "1F35E",
- "char": "🍞",
- "name": "bread",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F950",
- "char": "🥐",
- "name": "croissant",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F956",
- "char": "🥖",
- "name": "baguette bread",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1FAD3",
- "char": "🫓",
- "name": "flatbread",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F968",
- "char": "🥨",
- "name": "pretzel",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F96F",
- "char": "🥯",
- "name": "bagel",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F95E",
- "char": "🥞",
- "name": "pancakes",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F9C7",
- "char": "🧇",
- "name": "waffle",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F9C0",
- "char": "🧀",
- "name": "cheese wedge",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F356",
- "char": "🍖",
- "name": "meat on bone",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F357",
- "char": "🍗",
- "name": "poultry leg",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F969",
- "char": "🥩",
- "name": "cut of meat",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F953",
- "char": "🥓",
- "name": "bacon",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F354",
- "char": "🍔",
- "name": "hamburger",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F35F",
- "char": "🍟",
- "name": "french fries",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F355",
- "char": "🍕",
- "name": "pizza",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F32D",
- "char": "🌭",
- "name": "hot dog",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F96A",
- "char": "🥪",
- "name": "sandwich",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F32E",
- "char": "🌮",
- "name": "taco",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F32F",
- "char": "🌯",
- "name": "burrito",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1FAD4",
- "char": "🫔",
- "name": "tamale",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F959",
- "char": "🥙",
- "name": "stuffed flatbread",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F9C6",
- "char": "🧆",
- "name": "falafel",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F95A",
- "char": "🥚",
- "name": "egg",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F373",
- "char": "🍳",
- "name": "cooking",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F958",
- "char": "🥘",
- "name": "shallow pan of food",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F372",
- "char": "🍲",
- "name": "pot of food",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1FAD5",
- "char": "🫕",
- "name": "fondue",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F963",
- "char": "🥣",
- "name": "bowl with spoon",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F957",
- "char": "🥗",
- "name": "green salad",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F37F",
- "char": "🍿",
- "name": "popcorn",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F9C8",
- "char": "🧈",
- "name": "butter",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F9C2",
- "char": "🧂",
- "name": "salt",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F96B",
- "char": "🥫",
- "name": "canned food",
- "category": "Food & Drink (food-prepared)",
- "group": "Food & Drink",
- "subgroup": "food-prepared"
- },
- {
- "codes": "1F371",
- "char": "🍱",
- "name": "bento box",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F358",
- "char": "🍘",
- "name": "rice cracker",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F359",
- "char": "🍙",
- "name": "rice ball",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F35A",
- "char": "🍚",
- "name": "cooked rice",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F35B",
- "char": "🍛",
- "name": "curry rice",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F35C",
- "char": "🍜",
- "name": "steaming bowl",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F35D",
- "char": "🍝",
- "name": "spaghetti",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F360",
- "char": "🍠",
- "name": "roasted sweet potato",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F362",
- "char": "🍢",
- "name": "oden",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F363",
- "char": "🍣",
- "name": "sushi",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F364",
- "char": "🍤",
- "name": "fried shrimp",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F365",
- "char": "🍥",
- "name": "fish cake with swirl",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F96E",
- "char": "🥮",
- "name": "moon cake",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F361",
- "char": "🍡",
- "name": "dango",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F95F",
- "char": "🥟",
- "name": "dumpling",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F960",
- "char": "🥠",
- "name": "fortune cookie",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F961",
- "char": "🥡",
- "name": "takeout box",
- "category": "Food & Drink (food-asian)",
- "group": "Food & Drink",
- "subgroup": "food-asian"
- },
- {
- "codes": "1F980",
- "char": "🦀",
- "name": "crab",
- "category": "Food & Drink (food-marine)",
- "group": "Food & Drink",
- "subgroup": "food-marine"
- },
- {
- "codes": "1F99E",
- "char": "🦞",
- "name": "lobster",
- "category": "Food & Drink (food-marine)",
- "group": "Food & Drink",
- "subgroup": "food-marine"
- },
- {
- "codes": "1F990",
- "char": "🦐",
- "name": "shrimp",
- "category": "Food & Drink (food-marine)",
- "group": "Food & Drink",
- "subgroup": "food-marine"
- },
- {
- "codes": "1F991",
- "char": "🦑",
- "name": "squid",
- "category": "Food & Drink (food-marine)",
- "group": "Food & Drink",
- "subgroup": "food-marine"
- },
- {
- "codes": "1F9AA",
- "char": "🦪",
- "name": "oyster",
- "category": "Food & Drink (food-marine)",
- "group": "Food & Drink",
- "subgroup": "food-marine"
- },
- {
- "codes": "1F366",
- "char": "🍦",
- "name": "soft ice cream",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F367",
- "char": "🍧",
- "name": "shaved ice",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F368",
- "char": "🍨",
- "name": "ice cream",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F369",
- "char": "🍩",
- "name": "doughnut",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F36A",
- "char": "🍪",
- "name": "cookie",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F382",
- "char": "🎂",
- "name": "birthday cake",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F370",
- "char": "🍰",
- "name": "shortcake",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F9C1",
- "char": "🧁",
- "name": "cupcake",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F967",
- "char": "🥧",
- "name": "pie",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F36B",
- "char": "🍫",
- "name": "chocolate bar",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F36C",
- "char": "🍬",
- "name": "candy",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F36D",
- "char": "🍭",
- "name": "lollipop",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F36E",
- "char": "🍮",
- "name": "custard",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F36F",
- "char": "🍯",
- "name": "honey pot",
- "category": "Food & Drink (food-sweet)",
- "group": "Food & Drink",
- "subgroup": "food-sweet"
- },
- {
- "codes": "1F37C",
- "char": "🍼",
- "name": "baby bottle",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F95B",
- "char": "🥛",
- "name": "glass of milk",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "2615",
- "char": "☕",
- "name": "hot beverage",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1FAD6",
- "char": "🫖",
- "name": "teapot",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F375",
- "char": "🍵",
- "name": "teacup without handle",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F376",
- "char": "🍶",
- "name": "sake",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F37E",
- "char": "🍾",
- "name": "bottle with popping cork",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F377",
- "char": "🍷",
- "name": "wine glass",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F378",
- "char": "🍸",
- "name": "cocktail glass",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F379",
- "char": "🍹",
- "name": "tropical drink",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F37A",
- "char": "🍺",
- "name": "beer mug",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F37B",
- "char": "🍻",
- "name": "clinking beer mugs",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F942",
- "char": "🥂",
- "name": "clinking glasses",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F943",
- "char": "🥃",
- "name": "tumbler glass",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F964",
- "char": "🥤",
- "name": "cup with straw",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F9CB",
- "char": "🧋",
- "name": "bubble tea",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F9C3",
- "char": "🧃",
- "name": "beverage box",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F9C9",
- "char": "🧉",
- "name": "mate",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F9CA",
- "char": "🧊",
- "name": "ice",
- "category": "Food & Drink (drink)",
- "group": "Food & Drink",
- "subgroup": "drink"
- },
- {
- "codes": "1F962",
- "char": "🥢",
- "name": "chopsticks",
- "category": "Food & Drink (dishware)",
- "group": "Food & Drink",
- "subgroup": "dishware"
- },
- {
- "codes": "1F37D",
- "char": "🍽",
- "name": "fork and knife with plate",
- "category": "Food & Drink (dishware)",
- "group": "Food & Drink",
- "subgroup": "dishware"
- },
- {
- "codes": "1F374",
- "char": "🍴",
- "name": "fork and knife",
- "category": "Food & Drink (dishware)",
- "group": "Food & Drink",
- "subgroup": "dishware"
- },
- {
- "codes": "1F944",
- "char": "🥄",
- "name": "spoon",
- "category": "Food & Drink (dishware)",
- "group": "Food & Drink",
- "subgroup": "dishware"
- },
- {
- "codes": "1F52A",
- "char": "🔪",
- "name": "kitchen knife",
- "category": "Food & Drink (dishware)",
- "group": "Food & Drink",
- "subgroup": "dishware"
- },
- {
- "codes": "1F3FA",
- "char": "🏺",
- "name": "amphora",
- "category": "Food & Drink (dishware)",
- "group": "Food & Drink",
- "subgroup": "dishware"
- },
- {
- "codes": "1F30D",
- "char": "🌍",
- "name": "globe showing Europe-Africa",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F30E",
- "char": "🌎",
- "name": "globe showing Americas",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F30F",
- "char": "🌏",
- "name": "globe showing Asia-Australia",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F310",
- "char": "🌐",
- "name": "globe with meridians",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F5FA",
- "char": "🗺",
- "name": "world map",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F5FE",
- "char": "🗾",
- "name": "map of Japan",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F9ED",
- "char": "🧭",
- "name": "compass",
- "category": "Travel & Places (place-map)",
- "group": "Travel & Places",
- "subgroup": "place-map"
- },
- {
- "codes": "1F3D4",
- "char": "🏔",
- "name": "snow-capped mountain",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "26F0",
- "char": "⛰",
- "name": "mountain",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F30B",
- "char": "🌋",
- "name": "volcano",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F5FB",
- "char": "🗻",
- "name": "mount fuji",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F3D5",
- "char": "🏕",
- "name": "camping",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F3D6",
- "char": "🏖",
- "name": "beach with umbrella",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F3DC",
- "char": "🏜",
- "name": "desert",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F3DD",
- "char": "🏝",
- "name": "desert island",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F3DE",
- "char": "🏞",
- "name": "national park",
- "category": "Travel & Places (place-geographic)",
- "group": "Travel & Places",
- "subgroup": "place-geographic"
- },
- {
- "codes": "1F3DF",
- "char": "🏟",
- "name": "stadium",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3DB",
- "char": "🏛",
- "name": "classical building",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3D7",
- "char": "🏗",
- "name": "building construction",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F9F1",
- "char": "🧱",
- "name": "brick",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1FAA8",
- "char": "🪨",
- "name": "rock",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1FAB5",
- "char": "🪵",
- "name": "wood",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F6D6",
- "char": "🛖",
- "name": "hut",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3D8",
- "char": "🏘",
- "name": "houses",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3DA",
- "char": "🏚",
- "name": "derelict house",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E0",
- "char": "🏠",
- "name": "house",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E1",
- "char": "🏡",
- "name": "house with garden",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E2",
- "char": "🏢",
- "name": "office building",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E3",
- "char": "🏣",
- "name": "Japanese post office",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E4",
- "char": "🏤",
- "name": "post office",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E5",
- "char": "🏥",
- "name": "hospital",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E6",
- "char": "🏦",
- "name": "bank",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E8",
- "char": "🏨",
- "name": "hotel",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3E9",
- "char": "🏩",
- "name": "love hotel",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3EA",
- "char": "🏪",
- "name": "convenience store",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3EB",
- "char": "🏫",
- "name": "school",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3EC",
- "char": "🏬",
- "name": "department store",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3ED",
- "char": "🏭",
- "name": "factory",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3EF",
- "char": "🏯",
- "name": "Japanese castle",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F3F0",
- "char": "🏰",
- "name": "castle",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F492",
- "char": "💒",
- "name": "wedding",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F5FC",
- "char": "🗼",
- "name": "Tokyo tower",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "1F5FD",
- "char": "🗽",
- "name": "Statue of Liberty",
- "category": "Travel & Places (place-building)",
- "group": "Travel & Places",
- "subgroup": "place-building"
- },
- {
- "codes": "26EA",
- "char": "⛪",
- "name": "church",
- "category": "Travel & Places (place-religious)",
- "group": "Travel & Places",
- "subgroup": "place-religious"
- },
- {
- "codes": "1F54C",
- "char": "🕌",
- "name": "mosque",
- "category": "Travel & Places (place-religious)",
- "group": "Travel & Places",
- "subgroup": "place-religious"
- },
- {
- "codes": "1F6D5",
- "char": "🛕",
- "name": "hindu temple",
- "category": "Travel & Places (place-religious)",
- "group": "Travel & Places",
- "subgroup": "place-religious"
- },
- {
- "codes": "1F54D",
- "char": "🕍",
- "name": "synagogue",
- "category": "Travel & Places (place-religious)",
- "group": "Travel & Places",
- "subgroup": "place-religious"
- },
- {
- "codes": "26E9",
- "char": "⛩",
- "name": "shinto shrine",
- "category": "Travel & Places (place-religious)",
- "group": "Travel & Places",
- "subgroup": "place-religious"
- },
- {
- "codes": "1F54B",
- "char": "🕋",
- "name": "kaaba",
- "category": "Travel & Places (place-religious)",
- "group": "Travel & Places",
- "subgroup": "place-religious"
- },
- {
- "codes": "26F2",
- "char": "⛲",
- "name": "fountain",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "26FA",
- "char": "⛺",
- "name": "tent",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F301",
- "char": "🌁",
- "name": "foggy",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F303",
- "char": "🌃",
- "name": "night with stars",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F3D9",
- "char": "🏙",
- "name": "cityscape",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F304",
- "char": "🌄",
- "name": "sunrise over mountains",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F305",
- "char": "🌅",
- "name": "sunrise",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F306",
- "char": "🌆",
- "name": "cityscape at dusk",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F307",
- "char": "🌇",
- "name": "sunset",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F309",
- "char": "🌉",
- "name": "bridge at night",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "2668",
- "char": "♨",
- "name": "hot springs",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F3A0",
- "char": "🎠",
- "name": "carousel horse",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F3A1",
- "char": "🎡",
- "name": "ferris wheel",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F3A2",
- "char": "🎢",
- "name": "roller coaster",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F488",
- "char": "💈",
- "name": "barber pole",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F3AA",
- "char": "🎪",
- "name": "circus tent",
- "category": "Travel & Places (place-other)",
- "group": "Travel & Places",
- "subgroup": "place-other"
- },
- {
- "codes": "1F682",
- "char": "🚂",
- "name": "locomotive",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F683",
- "char": "🚃",
- "name": "railway car",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F684",
- "char": "🚄",
- "name": "high-speed train",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F685",
- "char": "🚅",
- "name": "bullet train",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F686",
- "char": "🚆",
- "name": "train",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F687",
- "char": "🚇",
- "name": "metro",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F688",
- "char": "🚈",
- "name": "light rail",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F689",
- "char": "🚉",
- "name": "station",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F68A",
- "char": "🚊",
- "name": "tram",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F69D",
- "char": "🚝",
- "name": "monorail",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F69E",
- "char": "🚞",
- "name": "mountain railway",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F68B",
- "char": "🚋",
- "name": "tram car",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F68C",
- "char": "🚌",
- "name": "bus",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F68D",
- "char": "🚍",
- "name": "oncoming bus",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F68E",
- "char": "🚎",
- "name": "trolleybus",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F690",
- "char": "🚐",
- "name": "minibus",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F691",
- "char": "🚑",
- "name": "ambulance",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F692",
- "char": "🚒",
- "name": "fire engine",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F693",
- "char": "🚓",
- "name": "police car",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F694",
- "char": "🚔",
- "name": "oncoming police car",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F695",
- "char": "🚕",
- "name": "taxi",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F696",
- "char": "🚖",
- "name": "oncoming taxi",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F697",
- "char": "🚗",
- "name": "automobile",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F698",
- "char": "🚘",
- "name": "oncoming automobile",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F699",
- "char": "🚙",
- "name": "sport utility vehicle",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6FB",
- "char": "🛻",
- "name": "pickup truck",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F69A",
- "char": "🚚",
- "name": "delivery truck",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F69B",
- "char": "🚛",
- "name": "articulated lorry",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F69C",
- "char": "🚜",
- "name": "tractor",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F3CE",
- "char": "🏎",
- "name": "racing car",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F3CD",
- "char": "🏍",
- "name": "motorcycle",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6F5",
- "char": "🛵",
- "name": "motor scooter",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F9BD",
- "char": "🦽",
- "name": "manual wheelchair",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F9BC",
- "char": "🦼",
- "name": "motorized wheelchair",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6FA",
- "char": "🛺",
- "name": "auto rickshaw",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6B2",
- "char": "🚲",
- "name": "bicycle",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6F4",
- "char": "🛴",
- "name": "kick scooter",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6F9",
- "char": "🛹",
- "name": "skateboard",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6FC",
- "char": "🛼",
- "name": "roller skate",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F68F",
- "char": "🚏",
- "name": "bus stop",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6E3",
- "char": "🛣",
- "name": "motorway",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6E4",
- "char": "🛤",
- "name": "railway track",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6E2",
- "char": "🛢",
- "name": "oil drum",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "26FD",
- "char": "⛽",
- "name": "fuel pump",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6A8",
- "char": "🚨",
- "name": "police car light",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6A5",
- "char": "🚥",
- "name": "horizontal traffic light",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6A6",
- "char": "🚦",
- "name": "vertical traffic light",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6D1",
- "char": "🛑",
- "name": "stop sign",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "1F6A7",
- "char": "🚧",
- "name": "construction",
- "category": "Travel & Places (transport-ground)",
- "group": "Travel & Places",
- "subgroup": "transport-ground"
- },
- {
- "codes": "2693",
- "char": "⚓",
- "name": "anchor",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "26F5",
- "char": "⛵",
- "name": "sailboat",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "1F6F6",
- "char": "🛶",
- "name": "canoe",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "1F6A4",
- "char": "🚤",
- "name": "speedboat",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "1F6F3",
- "char": "🛳",
- "name": "passenger ship",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "26F4",
- "char": "⛴",
- "name": "ferry",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "1F6E5",
- "char": "🛥",
- "name": "motor boat",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "1F6A2",
- "char": "🚢",
- "name": "ship",
- "category": "Travel & Places (transport-water)",
- "group": "Travel & Places",
- "subgroup": "transport-water"
- },
- {
- "codes": "2708",
- "char": "✈",
- "name": "airplane",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6E9",
- "char": "🛩",
- "name": "small airplane",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6EB",
- "char": "🛫",
- "name": "airplane departure",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6EC",
- "char": "🛬",
- "name": "airplane arrival",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1FA82",
- "char": "🪂",
- "name": "parachute",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F4BA",
- "char": "💺",
- "name": "seat",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F681",
- "char": "🚁",
- "name": "helicopter",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F69F",
- "char": "🚟",
- "name": "suspension railway",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6A0",
- "char": "🚠",
- "name": "mountain cableway",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6A1",
- "char": "🚡",
- "name": "aerial tramway",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6F0",
- "char": "🛰",
- "name": "satellite",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F680",
- "char": "🚀",
- "name": "rocket",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6F8",
- "char": "🛸",
- "name": "flying saucer",
- "category": "Travel & Places (transport-air)",
- "group": "Travel & Places",
- "subgroup": "transport-air"
- },
- {
- "codes": "1F6CE",
- "char": "🛎",
- "name": "bellhop bell",
- "category": "Travel & Places (hotel)",
- "group": "Travel & Places",
- "subgroup": "hotel"
- },
- {
- "codes": "1F9F3",
- "char": "🧳",
- "name": "luggage",
- "category": "Travel & Places (hotel)",
- "group": "Travel & Places",
- "subgroup": "hotel"
- },
- {
- "codes": "231B",
- "char": "⌛",
- "name": "hourglass done",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "23F3",
- "char": "⏳",
- "name": "hourglass not done",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "231A",
- "char": "⌚",
- "name": "watch",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "23F0",
- "char": "⏰",
- "name": "alarm clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "23F1",
- "char": "⏱",
- "name": "stopwatch",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "23F2",
- "char": "⏲",
- "name": "timer clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F570",
- "char": "🕰",
- "name": "mantelpiece clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F55B",
- "char": "🕛",
- "name": "twelve o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F567",
- "char": "🕧",
- "name": "twelve-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F550",
- "char": "🕐",
- "name": "one o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F55C",
- "char": "🕜",
- "name": "one-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F551",
- "char": "🕑",
- "name": "two o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F55D",
- "char": "🕝",
- "name": "two-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F552",
- "char": "🕒",
- "name": "three o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F55E",
- "char": "🕞",
- "name": "three-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F553",
- "char": "🕓",
- "name": "four o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F55F",
- "char": "🕟",
- "name": "four-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F554",
- "char": "🕔",
- "name": "five o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F560",
- "char": "🕠",
- "name": "five-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F555",
- "char": "🕕",
- "name": "six o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F561",
- "char": "🕡",
- "name": "six-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F556",
- "char": "🕖",
- "name": "seven o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F562",
- "char": "🕢",
- "name": "seven-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F557",
- "char": "🕗",
- "name": "eight o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F563",
- "char": "🕣",
- "name": "eight-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F558",
- "char": "🕘",
- "name": "nine o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F564",
- "char": "🕤",
- "name": "nine-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F559",
- "char": "🕙",
- "name": "ten o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F565",
- "char": "🕥",
- "name": "ten-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F55A",
- "char": "🕚",
- "name": "eleven o’clock",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F566",
- "char": "🕦",
- "name": "eleven-thirty",
- "category": "Travel & Places (time)",
- "group": "Travel & Places",
- "subgroup": "time"
- },
- {
- "codes": "1F311",
- "char": "🌑",
- "name": "new moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F312",
- "char": "🌒",
- "name": "waxing crescent moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F313",
- "char": "🌓",
- "name": "first quarter moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F314",
- "char": "🌔",
- "name": "waxing gibbous moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F315",
- "char": "🌕",
- "name": "full moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F316",
- "char": "🌖",
- "name": "waning gibbous moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F317",
- "char": "🌗",
- "name": "last quarter moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F318",
- "char": "🌘",
- "name": "waning crescent moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F319",
- "char": "🌙",
- "name": "crescent moon",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F31A",
- "char": "🌚",
- "name": "new moon face",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F31B",
- "char": "🌛",
- "name": "first quarter moon face",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F31C",
- "char": "🌜",
- "name": "last quarter moon face",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F321",
- "char": "🌡",
- "name": "thermometer",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2600",
- "char": "☀",
- "name": "sun",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F31D",
- "char": "🌝",
- "name": "full moon face",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F31E",
- "char": "🌞",
- "name": "sun with face",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1FA90",
- "char": "🪐",
- "name": "ringed planet",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2B50",
- "char": "⭐",
- "name": "star",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F31F",
- "char": "🌟",
- "name": "glowing star",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F320",
- "char": "🌠",
- "name": "shooting star",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F30C",
- "char": "🌌",
- "name": "milky way",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2601",
- "char": "☁",
- "name": "cloud",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "26C5",
- "char": "⛅",
- "name": "sun behind cloud",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "26C8",
- "char": "⛈",
- "name": "cloud with lightning and rain",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F324",
- "char": "🌤",
- "name": "sun behind small cloud",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F325",
- "char": "🌥",
- "name": "sun behind large cloud",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F326",
- "char": "🌦",
- "name": "sun behind rain cloud",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F327",
- "char": "🌧",
- "name": "cloud with rain",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F328",
- "char": "🌨",
- "name": "cloud with snow",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F329",
- "char": "🌩",
- "name": "cloud with lightning",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F32A",
- "char": "🌪",
- "name": "tornado",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F32B",
- "char": "🌫",
- "name": "fog",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F32C",
- "char": "🌬",
- "name": "wind face",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F300",
- "char": "🌀",
- "name": "cyclone",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F308",
- "char": "🌈",
- "name": "rainbow",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F302",
- "char": "🌂",
- "name": "closed umbrella",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2602",
- "char": "☂",
- "name": "umbrella",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2614",
- "char": "☔",
- "name": "umbrella with rain drops",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "26F1",
- "char": "⛱",
- "name": "umbrella on ground",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "26A1",
- "char": "⚡",
- "name": "high voltage",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2744",
- "char": "❄",
- "name": "snowflake",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2603",
- "char": "☃",
- "name": "snowman",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "26C4",
- "char": "⛄",
- "name": "snowman without snow",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "2604",
- "char": "☄",
- "name": "comet",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F525",
- "char": "🔥",
- "name": "fire",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F4A7",
- "char": "💧",
- "name": "droplet",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F30A",
- "char": "🌊",
- "name": "water wave",
- "category": "Travel & Places (sky & weather)",
- "group": "Travel & Places",
- "subgroup": "sky & weather"
- },
- {
- "codes": "1F383",
- "char": "🎃",
- "name": "jack-o-lantern",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F384",
- "char": "🎄",
- "name": "Christmas tree",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F386",
- "char": "🎆",
- "name": "fireworks",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F387",
- "char": "🎇",
- "name": "sparkler",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F9E8",
- "char": "🧨",
- "name": "firecracker",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "2728",
- "char": "✨",
- "name": "sparkles",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F388",
- "char": "🎈",
- "name": "balloon",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F389",
- "char": "🎉",
- "name": "party popper",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F38A",
- "char": "🎊",
- "name": "confetti ball",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F38B",
- "char": "🎋",
- "name": "tanabata tree",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F38D",
- "char": "🎍",
- "name": "pine decoration",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F38E",
- "char": "🎎",
- "name": "Japanese dolls",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F38F",
- "char": "🎏",
- "name": "carp streamer",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F390",
- "char": "🎐",
- "name": "wind chime",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F391",
- "char": "🎑",
- "name": "moon viewing ceremony",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F9E7",
- "char": "🧧",
- "name": "red envelope",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F380",
- "char": "🎀",
- "name": "ribbon",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F381",
- "char": "🎁",
- "name": "wrapped gift",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F397",
- "char": "🎗",
- "name": "reminder ribbon",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F39F",
- "char": "🎟",
- "name": "admission tickets",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F3AB",
- "char": "🎫",
- "name": "ticket",
- "category": "Activities (event)",
- "group": "Activities",
- "subgroup": "event"
- },
- {
- "codes": "1F396",
- "char": "🎖",
- "name": "military medal",
- "category": "Activities (award-medal)",
- "group": "Activities",
- "subgroup": "award-medal"
- },
- {
- "codes": "1F3C6",
- "char": "🏆",
- "name": "trophy",
- "category": "Activities (award-medal)",
- "group": "Activities",
- "subgroup": "award-medal"
- },
- {
- "codes": "1F3C5",
- "char": "🏅",
- "name": "sports medal",
- "category": "Activities (award-medal)",
- "group": "Activities",
- "subgroup": "award-medal"
- },
- {
- "codes": "1F947",
- "char": "🥇",
- "name": "1st place medal",
- "category": "Activities (award-medal)",
- "group": "Activities",
- "subgroup": "award-medal"
- },
- {
- "codes": "1F948",
- "char": "🥈",
- "name": "2nd place medal",
- "category": "Activities (award-medal)",
- "group": "Activities",
- "subgroup": "award-medal"
- },
- {
- "codes": "1F949",
- "char": "🥉",
- "name": "3rd place medal",
- "category": "Activities (award-medal)",
- "group": "Activities",
- "subgroup": "award-medal"
- },
- {
- "codes": "26BD",
- "char": "⚽",
- "name": "soccer ball",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "26BE",
- "char": "⚾",
- "name": "baseball",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F94E",
- "char": "🥎",
- "name": "softball",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3C0",
- "char": "🏀",
- "name": "basketball",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3D0",
- "char": "🏐",
- "name": "volleyball",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3C8",
- "char": "🏈",
- "name": "american football",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3C9",
- "char": "🏉",
- "name": "rugby football",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3BE",
- "char": "🎾",
- "name": "tennis",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F94F",
- "char": "🥏",
- "name": "flying disc",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3B3",
- "char": "🎳",
- "name": "bowling",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3CF",
- "char": "🏏",
- "name": "cricket game",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3D1",
- "char": "🏑",
- "name": "field hockey",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3D2",
- "char": "🏒",
- "name": "ice hockey",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F94D",
- "char": "🥍",
- "name": "lacrosse",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3D3",
- "char": "🏓",
- "name": "ping pong",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3F8",
- "char": "🏸",
- "name": "badminton",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F94A",
- "char": "🥊",
- "name": "boxing glove",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F94B",
- "char": "🥋",
- "name": "martial arts uniform",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F945",
- "char": "🥅",
- "name": "goal net",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "26F3",
- "char": "⛳",
- "name": "flag in hole",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "26F8",
- "char": "⛸",
- "name": "ice skate",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3A3",
- "char": "🎣",
- "name": "fishing pole",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F93F",
- "char": "🤿",
- "name": "diving mask",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3BD",
- "char": "🎽",
- "name": "running shirt",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3BF",
- "char": "🎿",
- "name": "skis",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F6F7",
- "char": "🛷",
- "name": "sled",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F94C",
- "char": "🥌",
- "name": "curling stone",
- "category": "Activities (sport)",
- "group": "Activities",
- "subgroup": "sport"
- },
- {
- "codes": "1F3AF",
- "char": "🎯",
- "name": "bullseye",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1FA80",
- "char": "🪀",
- "name": "yo-yo",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1FA81",
- "char": "🪁",
- "name": "kite",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F3B1",
- "char": "🎱",
- "name": "pool 8 ball",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F52E",
- "char": "🔮",
- "name": "crystal ball",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1FA84",
- "char": "🪄",
- "name": "magic wand",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F9FF",
- "char": "🧿",
- "name": "nazar amulet",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F3AE",
- "char": "🎮",
- "name": "video game",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F579",
- "char": "🕹",
- "name": "joystick",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F3B0",
- "char": "🎰",
- "name": "slot machine",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F3B2",
- "char": "🎲",
- "name": "game die",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F9E9",
- "char": "🧩",
- "name": "puzzle piece",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F9F8",
- "char": "🧸",
- "name": "teddy bear",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1FA85",
- "char": "🪅",
- "name": "piñata",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1FA86",
- "char": "🪆",
- "name": "nesting dolls",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "2660",
- "char": "♠",
- "name": "spade suit",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "2665",
- "char": "♥",
- "name": "heart suit",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "2666",
- "char": "♦",
- "name": "diamond suit",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "2663",
- "char": "♣",
- "name": "club suit",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "265F",
- "char": "♟",
- "name": "chess pawn",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F0CF",
- "char": "🃏",
- "name": "joker",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F004",
- "char": "🀄",
- "name": "mahjong red dragon",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F3B4",
- "char": "🎴",
- "name": "flower playing cards",
- "category": "Activities (game)",
- "group": "Activities",
- "subgroup": "game"
- },
- {
- "codes": "1F3AD",
- "char": "🎭",
- "name": "performing arts",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1F5BC",
- "char": "🖼",
- "name": "framed picture",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1F3A8",
- "char": "🎨",
- "name": "artist palette",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1F9F5",
- "char": "🧵",
- "name": "thread",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1FAA1",
- "char": "🪡",
- "name": "sewing needle",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1F9F6",
- "char": "🧶",
- "name": "yarn",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1FAA2",
- "char": "🪢",
- "name": "knot",
- "category": "Activities (arts & crafts)",
- "group": "Activities",
- "subgroup": "arts & crafts"
- },
- {
- "codes": "1F453",
- "char": "👓",
- "name": "glasses",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F576",
- "char": "🕶",
- "name": "sunglasses",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F97D",
- "char": "🥽",
- "name": "goggles",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F97C",
- "char": "🥼",
- "name": "lab coat",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F9BA",
- "char": "🦺",
- "name": "safety vest",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F454",
- "char": "👔",
- "name": "necktie",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F455",
- "char": "👕",
- "name": "t-shirt",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F456",
- "char": "👖",
- "name": "jeans",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F9E3",
- "char": "🧣",
- "name": "scarf",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F9E4",
- "char": "🧤",
- "name": "gloves",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F9E5",
- "char": "🧥",
- "name": "coat",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F9E6",
- "char": "🧦",
- "name": "socks",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F457",
- "char": "👗",
- "name": "dress",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F458",
- "char": "👘",
- "name": "kimono",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F97B",
- "char": "🥻",
- "name": "sari",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1FA71",
- "char": "🩱",
- "name": "one-piece swimsuit",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1FA72",
- "char": "🩲",
- "name": "briefs",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1FA73",
- "char": "🩳",
- "name": "shorts",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F459",
- "char": "👙",
- "name": "bikini",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F45A",
- "char": "👚",
- "name": "woman’s clothes",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F45B",
- "char": "👛",
- "name": "purse",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F45C",
- "char": "👜",
- "name": "handbag",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F45D",
- "char": "👝",
- "name": "clutch bag",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F6CD",
- "char": "🛍",
- "name": "shopping bags",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F392",
- "char": "🎒",
- "name": "backpack",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1FA74",
- "char": "🩴",
- "name": "thong sandal",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F45E",
- "char": "👞",
- "name": "man’s shoe",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F45F",
- "char": "👟",
- "name": "running shoe",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F97E",
- "char": "🥾",
- "name": "hiking boot",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F97F",
- "char": "🥿",
- "name": "flat shoe",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F460",
- "char": "👠",
- "name": "high-heeled shoe",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F461",
- "char": "👡",
- "name": "woman’s sandal",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1FA70",
- "char": "🩰",
- "name": "ballet shoes",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F462",
- "char": "👢",
- "name": "woman’s boot",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F451",
- "char": "👑",
- "name": "crown",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F452",
- "char": "👒",
- "name": "woman’s hat",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F3A9",
- "char": "🎩",
- "name": "top hat",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F393",
- "char": "🎓",
- "name": "graduation cap",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F9E2",
- "char": "🧢",
- "name": "billed cap",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1FA96",
- "char": "🪖",
- "name": "military helmet",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "26D1",
- "char": "⛑",
- "name": "rescue worker’s helmet",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F4FF",
- "char": "📿",
- "name": "prayer beads",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F484",
- "char": "💄",
- "name": "lipstick",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F48D",
- "char": "💍",
- "name": "ring",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F48E",
- "char": "💎",
- "name": "gem stone",
- "category": "Objects (clothing)",
- "group": "Objects",
- "subgroup": "clothing"
- },
- {
- "codes": "1F507",
- "char": "🔇",
- "name": "muted speaker",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F508",
- "char": "🔈",
- "name": "speaker low volume",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F509",
- "char": "🔉",
- "name": "speaker medium volume",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F50A",
- "char": "🔊",
- "name": "speaker high volume",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F4E2",
- "char": "📢",
- "name": "loudspeaker",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F4E3",
- "char": "📣",
- "name": "megaphone",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F4EF",
- "char": "📯",
- "name": "postal horn",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F514",
- "char": "🔔",
- "name": "bell",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F515",
- "char": "🔕",
- "name": "bell with slash",
- "category": "Objects (sound)",
- "group": "Objects",
- "subgroup": "sound"
- },
- {
- "codes": "1F3BC",
- "char": "🎼",
- "name": "musical score",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F3B5",
- "char": "🎵",
- "name": "musical note",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F3B6",
- "char": "🎶",
- "name": "musical notes",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F399",
- "char": "🎙",
- "name": "studio microphone",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F39A",
- "char": "🎚",
- "name": "level slider",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F39B",
- "char": "🎛",
- "name": "control knobs",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F3A4",
- "char": "🎤",
- "name": "microphone",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F3A7",
- "char": "🎧",
- "name": "headphone",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F4FB",
- "char": "📻",
- "name": "radio",
- "category": "Objects (music)",
- "group": "Objects",
- "subgroup": "music"
- },
- {
- "codes": "1F3B7",
- "char": "🎷",
- "name": "saxophone",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1FA97",
- "char": "🪗",
- "name": "accordion",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1F3B8",
- "char": "🎸",
- "name": "guitar",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1F3B9",
- "char": "🎹",
- "name": "musical keyboard",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1F3BA",
- "char": "🎺",
- "name": "trumpet",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1F3BB",
- "char": "🎻",
- "name": "violin",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1FA95",
- "char": "🪕",
- "name": "banjo",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1F941",
- "char": "🥁",
- "name": "drum",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1FA98",
- "char": "🪘",
- "name": "long drum",
- "category": "Objects (musical-instrument)",
- "group": "Objects",
- "subgroup": "musical-instrument"
- },
- {
- "codes": "1F4F1",
- "char": "📱",
- "name": "mobile phone",
- "category": "Objects (phone)",
- "group": "Objects",
- "subgroup": "phone"
- },
- {
- "codes": "1F4F2",
- "char": "📲",
- "name": "mobile phone with arrow",
- "category": "Objects (phone)",
- "group": "Objects",
- "subgroup": "phone"
- },
- {
- "codes": "260E",
- "char": "☎",
- "name": "telephone",
- "category": "Objects (phone)",
- "group": "Objects",
- "subgroup": "phone"
- },
- {
- "codes": "1F4DE",
- "char": "📞",
- "name": "telephone receiver",
- "category": "Objects (phone)",
- "group": "Objects",
- "subgroup": "phone"
- },
- {
- "codes": "1F4DF",
- "char": "📟",
- "name": "pager",
- "category": "Objects (phone)",
- "group": "Objects",
- "subgroup": "phone"
- },
- {
- "codes": "1F4E0",
- "char": "📠",
- "name": "fax machine",
- "category": "Objects (phone)",
- "group": "Objects",
- "subgroup": "phone"
- },
- {
- "codes": "1F50B",
- "char": "🔋",
- "name": "battery",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F50C",
- "char": "🔌",
- "name": "electric plug",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F4BB",
- "char": "💻",
- "name": "laptop",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F5A5",
- "char": "🖥",
- "name": "desktop computer",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F5A8",
- "char": "🖨",
- "name": "printer",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "2328",
- "char": "⌨",
- "name": "keyboard",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F5B1",
- "char": "🖱",
- "name": "computer mouse",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F5B2",
- "char": "🖲",
- "name": "trackball",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F4BD",
- "char": "💽",
- "name": "computer disk",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F4BE",
- "char": "💾",
- "name": "floppy disk",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F4BF",
- "char": "💿",
- "name": "optical disk",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F4C0",
- "char": "📀",
- "name": "dvd",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F9EE",
- "char": "🧮",
- "name": "abacus",
- "category": "Objects (computer)",
- "group": "Objects",
- "subgroup": "computer"
- },
- {
- "codes": "1F3A5",
- "char": "🎥",
- "name": "movie camera",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F39E",
- "char": "🎞",
- "name": "film frames",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4FD",
- "char": "📽",
- "name": "film projector",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F3AC",
- "char": "🎬",
- "name": "clapper board",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4FA",
- "char": "📺",
- "name": "television",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4F7",
- "char": "📷",
- "name": "camera",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4F8",
- "char": "📸",
- "name": "camera with flash",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4F9",
- "char": "📹",
- "name": "video camera",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4FC",
- "char": "📼",
- "name": "videocassette",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F50D",
- "char": "🔍",
- "name": "magnifying glass tilted left",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F50E",
- "char": "🔎",
- "name": "magnifying glass tilted right",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F56F",
- "char": "🕯",
- "name": "candle",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4A1",
- "char": "💡",
- "name": "light bulb",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F526",
- "char": "🔦",
- "name": "flashlight",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F3EE",
- "char": "🏮",
- "name": "red paper lantern",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1FA94",
- "char": "🪔",
- "name": "diya lamp",
- "category": "Objects (light & video)",
- "group": "Objects",
- "subgroup": "light & video"
- },
- {
- "codes": "1F4D4",
- "char": "📔",
- "name": "notebook with decorative cover",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D5",
- "char": "📕",
- "name": "closed book",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D6",
- "char": "📖",
- "name": "open book",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D7",
- "char": "📗",
- "name": "green book",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D8",
- "char": "📘",
- "name": "blue book",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D9",
- "char": "📙",
- "name": "orange book",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4DA",
- "char": "📚",
- "name": "books",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D3",
- "char": "📓",
- "name": "notebook",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D2",
- "char": "📒",
- "name": "ledger",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4C3",
- "char": "📃",
- "name": "page with curl",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4DC",
- "char": "📜",
- "name": "scroll",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4C4",
- "char": "📄",
- "name": "page facing up",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4F0",
- "char": "📰",
- "name": "newspaper",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F5DE",
- "char": "🗞",
- "name": "rolled-up newspaper",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4D1",
- "char": "📑",
- "name": "bookmark tabs",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F516",
- "char": "🔖",
- "name": "bookmark",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F3F7",
- "char": "🏷",
- "name": "label",
- "category": "Objects (book-paper)",
- "group": "Objects",
- "subgroup": "book-paper"
- },
- {
- "codes": "1F4B0",
- "char": "💰",
- "name": "money bag",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1FA99",
- "char": "🪙",
- "name": "coin",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B4",
- "char": "💴",
- "name": "yen banknote",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B5",
- "char": "💵",
- "name": "dollar banknote",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B6",
- "char": "💶",
- "name": "euro banknote",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B7",
- "char": "💷",
- "name": "pound banknote",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B8",
- "char": "💸",
- "name": "money with wings",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B3",
- "char": "💳",
- "name": "credit card",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F9FE",
- "char": "🧾",
- "name": "receipt",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "1F4B9",
- "char": "💹",
- "name": "chart increasing with yen",
- "category": "Objects (money)",
- "group": "Objects",
- "subgroup": "money"
- },
- {
- "codes": "2709",
- "char": "✉",
- "name": "envelope",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4E7",
- "char": "📧",
- "name": "e-mail",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4E8",
- "char": "📨",
- "name": "incoming envelope",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4E9",
- "char": "📩",
- "name": "envelope with arrow",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4E4",
- "char": "📤",
- "name": "outbox tray",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4E5",
- "char": "📥",
- "name": "inbox tray",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4E6",
- "char": "📦",
- "name": "package",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4EB",
- "char": "📫",
- "name": "closed mailbox with raised flag",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4EA",
- "char": "📪",
- "name": "closed mailbox with lowered flag",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4EC",
- "char": "📬",
- "name": "open mailbox with raised flag",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4ED",
- "char": "📭",
- "name": "open mailbox with lowered flag",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F4EE",
- "char": "📮",
- "name": "postbox",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "1F5F3",
- "char": "🗳",
- "name": "ballot box with ballot",
- "category": "Objects (mail)",
- "group": "Objects",
- "subgroup": "mail"
- },
- {
- "codes": "270F",
- "char": "✏",
- "name": "pencil",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "2712",
- "char": "✒",
- "name": "black nib",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "1F58B",
- "char": "🖋",
- "name": "fountain pen",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "1F58A",
- "char": "🖊",
- "name": "pen",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "1F58C",
- "char": "🖌",
- "name": "paintbrush",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "1F58D",
- "char": "🖍",
- "name": "crayon",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "1F4DD",
- "char": "📝",
- "name": "memo",
- "category": "Objects (writing)",
- "group": "Objects",
- "subgroup": "writing"
- },
- {
- "codes": "1F4BC",
- "char": "💼",
- "name": "briefcase",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C1",
- "char": "📁",
- "name": "file folder",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C2",
- "char": "📂",
- "name": "open file folder",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F5C2",
- "char": "🗂",
- "name": "card index dividers",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C5",
- "char": "📅",
- "name": "calendar",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C6",
- "char": "📆",
- "name": "tear-off calendar",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F5D2",
- "char": "🗒",
- "name": "spiral notepad",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F5D3",
- "char": "🗓",
- "name": "spiral calendar",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C7",
- "char": "📇",
- "name": "card index",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C8",
- "char": "📈",
- "name": "chart increasing",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4C9",
- "char": "📉",
- "name": "chart decreasing",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4CA",
- "char": "📊",
- "name": "bar chart",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4CB",
- "char": "📋",
- "name": "clipboard",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4CC",
- "char": "📌",
- "name": "pushpin",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4CD",
- "char": "📍",
- "name": "round pushpin",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4CE",
- "char": "📎",
- "name": "paperclip",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F587",
- "char": "🖇",
- "name": "linked paperclips",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4CF",
- "char": "📏",
- "name": "straight ruler",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F4D0",
- "char": "📐",
- "name": "triangular ruler",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "2702",
- "char": "✂",
- "name": "scissors",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F5C3",
- "char": "🗃",
- "name": "card file box",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F5C4",
- "char": "🗄",
- "name": "file cabinet",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F5D1",
- "char": "🗑",
- "name": "wastebasket",
- "category": "Objects (office)",
- "group": "Objects",
- "subgroup": "office"
- },
- {
- "codes": "1F512",
- "char": "🔒",
- "name": "locked",
- "category": "Objects (lock)",
- "group": "Objects",
- "subgroup": "lock"
- },
- {
- "codes": "1F513",
- "char": "🔓",
- "name": "unlocked",
- "category": "Objects (lock)",
- "group": "Objects",
- "subgroup": "lock"
- },
- {
- "codes": "1F50F",
- "char": "🔏",
- "name": "locked with pen",
- "category": "Objects (lock)",
- "group": "Objects",
- "subgroup": "lock"
- },
- {
- "codes": "1F510",
- "char": "🔐",
- "name": "locked with key",
- "category": "Objects (lock)",
- "group": "Objects",
- "subgroup": "lock"
- },
- {
- "codes": "1F511",
- "char": "🔑",
- "name": "key",
- "category": "Objects (lock)",
- "group": "Objects",
- "subgroup": "lock"
- },
- {
- "codes": "1F5DD",
- "char": "🗝",
- "name": "old key",
- "category": "Objects (lock)",
- "group": "Objects",
- "subgroup": "lock"
- },
- {
- "codes": "1F528",
- "char": "🔨",
- "name": "hammer",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1FA93",
- "char": "🪓",
- "name": "axe",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "26CF",
- "char": "⛏",
- "name": "pick",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "2692",
- "char": "⚒",
- "name": "hammer and pick",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F6E0",
- "char": "🛠",
- "name": "hammer and wrench",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F5E1",
- "char": "🗡",
- "name": "dagger",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "2694",
- "char": "⚔",
- "name": "crossed swords",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F52B",
- "char": "🔫",
- "name": "water pistol",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1FA83",
- "char": "🪃",
- "name": "boomerang",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F3F9",
- "char": "🏹",
- "name": "bow and arrow",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F6E1",
- "char": "🛡",
- "name": "shield",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1FA9A",
- "char": "🪚",
- "name": "carpentry saw",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F527",
- "char": "🔧",
- "name": "wrench",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1FA9B",
- "char": "🪛",
- "name": "screwdriver",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F529",
- "char": "🔩",
- "name": "nut and bolt",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "2699",
- "char": "⚙",
- "name": "gear",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F5DC",
- "char": "🗜",
- "name": "clamp",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "2696",
- "char": "⚖",
- "name": "balance scale",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F9AF",
- "char": "🦯",
- "name": "white cane",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F517",
- "char": "🔗",
- "name": "link",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "26D3",
- "char": "⛓",
- "name": "chains",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1FA9D",
- "char": "🪝",
- "name": "hook",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F9F0",
- "char": "🧰",
- "name": "toolbox",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1F9F2",
- "char": "🧲",
- "name": "magnet",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "1FA9C",
- "char": "🪜",
- "name": "ladder",
- "category": "Objects (tool)",
- "group": "Objects",
- "subgroup": "tool"
- },
- {
- "codes": "2697",
- "char": "⚗",
- "name": "alembic",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F9EA",
- "char": "🧪",
- "name": "test tube",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F9EB",
- "char": "🧫",
- "name": "petri dish",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F9EC",
- "char": "🧬",
- "name": "dna",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F52C",
- "char": "🔬",
- "name": "microscope",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F52D",
- "char": "🔭",
- "name": "telescope",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F4E1",
- "char": "📡",
- "name": "satellite antenna",
- "category": "Objects (science)",
- "group": "Objects",
- "subgroup": "science"
- },
- {
- "codes": "1F489",
- "char": "💉",
- "name": "syringe",
- "category": "Objects (medical)",
- "group": "Objects",
- "subgroup": "medical"
- },
- {
- "codes": "1FA78",
- "char": "🩸",
- "name": "drop of blood",
- "category": "Objects (medical)",
- "group": "Objects",
- "subgroup": "medical"
- },
- {
- "codes": "1F48A",
- "char": "💊",
- "name": "pill",
- "category": "Objects (medical)",
- "group": "Objects",
- "subgroup": "medical"
- },
- {
- "codes": "1FA79",
- "char": "🩹",
- "name": "adhesive bandage",
- "category": "Objects (medical)",
- "group": "Objects",
- "subgroup": "medical"
- },
- {
- "codes": "1FA7A",
- "char": "🩺",
- "name": "stethoscope",
- "category": "Objects (medical)",
- "group": "Objects",
- "subgroup": "medical"
- },
- {
- "codes": "1F6AA",
- "char": "🚪",
- "name": "door",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6D7",
- "char": "🛗",
- "name": "elevator",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FA9E",
- "char": "🪞",
- "name": "mirror",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FA9F",
- "char": "🪟",
- "name": "window",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6CF",
- "char": "🛏",
- "name": "bed",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6CB",
- "char": "🛋",
- "name": "couch and lamp",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FA91",
- "char": "🪑",
- "name": "chair",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6BD",
- "char": "🚽",
- "name": "toilet",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FAA0",
- "char": "🪠",
- "name": "plunger",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6BF",
- "char": "🚿",
- "name": "shower",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6C1",
- "char": "🛁",
- "name": "bathtub",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FAA4",
- "char": "🪤",
- "name": "mouse trap",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FA92",
- "char": "🪒",
- "name": "razor",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9F4",
- "char": "🧴",
- "name": "lotion bottle",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9F7",
- "char": "🧷",
- "name": "safety pin",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9F9",
- "char": "🧹",
- "name": "broom",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9FA",
- "char": "🧺",
- "name": "basket",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9FB",
- "char": "🧻",
- "name": "roll of paper",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FAA3",
- "char": "🪣",
- "name": "bucket",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9FC",
- "char": "🧼",
- "name": "soap",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1FAA5",
- "char": "🪥",
- "name": "toothbrush",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9FD",
- "char": "🧽",
- "name": "sponge",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F9EF",
- "char": "🧯",
- "name": "fire extinguisher",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6D2",
- "char": "🛒",
- "name": "shopping cart",
- "category": "Objects (household)",
- "group": "Objects",
- "subgroup": "household"
- },
- {
- "codes": "1F6AC",
- "char": "🚬",
- "name": "cigarette",
- "category": "Objects (other-object)",
- "group": "Objects",
- "subgroup": "other-object"
- },
- {
- "codes": "26B0",
- "char": "⚰",
- "name": "coffin",
- "category": "Objects (other-object)",
- "group": "Objects",
- "subgroup": "other-object"
- },
- {
- "codes": "1FAA6",
- "char": "🪦",
- "name": "headstone",
- "category": "Objects (other-object)",
- "group": "Objects",
- "subgroup": "other-object"
- },
- {
- "codes": "26B1",
- "char": "⚱",
- "name": "funeral urn",
- "category": "Objects (other-object)",
- "group": "Objects",
- "subgroup": "other-object"
- },
- {
- "codes": "1F5FF",
- "char": "🗿",
- "name": "moai",
- "category": "Objects (other-object)",
- "group": "Objects",
- "subgroup": "other-object"
- },
- {
- "codes": "1FAA7",
- "char": "🪧",
- "name": "placard",
- "category": "Objects (other-object)",
- "group": "Objects",
- "subgroup": "other-object"
- },
- {
- "codes": "1F3E7",
- "char": "🏧",
- "name": "ATM sign",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6AE",
- "char": "🚮",
- "name": "litter in bin sign",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6B0",
- "char": "🚰",
- "name": "potable water",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "267F",
- "char": "♿",
- "name": "wheelchair symbol",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6B9",
- "char": "🚹",
- "name": "men’s room",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6BA",
- "char": "🚺",
- "name": "women’s room",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6BB",
- "char": "🚻",
- "name": "restroom",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6BC",
- "char": "🚼",
- "name": "baby symbol",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6BE",
- "char": "🚾",
- "name": "water closet",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6C2",
- "char": "🛂",
- "name": "passport control",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6C3",
- "char": "🛃",
- "name": "customs",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6C4",
- "char": "🛄",
- "name": "baggage claim",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "1F6C5",
- "char": "🛅",
- "name": "left luggage",
- "category": "Symbols (transport-sign)",
- "group": "Symbols",
- "subgroup": "transport-sign"
- },
- {
- "codes": "26A0",
- "char": "⚠",
- "name": "warning",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6B8",
- "char": "🚸",
- "name": "children crossing",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "26D4",
- "char": "⛔",
- "name": "no entry",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6AB",
- "char": "🚫",
- "name": "prohibited",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6B3",
- "char": "🚳",
- "name": "no bicycles",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6AD",
- "char": "🚭",
- "name": "no smoking",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6AF",
- "char": "🚯",
- "name": "no littering",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6B1",
- "char": "🚱",
- "name": "non-potable water",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F6B7",
- "char": "🚷",
- "name": "no pedestrians",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F4F5",
- "char": "📵",
- "name": "no mobile phones",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "1F51E",
- "char": "🔞",
- "name": "no one under eighteen",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "2622",
- "char": "☢",
- "name": "radioactive",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "2623",
- "char": "☣",
- "name": "biohazard",
- "category": "Symbols (warning)",
- "group": "Symbols",
- "subgroup": "warning"
- },
- {
- "codes": "2B06",
- "char": "⬆",
- "name": "up arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2197",
- "char": "↗",
- "name": "up-right arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "27A1",
- "char": "➡",
- "name": "right arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2198",
- "char": "↘",
- "name": "down-right arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2B07",
- "char": "⬇",
- "name": "down arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2199",
- "char": "↙",
- "name": "down-left arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2B05",
- "char": "⬅",
- "name": "left arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2196",
- "char": "↖",
- "name": "up-left arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2195",
- "char": "↕",
- "name": "up-down arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2194",
- "char": "↔",
- "name": "left-right arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "21A9",
- "char": "↩",
- "name": "right arrow curving left",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "21AA",
- "char": "↪",
- "name": "left arrow curving right",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2934",
- "char": "⤴",
- "name": "right arrow curving up",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "2935",
- "char": "⤵",
- "name": "right arrow curving down",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F503",
- "char": "🔃",
- "name": "clockwise vertical arrows",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F504",
- "char": "🔄",
- "name": "counterclockwise arrows button",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F519",
- "char": "🔙",
- "name": "BACK arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F51A",
- "char": "🔚",
- "name": "END arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F51B",
- "char": "🔛",
- "name": "ON! arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F51C",
- "char": "🔜",
- "name": "SOON arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F51D",
- "char": "🔝",
- "name": "TOP arrow",
- "category": "Symbols (arrow)",
- "group": "Symbols",
- "subgroup": "arrow"
- },
- {
- "codes": "1F6D0",
- "char": "🛐",
- "name": "place of worship",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "269B",
- "char": "⚛",
- "name": "atom symbol",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "1F549",
- "char": "🕉",
- "name": "om",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "2721",
- "char": "✡",
- "name": "star of David",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "2638",
- "char": "☸",
- "name": "wheel of dharma",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "262F",
- "char": "☯",
- "name": "yin yang",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "271D",
- "char": "✝",
- "name": "latin cross",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "2626",
- "char": "☦",
- "name": "orthodox cross",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "262A",
- "char": "☪",
- "name": "star and crescent",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "262E",
- "char": "☮",
- "name": "peace symbol",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "1F54E",
- "char": "🕎",
- "name": "menorah",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "1F52F",
- "char": "🔯",
- "name": "dotted six-pointed star",
- "category": "Symbols (religion)",
- "group": "Symbols",
- "subgroup": "religion"
- },
- {
- "codes": "2648",
- "char": "♈",
- "name": "Aries",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "2649",
- "char": "♉",
- "name": "Taurus",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "264A",
- "char": "♊",
- "name": "Gemini",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "264B",
- "char": "♋",
- "name": "Cancer",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "264C",
- "char": "♌",
- "name": "Leo",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "264D",
- "char": "♍",
- "name": "Virgo",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "264E",
- "char": "♎",
- "name": "Libra",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "264F",
- "char": "♏",
- "name": "Scorpio",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "2650",
- "char": "♐",
- "name": "Sagittarius",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "2651",
- "char": "♑",
- "name": "Capricorn",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "2652",
- "char": "♒",
- "name": "Aquarius",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "2653",
- "char": "♓",
- "name": "Pisces",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "26CE",
- "char": "⛎",
- "name": "Ophiuchus",
- "category": "Symbols (zodiac)",
- "group": "Symbols",
- "subgroup": "zodiac"
- },
- {
- "codes": "1F500",
- "char": "🔀",
- "name": "shuffle tracks button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F501",
- "char": "🔁",
- "name": "repeat button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F502",
- "char": "🔂",
- "name": "repeat single button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "25B6",
- "char": "▶",
- "name": "play button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23E9",
- "char": "⏩",
- "name": "fast-forward button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23ED",
- "char": "⏭",
- "name": "next track button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23EF",
- "char": "⏯",
- "name": "play or pause button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "25C0",
- "char": "◀",
- "name": "reverse button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23EA",
- "char": "⏪",
- "name": "fast reverse button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23EE",
- "char": "⏮",
- "name": "last track button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F53C",
- "char": "🔼",
- "name": "upwards button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23EB",
- "char": "⏫",
- "name": "fast up button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F53D",
- "char": "🔽",
- "name": "downwards button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23EC",
- "char": "⏬",
- "name": "fast down button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23F8",
- "char": "⏸",
- "name": "pause button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23F9",
- "char": "⏹",
- "name": "stop button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23FA",
- "char": "⏺",
- "name": "record button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "23CF",
- "char": "⏏",
- "name": "eject button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F3A6",
- "char": "🎦",
- "name": "cinema",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F505",
- "char": "🔅",
- "name": "dim button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F506",
- "char": "🔆",
- "name": "bright button",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F4F6",
- "char": "📶",
- "name": "antenna bars",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F4F3",
- "char": "📳",
- "name": "vibration mode",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "1F4F4",
- "char": "📴",
- "name": "mobile phone off",
- "category": "Symbols (av-symbol)",
- "group": "Symbols",
- "subgroup": "av-symbol"
- },
- {
- "codes": "2640",
- "char": "♀",
- "name": "female sign",
- "category": "Symbols (gender)",
- "group": "Symbols",
- "subgroup": "gender"
- },
- {
- "codes": "2642",
- "char": "♂",
- "name": "male sign",
- "category": "Symbols (gender)",
- "group": "Symbols",
- "subgroup": "gender"
- },
- {
- "codes": "26A7",
- "char": "⚧",
- "name": "transgender symbol",
- "category": "Symbols (gender)",
- "group": "Symbols",
- "subgroup": "gender"
- },
- {
- "codes": "2716",
- "char": "✖",
- "name": "multiply",
- "category": "Symbols (math)",
- "group": "Symbols",
- "subgroup": "math"
- },
- {
- "codes": "2795",
- "char": "➕",
- "name": "plus",
- "category": "Symbols (math)",
- "group": "Symbols",
- "subgroup": "math"
- },
- {
- "codes": "2796",
- "char": "➖",
- "name": "minus",
- "category": "Symbols (math)",
- "group": "Symbols",
- "subgroup": "math"
- },
- {
- "codes": "2797",
- "char": "➗",
- "name": "divide",
- "category": "Symbols (math)",
- "group": "Symbols",
- "subgroup": "math"
- },
- {
- "codes": "267E",
- "char": "♾",
- "name": "infinity",
- "category": "Symbols (math)",
- "group": "Symbols",
- "subgroup": "math"
- },
- {
- "codes": "203C",
- "char": "‼",
- "name": "double exclamation mark",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "2049",
- "char": "⁉",
- "name": "exclamation question mark",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "2753",
- "char": "❓",
- "name": "red question mark",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "2754",
- "char": "❔",
- "name": "white question mark",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "2755",
- "char": "❕",
- "name": "white exclamation mark",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "2757",
- "char": "❗",
- "name": "red exclamation mark",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "3030",
- "char": "〰",
- "name": "wavy dash",
- "category": "Symbols (punctuation)",
- "group": "Symbols",
- "subgroup": "punctuation"
- },
- {
- "codes": "1F4B1",
- "char": "💱",
- "name": "currency exchange",
- "category": "Symbols (currency)",
- "group": "Symbols",
- "subgroup": "currency"
- },
- {
- "codes": "1F4B2",
- "char": "💲",
- "name": "heavy dollar sign",
- "category": "Symbols (currency)",
- "group": "Symbols",
- "subgroup": "currency"
- },
- {
- "codes": "2695",
- "char": "⚕",
- "name": "medical symbol",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "267B",
- "char": "♻",
- "name": "recycling symbol",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "269C",
- "char": "⚜",
- "name": "fleur-de-lis",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "1F531",
- "char": "🔱",
- "name": "trident emblem",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "1F4DB",
- "char": "📛",
- "name": "name badge",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "1F530",
- "char": "🔰",
- "name": "Japanese symbol for beginner",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2B55",
- "char": "⭕",
- "name": "hollow red circle",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2705",
- "char": "✅",
- "name": "check mark button",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2611",
- "char": "☑",
- "name": "check box with check",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2714",
- "char": "✔",
- "name": "check mark",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "274C",
- "char": "❌",
- "name": "cross mark",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "274E",
- "char": "❎",
- "name": "cross mark button",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "27B0",
- "char": "➰",
- "name": "curly loop",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "27BF",
- "char": "➿",
- "name": "double curly loop",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "303D",
- "char": "〽",
- "name": "part alternation mark",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2733",
- "char": "✳",
- "name": "eight-spoked asterisk",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2734",
- "char": "✴",
- "name": "eight-pointed star",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2747",
- "char": "❇",
- "name": "sparkle",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "2122",
- "char": "™",
- "name": "trade mark",
- "category": "Symbols (other-symbol)",
- "group": "Symbols",
- "subgroup": "other-symbol"
- },
- {
- "codes": "1F520",
- "char": "🔠",
- "name": "input latin uppercase",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F521",
- "char": "🔡",
- "name": "input latin lowercase",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F522",
- "char": "🔢",
- "name": "input numbers",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F523",
- "char": "🔣",
- "name": "input symbols",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F524",
- "char": "🔤",
- "name": "input latin letters",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F170",
- "char": "🅰",
- "name": "A button (blood type)",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F18E",
- "char": "🆎",
- "name": "AB button (blood type)",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F171",
- "char": "🅱",
- "name": "B button (blood type)",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F191",
- "char": "🆑",
- "name": "CL button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F192",
- "char": "🆒",
- "name": "COOL button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F193",
- "char": "🆓",
- "name": "FREE button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "2139",
- "char": "ℹ",
- "name": "information",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F194",
- "char": "🆔",
- "name": "ID button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "24C2",
- "char": "Ⓜ",
- "name": "circled M",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F195",
- "char": "🆕",
- "name": "NEW button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F196",
- "char": "🆖",
- "name": "NG button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F17E",
- "char": "🅾",
- "name": "O button (blood type)",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F197",
- "char": "🆗",
- "name": "OK button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F17F",
- "char": "🅿",
- "name": "P button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F198",
- "char": "🆘",
- "name": "SOS button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F199",
- "char": "🆙",
- "name": "UP! button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F19A",
- "char": "🆚",
- "name": "VS button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F201",
- "char": "🈁",
- "name": "Japanese “here” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F202",
- "char": "🈂",
- "name": "Japanese “service charge” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F237",
- "char": "🈷",
- "name": "Japanese “monthly amount” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F236",
- "char": "🈶",
- "name": "Japanese “not free of charge” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F22F",
- "char": "🈯",
- "name": "Japanese “reserved” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F250",
- "char": "🉐",
- "name": "Japanese “bargain” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F239",
- "char": "🈹",
- "name": "Japanese “discount” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F21A",
- "char": "🈚",
- "name": "Japanese “free of charge” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F232",
- "char": "🈲",
- "name": "Japanese “prohibited” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F251",
- "char": "🉑",
- "name": "Japanese “acceptable” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F238",
- "char": "🈸",
- "name": "Japanese “application” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F234",
- "char": "🈴",
- "name": "Japanese “passing grade” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F233",
- "char": "🈳",
- "name": "Japanese “vacancy” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "3297",
- "char": "㊗",
- "name": "Japanese “congratulations” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "3299",
- "char": "㊙",
- "name": "Japanese “secret” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F23A",
- "char": "🈺",
- "name": "Japanese “open for business” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F235",
- "char": "🈵",
- "name": "Japanese “no vacancy” button",
- "category": "Symbols (alphanum)",
- "group": "Symbols",
- "subgroup": "alphanum"
- },
- {
- "codes": "1F534",
- "char": "🔴",
- "name": "red circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E0",
- "char": "🟠",
- "name": "orange circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E1",
- "char": "🟡",
- "name": "yellow circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E2",
- "char": "🟢",
- "name": "green circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F535",
- "char": "🔵",
- "name": "blue circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E3",
- "char": "🟣",
- "name": "purple circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E4",
- "char": "🟤",
- "name": "brown circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "26AB",
- "char": "⚫",
- "name": "black circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "26AA",
- "char": "⚪",
- "name": "white circle",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E5",
- "char": "🟥",
- "name": "red square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E7",
- "char": "🟧",
- "name": "orange square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E8",
- "char": "🟨",
- "name": "yellow square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E9",
- "char": "🟩",
- "name": "green square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7E6",
- "char": "🟦",
- "name": "blue square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7EA",
- "char": "🟪",
- "name": "purple square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F7EB",
- "char": "🟫",
- "name": "brown square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "2B1B",
- "char": "⬛",
- "name": "black large square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "2B1C",
- "char": "⬜",
- "name": "white large square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "25FC",
- "char": "◼",
- "name": "black medium square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "25FB",
- "char": "◻",
- "name": "white medium square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "25FE",
- "char": "◾",
- "name": "black medium-small square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "25FD",
- "char": "◽",
- "name": "white medium-small square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "25AA",
- "char": "▪",
- "name": "black small square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "25AB",
- "char": "▫",
- "name": "white small square",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F536",
- "char": "🔶",
- "name": "large orange diamond",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F537",
- "char": "🔷",
- "name": "large blue diamond",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F538",
- "char": "🔸",
- "name": "small orange diamond",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F539",
- "char": "🔹",
- "name": "small blue diamond",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F53A",
- "char": "🔺",
- "name": "red triangle pointed up",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F53B",
- "char": "🔻",
- "name": "red triangle pointed down",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F4A0",
- "char": "💠",
- "name": "diamond with a dot",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F518",
- "char": "🔘",
- "name": "radio button",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F533",
- "char": "🔳",
- "name": "white square button",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F532",
- "char": "🔲",
- "name": "black square button",
- "category": "Symbols (geometric)",
- "group": "Symbols",
- "subgroup": "geometric"
- },
- {
- "codes": "1F3C1",
- "char": "🏁",
- "name": "chequered flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F6A9",
- "char": "🚩",
- "name": "triangular flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F38C",
- "char": "🎌",
- "name": "crossed flags",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F3F4",
- "char": "🏴",
- "name": "black flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F3F3",
- "char": "🏳",
- "name": "white flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F3F3 FE0F 200D 1F308",
- "char": "🏳️🌈",
- "name": "rainbow flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F3F3 FE0F 200D 26A7 FE0F",
- "char": "🏳️⚧️",
- "name": "transgender flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F3F4 200D 2620 FE0F",
- "char": "🏴☠️",
- "name": "pirate flag",
- "category": "Flags (flag)",
- "group": "Flags",
- "subgroup": "flag"
- },
- {
- "codes": "1F1E6 1F1E8",
- "char": "🇦🇨",
- "name": "flag: Ascension Island",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1E9",
- "char": "🇦🇩",
- "name": "flag: Andorra",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1EA",
- "char": "🇦🇪",
- "name": "flag: United Arab Emirates",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1EB",
- "char": "🇦🇫",
- "name": "flag: Afghanistan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1EC",
- "char": "🇦🇬",
- "name": "flag: Antigua & Barbuda",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1EE",
- "char": "🇦🇮",
- "name": "flag: Anguilla",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F1",
- "char": "🇦🇱",
- "name": "flag: Albania",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F2",
- "char": "🇦🇲",
- "name": "flag: Armenia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F4",
- "char": "🇦🇴",
- "name": "flag: Angola",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F6",
- "char": "🇦🇶",
- "name": "flag: Antarctica",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F7",
- "char": "🇦🇷",
- "name": "flag: Argentina",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F8",
- "char": "🇦🇸",
- "name": "flag: American Samoa",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1F9",
- "char": "🇦🇹",
- "name": "flag: Austria",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1FA",
- "char": "🇦🇺",
- "name": "flag: Australia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1FC",
- "char": "🇦🇼",
- "name": "flag: Aruba",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1FD",
- "char": "🇦🇽",
- "name": "flag: Åland Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E6 1F1FF",
- "char": "🇦🇿",
- "name": "flag: Azerbaijan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1E6",
- "char": "🇧🇦",
- "name": "flag: Bosnia & Herzegovina",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1E7",
- "char": "🇧🇧",
- "name": "flag: Barbados",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1E9",
- "char": "🇧🇩",
- "name": "flag: Bangladesh",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1EA",
- "char": "🇧🇪",
- "name": "flag: Belgium",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1EB",
- "char": "🇧🇫",
- "name": "flag: Burkina Faso",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1EC",
- "char": "🇧🇬",
- "name": "flag: Bulgaria",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1ED",
- "char": "🇧🇭",
- "name": "flag: Bahrain",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1EE",
- "char": "🇧🇮",
- "name": "flag: Burundi",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1EF",
- "char": "🇧🇯",
- "name": "flag: Benin",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F1",
- "char": "🇧🇱",
- "name": "flag: St. Barthélemy",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F2",
- "char": "🇧🇲",
- "name": "flag: Bermuda",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F3",
- "char": "🇧🇳",
- "name": "flag: Brunei",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F4",
- "char": "🇧🇴",
- "name": "flag: Bolivia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F6",
- "char": "🇧🇶",
- "name": "flag: Caribbean Netherlands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F7",
- "char": "🇧🇷",
- "name": "flag: Brazil",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F8",
- "char": "🇧🇸",
- "name": "flag: Bahamas",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1F9",
- "char": "🇧🇹",
- "name": "flag: Bhutan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1FB",
- "char": "🇧🇻",
- "name": "flag: Bouvet Island",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1FC",
- "char": "🇧🇼",
- "name": "flag: Botswana",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1FE",
- "char": "🇧🇾",
- "name": "flag: Belarus",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E7 1F1FF",
- "char": "🇧🇿",
- "name": "flag: Belize",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1E6",
- "char": "🇨🇦",
- "name": "flag: Canada",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1E8",
- "char": "🇨🇨",
- "name": "flag: Cocos (Keeling) Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1E9",
- "char": "🇨🇩",
- "name": "flag: Congo - Kinshasa",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1EB",
- "char": "🇨🇫",
- "name": "flag: Central African Republic",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1EC",
- "char": "🇨🇬",
- "name": "flag: Congo - Brazzaville",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1ED",
- "char": "🇨🇭",
- "name": "flag: Switzerland",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1EE",
- "char": "🇨🇮",
- "name": "flag: Côte d’Ivoire",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F0",
- "char": "🇨🇰",
- "name": "flag: Cook Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F1",
- "char": "🇨🇱",
- "name": "flag: Chile",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F2",
- "char": "🇨🇲",
- "name": "flag: Cameroon",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F3",
- "char": "🇨🇳",
- "name": "flag: China",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F4",
- "char": "🇨🇴",
- "name": "flag: Colombia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F5",
- "char": "🇨🇵",
- "name": "flag: Clipperton Island",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1F7",
- "char": "🇨🇷",
- "name": "flag: Costa Rica",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1FA",
- "char": "🇨🇺",
- "name": "flag: Cuba",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1FB",
- "char": "🇨🇻",
- "name": "flag: Cape Verde",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1FC",
- "char": "🇨🇼",
- "name": "flag: Curaçao",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1FD",
- "char": "🇨🇽",
- "name": "flag: Christmas Island",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1FE",
- "char": "🇨🇾",
- "name": "flag: Cyprus",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E8 1F1FF",
- "char": "🇨🇿",
- "name": "flag: Czechia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1EA",
- "char": "🇩🇪",
- "name": "flag: Germany",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1EC",
- "char": "🇩🇬",
- "name": "flag: Diego Garcia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1EF",
- "char": "🇩🇯",
- "name": "flag: Djibouti",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1F0",
- "char": "🇩🇰",
- "name": "flag: Denmark",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1F2",
- "char": "🇩🇲",
- "name": "flag: Dominica",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1F4",
- "char": "🇩🇴",
- "name": "flag: Dominican Republic",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1E9 1F1FF",
- "char": "🇩🇿",
- "name": "flag: Algeria",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1E6",
- "char": "🇪🇦",
- "name": "flag: Ceuta & Melilla",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1E8",
- "char": "🇪🇨",
- "name": "flag: Ecuador",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1EA",
- "char": "🇪🇪",
- "name": "flag: Estonia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1EC",
- "char": "🇪🇬",
- "name": "flag: Egypt",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1ED",
- "char": "🇪🇭",
- "name": "flag: Western Sahara",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1F7",
- "char": "🇪🇷",
- "name": "flag: Eritrea",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1F8",
- "char": "🇪🇸",
- "name": "flag: Spain",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1F9",
- "char": "🇪🇹",
- "name": "flag: Ethiopia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EA 1F1FA",
- "char": "🇪🇺",
- "name": "flag: European Union",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EB 1F1EE",
- "char": "🇫🇮",
- "name": "flag: Finland",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EB 1F1EF",
- "char": "🇫🇯",
- "name": "flag: Fiji",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EB 1F1F0",
- "char": "🇫🇰",
- "name": "flag: Falkland Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EB 1F1F2",
- "char": "🇫🇲",
- "name": "flag: Micronesia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EB 1F1F4",
- "char": "🇫🇴",
- "name": "flag: Faroe Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EB 1F1F7",
- "char": "🇫🇷",
- "name": "flag: France",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1E6",
- "char": "🇬🇦",
- "name": "flag: Gabon",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1E7",
- "char": "🇬🇧",
- "name": "flag: United Kingdom",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1E9",
- "char": "🇬🇩",
- "name": "flag: Grenada",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1EA",
- "char": "🇬🇪",
- "name": "flag: Georgia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1EB",
- "char": "🇬🇫",
- "name": "flag: French Guiana",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1EC",
- "char": "🇬🇬",
- "name": "flag: Guernsey",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1ED",
- "char": "🇬🇭",
- "name": "flag: Ghana",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1EE",
- "char": "🇬🇮",
- "name": "flag: Gibraltar",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F1",
- "char": "🇬🇱",
- "name": "flag: Greenland",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F2",
- "char": "🇬🇲",
- "name": "flag: Gambia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F3",
- "char": "🇬🇳",
- "name": "flag: Guinea",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F5",
- "char": "🇬🇵",
- "name": "flag: Guadeloupe",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F6",
- "char": "🇬🇶",
- "name": "flag: Equatorial Guinea",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F7",
- "char": "🇬🇷",
- "name": "flag: Greece",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F8",
- "char": "🇬🇸",
- "name": "flag: South Georgia & South Sandwich Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1F9",
- "char": "🇬🇹",
- "name": "flag: Guatemala",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1FA",
- "char": "🇬🇺",
- "name": "flag: Guam",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1FC",
- "char": "🇬🇼",
- "name": "flag: Guinea-Bissau",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EC 1F1FE",
- "char": "🇬🇾",
- "name": "flag: Guyana",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1ED 1F1F0",
- "char": "🇭🇰",
- "name": "flag: Hong Kong SAR China",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1ED 1F1F2",
- "char": "🇭🇲",
- "name": "flag: Heard & McDonald Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1ED 1F1F3",
- "char": "🇭🇳",
- "name": "flag: Honduras",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1ED 1F1F7",
- "char": "🇭🇷",
- "name": "flag: Croatia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1ED 1F1F9",
- "char": "🇭🇹",
- "name": "flag: Haiti",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1ED 1F1FA",
- "char": "🇭🇺",
- "name": "flag: Hungary",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1E8",
- "char": "🇮🇨",
- "name": "flag: Canary Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1E9",
- "char": "🇮🇩",
- "name": "flag: Indonesia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1EA",
- "char": "🇮🇪",
- "name": "flag: Ireland",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F1",
- "char": "🇮🇱",
- "name": "flag: Israel",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F2",
- "char": "🇮🇲",
- "name": "flag: Isle of Man",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F3",
- "char": "🇮🇳",
- "name": "flag: India",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F4",
- "char": "🇮🇴",
- "name": "flag: British Indian Ocean Territory",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F6",
- "char": "🇮🇶",
- "name": "flag: Iraq",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F7",
- "char": "🇮🇷",
- "name": "flag: Iran",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F8",
- "char": "🇮🇸",
- "name": "flag: Iceland",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EE 1F1F9",
- "char": "🇮🇹",
- "name": "flag: Italy",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EF 1F1EA",
- "char": "🇯🇪",
- "name": "flag: Jersey",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EF 1F1F2",
- "char": "🇯🇲",
- "name": "flag: Jamaica",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EF 1F1F4",
- "char": "🇯🇴",
- "name": "flag: Jordan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1EF 1F1F5",
- "char": "🇯🇵",
- "name": "flag: Japan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1EA",
- "char": "🇰🇪",
- "name": "flag: Kenya",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1EC",
- "char": "🇰🇬",
- "name": "flag: Kyrgyzstan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1ED",
- "char": "🇰🇭",
- "name": "flag: Cambodia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1EE",
- "char": "🇰🇮",
- "name": "flag: Kiribati",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1F2",
- "char": "🇰🇲",
- "name": "flag: Comoros",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1F3",
- "char": "🇰🇳",
- "name": "flag: St. Kitts & Nevis",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1F5",
- "char": "🇰🇵",
- "name": "flag: North Korea",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1F7",
- "char": "🇰🇷",
- "name": "flag: South Korea",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1FC",
- "char": "🇰🇼",
- "name": "flag: Kuwait",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1FE",
- "char": "🇰🇾",
- "name": "flag: Cayman Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F0 1F1FF",
- "char": "🇰🇿",
- "name": "flag: Kazakhstan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1E6",
- "char": "🇱🇦",
- "name": "flag: Laos",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1E7",
- "char": "🇱🇧",
- "name": "flag: Lebanon",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1E8",
- "char": "🇱🇨",
- "name": "flag: St. Lucia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1EE",
- "char": "🇱🇮",
- "name": "flag: Liechtenstein",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1F0",
- "char": "🇱🇰",
- "name": "flag: Sri Lanka",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1F7",
- "char": "🇱🇷",
- "name": "flag: Liberia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1F8",
- "char": "🇱🇸",
- "name": "flag: Lesotho",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1F9",
- "char": "🇱🇹",
- "name": "flag: Lithuania",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1FA",
- "char": "🇱🇺",
- "name": "flag: Luxembourg",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1FB",
- "char": "🇱🇻",
- "name": "flag: Latvia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F1 1F1FE",
- "char": "🇱🇾",
- "name": "flag: Libya",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1E6",
- "char": "🇲🇦",
- "name": "flag: Morocco",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1E8",
- "char": "🇲🇨",
- "name": "flag: Monaco",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1E9",
- "char": "🇲🇩",
- "name": "flag: Moldova",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1EA",
- "char": "🇲🇪",
- "name": "flag: Montenegro",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1EB",
- "char": "🇲🇫",
- "name": "flag: St. Martin",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1EC",
- "char": "🇲🇬",
- "name": "flag: Madagascar",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1ED",
- "char": "🇲🇭",
- "name": "flag: Marshall Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F0",
- "char": "🇲🇰",
- "name": "flag: North Macedonia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F1",
- "char": "🇲🇱",
- "name": "flag: Mali",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F2",
- "char": "🇲🇲",
- "name": "flag: Myanmar (Burma)",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F3",
- "char": "🇲🇳",
- "name": "flag: Mongolia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F4",
- "char": "🇲🇴",
- "name": "flag: Macao SAR China",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F5",
- "char": "🇲🇵",
- "name": "flag: Northern Mariana Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F6",
- "char": "🇲🇶",
- "name": "flag: Martinique",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F7",
- "char": "🇲🇷",
- "name": "flag: Mauritania",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F8",
- "char": "🇲🇸",
- "name": "flag: Montserrat",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1F9",
- "char": "🇲🇹",
- "name": "flag: Malta",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1FA",
- "char": "🇲🇺",
- "name": "flag: Mauritius",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1FB",
- "char": "🇲🇻",
- "name": "flag: Maldives",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1FC",
- "char": "🇲🇼",
- "name": "flag: Malawi",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1FD",
- "char": "🇲🇽",
- "name": "flag: Mexico",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1FE",
- "char": "🇲🇾",
- "name": "flag: Malaysia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F2 1F1FF",
- "char": "🇲🇿",
- "name": "flag: Mozambique",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1E6",
- "char": "🇳🇦",
- "name": "flag: Namibia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1E8",
- "char": "🇳🇨",
- "name": "flag: New Caledonia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1EA",
- "char": "🇳🇪",
- "name": "flag: Niger",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1EB",
- "char": "🇳🇫",
- "name": "flag: Norfolk Island",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1EC",
- "char": "🇳🇬",
- "name": "flag: Nigeria",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1EE",
- "char": "🇳🇮",
- "name": "flag: Nicaragua",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1F1",
- "char": "🇳🇱",
- "name": "flag: Netherlands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1F4",
- "char": "🇳🇴",
- "name": "flag: Norway",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1F5",
- "char": "🇳🇵",
- "name": "flag: Nepal",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1F7",
- "char": "🇳🇷",
- "name": "flag: Nauru",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1FA",
- "char": "🇳🇺",
- "name": "flag: Niue",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F3 1F1FF",
- "char": "🇳🇿",
- "name": "flag: New Zealand",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F4 1F1F2",
- "char": "🇴🇲",
- "name": "flag: Oman",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1E6",
- "char": "🇵🇦",
- "name": "flag: Panama",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1EA",
- "char": "🇵🇪",
- "name": "flag: Peru",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1EB",
- "char": "🇵🇫",
- "name": "flag: French Polynesia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1EC",
- "char": "🇵🇬",
- "name": "flag: Papua New Guinea",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1ED",
- "char": "🇵🇭",
- "name": "flag: Philippines",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F0",
- "char": "🇵🇰",
- "name": "flag: Pakistan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F1",
- "char": "🇵🇱",
- "name": "flag: Poland",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F2",
- "char": "🇵🇲",
- "name": "flag: St. Pierre & Miquelon",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F3",
- "char": "🇵🇳",
- "name": "flag: Pitcairn Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F7",
- "char": "🇵🇷",
- "name": "flag: Puerto Rico",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F8",
- "char": "🇵🇸",
- "name": "flag: Palestinian Territories",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1F9",
- "char": "🇵🇹",
- "name": "flag: Portugal",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1FC",
- "char": "🇵🇼",
- "name": "flag: Palau",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F5 1F1FE",
- "char": "🇵🇾",
- "name": "flag: Paraguay",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F6 1F1E6",
- "char": "🇶🇦",
- "name": "flag: Qatar",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F7 1F1EA",
- "char": "🇷🇪",
- "name": "flag: Réunion",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F7 1F1F4",
- "char": "🇷🇴",
- "name": "flag: Romania",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F7 1F1F8",
- "char": "🇷🇸",
- "name": "flag: Serbia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F7 1F1FA",
- "char": "🇷🇺",
- "name": "flag: Russia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F7 1F1FC",
- "char": "🇷🇼",
- "name": "flag: Rwanda",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1E6",
- "char": "🇸🇦",
- "name": "flag: Saudi Arabia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1E7",
- "char": "🇸🇧",
- "name": "flag: Solomon Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1E8",
- "char": "🇸🇨",
- "name": "flag: Seychelles",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1E9",
- "char": "🇸🇩",
- "name": "flag: Sudan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1EA",
- "char": "🇸🇪",
- "name": "flag: Sweden",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1EC",
- "char": "🇸🇬",
- "name": "flag: Singapore",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1ED",
- "char": "🇸🇭",
- "name": "flag: St. Helena",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1EE",
- "char": "🇸🇮",
- "name": "flag: Slovenia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1EF",
- "char": "🇸🇯",
- "name": "flag: Svalbard & Jan Mayen",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F0",
- "char": "🇸🇰",
- "name": "flag: Slovakia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F1",
- "char": "🇸🇱",
- "name": "flag: Sierra Leone",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F2",
- "char": "🇸🇲",
- "name": "flag: San Marino",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F3",
- "char": "🇸🇳",
- "name": "flag: Senegal",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F4",
- "char": "🇸🇴",
- "name": "flag: Somalia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F7",
- "char": "🇸🇷",
- "name": "flag: Suriname",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F8",
- "char": "🇸🇸",
- "name": "flag: South Sudan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1F9",
- "char": "🇸🇹",
- "name": "flag: São Tomé & Príncipe",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1FB",
- "char": "🇸🇻",
- "name": "flag: El Salvador",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1FD",
- "char": "🇸🇽",
- "name": "flag: Sint Maarten",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1FE",
- "char": "🇸🇾",
- "name": "flag: Syria",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F8 1F1FF",
- "char": "🇸🇿",
- "name": "flag: Eswatini",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1E6",
- "char": "🇹🇦",
- "name": "flag: Tristan da Cunha",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1E8",
- "char": "🇹🇨",
- "name": "flag: Turks & Caicos Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1E9",
- "char": "🇹🇩",
- "name": "flag: Chad",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1EB",
- "char": "🇹🇫",
- "name": "flag: French Southern Territories",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1EC",
- "char": "🇹🇬",
- "name": "flag: Togo",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1ED",
- "char": "🇹🇭",
- "name": "flag: Thailand",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1EF",
- "char": "🇹🇯",
- "name": "flag: Tajikistan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F0",
- "char": "🇹🇰",
- "name": "flag: Tokelau",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F1",
- "char": "🇹🇱",
- "name": "flag: Timor-Leste",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F2",
- "char": "🇹🇲",
- "name": "flag: Turkmenistan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F3",
- "char": "🇹🇳",
- "name": "flag: Tunisia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F4",
- "char": "🇹🇴",
- "name": "flag: Tonga",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F7",
- "char": "🇹🇷",
- "name": "flag: Turkey",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1F9",
- "char": "🇹🇹",
- "name": "flag: Trinidad & Tobago",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1FB",
- "char": "🇹🇻",
- "name": "flag: Tuvalu",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1FC",
- "char": "🇹🇼",
- "name": "flag: Taiwan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1F9 1F1FF",
- "char": "🇹🇿",
- "name": "flag: Tanzania",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1E6",
- "char": "🇺🇦",
- "name": "flag: Ukraine",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1EC",
- "char": "🇺🇬",
- "name": "flag: Uganda",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1F2",
- "char": "🇺🇲",
- "name": "flag: U.S. Outlying Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1F3",
- "char": "🇺🇳",
- "name": "flag: United Nations",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1F8",
- "char": "🇺🇸",
- "name": "flag: United States",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1FE",
- "char": "🇺🇾",
- "name": "flag: Uruguay",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FA 1F1FF",
- "char": "🇺🇿",
- "name": "flag: Uzbekistan",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1E6",
- "char": "🇻🇦",
- "name": "flag: Vatican City",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1E8",
- "char": "🇻🇨",
- "name": "flag: St. Vincent & Grenadines",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1EA",
- "char": "🇻🇪",
- "name": "flag: Venezuela",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1EC",
- "char": "🇻🇬",
- "name": "flag: British Virgin Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1EE",
- "char": "🇻🇮",
- "name": "flag: U.S. Virgin Islands",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1F3",
- "char": "🇻🇳",
- "name": "flag: Vietnam",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FB 1F1FA",
- "char": "🇻🇺",
- "name": "flag: Vanuatu",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FC 1F1EB",
- "char": "🇼🇫",
- "name": "flag: Wallis & Futuna",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FC 1F1F8",
- "char": "🇼🇸",
- "name": "flag: Samoa",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FD 1F1F0",
- "char": "🇽🇰",
- "name": "flag: Kosovo",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FE 1F1EA",
- "char": "🇾🇪",
- "name": "flag: Yemen",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FE 1F1F9",
- "char": "🇾🇹",
- "name": "flag: Mayotte",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FF 1F1E6",
- "char": "🇿🇦",
- "name": "flag: South Africa",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FF 1F1F2",
- "char": "🇿🇲",
- "name": "flag: Zambia",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F1FF 1F1FC",
- "char": "🇿🇼",
- "name": "flag: Zimbabwe",
- "category": "Flags (country-flag)",
- "group": "Flags",
- "subgroup": "country-flag"
- },
- {
- "codes": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F",
- "char": "🏴",
- "name": "flag: England",
- "category": "Flags (subdivision-flag)",
- "group": "Flags",
- "subgroup": "subdivision-flag"
- },
- {
- "codes": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F",
- "char": "🏴",
- "name": "flag: Scotland",
- "category": "Flags (subdivision-flag)",
- "group": "Flags",
- "subgroup": "subdivision-flag"
- },
- {
- "codes": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F",
- "char": "🏴",
- "name": "flag: Wales",
- "category": "Flags (subdivision-flag)",
- "group": "Flags",
- "subgroup": "subdivision-flag"
- }
- ],
- "emojisGroups" : [
- {
- "name": "Smileys & Emotion",
- "emoji": {
- "codes": "1F600",
- "char": "😀",
- "name": "grinning face"
- }
- },
- {
- "name": "People & Body",
- "emoji": {
- "codes": "1F91A",
- "char": "🤚",
- "name": "raised back of hand"
- }
- },
- {
- "name": "Animals & Nature",
- "emoji": {
- "codes": "1F435",
- "char": "🐵",
- "name": "monkey face"
- }
- },
- {
- "name": "Food & Drink",
- "emoji": {
- "codes": "1F34F",
- "char": "🍏",
- "name": "green apple"
- }
- },
- {
- "name": "Travel & Places",
- "emoji": {
- "codes": "1F697",
- "char": "🚗",
- "name": "automobile"
- }
- },
- {
- "name": "Activities",
- "emoji": {
- "codes": "26BD",
- "char": "⚽",
- "name": "soccer ball"
- }
- },
- {
- "name": "Objects",
- "emoji": {
- "codes": "231A",
- "char": "⌚",
- "name": "watch"
- }
- },
- {
- "name": "Symbols",
- "emoji": {
- "codes": "2705",
- "char": "✅",
- "name": "check mark button"
- }
- },
- {
- "name": "Flags",
- "emoji": {
- "codes": "1F3F3",
- "char": "🏳",
- "name": "white flag"
- }
- }
- ]
+ "emojisList": [
+ {
+ "codes": "1F600",
+ "char": "😀",
+ "name": "grinning face",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F603",
+ "char": "😃",
+ "name": "grinning face with big eyes",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F604",
+ "char": "😄",
+ "name": "grinning face with smiling eyes",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F601",
+ "char": "😁",
+ "name": "beaming face with smiling eyes",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F606",
+ "char": "😆",
+ "name": "grinning squinting face",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F605",
+ "char": "😅",
+ "name": "grinning face with sweat",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F923",
+ "char": "🤣",
+ "name": "rolling on the floor laughing",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F602",
+ "char": "😂",
+ "name": "face with tears of joy",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F642",
+ "char": "🙂",
+ "name": "slightly smiling face",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F643",
+ "char": "🙃",
+ "name": "upside-down face",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F609",
+ "char": "😉",
+ "name": "winking face",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F60A",
+ "char": "😊",
+ "name": "smiling face with smiling eyes",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F607",
+ "char": "😇",
+ "name": "smiling face with halo",
+ "category": "Smileys & Emotion (face-smiling)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-smiling"
+ },
+ {
+ "codes": "1F970",
+ "char": "🥰",
+ "name": "smiling face with hearts",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F60D",
+ "char": "😍",
+ "name": "smiling face with heart-eyes",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F929",
+ "char": "🤩",
+ "name": "star-struck",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F618",
+ "char": "😘",
+ "name": "face blowing a kiss",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F617",
+ "char": "😗",
+ "name": "kissing face",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "263A",
+ "char": "☺️",
+ "name": "smiling face",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F61A",
+ "char": "😚",
+ "name": "kissing face with closed eyes",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F619",
+ "char": "😙",
+ "name": "kissing face with smiling eyes",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F972",
+ "char": "🥲",
+ "name": "smiling face with tear",
+ "category": "Smileys & Emotion (face-affection)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-affection"
+ },
+ {
+ "codes": "1F60B",
+ "char": "😋",
+ "name": "face savoring food",
+ "category": "Smileys & Emotion (face-tongue)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-tongue"
+ },
+ {
+ "codes": "1F61B",
+ "char": "😛",
+ "name": "face with tongue",
+ "category": "Smileys & Emotion (face-tongue)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-tongue"
+ },
+ {
+ "codes": "1F61C",
+ "char": "😜",
+ "name": "winking face with tongue",
+ "category": "Smileys & Emotion (face-tongue)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-tongue"
+ },
+ {
+ "codes": "1F92A",
+ "char": "🤪",
+ "name": "zany face",
+ "category": "Smileys & Emotion (face-tongue)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-tongue"
+ },
+ {
+ "codes": "1F61D",
+ "char": "😝",
+ "name": "squinting face with tongue",
+ "category": "Smileys & Emotion (face-tongue)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-tongue"
+ },
+ {
+ "codes": "1F911",
+ "char": "🤑",
+ "name": "money-mouth face",
+ "category": "Smileys & Emotion (face-tongue)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-tongue"
+ },
+ {
+ "codes": "1F917",
+ "char": "🤗",
+ "name": "hugging face",
+ "category": "Smileys & Emotion (face-hand)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hand"
+ },
+ {
+ "codes": "1F92D",
+ "char": "🤭",
+ "name": "face with hand over mouth",
+ "category": "Smileys & Emotion (face-hand)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hand"
+ },
+ {
+ "codes": "1F92B",
+ "char": "🤫",
+ "name": "shushing face",
+ "category": "Smileys & Emotion (face-hand)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hand"
+ },
+ {
+ "codes": "1F914",
+ "char": "🤔",
+ "name": "thinking face",
+ "category": "Smileys & Emotion (face-hand)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hand"
+ },
+ {
+ "codes": "1F910",
+ "char": "🤐",
+ "name": "zipper-mouth face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F928",
+ "char": "🤨",
+ "name": "face with raised eyebrow",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F610",
+ "char": "😐",
+ "name": "neutral face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F611",
+ "char": "😑",
+ "name": "expressionless face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F636",
+ "char": "😶",
+ "name": "face without mouth",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F60F",
+ "char": "😏",
+ "name": "smirking face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F612",
+ "char": "😒",
+ "name": "unamused face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F644",
+ "char": "🙄",
+ "name": "face with rolling eyes",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F62C",
+ "char": "😬",
+ "name": "grimacing face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F925",
+ "char": "🤥",
+ "name": "lying face",
+ "category": "Smileys & Emotion (face-neutral-skeptical)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-neutral-skeptical"
+ },
+ {
+ "codes": "1F60C",
+ "char": "😌",
+ "name": "relieved face",
+ "category": "Smileys & Emotion (face-sleepy)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-sleepy"
+ },
+ {
+ "codes": "1F614",
+ "char": "😔",
+ "name": "pensive face",
+ "category": "Smileys & Emotion (face-sleepy)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-sleepy"
+ },
+ {
+ "codes": "1F62A",
+ "char": "😪",
+ "name": "sleepy face",
+ "category": "Smileys & Emotion (face-sleepy)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-sleepy"
+ },
+ {
+ "codes": "1F924",
+ "char": "🤤",
+ "name": "drooling face",
+ "category": "Smileys & Emotion (face-sleepy)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-sleepy"
+ },
+ {
+ "codes": "1F634",
+ "char": "😴",
+ "name": "sleeping face",
+ "category": "Smileys & Emotion (face-sleepy)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-sleepy"
+ },
+ {
+ "codes": "1F637",
+ "char": "😷",
+ "name": "face with medical mask",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F912",
+ "char": "🤒",
+ "name": "face with thermometer",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F915",
+ "char": "🤕",
+ "name": "face with head-bandage",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F922",
+ "char": "🤢",
+ "name": "nauseated face",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F92E",
+ "char": "🤮",
+ "name": "face vomiting",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F927",
+ "char": "🤧",
+ "name": "sneezing face",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F975",
+ "char": "🥵",
+ "name": "hot face",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F976",
+ "char": "🥶",
+ "name": "cold face",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F974",
+ "char": "🥴",
+ "name": "woozy face",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F635",
+ "char": "😵",
+ "name": "knocked-out face",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F92F",
+ "char": "🤯",
+ "name": "exploding head",
+ "category": "Smileys & Emotion (face-unwell)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-unwell"
+ },
+ {
+ "codes": "1F920",
+ "char": "🤠",
+ "name": "cowboy hat face",
+ "category": "Smileys & Emotion (face-hat)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hat"
+ },
+ {
+ "codes": "1F973",
+ "char": "🥳",
+ "name": "partying face",
+ "category": "Smileys & Emotion (face-hat)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hat"
+ },
+ {
+ "codes": "1F978",
+ "char": "🥸",
+ "name": "disguised face",
+ "category": "Smileys & Emotion (face-hat)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-hat"
+ },
+ {
+ "codes": "1F60E",
+ "char": "😎",
+ "name": "smiling face with sunglasses",
+ "category": "Smileys & Emotion (face-glasses)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-glasses"
+ },
+ {
+ "codes": "1F913",
+ "char": "🤓",
+ "name": "nerd face",
+ "category": "Smileys & Emotion (face-glasses)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-glasses"
+ },
+ {
+ "codes": "1F9D0",
+ "char": "🧐",
+ "name": "face with monocle",
+ "category": "Smileys & Emotion (face-glasses)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-glasses"
+ },
+ {
+ "codes": "1F615",
+ "char": "😕",
+ "name": "confused face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F61F",
+ "char": "😟",
+ "name": "worried face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F641",
+ "char": "🙁",
+ "name": "slightly frowning face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "2639",
+ "char": "☹",
+ "name": "frowning face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F62E",
+ "char": "😮",
+ "name": "face with open mouth",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F62F",
+ "char": "😯",
+ "name": "hushed face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F632",
+ "char": "😲",
+ "name": "astonished face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F633",
+ "char": "😳",
+ "name": "flushed face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F97A",
+ "char": "🥺",
+ "name": "pleading face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F626",
+ "char": "😦",
+ "name": "frowning face with open mouth",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F627",
+ "char": "😧",
+ "name": "anguished face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F628",
+ "char": "😨",
+ "name": "fearful face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F630",
+ "char": "😰",
+ "name": "anxious face with sweat",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F625",
+ "char": "😥",
+ "name": "sad but relieved face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F622",
+ "char": "😢",
+ "name": "crying face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F62D",
+ "char": "😭",
+ "name": "loudly crying face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F631",
+ "char": "😱",
+ "name": "face screaming in fear",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F616",
+ "char": "😖",
+ "name": "confounded face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F623",
+ "char": "😣",
+ "name": "persevering face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F61E",
+ "char": "😞",
+ "name": "disappointed face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F613",
+ "char": "😓",
+ "name": "downcast face with sweat",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F629",
+ "char": "😩",
+ "name": "weary face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F62B",
+ "char": "😫",
+ "name": "tired face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F971",
+ "char": "🥱",
+ "name": "yawning face",
+ "category": "Smileys & Emotion (face-concerned)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-concerned"
+ },
+ {
+ "codes": "1F624",
+ "char": "😤",
+ "name": "face with steam from nose",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F621",
+ "char": "😡",
+ "name": "pouting face",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F620",
+ "char": "😠",
+ "name": "angry face",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F92C",
+ "char": "🤬",
+ "name": "face with symbols on mouth",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F608",
+ "char": "😈",
+ "name": "smiling face with horns",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F47F",
+ "char": "👿",
+ "name": "angry face with horns",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F480",
+ "char": "💀",
+ "name": "skull",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "2620",
+ "char": "☠",
+ "name": "skull and crossbones",
+ "category": "Smileys & Emotion (face-negative)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-negative"
+ },
+ {
+ "codes": "1F4A9",
+ "char": "💩",
+ "name": "pile of poo",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F921",
+ "char": "🤡",
+ "name": "clown face",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F479",
+ "char": "👹",
+ "name": "ogre",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F47A",
+ "char": "👺",
+ "name": "goblin",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F47B",
+ "char": "👻",
+ "name": "ghost",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F47D",
+ "char": "👽",
+ "name": "alien",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F47E",
+ "char": "👾",
+ "name": "alien monster",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F916",
+ "char": "🤖",
+ "name": "robot",
+ "category": "Smileys & Emotion (face-costume)",
+ "group": "Smileys & Emotion",
+ "subgroup": "face-costume"
+ },
+ {
+ "codes": "1F63A",
+ "char": "😺",
+ "name": "grinning cat",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F638",
+ "char": "😸",
+ "name": "grinning cat with smiling eyes",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F639",
+ "char": "😹",
+ "name": "cat with tears of joy",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F63B",
+ "char": "😻",
+ "name": "smiling cat with heart-eyes",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F63C",
+ "char": "😼",
+ "name": "cat with wry smile",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F63D",
+ "char": "😽",
+ "name": "kissing cat",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F640",
+ "char": "🙀",
+ "name": "weary cat",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F63F",
+ "char": "😿",
+ "name": "crying cat",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F63E",
+ "char": "😾",
+ "name": "pouting cat",
+ "category": "Smileys & Emotion (cat-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "cat-face"
+ },
+ {
+ "codes": "1F648",
+ "char": "🙈",
+ "name": "see-no-evil monkey",
+ "category": "Smileys & Emotion (monkey-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "monkey-face"
+ },
+ {
+ "codes": "1F649",
+ "char": "🙉",
+ "name": "hear-no-evil monkey",
+ "category": "Smileys & Emotion (monkey-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "monkey-face"
+ },
+ {
+ "codes": "1F64A",
+ "char": "🙊",
+ "name": "speak-no-evil monkey",
+ "category": "Smileys & Emotion (monkey-face)",
+ "group": "Smileys & Emotion",
+ "subgroup": "monkey-face"
+ },
+ {
+ "codes": "1F48B",
+ "char": "💋",
+ "name": "kiss mark",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F48C",
+ "char": "💌",
+ "name": "love letter",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F498",
+ "char": "💘",
+ "name": "heart with arrow",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F49D",
+ "char": "💝",
+ "name": "heart with ribbon",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F496",
+ "char": "💖",
+ "name": "sparkling heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F497",
+ "char": "💗",
+ "name": "growing heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F493",
+ "char": "💓",
+ "name": "beating heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F49E",
+ "char": "💞",
+ "name": "revolving hearts",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F495",
+ "char": "💕",
+ "name": "two hearts",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F49F",
+ "char": "💟",
+ "name": "heart decoration",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "2763",
+ "char": "❣",
+ "name": "heart exclamation",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F494",
+ "char": "💔",
+ "name": "broken heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "2764",
+ "char": "❤",
+ "name": "red heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F9E1",
+ "char": "🧡",
+ "name": "orange heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F49B",
+ "char": "💛",
+ "name": "yellow heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F49A",
+ "char": "💚",
+ "name": "green heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F499",
+ "char": "💙",
+ "name": "blue heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F49C",
+ "char": "💜",
+ "name": "purple heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F90E",
+ "char": "🤎",
+ "name": "brown heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F5A4",
+ "char": "🖤",
+ "name": "black heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F90D",
+ "char": "🤍",
+ "name": "white heart",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4AF",
+ "char": "💯",
+ "name": "hundred points",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4A2",
+ "char": "💢",
+ "name": "anger symbol",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4A5",
+ "char": "💥",
+ "name": "collision",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4AB",
+ "char": "💫",
+ "name": "dizzy",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4A6",
+ "char": "💦",
+ "name": "sweat droplets",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4A8",
+ "char": "💨",
+ "name": "dashing away",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F573",
+ "char": "🕳",
+ "name": "hole",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4A3",
+ "char": "💣",
+ "name": "bomb",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4AC",
+ "char": "💬",
+ "name": "speech balloon",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F441 200D 1F5E8",
+ "char": "👁🗨",
+ "name": "eye in speech bubble",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F5E8",
+ "char": "🗨",
+ "name": "left speech bubble",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F5EF",
+ "char": "🗯",
+ "name": "right anger bubble",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4AD",
+ "char": "💭",
+ "name": "thought balloon",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F4A4",
+ "char": "💤",
+ "name": "zzz",
+ "category": "Smileys & Emotion (emotion)",
+ "group": "Smileys & Emotion",
+ "subgroup": "emotion"
+ },
+ {
+ "codes": "1F44B",
+ "char": "👋",
+ "name": "waving hand",
+ "category": "People & Body (hand-fingers-open)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-open"
+ },
+ {
+ "codes": "1F91A",
+ "char": "🤚",
+ "name": "raised back of hand",
+ "category": "People & Body (hand-fingers-open)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-open"
+ },
+ {
+ "codes": "1F590",
+ "char": "🖐",
+ "name": "hand with fingers splayed",
+ "category": "People & Body (hand-fingers-open)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-open"
+ },
+ {
+ "codes": "270B",
+ "char": "✋",
+ "name": "raised hand",
+ "category": "People & Body (hand-fingers-open)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-open"
+ },
+ {
+ "codes": "1F596",
+ "char": "🖖",
+ "name": "vulcan salute",
+ "category": "People & Body (hand-fingers-open)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-open"
+ },
+ {
+ "codes": "1F44C",
+ "char": "👌",
+ "name": "OK hand",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F90C",
+ "char": "🤌",
+ "name": "pinched fingers",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F90F",
+ "char": "🤏",
+ "name": "pinching hand",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "270C",
+ "char": "✌",
+ "name": "victory hand",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F91E",
+ "char": "🤞",
+ "name": "crossed fingers",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F91F",
+ "char": "🤟",
+ "name": "love-you gesture",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F918",
+ "char": "🤘",
+ "name": "sign of the horns",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F919",
+ "char": "🤙",
+ "name": "call me hand",
+ "category": "People & Body (hand-fingers-partial)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-partial"
+ },
+ {
+ "codes": "1F448",
+ "char": "👈",
+ "name": "backhand index pointing left",
+ "category": "People & Body (hand-single-finger)",
+ "group": "People & Body",
+ "subgroup": "hand-single-finger"
+ },
+ {
+ "codes": "1F449",
+ "char": "👉",
+ "name": "backhand index pointing right",
+ "category": "People & Body (hand-single-finger)",
+ "group": "People & Body",
+ "subgroup": "hand-single-finger"
+ },
+ {
+ "codes": "1F446",
+ "char": "👆",
+ "name": "backhand index pointing up",
+ "category": "People & Body (hand-single-finger)",
+ "group": "People & Body",
+ "subgroup": "hand-single-finger"
+ },
+ {
+ "codes": "1F595",
+ "char": "🖕",
+ "name": "middle finger",
+ "category": "People & Body (hand-single-finger)",
+ "group": "People & Body",
+ "subgroup": "hand-single-finger"
+ },
+ {
+ "codes": "1F447",
+ "char": "👇",
+ "name": "backhand index pointing down",
+ "category": "People & Body (hand-single-finger)",
+ "group": "People & Body",
+ "subgroup": "hand-single-finger"
+ },
+ {
+ "codes": "261D",
+ "char": "☝",
+ "name": "index pointing up",
+ "category": "People & Body (hand-single-finger)",
+ "group": "People & Body",
+ "subgroup": "hand-single-finger"
+ },
+ {
+ "codes": "1F44D",
+ "char": "👍",
+ "name": "thumbs up",
+ "category": "People & Body (hand-fingers-closed)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-closed"
+ },
+ {
+ "codes": "1F44E",
+ "char": "👎",
+ "name": "thumbs down",
+ "category": "People & Body (hand-fingers-closed)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-closed"
+ },
+ {
+ "codes": "270A",
+ "char": "✊",
+ "name": "raised fist",
+ "category": "People & Body (hand-fingers-closed)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-closed"
+ },
+ {
+ "codes": "1F44A",
+ "char": "👊",
+ "name": "oncoming fist",
+ "category": "People & Body (hand-fingers-closed)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-closed"
+ },
+ {
+ "codes": "1F91B",
+ "char": "🤛",
+ "name": "left-facing fist",
+ "category": "People & Body (hand-fingers-closed)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-closed"
+ },
+ {
+ "codes": "1F91C",
+ "char": "🤜",
+ "name": "right-facing fist",
+ "category": "People & Body (hand-fingers-closed)",
+ "group": "People & Body",
+ "subgroup": "hand-fingers-closed"
+ },
+ {
+ "codes": "1F44F",
+ "char": "👏",
+ "name": "clapping hands",
+ "category": "People & Body (hands)",
+ "group": "People & Body",
+ "subgroup": "hands"
+ },
+ {
+ "codes": "1F64C",
+ "char": "🙌",
+ "name": "raising hands",
+ "category": "People & Body (hands)",
+ "group": "People & Body",
+ "subgroup": "hands"
+ },
+ {
+ "codes": "1F450",
+ "char": "👐",
+ "name": "open hands",
+ "category": "People & Body (hands)",
+ "group": "People & Body",
+ "subgroup": "hands"
+ },
+ {
+ "codes": "1F932",
+ "char": "🤲",
+ "name": "palms up together",
+ "category": "People & Body (hands)",
+ "group": "People & Body",
+ "subgroup": "hands"
+ },
+ {
+ "codes": "1F91D",
+ "char": "🤝",
+ "name": "handshake",
+ "category": "People & Body (hands)",
+ "group": "People & Body",
+ "subgroup": "hands"
+ },
+ {
+ "codes": "1F64F",
+ "char": "🙏",
+ "name": "folded hands",
+ "category": "People & Body (hands)",
+ "group": "People & Body",
+ "subgroup": "hands"
+ },
+ {
+ "codes": "270D",
+ "char": "✍",
+ "name": "writing hand",
+ "category": "People & Body (hand-prop)",
+ "group": "People & Body",
+ "subgroup": "hand-prop"
+ },
+ {
+ "codes": "1F485",
+ "char": "💅",
+ "name": "nail polish",
+ "category": "People & Body (hand-prop)",
+ "group": "People & Body",
+ "subgroup": "hand-prop"
+ },
+ {
+ "codes": "1F933",
+ "char": "🤳",
+ "name": "selfie",
+ "category": "People & Body (hand-prop)",
+ "group": "People & Body",
+ "subgroup": "hand-prop"
+ },
+ {
+ "codes": "1F4AA",
+ "char": "💪",
+ "name": "flexed biceps",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9BE",
+ "char": "🦾",
+ "name": "mechanical arm",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9BF",
+ "char": "🦿",
+ "name": "mechanical leg",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9B5",
+ "char": "🦵",
+ "name": "leg",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9B6",
+ "char": "🦶",
+ "name": "foot",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F442",
+ "char": "👂",
+ "name": "ear",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9BB",
+ "char": "🦻",
+ "name": "ear with hearing aid",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F443",
+ "char": "👃",
+ "name": "nose",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9E0",
+ "char": "🧠",
+ "name": "brain",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1FAC0",
+ "char": "🫀",
+ "name": "anatomical heart",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1FAC1",
+ "char": "🫁",
+ "name": "lungs",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9B7",
+ "char": "🦷",
+ "name": "tooth",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F9B4",
+ "char": "🦴",
+ "name": "bone",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F440",
+ "char": "👀",
+ "name": "eyes",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F441",
+ "char": "👁",
+ "name": "eye",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F445",
+ "char": "👅",
+ "name": "tongue",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F444",
+ "char": "👄",
+ "name": "mouth",
+ "category": "People & Body (body-parts)",
+ "group": "People & Body",
+ "subgroup": "body-parts"
+ },
+ {
+ "codes": "1F476",
+ "char": "👶",
+ "name": "baby",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F9D2",
+ "char": "🧒",
+ "name": "child",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F466",
+ "char": "👦",
+ "name": "boy",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F467",
+ "char": "👧",
+ "name": "girl",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F9D1",
+ "char": "🧑",
+ "name": "person",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F468",
+ "char": "👨",
+ "name": "man",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F469",
+ "char": "👩",
+ "name": "woman",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F9D3",
+ "char": "🧓",
+ "name": "older person",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F474",
+ "char": "👴",
+ "name": "old man",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F475",
+ "char": "👵",
+ "name": "old woman",
+ "category": "People & Body (person)",
+ "group": "People & Body",
+ "subgroup": "person"
+ },
+ {
+ "codes": "1F64D",
+ "char": "🙍",
+ "name": "person frowning",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64D 200D 2642 FE0F",
+ "char": "🙍♂️",
+ "name": "man frowning",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64D 200D 2640 FE0F",
+ "char": "🙍♀️",
+ "name": "woman frowning",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64E",
+ "char": "🙎",
+ "name": "person pouting",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64E 200D 2642 FE0F",
+ "char": "🙎♂️",
+ "name": "man pouting",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64E 200D 2640 FE0F",
+ "char": "🙎♀️",
+ "name": "woman pouting",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F645",
+ "char": "🙅",
+ "name": "person gesturing NO",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F645 200D 2642 FE0F",
+ "char": "🙅♂️",
+ "name": "man gesturing NO",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F645 200D 2640 FE0F",
+ "char": "🙅♀️",
+ "name": "woman gesturing NO",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F646",
+ "char": "🙆",
+ "name": "person gesturing OK",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F646 200D 2642 FE0F",
+ "char": "🙆♂️",
+ "name": "man gesturing OK",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F646 200D 2640 FE0F",
+ "char": "🙆♀️",
+ "name": "woman gesturing OK",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F481",
+ "char": "💁",
+ "name": "person tipping hand",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F481 200D 2642 FE0F",
+ "char": "💁♂️",
+ "name": "man tipping hand",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F481 200D 2640 FE0F",
+ "char": "💁♀️",
+ "name": "woman tipping hand",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64B",
+ "char": "🙋",
+ "name": "person raising hand",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64B 200D 2642 FE0F",
+ "char": "🙋♂️",
+ "name": "man raising hand",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F64B 200D 2640 FE0F",
+ "char": "🙋♀️",
+ "name": "woman raising hand",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F9CF",
+ "char": "🧏",
+ "name": "deaf person",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F9CF 200D 2642 FE0F",
+ "char": "🧏♂️",
+ "name": "deaf man",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F9CF 200D 2640 FE0F",
+ "char": "🧏♀️",
+ "name": "deaf woman",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F647",
+ "char": "🙇",
+ "name": "person bowing",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F647 200D 2642 FE0F",
+ "char": "🙇♂️",
+ "name": "man bowing",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F647 200D 2640 FE0F",
+ "char": "🙇♀️",
+ "name": "woman bowing",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F926",
+ "char": "🤦",
+ "name": "person facepalming",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F926 200D 2642 FE0F",
+ "char": "🤦♂️",
+ "name": "man facepalming",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F926 200D 2640 FE0F",
+ "char": "🤦♀️",
+ "name": "woman facepalming",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F937",
+ "char": "🤷",
+ "name": "person shrugging",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F937 200D 2642 FE0F",
+ "char": "🤷♂️",
+ "name": "man shrugging",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F937 200D 2640 FE0F",
+ "char": "🤷♀️",
+ "name": "woman shrugging",
+ "category": "People & Body (person-gesture)",
+ "group": "People & Body",
+ "subgroup": "person-gesture"
+ },
+ {
+ "codes": "1F9D1 200D 2695 FE0F",
+ "char": "🧑⚕️",
+ "name": "health worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 2695 FE0F",
+ "char": "👨⚕️",
+ "name": "man health worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 2695 FE0F",
+ "char": "👩⚕️",
+ "name": "woman health worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F393",
+ "char": "🧑🎓",
+ "name": "student",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F393",
+ "char": "👨🎓",
+ "name": "man student",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F393",
+ "char": "👩🎓",
+ "name": "woman student",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F3EB",
+ "char": "🧑🏫",
+ "name": "teacher",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F3EB",
+ "char": "👨🏫",
+ "name": "man teacher",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F3EB",
+ "char": "👩🏫",
+ "name": "woman teacher",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 2696 FE0F",
+ "char": "🧑⚖️",
+ "name": "judge",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 2696 FE0F",
+ "char": "👨⚖️",
+ "name": "man judge",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 2696 FE0F",
+ "char": "👩⚖️",
+ "name": "woman judge",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F33E",
+ "char": "🧑🌾",
+ "name": "farmer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F33E",
+ "char": "👨🌾",
+ "name": "man farmer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F33E",
+ "char": "👩🌾",
+ "name": "woman farmer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F373",
+ "char": "🧑🍳",
+ "name": "cook",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F373",
+ "char": "👨🍳",
+ "name": "man cook",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F373",
+ "char": "👩🍳",
+ "name": "woman cook",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F527",
+ "char": "🧑🔧",
+ "name": "mechanic",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F527",
+ "char": "👨🔧",
+ "name": "man mechanic",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F527",
+ "char": "👩🔧",
+ "name": "woman mechanic",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F3ED",
+ "char": "🧑🏭",
+ "name": "factory worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F3ED",
+ "char": "👨🏭",
+ "name": "man factory worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F3ED",
+ "char": "👩🏭",
+ "name": "woman factory worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F4BC",
+ "char": "🧑💼",
+ "name": "office worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F4BC",
+ "char": "👨💼",
+ "name": "man office worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F4BC",
+ "char": "👩💼",
+ "name": "woman office worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F52C",
+ "char": "🧑🔬",
+ "name": "scientist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F52C",
+ "char": "👨🔬",
+ "name": "man scientist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F52C",
+ "char": "👩🔬",
+ "name": "woman scientist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F4BB",
+ "char": "🧑💻",
+ "name": "technologist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F4BB",
+ "char": "👨💻",
+ "name": "man technologist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F4BB",
+ "char": "👩💻",
+ "name": "woman technologist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F3A4",
+ "char": "🧑🎤",
+ "name": "singer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F3A4",
+ "char": "👨🎤",
+ "name": "man singer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F3A4",
+ "char": "👩🎤",
+ "name": "woman singer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F3A8",
+ "char": "🧑🎨",
+ "name": "artist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F3A8",
+ "char": "👨🎨",
+ "name": "man artist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F3A8",
+ "char": "👩🎨",
+ "name": "woman artist",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 2708 FE0F",
+ "char": "🧑✈️",
+ "name": "pilot",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 2708 FE0F",
+ "char": "👨✈️",
+ "name": "man pilot",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 2708 FE0F",
+ "char": "👩✈️",
+ "name": "woman pilot",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F680",
+ "char": "🧑🚀",
+ "name": "astronaut",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F680",
+ "char": "👨🚀",
+ "name": "man astronaut",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F680",
+ "char": "👩🚀",
+ "name": "woman astronaut",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F692",
+ "char": "🧑🚒",
+ "name": "firefighter",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F692",
+ "char": "👨🚒",
+ "name": "man firefighter",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F692",
+ "char": "👩🚒",
+ "name": "woman firefighter",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F46E",
+ "char": "👮",
+ "name": "police officer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F46E 200D 2642 FE0F",
+ "char": "👮♂️",
+ "name": "man police officer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F46E 200D 2640 FE0F",
+ "char": "👮♀️",
+ "name": "woman police officer",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F575",
+ "char": "🕵",
+ "name": "detective",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F575 FE0F 200D 2642 FE0F",
+ "char": "🕵️♂️",
+ "name": "man detective",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F575 FE0F 200D 2640 FE0F",
+ "char": "🕵️♀️",
+ "name": "woman detective",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F482",
+ "char": "💂",
+ "name": "guard",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F482 200D 2642 FE0F",
+ "char": "💂♂️",
+ "name": "man guard",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F482 200D 2640 FE0F",
+ "char": "💂♀️",
+ "name": "woman guard",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F977",
+ "char": "🥷",
+ "name": "ninja",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F477",
+ "char": "👷",
+ "name": "construction worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F477 200D 2642 FE0F",
+ "char": "👷♂️",
+ "name": "man construction worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F477 200D 2640 FE0F",
+ "char": "👷♀️",
+ "name": "woman construction worker",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F934",
+ "char": "🤴",
+ "name": "prince",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F478",
+ "char": "👸",
+ "name": "princess",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F473",
+ "char": "👳",
+ "name": "person wearing turban",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F473 200D 2642 FE0F",
+ "char": "👳♂️",
+ "name": "man wearing turban",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F473 200D 2640 FE0F",
+ "char": "👳♀️",
+ "name": "woman wearing turban",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F472",
+ "char": "👲",
+ "name": "person with skullcap",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D5",
+ "char": "🧕",
+ "name": "woman with headscarf",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F935",
+ "char": "🤵",
+ "name": "person in tuxedo",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F935 200D 2642 FE0F",
+ "char": "🤵♂️",
+ "name": "man in tuxedo",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F935 200D 2640 FE0F",
+ "char": "🤵♀️",
+ "name": "woman in tuxedo",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F470",
+ "char": "👰",
+ "name": "person with veil",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F470 200D 2642 FE0F",
+ "char": "👰♂️",
+ "name": "man with veil",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F470 200D 2640 FE0F",
+ "char": "👰♀️",
+ "name": "woman with veil",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F930",
+ "char": "🤰",
+ "name": "pregnant woman",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F931",
+ "char": "🤱",
+ "name": "breast-feeding",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F469 200D 1F37C",
+ "char": "👩🍼",
+ "name": "woman feeding baby",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F468 200D 1F37C",
+ "char": "👨🍼",
+ "name": "man feeding baby",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F9D1 200D 1F37C",
+ "char": "🧑🍼",
+ "name": "person feeding baby",
+ "category": "People & Body (person-role)",
+ "group": "People & Body",
+ "subgroup": "person-role"
+ },
+ {
+ "codes": "1F47C",
+ "char": "👼",
+ "name": "baby angel",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F385",
+ "char": "🎅",
+ "name": "Santa Claus",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F936",
+ "char": "🤶",
+ "name": "Mrs. Claus",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9D1 200D 1F384",
+ "char": "🧑🎄",
+ "name": "mx claus",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9B8",
+ "char": "🦸",
+ "name": "superhero",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9B8 200D 2642 FE0F",
+ "char": "🦸♂️",
+ "name": "man superhero",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9B8 200D 2640 FE0F",
+ "char": "🦸♀️",
+ "name": "woman superhero",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9B9",
+ "char": "🦹",
+ "name": "supervillain",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9B9 200D 2642 FE0F",
+ "char": "🦹♂️",
+ "name": "man supervillain",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9B9 200D 2640 FE0F",
+ "char": "🦹♀️",
+ "name": "woman supervillain",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9D9",
+ "char": "🧙",
+ "name": "mage",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9D9 200D 2642 FE0F",
+ "char": "🧙♂️",
+ "name": "man mage",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9D9 200D 2640 FE0F",
+ "char": "🧙♀️",
+ "name": "woman mage",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DA",
+ "char": "🧚",
+ "name": "fairy",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DA 200D 2642 FE0F",
+ "char": "🧚♂️",
+ "name": "man fairy",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DA 200D 2640 FE0F",
+ "char": "🧚♀️",
+ "name": "woman fairy",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DB",
+ "char": "🧛",
+ "name": "vampire",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DB 200D 2642 FE0F",
+ "char": "🧛♂️",
+ "name": "man vampire",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DB 200D 2640 FE0F",
+ "char": "🧛♀️",
+ "name": "woman vampire",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DC",
+ "char": "🧜",
+ "name": "merperson",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DC 200D 2642 FE0F",
+ "char": "🧜♂️",
+ "name": "merman",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DC 200D 2640 FE0F",
+ "char": "🧜♀️",
+ "name": "mermaid",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DD",
+ "char": "🧝",
+ "name": "elf",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DD 200D 2642 FE0F",
+ "char": "🧝♂️",
+ "name": "man elf",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DD 200D 2640 FE0F",
+ "char": "🧝♀️",
+ "name": "woman elf",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DE",
+ "char": "🧞",
+ "name": "genie",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DE 200D 2642 FE0F",
+ "char": "🧞♂️",
+ "name": "man genie",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DE 200D 2640 FE0F",
+ "char": "🧞♀️",
+ "name": "woman genie",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DF",
+ "char": "🧟",
+ "name": "zombie",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DF 200D 2642 FE0F",
+ "char": "🧟♂️",
+ "name": "man zombie",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F9DF 200D 2640 FE0F",
+ "char": "🧟♀️",
+ "name": "woman zombie",
+ "category": "People & Body (person-fantasy)",
+ "group": "People & Body",
+ "subgroup": "person-fantasy"
+ },
+ {
+ "codes": "1F486",
+ "char": "💆",
+ "name": "person getting massage",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F486 200D 2642 FE0F",
+ "char": "💆♂️",
+ "name": "man getting massage",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F486 200D 2640 FE0F",
+ "char": "💆♀️",
+ "name": "woman getting massage",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F487",
+ "char": "💇",
+ "name": "person getting haircut",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F487 200D 2642 FE0F",
+ "char": "💇♂️",
+ "name": "man getting haircut",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F487 200D 2640 FE0F",
+ "char": "💇♀️",
+ "name": "woman getting haircut",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F6B6",
+ "char": "🚶",
+ "name": "person walking",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F6B6 200D 2642 FE0F",
+ "char": "🚶♂️",
+ "name": "man walking",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F6B6 200D 2640 FE0F",
+ "char": "🚶♀️",
+ "name": "woman walking",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9CD",
+ "char": "🧍",
+ "name": "person standing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9CD 200D 2642 FE0F",
+ "char": "🧍♂️",
+ "name": "man standing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9CD 200D 2640 FE0F",
+ "char": "🧍♀️",
+ "name": "woman standing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9CE",
+ "char": "🧎",
+ "name": "person kneeling",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9CE 200D 2642 FE0F",
+ "char": "🧎♂️",
+ "name": "man kneeling",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9CE 200D 2640 FE0F",
+ "char": "🧎♀️",
+ "name": "woman kneeling",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D1 200D 1F9AF",
+ "char": "🧑🦯",
+ "name": "person with white cane",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F468 200D 1F9AF",
+ "char": "👨🦯",
+ "name": "man with white cane",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F469 200D 1F9AF",
+ "char": "👩🦯",
+ "name": "woman with white cane",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D1 200D 1F9BC",
+ "char": "🧑🦼",
+ "name": "person in motorized wheelchair",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F468 200D 1F9BC",
+ "char": "👨🦼",
+ "name": "man in motorized wheelchair",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F469 200D 1F9BC",
+ "char": "👩🦼",
+ "name": "woman in motorized wheelchair",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D1 200D 1F9BD",
+ "char": "🧑🦽",
+ "name": "person in manual wheelchair",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F468 200D 1F9BD",
+ "char": "👨🦽",
+ "name": "man in manual wheelchair",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F469 200D 1F9BD",
+ "char": "👩🦽",
+ "name": "woman in manual wheelchair",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F3C3",
+ "char": "🏃",
+ "name": "person running",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F3C3 200D 2642 FE0F",
+ "char": "🏃♂️",
+ "name": "man running",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F3C3 200D 2640 FE0F",
+ "char": "🏃♀️",
+ "name": "woman running",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F483",
+ "char": "💃",
+ "name": "woman dancing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F57A",
+ "char": "🕺",
+ "name": "man dancing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F574",
+ "char": "🕴",
+ "name": "person in suit levitating",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F46F",
+ "char": "👯",
+ "name": "people with bunny ears",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F46F 200D 2642 FE0F",
+ "char": "👯♂️",
+ "name": "men with bunny ears",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F46F 200D 2640 FE0F",
+ "char": "👯♀️",
+ "name": "women with bunny ears",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D6",
+ "char": "🧖",
+ "name": "person in steamy room",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D6 200D 2642 FE0F",
+ "char": "🧖♂️",
+ "name": "man in steamy room",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D6 200D 2640 FE0F",
+ "char": "🧖♀️",
+ "name": "woman in steamy room",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D7",
+ "char": "🧗",
+ "name": "person climbing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D7 200D 2642 FE0F",
+ "char": "🧗♂️",
+ "name": "man climbing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F9D7 200D 2640 FE0F",
+ "char": "🧗♀️",
+ "name": "woman climbing",
+ "category": "People & Body (person-activity)",
+ "group": "People & Body",
+ "subgroup": "person-activity"
+ },
+ {
+ "codes": "1F93A",
+ "char": "🤺",
+ "name": "person fencing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3C7",
+ "char": "🏇",
+ "name": "horse racing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "26F7",
+ "char": "⛷",
+ "name": "skier",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3C2",
+ "char": "🏂",
+ "name": "snowboarder",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CC",
+ "char": "🏌",
+ "name": "person golfing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CC FE0F 200D 2642 FE0F",
+ "char": "🏌️♂️",
+ "name": "man golfing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CC FE0F 200D 2640 FE0F",
+ "char": "🏌️♀️",
+ "name": "woman golfing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3C4",
+ "char": "🏄",
+ "name": "person surfing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3C4 200D 2642 FE0F",
+ "char": "🏄♂️",
+ "name": "man surfing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3C4 200D 2640 FE0F",
+ "char": "🏄♀️",
+ "name": "woman surfing",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6A3",
+ "char": "🚣",
+ "name": "person rowing boat",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6A3 200D 2642 FE0F",
+ "char": "🚣♂️",
+ "name": "man rowing boat",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6A3 200D 2640 FE0F",
+ "char": "🚣♀️",
+ "name": "woman rowing boat",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CA",
+ "char": "🏊",
+ "name": "person swimming",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CA 200D 2642 FE0F",
+ "char": "🏊♂️",
+ "name": "man swimming",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CA 200D 2640 FE0F",
+ "char": "🏊♀️",
+ "name": "woman swimming",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "26F9",
+ "char": "⛹",
+ "name": "person bouncing ball",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "26F9 FE0F 200D 2642 FE0F",
+ "char": "⛹️♂️",
+ "name": "man bouncing ball",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "26F9 FE0F 200D 2640 FE0F",
+ "char": "⛹️♀️",
+ "name": "woman bouncing ball",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CB",
+ "char": "🏋",
+ "name": "person lifting weights",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CB FE0F 200D 2642 FE0F",
+ "char": "🏋️♂️",
+ "name": "man lifting weights",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F3CB FE0F 200D 2640 FE0F",
+ "char": "🏋️♀️",
+ "name": "woman lifting weights",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6B4",
+ "char": "🚴",
+ "name": "person biking",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6B4 200D 2642 FE0F",
+ "char": "🚴♂️",
+ "name": "man biking",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6B4 200D 2640 FE0F",
+ "char": "🚴♀️",
+ "name": "woman biking",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6B5",
+ "char": "🚵",
+ "name": "person mountain biking",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6B5 200D 2642 FE0F",
+ "char": "🚵♂️",
+ "name": "man mountain biking",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F6B5 200D 2640 FE0F",
+ "char": "🚵♀️",
+ "name": "woman mountain biking",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F938",
+ "char": "🤸",
+ "name": "person cartwheeling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F938 200D 2642 FE0F",
+ "char": "🤸♂️",
+ "name": "man cartwheeling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F938 200D 2640 FE0F",
+ "char": "🤸♀️",
+ "name": "woman cartwheeling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93C",
+ "char": "🤼",
+ "name": "people wrestling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93C 200D 2642 FE0F",
+ "char": "🤼♂️",
+ "name": "men wrestling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93C 200D 2640 FE0F",
+ "char": "🤼♀️",
+ "name": "women wrestling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93D",
+ "char": "🤽",
+ "name": "person playing water polo",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93D 200D 2642 FE0F",
+ "char": "🤽♂️",
+ "name": "man playing water polo",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93D 200D 2640 FE0F",
+ "char": "🤽♀️",
+ "name": "woman playing water polo",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93E",
+ "char": "🤾",
+ "name": "person playing handball",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93E 200D 2642 FE0F",
+ "char": "🤾♂️",
+ "name": "man playing handball",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F93E 200D 2640 FE0F",
+ "char": "🤾♀️",
+ "name": "woman playing handball",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F939",
+ "char": "🤹",
+ "name": "person juggling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F939 200D 2642 FE0F",
+ "char": "🤹♂️",
+ "name": "man juggling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F939 200D 2640 FE0F",
+ "char": "🤹♀️",
+ "name": "woman juggling",
+ "category": "People & Body (person-sport)",
+ "group": "People & Body",
+ "subgroup": "person-sport"
+ },
+ {
+ "codes": "1F9D8",
+ "char": "🧘",
+ "name": "person in lotus position",
+ "category": "People & Body (person-resting)",
+ "group": "People & Body",
+ "subgroup": "person-resting"
+ },
+ {
+ "codes": "1F9D8 200D 2642 FE0F",
+ "char": "🧘♂️",
+ "name": "man in lotus position",
+ "category": "People & Body (person-resting)",
+ "group": "People & Body",
+ "subgroup": "person-resting"
+ },
+ {
+ "codes": "1F9D8 200D 2640 FE0F",
+ "char": "🧘♀️",
+ "name": "woman in lotus position",
+ "category": "People & Body (person-resting)",
+ "group": "People & Body",
+ "subgroup": "person-resting"
+ },
+ {
+ "codes": "1F6C0",
+ "char": "🛀",
+ "name": "person taking bath",
+ "category": "People & Body (person-resting)",
+ "group": "People & Body",
+ "subgroup": "person-resting"
+ },
+ {
+ "codes": "1F6CC",
+ "char": "🛌",
+ "name": "person in bed",
+ "category": "People & Body (person-resting)",
+ "group": "People & Body",
+ "subgroup": "person-resting"
+ },
+ {
+ "codes": "1F9D1 200D 1F91D 200D 1F9D1",
+ "char": "🧑🤝🧑",
+ "name": "people holding hands",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F46D",
+ "char": "👭",
+ "name": "women holding hands",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F46B",
+ "char": "👫",
+ "name": "woman and man holding hands",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F46C",
+ "char": "👬",
+ "name": "men holding hands",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F48F",
+ "char": "💏",
+ "name": "kiss",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F491",
+ "char": "💑",
+ "name": "couple with heart",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F46A",
+ "char": "👪",
+ "name": "family",
+ "category": "People & Body (family)",
+ "group": "People & Body",
+ "subgroup": "family"
+ },
+ {
+ "codes": "1F5E3",
+ "char": "🗣",
+ "name": "speaking head",
+ "category": "People & Body (person-symbol)",
+ "group": "People & Body",
+ "subgroup": "person-symbol"
+ },
+ {
+ "codes": "1F464",
+ "char": "👤",
+ "name": "bust in silhouette",
+ "category": "People & Body (person-symbol)",
+ "group": "People & Body",
+ "subgroup": "person-symbol"
+ },
+ {
+ "codes": "1F465",
+ "char": "👥",
+ "name": "busts in silhouette",
+ "category": "People & Body (person-symbol)",
+ "group": "People & Body",
+ "subgroup": "person-symbol"
+ },
+ {
+ "codes": "1FAC2",
+ "char": "🫂",
+ "name": "people hugging",
+ "category": "People & Body (person-symbol)",
+ "group": "People & Body",
+ "subgroup": "person-symbol"
+ },
+ {
+ "codes": "1F463",
+ "char": "👣",
+ "name": "footprints",
+ "category": "People & Body (person-symbol)",
+ "group": "People & Body",
+ "subgroup": "person-symbol"
+ },
+ {
+ "codes": "1F435",
+ "char": "🐵",
+ "name": "monkey face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F412",
+ "char": "🐒",
+ "name": "monkey",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F98D",
+ "char": "🦍",
+ "name": "gorilla",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9A7",
+ "char": "🦧",
+ "name": "orangutan",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F436",
+ "char": "🐶",
+ "name": "dog face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F415",
+ "char": "🐕",
+ "name": "dog",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9AE",
+ "char": "🦮",
+ "name": "guide dog",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F415 200D 1F9BA",
+ "char": "🐕🦺",
+ "name": "service dog",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F429",
+ "char": "🐩",
+ "name": "poodle",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43A",
+ "char": "🐺",
+ "name": "wolf",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F98A",
+ "char": "🦊",
+ "name": "fox",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F99D",
+ "char": "🦝",
+ "name": "raccoon",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F431",
+ "char": "🐱",
+ "name": "cat face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F408",
+ "char": "🐈",
+ "name": "cat",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F408 200D 2B1B",
+ "char": "🐈⬛",
+ "name": "black cat",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F981",
+ "char": "🦁",
+ "name": "lion",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F42F",
+ "char": "🐯",
+ "name": "tiger face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F405",
+ "char": "🐅",
+ "name": "tiger",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F406",
+ "char": "🐆",
+ "name": "leopard",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F434",
+ "char": "🐴",
+ "name": "horse face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F40E",
+ "char": "🐎",
+ "name": "horse",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F984",
+ "char": "🦄",
+ "name": "unicorn",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F993",
+ "char": "🦓",
+ "name": "zebra",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F98C",
+ "char": "🦌",
+ "name": "deer",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9AC",
+ "char": "🦬",
+ "name": "bison",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F42E",
+ "char": "🐮",
+ "name": "cow face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F402",
+ "char": "🐂",
+ "name": "ox",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F403",
+ "char": "🐃",
+ "name": "water buffalo",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F404",
+ "char": "🐄",
+ "name": "cow",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F437",
+ "char": "🐷",
+ "name": "pig face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F416",
+ "char": "🐖",
+ "name": "pig",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F417",
+ "char": "🐗",
+ "name": "boar",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43D",
+ "char": "🐽",
+ "name": "pig nose",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F40F",
+ "char": "🐏",
+ "name": "ram",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F411",
+ "char": "🐑",
+ "name": "ewe",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F410",
+ "char": "🐐",
+ "name": "goat",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F42A",
+ "char": "🐪",
+ "name": "camel",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F42B",
+ "char": "🐫",
+ "name": "two-hump camel",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F999",
+ "char": "🦙",
+ "name": "llama",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F992",
+ "char": "🦒",
+ "name": "giraffe",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F418",
+ "char": "🐘",
+ "name": "elephant",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9A3",
+ "char": "🦣",
+ "name": "mammoth",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F98F",
+ "char": "🦏",
+ "name": "rhinoceros",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F99B",
+ "char": "🦛",
+ "name": "hippopotamus",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F42D",
+ "char": "🐭",
+ "name": "mouse face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F401",
+ "char": "🐁",
+ "name": "mouse",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F400",
+ "char": "🐀",
+ "name": "rat",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F439",
+ "char": "🐹",
+ "name": "hamster",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F430",
+ "char": "🐰",
+ "name": "rabbit face",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F407",
+ "char": "🐇",
+ "name": "rabbit",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43F",
+ "char": "🐿",
+ "name": "chipmunk",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9AB",
+ "char": "🦫",
+ "name": "beaver",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F994",
+ "char": "🦔",
+ "name": "hedgehog",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F987",
+ "char": "🦇",
+ "name": "bat",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43B",
+ "char": "🐻",
+ "name": "bear",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43B 200D 2744 FE0F",
+ "char": "🐻❄️",
+ "name": "polar bear",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F428",
+ "char": "🐨",
+ "name": "koala",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43C",
+ "char": "🐼",
+ "name": "panda",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9A5",
+ "char": "🦥",
+ "name": "sloth",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9A6",
+ "char": "🦦",
+ "name": "otter",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9A8",
+ "char": "🦨",
+ "name": "skunk",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F998",
+ "char": "🦘",
+ "name": "kangaroo",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F9A1",
+ "char": "🦡",
+ "name": "badger",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F43E",
+ "char": "🐾",
+ "name": "paw prints",
+ "category": "Animals & Nature (animal-mammal)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-mammal"
+ },
+ {
+ "codes": "1F983",
+ "char": "🦃",
+ "name": "turkey",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F414",
+ "char": "🐔",
+ "name": "chicken",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F413",
+ "char": "🐓",
+ "name": "rooster",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F423",
+ "char": "🐣",
+ "name": "hatching chick",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F424",
+ "char": "🐤",
+ "name": "baby chick",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F425",
+ "char": "🐥",
+ "name": "front-facing baby chick",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F426",
+ "char": "🐦",
+ "name": "bird",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F427",
+ "char": "🐧",
+ "name": "penguin",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F54A",
+ "char": "🕊",
+ "name": "dove",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F985",
+ "char": "🦅",
+ "name": "eagle",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F986",
+ "char": "🦆",
+ "name": "duck",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F9A2",
+ "char": "🦢",
+ "name": "swan",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F989",
+ "char": "🦉",
+ "name": "owl",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F9A4",
+ "char": "🦤",
+ "name": "dodo",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1FAB6",
+ "char": "🪶",
+ "name": "feather",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F9A9",
+ "char": "🦩",
+ "name": "flamingo",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F99A",
+ "char": "🦚",
+ "name": "peacock",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F99C",
+ "char": "🦜",
+ "name": "parrot",
+ "category": "Animals & Nature (animal-bird)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bird"
+ },
+ {
+ "codes": "1F438",
+ "char": "🐸",
+ "name": "frog",
+ "category": "Animals & Nature (animal-amphibian)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-amphibian"
+ },
+ {
+ "codes": "1F40A",
+ "char": "🐊",
+ "name": "crocodile",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F422",
+ "char": "🐢",
+ "name": "turtle",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F98E",
+ "char": "🦎",
+ "name": "lizard",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F40D",
+ "char": "🐍",
+ "name": "snake",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F432",
+ "char": "🐲",
+ "name": "dragon face",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F409",
+ "char": "🐉",
+ "name": "dragon",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F995",
+ "char": "🦕",
+ "name": "sauropod",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F996",
+ "char": "🦖",
+ "name": "T-Rex",
+ "category": "Animals & Nature (animal-reptile)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-reptile"
+ },
+ {
+ "codes": "1F433",
+ "char": "🐳",
+ "name": "spouting whale",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F40B",
+ "char": "🐋",
+ "name": "whale",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F42C",
+ "char": "🐬",
+ "name": "dolphin",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F9AD",
+ "char": "🦭",
+ "name": "seal",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F41F",
+ "char": "🐟",
+ "name": "fish",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F420",
+ "char": "🐠",
+ "name": "tropical fish",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F421",
+ "char": "🐡",
+ "name": "blowfish",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F988",
+ "char": "🦈",
+ "name": "shark",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F419",
+ "char": "🐙",
+ "name": "octopus",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F41A",
+ "char": "🐚",
+ "name": "spiral shell",
+ "category": "Animals & Nature (animal-marine)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-marine"
+ },
+ {
+ "codes": "1F40C",
+ "char": "🐌",
+ "name": "snail",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F98B",
+ "char": "🦋",
+ "name": "butterfly",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F41B",
+ "char": "🐛",
+ "name": "bug",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F41C",
+ "char": "🐜",
+ "name": "ant",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F41D",
+ "char": "🐝",
+ "name": "honeybee",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1FAB2",
+ "char": "🪲",
+ "name": "beetle",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F41E",
+ "char": "🐞",
+ "name": "lady beetle",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F997",
+ "char": "🦗",
+ "name": "cricket",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1FAB3",
+ "char": "🪳",
+ "name": "cockroach",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F577",
+ "char": "🕷",
+ "name": "spider",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F578",
+ "char": "🕸",
+ "name": "spider web",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F982",
+ "char": "🦂",
+ "name": "scorpion",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F99F",
+ "char": "🦟",
+ "name": "mosquito",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1FAB0",
+ "char": "🪰",
+ "name": "fly",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1FAB1",
+ "char": "🪱",
+ "name": "worm",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F9A0",
+ "char": "🦠",
+ "name": "microbe",
+ "category": "Animals & Nature (animal-bug)",
+ "group": "Animals & Nature",
+ "subgroup": "animal-bug"
+ },
+ {
+ "codes": "1F490",
+ "char": "💐",
+ "name": "bouquet",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F338",
+ "char": "🌸",
+ "name": "cherry blossom",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F4AE",
+ "char": "💮",
+ "name": "white flower",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F3F5",
+ "char": "🏵",
+ "name": "rosette",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F339",
+ "char": "🌹",
+ "name": "rose",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F940",
+ "char": "🥀",
+ "name": "wilted flower",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F33A",
+ "char": "🌺",
+ "name": "hibiscus",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F33B",
+ "char": "🌻",
+ "name": "sunflower",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F33C",
+ "char": "🌼",
+ "name": "blossom",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F337",
+ "char": "🌷",
+ "name": "tulip",
+ "category": "Animals & Nature (plant-flower)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-flower"
+ },
+ {
+ "codes": "1F331",
+ "char": "🌱",
+ "name": "seedling",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1FAB4",
+ "char": "🪴",
+ "name": "potted plant",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F332",
+ "char": "🌲",
+ "name": "evergreen tree",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F333",
+ "char": "🌳",
+ "name": "deciduous tree",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F334",
+ "char": "🌴",
+ "name": "palm tree",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F335",
+ "char": "🌵",
+ "name": "cactus",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F33E",
+ "char": "🌾",
+ "name": "sheaf of rice",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F33F",
+ "char": "🌿",
+ "name": "herb",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "2618",
+ "char": "☘",
+ "name": "shamrock",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F340",
+ "char": "🍀",
+ "name": "four leaf clover",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F341",
+ "char": "🍁",
+ "name": "maple leaf",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F342",
+ "char": "🍂",
+ "name": "fallen leaf",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F343",
+ "char": "🍃",
+ "name": "leaf fluttering in wind",
+ "category": "Animals & Nature (plant-other)",
+ "group": "Animals & Nature",
+ "subgroup": "plant-other"
+ },
+ {
+ "codes": "1F347",
+ "char": "🍇",
+ "name": "grapes",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F348",
+ "char": "🍈",
+ "name": "melon",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F349",
+ "char": "🍉",
+ "name": "watermelon",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F34A",
+ "char": "🍊",
+ "name": "tangerine",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F34B",
+ "char": "🍋",
+ "name": "lemon",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F34C",
+ "char": "🍌",
+ "name": "banana",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F34D",
+ "char": "🍍",
+ "name": "pineapple",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F96D",
+ "char": "🥭",
+ "name": "mango",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F34E",
+ "char": "🍎",
+ "name": "red apple",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F34F",
+ "char": "🍏",
+ "name": "green apple",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F350",
+ "char": "🍐",
+ "name": "pear",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F351",
+ "char": "🍑",
+ "name": "peach",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F352",
+ "char": "🍒",
+ "name": "cherries",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F353",
+ "char": "🍓",
+ "name": "strawberry",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1FAD0",
+ "char": "🫐",
+ "name": "blueberries",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F95D",
+ "char": "🥝",
+ "name": "kiwi fruit",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F345",
+ "char": "🍅",
+ "name": "tomato",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1FAD2",
+ "char": "🫒",
+ "name": "olive",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F965",
+ "char": "🥥",
+ "name": "coconut",
+ "category": "Food & Drink (food-fruit)",
+ "group": "Food & Drink",
+ "subgroup": "food-fruit"
+ },
+ {
+ "codes": "1F951",
+ "char": "🥑",
+ "name": "avocado",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F346",
+ "char": "🍆",
+ "name": "eggplant",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F954",
+ "char": "🥔",
+ "name": "potato",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F955",
+ "char": "🥕",
+ "name": "carrot",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F33D",
+ "char": "🌽",
+ "name": "ear of corn",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F336",
+ "char": "🌶",
+ "name": "hot pepper",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1FAD1",
+ "char": "🫑",
+ "name": "bell pepper",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F952",
+ "char": "🥒",
+ "name": "cucumber",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F96C",
+ "char": "🥬",
+ "name": "leafy green",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F966",
+ "char": "🥦",
+ "name": "broccoli",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F9C4",
+ "char": "🧄",
+ "name": "garlic",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F9C5",
+ "char": "🧅",
+ "name": "onion",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F344",
+ "char": "🍄",
+ "name": "mushroom",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F95C",
+ "char": "🥜",
+ "name": "peanuts",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F330",
+ "char": "🌰",
+ "name": "chestnut",
+ "category": "Food & Drink (food-vegetable)",
+ "group": "Food & Drink",
+ "subgroup": "food-vegetable"
+ },
+ {
+ "codes": "1F35E",
+ "char": "🍞",
+ "name": "bread",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F950",
+ "char": "🥐",
+ "name": "croissant",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F956",
+ "char": "🥖",
+ "name": "baguette bread",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1FAD3",
+ "char": "🫓",
+ "name": "flatbread",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F968",
+ "char": "🥨",
+ "name": "pretzel",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F96F",
+ "char": "🥯",
+ "name": "bagel",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F95E",
+ "char": "🥞",
+ "name": "pancakes",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F9C7",
+ "char": "🧇",
+ "name": "waffle",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F9C0",
+ "char": "🧀",
+ "name": "cheese wedge",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F356",
+ "char": "🍖",
+ "name": "meat on bone",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F357",
+ "char": "🍗",
+ "name": "poultry leg",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F969",
+ "char": "🥩",
+ "name": "cut of meat",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F953",
+ "char": "🥓",
+ "name": "bacon",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F354",
+ "char": "🍔",
+ "name": "hamburger",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F35F",
+ "char": "🍟",
+ "name": "french fries",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F355",
+ "char": "🍕",
+ "name": "pizza",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F32D",
+ "char": "🌭",
+ "name": "hot dog",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F96A",
+ "char": "🥪",
+ "name": "sandwich",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F32E",
+ "char": "🌮",
+ "name": "taco",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F32F",
+ "char": "🌯",
+ "name": "burrito",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1FAD4",
+ "char": "🫔",
+ "name": "tamale",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F959",
+ "char": "🥙",
+ "name": "stuffed flatbread",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F9C6",
+ "char": "🧆",
+ "name": "falafel",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F95A",
+ "char": "🥚",
+ "name": "egg",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F373",
+ "char": "🍳",
+ "name": "cooking",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F958",
+ "char": "🥘",
+ "name": "shallow pan of food",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F372",
+ "char": "🍲",
+ "name": "pot of food",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1FAD5",
+ "char": "🫕",
+ "name": "fondue",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F963",
+ "char": "🥣",
+ "name": "bowl with spoon",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F957",
+ "char": "🥗",
+ "name": "green salad",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F37F",
+ "char": "🍿",
+ "name": "popcorn",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F9C8",
+ "char": "🧈",
+ "name": "butter",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F9C2",
+ "char": "🧂",
+ "name": "salt",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F96B",
+ "char": "🥫",
+ "name": "canned food",
+ "category": "Food & Drink (food-prepared)",
+ "group": "Food & Drink",
+ "subgroup": "food-prepared"
+ },
+ {
+ "codes": "1F371",
+ "char": "🍱",
+ "name": "bento box",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F358",
+ "char": "🍘",
+ "name": "rice cracker",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F359",
+ "char": "🍙",
+ "name": "rice ball",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F35A",
+ "char": "🍚",
+ "name": "cooked rice",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F35B",
+ "char": "🍛",
+ "name": "curry rice",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F35C",
+ "char": "🍜",
+ "name": "steaming bowl",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F35D",
+ "char": "🍝",
+ "name": "spaghetti",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F360",
+ "char": "🍠",
+ "name": "roasted sweet potato",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F362",
+ "char": "🍢",
+ "name": "oden",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F363",
+ "char": "🍣",
+ "name": "sushi",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F364",
+ "char": "🍤",
+ "name": "fried shrimp",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F365",
+ "char": "🍥",
+ "name": "fish cake with swirl",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F96E",
+ "char": "🥮",
+ "name": "moon cake",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F361",
+ "char": "🍡",
+ "name": "dango",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F95F",
+ "char": "🥟",
+ "name": "dumpling",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F960",
+ "char": "🥠",
+ "name": "fortune cookie",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F961",
+ "char": "🥡",
+ "name": "takeout box",
+ "category": "Food & Drink (food-asian)",
+ "group": "Food & Drink",
+ "subgroup": "food-asian"
+ },
+ {
+ "codes": "1F980",
+ "char": "🦀",
+ "name": "crab",
+ "category": "Food & Drink (food-marine)",
+ "group": "Food & Drink",
+ "subgroup": "food-marine"
+ },
+ {
+ "codes": "1F99E",
+ "char": "🦞",
+ "name": "lobster",
+ "category": "Food & Drink (food-marine)",
+ "group": "Food & Drink",
+ "subgroup": "food-marine"
+ },
+ {
+ "codes": "1F990",
+ "char": "🦐",
+ "name": "shrimp",
+ "category": "Food & Drink (food-marine)",
+ "group": "Food & Drink",
+ "subgroup": "food-marine"
+ },
+ {
+ "codes": "1F991",
+ "char": "🦑",
+ "name": "squid",
+ "category": "Food & Drink (food-marine)",
+ "group": "Food & Drink",
+ "subgroup": "food-marine"
+ },
+ {
+ "codes": "1F9AA",
+ "char": "🦪",
+ "name": "oyster",
+ "category": "Food & Drink (food-marine)",
+ "group": "Food & Drink",
+ "subgroup": "food-marine"
+ },
+ {
+ "codes": "1F366",
+ "char": "🍦",
+ "name": "soft ice cream",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F367",
+ "char": "🍧",
+ "name": "shaved ice",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F368",
+ "char": "🍨",
+ "name": "ice cream",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F369",
+ "char": "🍩",
+ "name": "doughnut",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F36A",
+ "char": "🍪",
+ "name": "cookie",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F382",
+ "char": "🎂",
+ "name": "birthday cake",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F370",
+ "char": "🍰",
+ "name": "shortcake",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F9C1",
+ "char": "🧁",
+ "name": "cupcake",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F967",
+ "char": "🥧",
+ "name": "pie",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F36B",
+ "char": "🍫",
+ "name": "chocolate bar",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F36C",
+ "char": "🍬",
+ "name": "candy",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F36D",
+ "char": "🍭",
+ "name": "lollipop",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F36E",
+ "char": "🍮",
+ "name": "custard",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F36F",
+ "char": "🍯",
+ "name": "honey pot",
+ "category": "Food & Drink (food-sweet)",
+ "group": "Food & Drink",
+ "subgroup": "food-sweet"
+ },
+ {
+ "codes": "1F37C",
+ "char": "🍼",
+ "name": "baby bottle",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F95B",
+ "char": "🥛",
+ "name": "glass of milk",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "2615",
+ "char": "☕",
+ "name": "hot beverage",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1FAD6",
+ "char": "🫖",
+ "name": "teapot",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F375",
+ "char": "🍵",
+ "name": "teacup without handle",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F376",
+ "char": "🍶",
+ "name": "sake",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F37E",
+ "char": "🍾",
+ "name": "bottle with popping cork",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F377",
+ "char": "🍷",
+ "name": "wine glass",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F378",
+ "char": "🍸",
+ "name": "cocktail glass",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F379",
+ "char": "🍹",
+ "name": "tropical drink",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F37A",
+ "char": "🍺",
+ "name": "beer mug",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F37B",
+ "char": "🍻",
+ "name": "clinking beer mugs",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F942",
+ "char": "🥂",
+ "name": "clinking glasses",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F943",
+ "char": "🥃",
+ "name": "tumbler glass",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F964",
+ "char": "🥤",
+ "name": "cup with straw",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F9CB",
+ "char": "🧋",
+ "name": "bubble tea",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F9C3",
+ "char": "🧃",
+ "name": "beverage box",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F9C9",
+ "char": "🧉",
+ "name": "mate",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F9CA",
+ "char": "🧊",
+ "name": "ice",
+ "category": "Food & Drink (drink)",
+ "group": "Food & Drink",
+ "subgroup": "drink"
+ },
+ {
+ "codes": "1F962",
+ "char": "🥢",
+ "name": "chopsticks",
+ "category": "Food & Drink (dishware)",
+ "group": "Food & Drink",
+ "subgroup": "dishware"
+ },
+ {
+ "codes": "1F37D",
+ "char": "🍽",
+ "name": "fork and knife with plate",
+ "category": "Food & Drink (dishware)",
+ "group": "Food & Drink",
+ "subgroup": "dishware"
+ },
+ {
+ "codes": "1F374",
+ "char": "🍴",
+ "name": "fork and knife",
+ "category": "Food & Drink (dishware)",
+ "group": "Food & Drink",
+ "subgroup": "dishware"
+ },
+ {
+ "codes": "1F944",
+ "char": "🥄",
+ "name": "spoon",
+ "category": "Food & Drink (dishware)",
+ "group": "Food & Drink",
+ "subgroup": "dishware"
+ },
+ {
+ "codes": "1F52A",
+ "char": "🔪",
+ "name": "kitchen knife",
+ "category": "Food & Drink (dishware)",
+ "group": "Food & Drink",
+ "subgroup": "dishware"
+ },
+ {
+ "codes": "1F3FA",
+ "char": "🏺",
+ "name": "amphora",
+ "category": "Food & Drink (dishware)",
+ "group": "Food & Drink",
+ "subgroup": "dishware"
+ },
+ {
+ "codes": "1F30D",
+ "char": "🌍",
+ "name": "globe showing Europe-Africa",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F30E",
+ "char": "🌎",
+ "name": "globe showing Americas",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F30F",
+ "char": "🌏",
+ "name": "globe showing Asia-Australia",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F310",
+ "char": "🌐",
+ "name": "globe with meridians",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F5FA",
+ "char": "🗺",
+ "name": "world map",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F5FE",
+ "char": "🗾",
+ "name": "map of Japan",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F9ED",
+ "char": "🧭",
+ "name": "compass",
+ "category": "Travel & Places (place-map)",
+ "group": "Travel & Places",
+ "subgroup": "place-map"
+ },
+ {
+ "codes": "1F3D4",
+ "char": "🏔",
+ "name": "snow-capped mountain",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "26F0",
+ "char": "⛰",
+ "name": "mountain",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F30B",
+ "char": "🌋",
+ "name": "volcano",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F5FB",
+ "char": "🗻",
+ "name": "mount fuji",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F3D5",
+ "char": "🏕",
+ "name": "camping",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F3D6",
+ "char": "🏖",
+ "name": "beach with umbrella",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F3DC",
+ "char": "🏜",
+ "name": "desert",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F3DD",
+ "char": "🏝",
+ "name": "desert island",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F3DE",
+ "char": "🏞",
+ "name": "national park",
+ "category": "Travel & Places (place-geographic)",
+ "group": "Travel & Places",
+ "subgroup": "place-geographic"
+ },
+ {
+ "codes": "1F3DF",
+ "char": "🏟",
+ "name": "stadium",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3DB",
+ "char": "🏛",
+ "name": "classical building",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3D7",
+ "char": "🏗",
+ "name": "building construction",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F9F1",
+ "char": "🧱",
+ "name": "brick",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1FAA8",
+ "char": "🪨",
+ "name": "rock",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1FAB5",
+ "char": "🪵",
+ "name": "wood",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F6D6",
+ "char": "🛖",
+ "name": "hut",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3D8",
+ "char": "🏘",
+ "name": "houses",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3DA",
+ "char": "🏚",
+ "name": "derelict house",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E0",
+ "char": "🏠",
+ "name": "house",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E1",
+ "char": "🏡",
+ "name": "house with garden",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E2",
+ "char": "🏢",
+ "name": "office building",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E3",
+ "char": "🏣",
+ "name": "Japanese post office",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E4",
+ "char": "🏤",
+ "name": "post office",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E5",
+ "char": "🏥",
+ "name": "hospital",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E6",
+ "char": "🏦",
+ "name": "bank",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E8",
+ "char": "🏨",
+ "name": "hotel",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3E9",
+ "char": "🏩",
+ "name": "love hotel",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3EA",
+ "char": "🏪",
+ "name": "convenience store",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3EB",
+ "char": "🏫",
+ "name": "school",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3EC",
+ "char": "🏬",
+ "name": "department store",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3ED",
+ "char": "🏭",
+ "name": "factory",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3EF",
+ "char": "🏯",
+ "name": "Japanese castle",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F3F0",
+ "char": "🏰",
+ "name": "castle",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F492",
+ "char": "💒",
+ "name": "wedding",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F5FC",
+ "char": "🗼",
+ "name": "Tokyo tower",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "1F5FD",
+ "char": "🗽",
+ "name": "Statue of Liberty",
+ "category": "Travel & Places (place-building)",
+ "group": "Travel & Places",
+ "subgroup": "place-building"
+ },
+ {
+ "codes": "26EA",
+ "char": "⛪",
+ "name": "church",
+ "category": "Travel & Places (place-religious)",
+ "group": "Travel & Places",
+ "subgroup": "place-religious"
+ },
+ {
+ "codes": "1F54C",
+ "char": "🕌",
+ "name": "mosque",
+ "category": "Travel & Places (place-religious)",
+ "group": "Travel & Places",
+ "subgroup": "place-religious"
+ },
+ {
+ "codes": "1F6D5",
+ "char": "🛕",
+ "name": "hindu temple",
+ "category": "Travel & Places (place-religious)",
+ "group": "Travel & Places",
+ "subgroup": "place-religious"
+ },
+ {
+ "codes": "1F54D",
+ "char": "🕍",
+ "name": "synagogue",
+ "category": "Travel & Places (place-religious)",
+ "group": "Travel & Places",
+ "subgroup": "place-religious"
+ },
+ {
+ "codes": "26E9",
+ "char": "⛩",
+ "name": "shinto shrine",
+ "category": "Travel & Places (place-religious)",
+ "group": "Travel & Places",
+ "subgroup": "place-religious"
+ },
+ {
+ "codes": "1F54B",
+ "char": "🕋",
+ "name": "kaaba",
+ "category": "Travel & Places (place-religious)",
+ "group": "Travel & Places",
+ "subgroup": "place-religious"
+ },
+ {
+ "codes": "26F2",
+ "char": "⛲",
+ "name": "fountain",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "26FA",
+ "char": "⛺",
+ "name": "tent",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F301",
+ "char": "🌁",
+ "name": "foggy",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F303",
+ "char": "🌃",
+ "name": "night with stars",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F3D9",
+ "char": "🏙",
+ "name": "cityscape",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F304",
+ "char": "🌄",
+ "name": "sunrise over mountains",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F305",
+ "char": "🌅",
+ "name": "sunrise",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F306",
+ "char": "🌆",
+ "name": "cityscape at dusk",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F307",
+ "char": "🌇",
+ "name": "sunset",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F309",
+ "char": "🌉",
+ "name": "bridge at night",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "2668",
+ "char": "♨",
+ "name": "hot springs",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F3A0",
+ "char": "🎠",
+ "name": "carousel horse",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F3A1",
+ "char": "🎡",
+ "name": "ferris wheel",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F3A2",
+ "char": "🎢",
+ "name": "roller coaster",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F488",
+ "char": "💈",
+ "name": "barber pole",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F3AA",
+ "char": "🎪",
+ "name": "circus tent",
+ "category": "Travel & Places (place-other)",
+ "group": "Travel & Places",
+ "subgroup": "place-other"
+ },
+ {
+ "codes": "1F682",
+ "char": "🚂",
+ "name": "locomotive",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F683",
+ "char": "🚃",
+ "name": "railway car",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F684",
+ "char": "🚄",
+ "name": "high-speed train",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F685",
+ "char": "🚅",
+ "name": "bullet train",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F686",
+ "char": "🚆",
+ "name": "train",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F687",
+ "char": "🚇",
+ "name": "metro",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F688",
+ "char": "🚈",
+ "name": "light rail",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F689",
+ "char": "🚉",
+ "name": "station",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F68A",
+ "char": "🚊",
+ "name": "tram",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F69D",
+ "char": "🚝",
+ "name": "monorail",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F69E",
+ "char": "🚞",
+ "name": "mountain railway",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F68B",
+ "char": "🚋",
+ "name": "tram car",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F68C",
+ "char": "🚌",
+ "name": "bus",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F68D",
+ "char": "🚍",
+ "name": "oncoming bus",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F68E",
+ "char": "🚎",
+ "name": "trolleybus",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F690",
+ "char": "🚐",
+ "name": "minibus",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F691",
+ "char": "🚑",
+ "name": "ambulance",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F692",
+ "char": "🚒",
+ "name": "fire engine",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F693",
+ "char": "🚓",
+ "name": "police car",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F694",
+ "char": "🚔",
+ "name": "oncoming police car",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F695",
+ "char": "🚕",
+ "name": "taxi",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F696",
+ "char": "🚖",
+ "name": "oncoming taxi",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F697",
+ "char": "🚗",
+ "name": "automobile",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F698",
+ "char": "🚘",
+ "name": "oncoming automobile",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F699",
+ "char": "🚙",
+ "name": "sport utility vehicle",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6FB",
+ "char": "🛻",
+ "name": "pickup truck",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F69A",
+ "char": "🚚",
+ "name": "delivery truck",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F69B",
+ "char": "🚛",
+ "name": "articulated lorry",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F69C",
+ "char": "🚜",
+ "name": "tractor",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F3CE",
+ "char": "🏎",
+ "name": "racing car",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F3CD",
+ "char": "🏍",
+ "name": "motorcycle",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6F5",
+ "char": "🛵",
+ "name": "motor scooter",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F9BD",
+ "char": "🦽",
+ "name": "manual wheelchair",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F9BC",
+ "char": "🦼",
+ "name": "motorized wheelchair",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6FA",
+ "char": "🛺",
+ "name": "auto rickshaw",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6B2",
+ "char": "🚲",
+ "name": "bicycle",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6F4",
+ "char": "🛴",
+ "name": "kick scooter",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6F9",
+ "char": "🛹",
+ "name": "skateboard",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6FC",
+ "char": "🛼",
+ "name": "roller skate",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F68F",
+ "char": "🚏",
+ "name": "bus stop",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6E3",
+ "char": "🛣",
+ "name": "motorway",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6E4",
+ "char": "🛤",
+ "name": "railway track",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6E2",
+ "char": "🛢",
+ "name": "oil drum",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "26FD",
+ "char": "⛽",
+ "name": "fuel pump",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6A8",
+ "char": "🚨",
+ "name": "police car light",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6A5",
+ "char": "🚥",
+ "name": "horizontal traffic light",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6A6",
+ "char": "🚦",
+ "name": "vertical traffic light",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6D1",
+ "char": "🛑",
+ "name": "stop sign",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "1F6A7",
+ "char": "🚧",
+ "name": "construction",
+ "category": "Travel & Places (transport-ground)",
+ "group": "Travel & Places",
+ "subgroup": "transport-ground"
+ },
+ {
+ "codes": "2693",
+ "char": "⚓",
+ "name": "anchor",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "26F5",
+ "char": "⛵",
+ "name": "sailboat",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "1F6F6",
+ "char": "🛶",
+ "name": "canoe",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "1F6A4",
+ "char": "🚤",
+ "name": "speedboat",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "1F6F3",
+ "char": "🛳",
+ "name": "passenger ship",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "26F4",
+ "char": "⛴",
+ "name": "ferry",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "1F6E5",
+ "char": "🛥",
+ "name": "motor boat",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "1F6A2",
+ "char": "🚢",
+ "name": "ship",
+ "category": "Travel & Places (transport-water)",
+ "group": "Travel & Places",
+ "subgroup": "transport-water"
+ },
+ {
+ "codes": "2708",
+ "char": "✈",
+ "name": "airplane",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6E9",
+ "char": "🛩",
+ "name": "small airplane",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6EB",
+ "char": "🛫",
+ "name": "airplane departure",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6EC",
+ "char": "🛬",
+ "name": "airplane arrival",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1FA82",
+ "char": "🪂",
+ "name": "parachute",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F4BA",
+ "char": "💺",
+ "name": "seat",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F681",
+ "char": "🚁",
+ "name": "helicopter",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F69F",
+ "char": "🚟",
+ "name": "suspension railway",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6A0",
+ "char": "🚠",
+ "name": "mountain cableway",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6A1",
+ "char": "🚡",
+ "name": "aerial tramway",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6F0",
+ "char": "🛰",
+ "name": "satellite",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F680",
+ "char": "🚀",
+ "name": "rocket",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6F8",
+ "char": "🛸",
+ "name": "flying saucer",
+ "category": "Travel & Places (transport-air)",
+ "group": "Travel & Places",
+ "subgroup": "transport-air"
+ },
+ {
+ "codes": "1F6CE",
+ "char": "🛎",
+ "name": "bellhop bell",
+ "category": "Travel & Places (hotel)",
+ "group": "Travel & Places",
+ "subgroup": "hotel"
+ },
+ {
+ "codes": "1F9F3",
+ "char": "🧳",
+ "name": "luggage",
+ "category": "Travel & Places (hotel)",
+ "group": "Travel & Places",
+ "subgroup": "hotel"
+ },
+ {
+ "codes": "231B",
+ "char": "⌛",
+ "name": "hourglass done",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "23F3",
+ "char": "⏳",
+ "name": "hourglass not done",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "231A",
+ "char": "⌚",
+ "name": "watch",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "23F0",
+ "char": "⏰",
+ "name": "alarm clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "23F1",
+ "char": "⏱",
+ "name": "stopwatch",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "23F2",
+ "char": "⏲",
+ "name": "timer clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F570",
+ "char": "🕰",
+ "name": "mantelpiece clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F55B",
+ "char": "🕛",
+ "name": "twelve o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F567",
+ "char": "🕧",
+ "name": "twelve-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F550",
+ "char": "🕐",
+ "name": "one o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F55C",
+ "char": "🕜",
+ "name": "one-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F551",
+ "char": "🕑",
+ "name": "two o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F55D",
+ "char": "🕝",
+ "name": "two-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F552",
+ "char": "🕒",
+ "name": "three o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F55E",
+ "char": "🕞",
+ "name": "three-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F553",
+ "char": "🕓",
+ "name": "four o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F55F",
+ "char": "🕟",
+ "name": "four-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F554",
+ "char": "🕔",
+ "name": "five o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F560",
+ "char": "🕠",
+ "name": "five-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F555",
+ "char": "🕕",
+ "name": "six o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F561",
+ "char": "🕡",
+ "name": "six-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F556",
+ "char": "🕖",
+ "name": "seven o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F562",
+ "char": "🕢",
+ "name": "seven-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F557",
+ "char": "🕗",
+ "name": "eight o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F563",
+ "char": "🕣",
+ "name": "eight-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F558",
+ "char": "🕘",
+ "name": "nine o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F564",
+ "char": "🕤",
+ "name": "nine-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F559",
+ "char": "🕙",
+ "name": "ten o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F565",
+ "char": "🕥",
+ "name": "ten-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F55A",
+ "char": "🕚",
+ "name": "eleven o’clock",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F566",
+ "char": "🕦",
+ "name": "eleven-thirty",
+ "category": "Travel & Places (time)",
+ "group": "Travel & Places",
+ "subgroup": "time"
+ },
+ {
+ "codes": "1F311",
+ "char": "🌑",
+ "name": "new moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F312",
+ "char": "🌒",
+ "name": "waxing crescent moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F313",
+ "char": "🌓",
+ "name": "first quarter moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F314",
+ "char": "🌔",
+ "name": "waxing gibbous moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F315",
+ "char": "🌕",
+ "name": "full moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F316",
+ "char": "🌖",
+ "name": "waning gibbous moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F317",
+ "char": "🌗",
+ "name": "last quarter moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F318",
+ "char": "🌘",
+ "name": "waning crescent moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F319",
+ "char": "🌙",
+ "name": "crescent moon",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F31A",
+ "char": "🌚",
+ "name": "new moon face",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F31B",
+ "char": "🌛",
+ "name": "first quarter moon face",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F31C",
+ "char": "🌜",
+ "name": "last quarter moon face",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F321",
+ "char": "🌡",
+ "name": "thermometer",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2600",
+ "char": "☀",
+ "name": "sun",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F31D",
+ "char": "🌝",
+ "name": "full moon face",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F31E",
+ "char": "🌞",
+ "name": "sun with face",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1FA90",
+ "char": "🪐",
+ "name": "ringed planet",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2B50",
+ "char": "⭐",
+ "name": "star",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F31F",
+ "char": "🌟",
+ "name": "glowing star",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F320",
+ "char": "🌠",
+ "name": "shooting star",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F30C",
+ "char": "🌌",
+ "name": "milky way",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2601",
+ "char": "☁",
+ "name": "cloud",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "26C5",
+ "char": "⛅",
+ "name": "sun behind cloud",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "26C8",
+ "char": "⛈",
+ "name": "cloud with lightning and rain",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F324",
+ "char": "🌤",
+ "name": "sun behind small cloud",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F325",
+ "char": "🌥",
+ "name": "sun behind large cloud",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F326",
+ "char": "🌦",
+ "name": "sun behind rain cloud",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F327",
+ "char": "🌧",
+ "name": "cloud with rain",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F328",
+ "char": "🌨",
+ "name": "cloud with snow",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F329",
+ "char": "🌩",
+ "name": "cloud with lightning",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F32A",
+ "char": "🌪",
+ "name": "tornado",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F32B",
+ "char": "🌫",
+ "name": "fog",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F32C",
+ "char": "🌬",
+ "name": "wind face",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F300",
+ "char": "🌀",
+ "name": "cyclone",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F308",
+ "char": "🌈",
+ "name": "rainbow",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F302",
+ "char": "🌂",
+ "name": "closed umbrella",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2602",
+ "char": "☂",
+ "name": "umbrella",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2614",
+ "char": "☔",
+ "name": "umbrella with rain drops",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "26F1",
+ "char": "⛱",
+ "name": "umbrella on ground",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "26A1",
+ "char": "⚡",
+ "name": "high voltage",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2744",
+ "char": "❄",
+ "name": "snowflake",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2603",
+ "char": "☃",
+ "name": "snowman",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "26C4",
+ "char": "⛄",
+ "name": "snowman without snow",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "2604",
+ "char": "☄",
+ "name": "comet",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F525",
+ "char": "🔥",
+ "name": "fire",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F4A7",
+ "char": "💧",
+ "name": "droplet",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F30A",
+ "char": "🌊",
+ "name": "water wave",
+ "category": "Travel & Places (sky & weather)",
+ "group": "Travel & Places",
+ "subgroup": "sky & weather"
+ },
+ {
+ "codes": "1F383",
+ "char": "🎃",
+ "name": "jack-o-lantern",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F384",
+ "char": "🎄",
+ "name": "Christmas tree",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F386",
+ "char": "🎆",
+ "name": "fireworks",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F387",
+ "char": "🎇",
+ "name": "sparkler",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F9E8",
+ "char": "🧨",
+ "name": "firecracker",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "2728",
+ "char": "✨",
+ "name": "sparkles",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F388",
+ "char": "🎈",
+ "name": "balloon",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F389",
+ "char": "🎉",
+ "name": "party popper",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F38A",
+ "char": "🎊",
+ "name": "confetti ball",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F38B",
+ "char": "🎋",
+ "name": "tanabata tree",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F38D",
+ "char": "🎍",
+ "name": "pine decoration",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F38E",
+ "char": "🎎",
+ "name": "Japanese dolls",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F38F",
+ "char": "🎏",
+ "name": "carp streamer",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F390",
+ "char": "🎐",
+ "name": "wind chime",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F391",
+ "char": "🎑",
+ "name": "moon viewing ceremony",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F9E7",
+ "char": "🧧",
+ "name": "red envelope",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F380",
+ "char": "🎀",
+ "name": "ribbon",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F381",
+ "char": "🎁",
+ "name": "wrapped gift",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F397",
+ "char": "🎗",
+ "name": "reminder ribbon",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F39F",
+ "char": "🎟",
+ "name": "admission tickets",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F3AB",
+ "char": "🎫",
+ "name": "ticket",
+ "category": "Activities (event)",
+ "group": "Activities",
+ "subgroup": "event"
+ },
+ {
+ "codes": "1F396",
+ "char": "🎖",
+ "name": "military medal",
+ "category": "Activities (award-medal)",
+ "group": "Activities",
+ "subgroup": "award-medal"
+ },
+ {
+ "codes": "1F3C6",
+ "char": "🏆",
+ "name": "trophy",
+ "category": "Activities (award-medal)",
+ "group": "Activities",
+ "subgroup": "award-medal"
+ },
+ {
+ "codes": "1F3C5",
+ "char": "🏅",
+ "name": "sports medal",
+ "category": "Activities (award-medal)",
+ "group": "Activities",
+ "subgroup": "award-medal"
+ },
+ {
+ "codes": "1F947",
+ "char": "🥇",
+ "name": "1st place medal",
+ "category": "Activities (award-medal)",
+ "group": "Activities",
+ "subgroup": "award-medal"
+ },
+ {
+ "codes": "1F948",
+ "char": "🥈",
+ "name": "2nd place medal",
+ "category": "Activities (award-medal)",
+ "group": "Activities",
+ "subgroup": "award-medal"
+ },
+ {
+ "codes": "1F949",
+ "char": "🥉",
+ "name": "3rd place medal",
+ "category": "Activities (award-medal)",
+ "group": "Activities",
+ "subgroup": "award-medal"
+ },
+ {
+ "codes": "26BD",
+ "char": "⚽",
+ "name": "soccer ball",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "26BE",
+ "char": "⚾",
+ "name": "baseball",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F94E",
+ "char": "🥎",
+ "name": "softball",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3C0",
+ "char": "🏀",
+ "name": "basketball",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3D0",
+ "char": "🏐",
+ "name": "volleyball",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3C8",
+ "char": "🏈",
+ "name": "american football",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3C9",
+ "char": "🏉",
+ "name": "rugby football",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3BE",
+ "char": "🎾",
+ "name": "tennis",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F94F",
+ "char": "🥏",
+ "name": "flying disc",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3B3",
+ "char": "🎳",
+ "name": "bowling",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3CF",
+ "char": "🏏",
+ "name": "cricket game",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3D1",
+ "char": "🏑",
+ "name": "field hockey",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3D2",
+ "char": "🏒",
+ "name": "ice hockey",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F94D",
+ "char": "🥍",
+ "name": "lacrosse",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3D3",
+ "char": "🏓",
+ "name": "ping pong",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3F8",
+ "char": "🏸",
+ "name": "badminton",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F94A",
+ "char": "🥊",
+ "name": "boxing glove",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F94B",
+ "char": "🥋",
+ "name": "martial arts uniform",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F945",
+ "char": "🥅",
+ "name": "goal net",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "26F3",
+ "char": "⛳",
+ "name": "flag in hole",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "26F8",
+ "char": "⛸",
+ "name": "ice skate",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3A3",
+ "char": "🎣",
+ "name": "fishing pole",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F93F",
+ "char": "🤿",
+ "name": "diving mask",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3BD",
+ "char": "🎽",
+ "name": "running shirt",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3BF",
+ "char": "🎿",
+ "name": "skis",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F6F7",
+ "char": "🛷",
+ "name": "sled",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F94C",
+ "char": "🥌",
+ "name": "curling stone",
+ "category": "Activities (sport)",
+ "group": "Activities",
+ "subgroup": "sport"
+ },
+ {
+ "codes": "1F3AF",
+ "char": "🎯",
+ "name": "bullseye",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1FA80",
+ "char": "🪀",
+ "name": "yo-yo",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1FA81",
+ "char": "🪁",
+ "name": "kite",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F3B1",
+ "char": "🎱",
+ "name": "pool 8 ball",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F52E",
+ "char": "🔮",
+ "name": "crystal ball",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1FA84",
+ "char": "🪄",
+ "name": "magic wand",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F9FF",
+ "char": "🧿",
+ "name": "nazar amulet",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F3AE",
+ "char": "🎮",
+ "name": "video game",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F579",
+ "char": "🕹",
+ "name": "joystick",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F3B0",
+ "char": "🎰",
+ "name": "slot machine",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F3B2",
+ "char": "🎲",
+ "name": "game die",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F9E9",
+ "char": "🧩",
+ "name": "puzzle piece",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F9F8",
+ "char": "🧸",
+ "name": "teddy bear",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1FA85",
+ "char": "🪅",
+ "name": "piñata",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1FA86",
+ "char": "🪆",
+ "name": "nesting dolls",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "2660",
+ "char": "♠",
+ "name": "spade suit",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "2665",
+ "char": "♥",
+ "name": "heart suit",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "2666",
+ "char": "♦",
+ "name": "diamond suit",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "2663",
+ "char": "♣",
+ "name": "club suit",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "265F",
+ "char": "♟",
+ "name": "chess pawn",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F0CF",
+ "char": "🃏",
+ "name": "joker",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F004",
+ "char": "🀄",
+ "name": "mahjong red dragon",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F3B4",
+ "char": "🎴",
+ "name": "flower playing cards",
+ "category": "Activities (game)",
+ "group": "Activities",
+ "subgroup": "game"
+ },
+ {
+ "codes": "1F3AD",
+ "char": "🎭",
+ "name": "performing arts",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1F5BC",
+ "char": "🖼",
+ "name": "framed picture",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1F3A8",
+ "char": "🎨",
+ "name": "artist palette",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1F9F5",
+ "char": "🧵",
+ "name": "thread",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1FAA1",
+ "char": "🪡",
+ "name": "sewing needle",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1F9F6",
+ "char": "🧶",
+ "name": "yarn",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1FAA2",
+ "char": "🪢",
+ "name": "knot",
+ "category": "Activities (arts & crafts)",
+ "group": "Activities",
+ "subgroup": "arts & crafts"
+ },
+ {
+ "codes": "1F453",
+ "char": "👓",
+ "name": "glasses",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F576",
+ "char": "🕶",
+ "name": "sunglasses",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F97D",
+ "char": "🥽",
+ "name": "goggles",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F97C",
+ "char": "🥼",
+ "name": "lab coat",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F9BA",
+ "char": "🦺",
+ "name": "safety vest",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F454",
+ "char": "👔",
+ "name": "necktie",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F455",
+ "char": "👕",
+ "name": "t-shirt",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F456",
+ "char": "👖",
+ "name": "jeans",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F9E3",
+ "char": "🧣",
+ "name": "scarf",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F9E4",
+ "char": "🧤",
+ "name": "gloves",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F9E5",
+ "char": "🧥",
+ "name": "coat",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F9E6",
+ "char": "🧦",
+ "name": "socks",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F457",
+ "char": "👗",
+ "name": "dress",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F458",
+ "char": "👘",
+ "name": "kimono",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F97B",
+ "char": "🥻",
+ "name": "sari",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1FA71",
+ "char": "🩱",
+ "name": "one-piece swimsuit",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1FA72",
+ "char": "🩲",
+ "name": "briefs",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1FA73",
+ "char": "🩳",
+ "name": "shorts",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F459",
+ "char": "👙",
+ "name": "bikini",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F45A",
+ "char": "👚",
+ "name": "woman’s clothes",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F45B",
+ "char": "👛",
+ "name": "purse",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F45C",
+ "char": "👜",
+ "name": "handbag",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F45D",
+ "char": "👝",
+ "name": "clutch bag",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F6CD",
+ "char": "🛍",
+ "name": "shopping bags",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F392",
+ "char": "🎒",
+ "name": "backpack",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1FA74",
+ "char": "🩴",
+ "name": "thong sandal",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F45E",
+ "char": "👞",
+ "name": "man’s shoe",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F45F",
+ "char": "👟",
+ "name": "running shoe",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F97E",
+ "char": "🥾",
+ "name": "hiking boot",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F97F",
+ "char": "🥿",
+ "name": "flat shoe",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F460",
+ "char": "👠",
+ "name": "high-heeled shoe",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F461",
+ "char": "👡",
+ "name": "woman’s sandal",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1FA70",
+ "char": "🩰",
+ "name": "ballet shoes",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F462",
+ "char": "👢",
+ "name": "woman’s boot",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F451",
+ "char": "👑",
+ "name": "crown",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F452",
+ "char": "👒",
+ "name": "woman’s hat",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F3A9",
+ "char": "🎩",
+ "name": "top hat",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F393",
+ "char": "🎓",
+ "name": "graduation cap",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F9E2",
+ "char": "🧢",
+ "name": "billed cap",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1FA96",
+ "char": "🪖",
+ "name": "military helmet",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "26D1",
+ "char": "⛑",
+ "name": "rescue worker’s helmet",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F4FF",
+ "char": "📿",
+ "name": "prayer beads",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F484",
+ "char": "💄",
+ "name": "lipstick",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F48D",
+ "char": "💍",
+ "name": "ring",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F48E",
+ "char": "💎",
+ "name": "gem stone",
+ "category": "Objects (clothing)",
+ "group": "Objects",
+ "subgroup": "clothing"
+ },
+ {
+ "codes": "1F507",
+ "char": "🔇",
+ "name": "muted speaker",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F508",
+ "char": "🔈",
+ "name": "speaker low volume",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F509",
+ "char": "🔉",
+ "name": "speaker medium volume",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F50A",
+ "char": "🔊",
+ "name": "speaker high volume",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F4E2",
+ "char": "📢",
+ "name": "loudspeaker",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F4E3",
+ "char": "📣",
+ "name": "megaphone",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F4EF",
+ "char": "📯",
+ "name": "postal horn",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F514",
+ "char": "🔔",
+ "name": "bell",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F515",
+ "char": "🔕",
+ "name": "bell with slash",
+ "category": "Objects (sound)",
+ "group": "Objects",
+ "subgroup": "sound"
+ },
+ {
+ "codes": "1F3BC",
+ "char": "🎼",
+ "name": "musical score",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F3B5",
+ "char": "🎵",
+ "name": "musical note",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F3B6",
+ "char": "🎶",
+ "name": "musical notes",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F399",
+ "char": "🎙",
+ "name": "studio microphone",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F39A",
+ "char": "🎚",
+ "name": "level slider",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F39B",
+ "char": "🎛",
+ "name": "control knobs",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F3A4",
+ "char": "🎤",
+ "name": "microphone",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F3A7",
+ "char": "🎧",
+ "name": "headphone",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F4FB",
+ "char": "📻",
+ "name": "radio",
+ "category": "Objects (music)",
+ "group": "Objects",
+ "subgroup": "music"
+ },
+ {
+ "codes": "1F3B7",
+ "char": "🎷",
+ "name": "saxophone",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1FA97",
+ "char": "🪗",
+ "name": "accordion",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1F3B8",
+ "char": "🎸",
+ "name": "guitar",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1F3B9",
+ "char": "🎹",
+ "name": "musical keyboard",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1F3BA",
+ "char": "🎺",
+ "name": "trumpet",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1F3BB",
+ "char": "🎻",
+ "name": "violin",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1FA95",
+ "char": "🪕",
+ "name": "banjo",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1F941",
+ "char": "🥁",
+ "name": "drum",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1FA98",
+ "char": "🪘",
+ "name": "long drum",
+ "category": "Objects (musical-instrument)",
+ "group": "Objects",
+ "subgroup": "musical-instrument"
+ },
+ {
+ "codes": "1F4F1",
+ "char": "📱",
+ "name": "mobile phone",
+ "category": "Objects (phone)",
+ "group": "Objects",
+ "subgroup": "phone"
+ },
+ {
+ "codes": "1F4F2",
+ "char": "📲",
+ "name": "mobile phone with arrow",
+ "category": "Objects (phone)",
+ "group": "Objects",
+ "subgroup": "phone"
+ },
+ {
+ "codes": "260E",
+ "char": "☎",
+ "name": "telephone",
+ "category": "Objects (phone)",
+ "group": "Objects",
+ "subgroup": "phone"
+ },
+ {
+ "codes": "1F4DE",
+ "char": "📞",
+ "name": "telephone receiver",
+ "category": "Objects (phone)",
+ "group": "Objects",
+ "subgroup": "phone"
+ },
+ {
+ "codes": "1F4DF",
+ "char": "📟",
+ "name": "pager",
+ "category": "Objects (phone)",
+ "group": "Objects",
+ "subgroup": "phone"
+ },
+ {
+ "codes": "1F4E0",
+ "char": "📠",
+ "name": "fax machine",
+ "category": "Objects (phone)",
+ "group": "Objects",
+ "subgroup": "phone"
+ },
+ {
+ "codes": "1F50B",
+ "char": "🔋",
+ "name": "battery",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F50C",
+ "char": "🔌",
+ "name": "electric plug",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F4BB",
+ "char": "💻",
+ "name": "laptop",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F5A5",
+ "char": "🖥",
+ "name": "desktop computer",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F5A8",
+ "char": "🖨",
+ "name": "printer",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "2328",
+ "char": "⌨",
+ "name": "keyboard",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F5B1",
+ "char": "🖱",
+ "name": "computer mouse",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F5B2",
+ "char": "🖲",
+ "name": "trackball",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F4BD",
+ "char": "💽",
+ "name": "computer disk",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F4BE",
+ "char": "💾",
+ "name": "floppy disk",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F4BF",
+ "char": "💿",
+ "name": "optical disk",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F4C0",
+ "char": "📀",
+ "name": "dvd",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F9EE",
+ "char": "🧮",
+ "name": "abacus",
+ "category": "Objects (computer)",
+ "group": "Objects",
+ "subgroup": "computer"
+ },
+ {
+ "codes": "1F3A5",
+ "char": "🎥",
+ "name": "movie camera",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F39E",
+ "char": "🎞",
+ "name": "film frames",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4FD",
+ "char": "📽",
+ "name": "film projector",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F3AC",
+ "char": "🎬",
+ "name": "clapper board",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4FA",
+ "char": "📺",
+ "name": "television",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4F7",
+ "char": "📷",
+ "name": "camera",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4F8",
+ "char": "📸",
+ "name": "camera with flash",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4F9",
+ "char": "📹",
+ "name": "video camera",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4FC",
+ "char": "📼",
+ "name": "videocassette",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F50D",
+ "char": "🔍",
+ "name": "magnifying glass tilted left",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F50E",
+ "char": "🔎",
+ "name": "magnifying glass tilted right",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F56F",
+ "char": "🕯",
+ "name": "candle",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4A1",
+ "char": "💡",
+ "name": "light bulb",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F526",
+ "char": "🔦",
+ "name": "flashlight",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F3EE",
+ "char": "🏮",
+ "name": "red paper lantern",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1FA94",
+ "char": "🪔",
+ "name": "diya lamp",
+ "category": "Objects (light & video)",
+ "group": "Objects",
+ "subgroup": "light & video"
+ },
+ {
+ "codes": "1F4D4",
+ "char": "📔",
+ "name": "notebook with decorative cover",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D5",
+ "char": "📕",
+ "name": "closed book",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D6",
+ "char": "📖",
+ "name": "open book",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D7",
+ "char": "📗",
+ "name": "green book",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D8",
+ "char": "📘",
+ "name": "blue book",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D9",
+ "char": "📙",
+ "name": "orange book",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4DA",
+ "char": "📚",
+ "name": "books",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D3",
+ "char": "📓",
+ "name": "notebook",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D2",
+ "char": "📒",
+ "name": "ledger",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4C3",
+ "char": "📃",
+ "name": "page with curl",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4DC",
+ "char": "📜",
+ "name": "scroll",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4C4",
+ "char": "📄",
+ "name": "page facing up",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4F0",
+ "char": "📰",
+ "name": "newspaper",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F5DE",
+ "char": "🗞",
+ "name": "rolled-up newspaper",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4D1",
+ "char": "📑",
+ "name": "bookmark tabs",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F516",
+ "char": "🔖",
+ "name": "bookmark",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F3F7",
+ "char": "🏷",
+ "name": "label",
+ "category": "Objects (book-paper)",
+ "group": "Objects",
+ "subgroup": "book-paper"
+ },
+ {
+ "codes": "1F4B0",
+ "char": "💰",
+ "name": "money bag",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1FA99",
+ "char": "🪙",
+ "name": "coin",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B4",
+ "char": "💴",
+ "name": "yen banknote",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B5",
+ "char": "💵",
+ "name": "dollar banknote",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B6",
+ "char": "💶",
+ "name": "euro banknote",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B7",
+ "char": "💷",
+ "name": "pound banknote",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B8",
+ "char": "💸",
+ "name": "money with wings",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B3",
+ "char": "💳",
+ "name": "credit card",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F9FE",
+ "char": "🧾",
+ "name": "receipt",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "1F4B9",
+ "char": "💹",
+ "name": "chart increasing with yen",
+ "category": "Objects (money)",
+ "group": "Objects",
+ "subgroup": "money"
+ },
+ {
+ "codes": "2709",
+ "char": "✉",
+ "name": "envelope",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4E7",
+ "char": "📧",
+ "name": "e-mail",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4E8",
+ "char": "📨",
+ "name": "incoming envelope",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4E9",
+ "char": "📩",
+ "name": "envelope with arrow",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4E4",
+ "char": "📤",
+ "name": "outbox tray",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4E5",
+ "char": "📥",
+ "name": "inbox tray",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4E6",
+ "char": "📦",
+ "name": "package",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4EB",
+ "char": "📫",
+ "name": "closed mailbox with raised flag",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4EA",
+ "char": "📪",
+ "name": "closed mailbox with lowered flag",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4EC",
+ "char": "📬",
+ "name": "open mailbox with raised flag",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4ED",
+ "char": "📭",
+ "name": "open mailbox with lowered flag",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F4EE",
+ "char": "📮",
+ "name": "postbox",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "1F5F3",
+ "char": "🗳",
+ "name": "ballot box with ballot",
+ "category": "Objects (mail)",
+ "group": "Objects",
+ "subgroup": "mail"
+ },
+ {
+ "codes": "270F",
+ "char": "✏",
+ "name": "pencil",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "2712",
+ "char": "✒",
+ "name": "black nib",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "1F58B",
+ "char": "🖋",
+ "name": "fountain pen",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "1F58A",
+ "char": "🖊",
+ "name": "pen",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "1F58C",
+ "char": "🖌",
+ "name": "paintbrush",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "1F58D",
+ "char": "🖍",
+ "name": "crayon",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "1F4DD",
+ "char": "📝",
+ "name": "memo",
+ "category": "Objects (writing)",
+ "group": "Objects",
+ "subgroup": "writing"
+ },
+ {
+ "codes": "1F4BC",
+ "char": "💼",
+ "name": "briefcase",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C1",
+ "char": "📁",
+ "name": "file folder",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C2",
+ "char": "📂",
+ "name": "open file folder",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F5C2",
+ "char": "🗂",
+ "name": "card index dividers",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C5",
+ "char": "📅",
+ "name": "calendar",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C6",
+ "char": "📆",
+ "name": "tear-off calendar",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F5D2",
+ "char": "🗒",
+ "name": "spiral notepad",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F5D3",
+ "char": "🗓",
+ "name": "spiral calendar",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C7",
+ "char": "📇",
+ "name": "card index",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C8",
+ "char": "📈",
+ "name": "chart increasing",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4C9",
+ "char": "📉",
+ "name": "chart decreasing",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4CA",
+ "char": "📊",
+ "name": "bar chart",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4CB",
+ "char": "📋",
+ "name": "clipboard",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4CC",
+ "char": "📌",
+ "name": "pushpin",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4CD",
+ "char": "📍",
+ "name": "round pushpin",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4CE",
+ "char": "📎",
+ "name": "paperclip",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F587",
+ "char": "🖇",
+ "name": "linked paperclips",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4CF",
+ "char": "📏",
+ "name": "straight ruler",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F4D0",
+ "char": "📐",
+ "name": "triangular ruler",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "2702",
+ "char": "✂",
+ "name": "scissors",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F5C3",
+ "char": "🗃",
+ "name": "card file box",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F5C4",
+ "char": "🗄",
+ "name": "file cabinet",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F5D1",
+ "char": "🗑",
+ "name": "wastebasket",
+ "category": "Objects (office)",
+ "group": "Objects",
+ "subgroup": "office"
+ },
+ {
+ "codes": "1F512",
+ "char": "🔒",
+ "name": "locked",
+ "category": "Objects (lock)",
+ "group": "Objects",
+ "subgroup": "lock"
+ },
+ {
+ "codes": "1F513",
+ "char": "🔓",
+ "name": "unlocked",
+ "category": "Objects (lock)",
+ "group": "Objects",
+ "subgroup": "lock"
+ },
+ {
+ "codes": "1F50F",
+ "char": "🔏",
+ "name": "locked with pen",
+ "category": "Objects (lock)",
+ "group": "Objects",
+ "subgroup": "lock"
+ },
+ {
+ "codes": "1F510",
+ "char": "🔐",
+ "name": "locked with key",
+ "category": "Objects (lock)",
+ "group": "Objects",
+ "subgroup": "lock"
+ },
+ {
+ "codes": "1F511",
+ "char": "🔑",
+ "name": "key",
+ "category": "Objects (lock)",
+ "group": "Objects",
+ "subgroup": "lock"
+ },
+ {
+ "codes": "1F5DD",
+ "char": "🗝",
+ "name": "old key",
+ "category": "Objects (lock)",
+ "group": "Objects",
+ "subgroup": "lock"
+ },
+ {
+ "codes": "1F528",
+ "char": "🔨",
+ "name": "hammer",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1FA93",
+ "char": "🪓",
+ "name": "axe",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "26CF",
+ "char": "⛏",
+ "name": "pick",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "2692",
+ "char": "⚒",
+ "name": "hammer and pick",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F6E0",
+ "char": "🛠",
+ "name": "hammer and wrench",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F5E1",
+ "char": "🗡",
+ "name": "dagger",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "2694",
+ "char": "⚔",
+ "name": "crossed swords",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F52B",
+ "char": "🔫",
+ "name": "water pistol",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1FA83",
+ "char": "🪃",
+ "name": "boomerang",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F3F9",
+ "char": "🏹",
+ "name": "bow and arrow",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F6E1",
+ "char": "🛡",
+ "name": "shield",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1FA9A",
+ "char": "🪚",
+ "name": "carpentry saw",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F527",
+ "char": "🔧",
+ "name": "wrench",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1FA9B",
+ "char": "🪛",
+ "name": "screwdriver",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F529",
+ "char": "🔩",
+ "name": "nut and bolt",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "2699",
+ "char": "⚙",
+ "name": "gear",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F5DC",
+ "char": "🗜",
+ "name": "clamp",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "2696",
+ "char": "⚖",
+ "name": "balance scale",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F9AF",
+ "char": "🦯",
+ "name": "white cane",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F517",
+ "char": "🔗",
+ "name": "link",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "26D3",
+ "char": "⛓",
+ "name": "chains",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1FA9D",
+ "char": "🪝",
+ "name": "hook",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F9F0",
+ "char": "🧰",
+ "name": "toolbox",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1F9F2",
+ "char": "🧲",
+ "name": "magnet",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "1FA9C",
+ "char": "🪜",
+ "name": "ladder",
+ "category": "Objects (tool)",
+ "group": "Objects",
+ "subgroup": "tool"
+ },
+ {
+ "codes": "2697",
+ "char": "⚗",
+ "name": "alembic",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F9EA",
+ "char": "🧪",
+ "name": "test tube",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F9EB",
+ "char": "🧫",
+ "name": "petri dish",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F9EC",
+ "char": "🧬",
+ "name": "dna",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F52C",
+ "char": "🔬",
+ "name": "microscope",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F52D",
+ "char": "🔭",
+ "name": "telescope",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F4E1",
+ "char": "📡",
+ "name": "satellite antenna",
+ "category": "Objects (science)",
+ "group": "Objects",
+ "subgroup": "science"
+ },
+ {
+ "codes": "1F489",
+ "char": "💉",
+ "name": "syringe",
+ "category": "Objects (medical)",
+ "group": "Objects",
+ "subgroup": "medical"
+ },
+ {
+ "codes": "1FA78",
+ "char": "🩸",
+ "name": "drop of blood",
+ "category": "Objects (medical)",
+ "group": "Objects",
+ "subgroup": "medical"
+ },
+ {
+ "codes": "1F48A",
+ "char": "💊",
+ "name": "pill",
+ "category": "Objects (medical)",
+ "group": "Objects",
+ "subgroup": "medical"
+ },
+ {
+ "codes": "1FA79",
+ "char": "🩹",
+ "name": "adhesive bandage",
+ "category": "Objects (medical)",
+ "group": "Objects",
+ "subgroup": "medical"
+ },
+ {
+ "codes": "1FA7A",
+ "char": "🩺",
+ "name": "stethoscope",
+ "category": "Objects (medical)",
+ "group": "Objects",
+ "subgroup": "medical"
+ },
+ {
+ "codes": "1F6AA",
+ "char": "🚪",
+ "name": "door",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6D7",
+ "char": "🛗",
+ "name": "elevator",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FA9E",
+ "char": "🪞",
+ "name": "mirror",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FA9F",
+ "char": "🪟",
+ "name": "window",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6CF",
+ "char": "🛏",
+ "name": "bed",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6CB",
+ "char": "🛋",
+ "name": "couch and lamp",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FA91",
+ "char": "🪑",
+ "name": "chair",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6BD",
+ "char": "🚽",
+ "name": "toilet",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FAA0",
+ "char": "🪠",
+ "name": "plunger",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6BF",
+ "char": "🚿",
+ "name": "shower",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6C1",
+ "char": "🛁",
+ "name": "bathtub",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FAA4",
+ "char": "🪤",
+ "name": "mouse trap",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FA92",
+ "char": "🪒",
+ "name": "razor",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9F4",
+ "char": "🧴",
+ "name": "lotion bottle",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9F7",
+ "char": "🧷",
+ "name": "safety pin",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9F9",
+ "char": "🧹",
+ "name": "broom",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9FA",
+ "char": "🧺",
+ "name": "basket",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9FB",
+ "char": "🧻",
+ "name": "roll of paper",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FAA3",
+ "char": "🪣",
+ "name": "bucket",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9FC",
+ "char": "🧼",
+ "name": "soap",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1FAA5",
+ "char": "🪥",
+ "name": "toothbrush",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9FD",
+ "char": "🧽",
+ "name": "sponge",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F9EF",
+ "char": "🧯",
+ "name": "fire extinguisher",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6D2",
+ "char": "🛒",
+ "name": "shopping cart",
+ "category": "Objects (household)",
+ "group": "Objects",
+ "subgroup": "household"
+ },
+ {
+ "codes": "1F6AC",
+ "char": "🚬",
+ "name": "cigarette",
+ "category": "Objects (other-object)",
+ "group": "Objects",
+ "subgroup": "other-object"
+ },
+ {
+ "codes": "26B0",
+ "char": "⚰",
+ "name": "coffin",
+ "category": "Objects (other-object)",
+ "group": "Objects",
+ "subgroup": "other-object"
+ },
+ {
+ "codes": "1FAA6",
+ "char": "🪦",
+ "name": "headstone",
+ "category": "Objects (other-object)",
+ "group": "Objects",
+ "subgroup": "other-object"
+ },
+ {
+ "codes": "26B1",
+ "char": "⚱",
+ "name": "funeral urn",
+ "category": "Objects (other-object)",
+ "group": "Objects",
+ "subgroup": "other-object"
+ },
+ {
+ "codes": "1F5FF",
+ "char": "🗿",
+ "name": "moai",
+ "category": "Objects (other-object)",
+ "group": "Objects",
+ "subgroup": "other-object"
+ },
+ {
+ "codes": "1FAA7",
+ "char": "🪧",
+ "name": "placard",
+ "category": "Objects (other-object)",
+ "group": "Objects",
+ "subgroup": "other-object"
+ },
+ {
+ "codes": "1F3E7",
+ "char": "🏧",
+ "name": "ATM sign",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6AE",
+ "char": "🚮",
+ "name": "litter in bin sign",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6B0",
+ "char": "🚰",
+ "name": "potable water",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "267F",
+ "char": "♿",
+ "name": "wheelchair symbol",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6B9",
+ "char": "🚹",
+ "name": "men’s room",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6BA",
+ "char": "🚺",
+ "name": "women’s room",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6BB",
+ "char": "🚻",
+ "name": "restroom",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6BC",
+ "char": "🚼",
+ "name": "baby symbol",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6BE",
+ "char": "🚾",
+ "name": "water closet",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6C2",
+ "char": "🛂",
+ "name": "passport control",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6C3",
+ "char": "🛃",
+ "name": "customs",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6C4",
+ "char": "🛄",
+ "name": "baggage claim",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "1F6C5",
+ "char": "🛅",
+ "name": "left luggage",
+ "category": "Symbols (transport-sign)",
+ "group": "Symbols",
+ "subgroup": "transport-sign"
+ },
+ {
+ "codes": "26A0",
+ "char": "⚠",
+ "name": "warning",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6B8",
+ "char": "🚸",
+ "name": "children crossing",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "26D4",
+ "char": "⛔",
+ "name": "no entry",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6AB",
+ "char": "🚫",
+ "name": "prohibited",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6B3",
+ "char": "🚳",
+ "name": "no bicycles",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6AD",
+ "char": "🚭",
+ "name": "no smoking",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6AF",
+ "char": "🚯",
+ "name": "no littering",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6B1",
+ "char": "🚱",
+ "name": "non-potable water",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F6B7",
+ "char": "🚷",
+ "name": "no pedestrians",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F4F5",
+ "char": "📵",
+ "name": "no mobile phones",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "1F51E",
+ "char": "🔞",
+ "name": "no one under eighteen",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "2622",
+ "char": "☢",
+ "name": "radioactive",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "2623",
+ "char": "☣",
+ "name": "biohazard",
+ "category": "Symbols (warning)",
+ "group": "Symbols",
+ "subgroup": "warning"
+ },
+ {
+ "codes": "2B06",
+ "char": "⬆",
+ "name": "up arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2197",
+ "char": "↗",
+ "name": "up-right arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "27A1",
+ "char": "➡",
+ "name": "right arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2198",
+ "char": "↘",
+ "name": "down-right arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2B07",
+ "char": "⬇",
+ "name": "down arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2199",
+ "char": "↙",
+ "name": "down-left arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2B05",
+ "char": "⬅",
+ "name": "left arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2196",
+ "char": "↖",
+ "name": "up-left arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2195",
+ "char": "↕",
+ "name": "up-down arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2194",
+ "char": "↔",
+ "name": "left-right arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "21A9",
+ "char": "↩",
+ "name": "right arrow curving left",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "21AA",
+ "char": "↪",
+ "name": "left arrow curving right",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2934",
+ "char": "⤴",
+ "name": "right arrow curving up",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "2935",
+ "char": "⤵",
+ "name": "right arrow curving down",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F503",
+ "char": "🔃",
+ "name": "clockwise vertical arrows",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F504",
+ "char": "🔄",
+ "name": "counterclockwise arrows button",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F519",
+ "char": "🔙",
+ "name": "BACK arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F51A",
+ "char": "🔚",
+ "name": "END arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F51B",
+ "char": "🔛",
+ "name": "ON! arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F51C",
+ "char": "🔜",
+ "name": "SOON arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F51D",
+ "char": "🔝",
+ "name": "TOP arrow",
+ "category": "Symbols (arrow)",
+ "group": "Symbols",
+ "subgroup": "arrow"
+ },
+ {
+ "codes": "1F6D0",
+ "char": "🛐",
+ "name": "place of worship",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "269B",
+ "char": "⚛",
+ "name": "atom symbol",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "1F549",
+ "char": "🕉",
+ "name": "om",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "2721",
+ "char": "✡",
+ "name": "star of David",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "2638",
+ "char": "☸",
+ "name": "wheel of dharma",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "262F",
+ "char": "☯",
+ "name": "yin yang",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "271D",
+ "char": "✝",
+ "name": "latin cross",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "2626",
+ "char": "☦",
+ "name": "orthodox cross",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "262A",
+ "char": "☪",
+ "name": "star and crescent",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "262E",
+ "char": "☮",
+ "name": "peace symbol",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "1F54E",
+ "char": "🕎",
+ "name": "menorah",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "1F52F",
+ "char": "🔯",
+ "name": "dotted six-pointed star",
+ "category": "Symbols (religion)",
+ "group": "Symbols",
+ "subgroup": "religion"
+ },
+ {
+ "codes": "2648",
+ "char": "♈",
+ "name": "Aries",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "2649",
+ "char": "♉",
+ "name": "Taurus",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "264A",
+ "char": "♊",
+ "name": "Gemini",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "264B",
+ "char": "♋",
+ "name": "Cancer",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "264C",
+ "char": "♌",
+ "name": "Leo",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "264D",
+ "char": "♍",
+ "name": "Virgo",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "264E",
+ "char": "♎",
+ "name": "Libra",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "264F",
+ "char": "♏",
+ "name": "Scorpio",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "2650",
+ "char": "♐",
+ "name": "Sagittarius",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "2651",
+ "char": "♑",
+ "name": "Capricorn",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "2652",
+ "char": "♒",
+ "name": "Aquarius",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "2653",
+ "char": "♓",
+ "name": "Pisces",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "26CE",
+ "char": "⛎",
+ "name": "Ophiuchus",
+ "category": "Symbols (zodiac)",
+ "group": "Symbols",
+ "subgroup": "zodiac"
+ },
+ {
+ "codes": "1F500",
+ "char": "🔀",
+ "name": "shuffle tracks button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F501",
+ "char": "🔁",
+ "name": "repeat button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F502",
+ "char": "🔂",
+ "name": "repeat single button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "25B6",
+ "char": "▶",
+ "name": "play button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23E9",
+ "char": "⏩",
+ "name": "fast-forward button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23ED",
+ "char": "⏭",
+ "name": "next track button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23EF",
+ "char": "⏯",
+ "name": "play or pause button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "25C0",
+ "char": "◀",
+ "name": "reverse button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23EA",
+ "char": "⏪",
+ "name": "fast reverse button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23EE",
+ "char": "⏮",
+ "name": "last track button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F53C",
+ "char": "🔼",
+ "name": "upwards button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23EB",
+ "char": "⏫",
+ "name": "fast up button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F53D",
+ "char": "🔽",
+ "name": "downwards button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23EC",
+ "char": "⏬",
+ "name": "fast down button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23F8",
+ "char": "⏸",
+ "name": "pause button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23F9",
+ "char": "⏹",
+ "name": "stop button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23FA",
+ "char": "⏺",
+ "name": "record button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "23CF",
+ "char": "⏏",
+ "name": "eject button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F3A6",
+ "char": "🎦",
+ "name": "cinema",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F505",
+ "char": "🔅",
+ "name": "dim button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F506",
+ "char": "🔆",
+ "name": "bright button",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F4F6",
+ "char": "📶",
+ "name": "antenna bars",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F4F3",
+ "char": "📳",
+ "name": "vibration mode",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "1F4F4",
+ "char": "📴",
+ "name": "mobile phone off",
+ "category": "Symbols (av-symbol)",
+ "group": "Symbols",
+ "subgroup": "av-symbol"
+ },
+ {
+ "codes": "2640",
+ "char": "♀",
+ "name": "female sign",
+ "category": "Symbols (gender)",
+ "group": "Symbols",
+ "subgroup": "gender"
+ },
+ {
+ "codes": "2642",
+ "char": "♂",
+ "name": "male sign",
+ "category": "Symbols (gender)",
+ "group": "Symbols",
+ "subgroup": "gender"
+ },
+ {
+ "codes": "26A7",
+ "char": "⚧",
+ "name": "transgender symbol",
+ "category": "Symbols (gender)",
+ "group": "Symbols",
+ "subgroup": "gender"
+ },
+ {
+ "codes": "2716",
+ "char": "✖",
+ "name": "multiply",
+ "category": "Symbols (math)",
+ "group": "Symbols",
+ "subgroup": "math"
+ },
+ {
+ "codes": "2795",
+ "char": "➕",
+ "name": "plus",
+ "category": "Symbols (math)",
+ "group": "Symbols",
+ "subgroup": "math"
+ },
+ {
+ "codes": "2796",
+ "char": "➖",
+ "name": "minus",
+ "category": "Symbols (math)",
+ "group": "Symbols",
+ "subgroup": "math"
+ },
+ {
+ "codes": "2797",
+ "char": "➗",
+ "name": "divide",
+ "category": "Symbols (math)",
+ "group": "Symbols",
+ "subgroup": "math"
+ },
+ {
+ "codes": "267E",
+ "char": "♾",
+ "name": "infinity",
+ "category": "Symbols (math)",
+ "group": "Symbols",
+ "subgroup": "math"
+ },
+ {
+ "codes": "203C",
+ "char": "‼",
+ "name": "double exclamation mark",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "2049",
+ "char": "⁉",
+ "name": "exclamation question mark",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "2753",
+ "char": "❓",
+ "name": "red question mark",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "2754",
+ "char": "❔",
+ "name": "white question mark",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "2755",
+ "char": "❕",
+ "name": "white exclamation mark",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "2757",
+ "char": "❗",
+ "name": "red exclamation mark",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "3030",
+ "char": "〰",
+ "name": "wavy dash",
+ "category": "Symbols (punctuation)",
+ "group": "Symbols",
+ "subgroup": "punctuation"
+ },
+ {
+ "codes": "1F4B1",
+ "char": "💱",
+ "name": "currency exchange",
+ "category": "Symbols (currency)",
+ "group": "Symbols",
+ "subgroup": "currency"
+ },
+ {
+ "codes": "1F4B2",
+ "char": "💲",
+ "name": "heavy dollar sign",
+ "category": "Symbols (currency)",
+ "group": "Symbols",
+ "subgroup": "currency"
+ },
+ {
+ "codes": "2695",
+ "char": "⚕",
+ "name": "medical symbol",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "267B",
+ "char": "♻",
+ "name": "recycling symbol",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "269C",
+ "char": "⚜",
+ "name": "fleur-de-lis",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "1F531",
+ "char": "🔱",
+ "name": "trident emblem",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "1F4DB",
+ "char": "📛",
+ "name": "name badge",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "1F530",
+ "char": "🔰",
+ "name": "Japanese symbol for beginner",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2B55",
+ "char": "⭕",
+ "name": "hollow red circle",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2705",
+ "char": "✅",
+ "name": "check mark button",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2611",
+ "char": "☑",
+ "name": "check box with check",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2714",
+ "char": "✔",
+ "name": "check mark",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "274C",
+ "char": "❌",
+ "name": "cross mark",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "274E",
+ "char": "❎",
+ "name": "cross mark button",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "27B0",
+ "char": "➰",
+ "name": "curly loop",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "27BF",
+ "char": "➿",
+ "name": "double curly loop",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "303D",
+ "char": "〽",
+ "name": "part alternation mark",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2733",
+ "char": "✳",
+ "name": "eight-spoked asterisk",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2734",
+ "char": "✴",
+ "name": "eight-pointed star",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2747",
+ "char": "❇",
+ "name": "sparkle",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "2122",
+ "char": "™",
+ "name": "trade mark",
+ "category": "Symbols (other-symbol)",
+ "group": "Symbols",
+ "subgroup": "other-symbol"
+ },
+ {
+ "codes": "1F520",
+ "char": "🔠",
+ "name": "input latin uppercase",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F521",
+ "char": "🔡",
+ "name": "input latin lowercase",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F522",
+ "char": "🔢",
+ "name": "input numbers",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F523",
+ "char": "🔣",
+ "name": "input symbols",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F524",
+ "char": "🔤",
+ "name": "input latin letters",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F170",
+ "char": "🅰",
+ "name": "A button (blood type)",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F18E",
+ "char": "🆎",
+ "name": "AB button (blood type)",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F171",
+ "char": "🅱",
+ "name": "B button (blood type)",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F191",
+ "char": "🆑",
+ "name": "CL button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F192",
+ "char": "🆒",
+ "name": "COOL button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F193",
+ "char": "🆓",
+ "name": "FREE button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "2139",
+ "char": "ℹ",
+ "name": "information",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F194",
+ "char": "🆔",
+ "name": "ID button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "24C2",
+ "char": "Ⓜ",
+ "name": "circled M",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F195",
+ "char": "🆕",
+ "name": "NEW button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F196",
+ "char": "🆖",
+ "name": "NG button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F17E",
+ "char": "🅾",
+ "name": "O button (blood type)",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F197",
+ "char": "🆗",
+ "name": "OK button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F17F",
+ "char": "🅿",
+ "name": "P button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F198",
+ "char": "🆘",
+ "name": "SOS button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F199",
+ "char": "🆙",
+ "name": "UP! button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F19A",
+ "char": "🆚",
+ "name": "VS button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F201",
+ "char": "🈁",
+ "name": "Japanese “here” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F202",
+ "char": "🈂",
+ "name": "Japanese “service charge” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F237",
+ "char": "🈷",
+ "name": "Japanese “monthly amount” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F236",
+ "char": "🈶",
+ "name": "Japanese “not free of charge” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F22F",
+ "char": "🈯",
+ "name": "Japanese “reserved” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F250",
+ "char": "🉐",
+ "name": "Japanese “bargain” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F239",
+ "char": "🈹",
+ "name": "Japanese “discount” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F21A",
+ "char": "🈚",
+ "name": "Japanese “free of charge” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F232",
+ "char": "🈲",
+ "name": "Japanese “prohibited” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F251",
+ "char": "🉑",
+ "name": "Japanese “acceptable” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F238",
+ "char": "🈸",
+ "name": "Japanese “application” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F234",
+ "char": "🈴",
+ "name": "Japanese “passing grade” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F233",
+ "char": "🈳",
+ "name": "Japanese “vacancy” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "3297",
+ "char": "㊗",
+ "name": "Japanese “congratulations” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "3299",
+ "char": "㊙",
+ "name": "Japanese “secret” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F23A",
+ "char": "🈺",
+ "name": "Japanese “open for business” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F235",
+ "char": "🈵",
+ "name": "Japanese “no vacancy” button",
+ "category": "Symbols (alphanum)",
+ "group": "Symbols",
+ "subgroup": "alphanum"
+ },
+ {
+ "codes": "1F534",
+ "char": "🔴",
+ "name": "red circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E0",
+ "char": "🟠",
+ "name": "orange circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E1",
+ "char": "🟡",
+ "name": "yellow circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E2",
+ "char": "🟢",
+ "name": "green circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F535",
+ "char": "🔵",
+ "name": "blue circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E3",
+ "char": "🟣",
+ "name": "purple circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E4",
+ "char": "🟤",
+ "name": "brown circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "26AB",
+ "char": "⚫",
+ "name": "black circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "26AA",
+ "char": "⚪",
+ "name": "white circle",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E5",
+ "char": "🟥",
+ "name": "red square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E7",
+ "char": "🟧",
+ "name": "orange square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E8",
+ "char": "🟨",
+ "name": "yellow square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E9",
+ "char": "🟩",
+ "name": "green square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7E6",
+ "char": "🟦",
+ "name": "blue square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7EA",
+ "char": "🟪",
+ "name": "purple square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F7EB",
+ "char": "🟫",
+ "name": "brown square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "2B1B",
+ "char": "⬛",
+ "name": "black large square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "2B1C",
+ "char": "⬜",
+ "name": "white large square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "25FC",
+ "char": "◼",
+ "name": "black medium square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "25FB",
+ "char": "◻",
+ "name": "white medium square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "25FE",
+ "char": "◾",
+ "name": "black medium-small square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "25FD",
+ "char": "◽",
+ "name": "white medium-small square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "25AA",
+ "char": "▪",
+ "name": "black small square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "25AB",
+ "char": "▫",
+ "name": "white small square",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F536",
+ "char": "🔶",
+ "name": "large orange diamond",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F537",
+ "char": "🔷",
+ "name": "large blue diamond",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F538",
+ "char": "🔸",
+ "name": "small orange diamond",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F539",
+ "char": "🔹",
+ "name": "small blue diamond",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F53A",
+ "char": "🔺",
+ "name": "red triangle pointed up",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F53B",
+ "char": "🔻",
+ "name": "red triangle pointed down",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F4A0",
+ "char": "💠",
+ "name": "diamond with a dot",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F518",
+ "char": "🔘",
+ "name": "radio button",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F533",
+ "char": "🔳",
+ "name": "white square button",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F532",
+ "char": "🔲",
+ "name": "black square button",
+ "category": "Symbols (geometric)",
+ "group": "Symbols",
+ "subgroup": "geometric"
+ },
+ {
+ "codes": "1F3C1",
+ "char": "🏁",
+ "name": "chequered flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F6A9",
+ "char": "🚩",
+ "name": "triangular flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F38C",
+ "char": "🎌",
+ "name": "crossed flags",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F3F4",
+ "char": "🏴",
+ "name": "black flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F3F3",
+ "char": "🏳",
+ "name": "white flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F3F3 FE0F 200D 1F308",
+ "char": "🏳️🌈",
+ "name": "rainbow flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F3F3 FE0F 200D 26A7 FE0F",
+ "char": "🏳️⚧️",
+ "name": "transgender flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F3F4 200D 2620 FE0F",
+ "char": "🏴☠️",
+ "name": "pirate flag",
+ "category": "Flags (flag)",
+ "group": "Flags",
+ "subgroup": "flag"
+ },
+ {
+ "codes": "1F1E6 1F1E8",
+ "char": "🇦🇨",
+ "name": "flag: Ascension Island",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1E9",
+ "char": "🇦🇩",
+ "name": "flag: Andorra",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1EA",
+ "char": "🇦🇪",
+ "name": "flag: United Arab Emirates",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1EB",
+ "char": "🇦🇫",
+ "name": "flag: Afghanistan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1EC",
+ "char": "🇦🇬",
+ "name": "flag: Antigua & Barbuda",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1EE",
+ "char": "🇦🇮",
+ "name": "flag: Anguilla",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F1",
+ "char": "🇦🇱",
+ "name": "flag: Albania",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F2",
+ "char": "🇦🇲",
+ "name": "flag: Armenia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F4",
+ "char": "🇦🇴",
+ "name": "flag: Angola",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F6",
+ "char": "🇦🇶",
+ "name": "flag: Antarctica",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F7",
+ "char": "🇦🇷",
+ "name": "flag: Argentina",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F8",
+ "char": "🇦🇸",
+ "name": "flag: American Samoa",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1F9",
+ "char": "🇦🇹",
+ "name": "flag: Austria",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1FA",
+ "char": "🇦🇺",
+ "name": "flag: Australia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1FC",
+ "char": "🇦🇼",
+ "name": "flag: Aruba",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1FD",
+ "char": "🇦🇽",
+ "name": "flag: Åland Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E6 1F1FF",
+ "char": "🇦🇿",
+ "name": "flag: Azerbaijan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1E6",
+ "char": "🇧🇦",
+ "name": "flag: Bosnia & Herzegovina",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1E7",
+ "char": "🇧🇧",
+ "name": "flag: Barbados",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1E9",
+ "char": "🇧🇩",
+ "name": "flag: Bangladesh",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1EA",
+ "char": "🇧🇪",
+ "name": "flag: Belgium",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1EB",
+ "char": "🇧🇫",
+ "name": "flag: Burkina Faso",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1EC",
+ "char": "🇧🇬",
+ "name": "flag: Bulgaria",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1ED",
+ "char": "🇧🇭",
+ "name": "flag: Bahrain",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1EE",
+ "char": "🇧🇮",
+ "name": "flag: Burundi",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1EF",
+ "char": "🇧🇯",
+ "name": "flag: Benin",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F1",
+ "char": "🇧🇱",
+ "name": "flag: St. Barthélemy",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F2",
+ "char": "🇧🇲",
+ "name": "flag: Bermuda",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F3",
+ "char": "🇧🇳",
+ "name": "flag: Brunei",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F4",
+ "char": "🇧🇴",
+ "name": "flag: Bolivia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F6",
+ "char": "🇧🇶",
+ "name": "flag: Caribbean Netherlands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F7",
+ "char": "🇧🇷",
+ "name": "flag: Brazil",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F8",
+ "char": "🇧🇸",
+ "name": "flag: Bahamas",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1F9",
+ "char": "🇧🇹",
+ "name": "flag: Bhutan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1FB",
+ "char": "🇧🇻",
+ "name": "flag: Bouvet Island",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1FC",
+ "char": "🇧🇼",
+ "name": "flag: Botswana",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1FE",
+ "char": "🇧🇾",
+ "name": "flag: Belarus",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E7 1F1FF",
+ "char": "🇧🇿",
+ "name": "flag: Belize",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1E6",
+ "char": "🇨🇦",
+ "name": "flag: Canada",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1E8",
+ "char": "🇨🇨",
+ "name": "flag: Cocos (Keeling) Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1E9",
+ "char": "🇨🇩",
+ "name": "flag: Congo - Kinshasa",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1EB",
+ "char": "🇨🇫",
+ "name": "flag: Central African Republic",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1EC",
+ "char": "🇨🇬",
+ "name": "flag: Congo - Brazzaville",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1ED",
+ "char": "🇨🇭",
+ "name": "flag: Switzerland",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1EE",
+ "char": "🇨🇮",
+ "name": "flag: Côte d’Ivoire",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F0",
+ "char": "🇨🇰",
+ "name": "flag: Cook Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F1",
+ "char": "🇨🇱",
+ "name": "flag: Chile",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F2",
+ "char": "🇨🇲",
+ "name": "flag: Cameroon",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F3",
+ "char": "🇨🇳",
+ "name": "flag: China",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F4",
+ "char": "🇨🇴",
+ "name": "flag: Colombia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F5",
+ "char": "🇨🇵",
+ "name": "flag: Clipperton Island",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1F7",
+ "char": "🇨🇷",
+ "name": "flag: Costa Rica",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1FA",
+ "char": "🇨🇺",
+ "name": "flag: Cuba",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1FB",
+ "char": "🇨🇻",
+ "name": "flag: Cape Verde",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1FC",
+ "char": "🇨🇼",
+ "name": "flag: Curaçao",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1FD",
+ "char": "🇨🇽",
+ "name": "flag: Christmas Island",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1FE",
+ "char": "🇨🇾",
+ "name": "flag: Cyprus",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E8 1F1FF",
+ "char": "🇨🇿",
+ "name": "flag: Czechia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1EA",
+ "char": "🇩🇪",
+ "name": "flag: Germany",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1EC",
+ "char": "🇩🇬",
+ "name": "flag: Diego Garcia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1EF",
+ "char": "🇩🇯",
+ "name": "flag: Djibouti",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1F0",
+ "char": "🇩🇰",
+ "name": "flag: Denmark",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1F2",
+ "char": "🇩🇲",
+ "name": "flag: Dominica",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1F4",
+ "char": "🇩🇴",
+ "name": "flag: Dominican Republic",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1E9 1F1FF",
+ "char": "🇩🇿",
+ "name": "flag: Algeria",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1E6",
+ "char": "🇪🇦",
+ "name": "flag: Ceuta & Melilla",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1E8",
+ "char": "🇪🇨",
+ "name": "flag: Ecuador",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1EA",
+ "char": "🇪🇪",
+ "name": "flag: Estonia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1EC",
+ "char": "🇪🇬",
+ "name": "flag: Egypt",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1ED",
+ "char": "🇪🇭",
+ "name": "flag: Western Sahara",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1F7",
+ "char": "🇪🇷",
+ "name": "flag: Eritrea",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1F8",
+ "char": "🇪🇸",
+ "name": "flag: Spain",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1F9",
+ "char": "🇪🇹",
+ "name": "flag: Ethiopia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EA 1F1FA",
+ "char": "🇪🇺",
+ "name": "flag: European Union",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EB 1F1EE",
+ "char": "🇫🇮",
+ "name": "flag: Finland",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EB 1F1EF",
+ "char": "🇫🇯",
+ "name": "flag: Fiji",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EB 1F1F0",
+ "char": "🇫🇰",
+ "name": "flag: Falkland Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EB 1F1F2",
+ "char": "🇫🇲",
+ "name": "flag: Micronesia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EB 1F1F4",
+ "char": "🇫🇴",
+ "name": "flag: Faroe Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EB 1F1F7",
+ "char": "🇫🇷",
+ "name": "flag: France",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1E6",
+ "char": "🇬🇦",
+ "name": "flag: Gabon",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1E7",
+ "char": "🇬🇧",
+ "name": "flag: United Kingdom",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1E9",
+ "char": "🇬🇩",
+ "name": "flag: Grenada",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1EA",
+ "char": "🇬🇪",
+ "name": "flag: Georgia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1EB",
+ "char": "🇬🇫",
+ "name": "flag: French Guiana",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1EC",
+ "char": "🇬🇬",
+ "name": "flag: Guernsey",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1ED",
+ "char": "🇬🇭",
+ "name": "flag: Ghana",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1EE",
+ "char": "🇬🇮",
+ "name": "flag: Gibraltar",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F1",
+ "char": "🇬🇱",
+ "name": "flag: Greenland",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F2",
+ "char": "🇬🇲",
+ "name": "flag: Gambia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F3",
+ "char": "🇬🇳",
+ "name": "flag: Guinea",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F5",
+ "char": "🇬🇵",
+ "name": "flag: Guadeloupe",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F6",
+ "char": "🇬🇶",
+ "name": "flag: Equatorial Guinea",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F7",
+ "char": "🇬🇷",
+ "name": "flag: Greece",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F8",
+ "char": "🇬🇸",
+ "name": "flag: South Georgia & South Sandwich Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1F9",
+ "char": "🇬🇹",
+ "name": "flag: Guatemala",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1FA",
+ "char": "🇬🇺",
+ "name": "flag: Guam",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1FC",
+ "char": "🇬🇼",
+ "name": "flag: Guinea-Bissau",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EC 1F1FE",
+ "char": "🇬🇾",
+ "name": "flag: Guyana",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1ED 1F1F0",
+ "char": "🇭🇰",
+ "name": "flag: Hong Kong SAR China",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1ED 1F1F2",
+ "char": "🇭🇲",
+ "name": "flag: Heard & McDonald Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1ED 1F1F3",
+ "char": "🇭🇳",
+ "name": "flag: Honduras",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1ED 1F1F7",
+ "char": "🇭🇷",
+ "name": "flag: Croatia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1ED 1F1F9",
+ "char": "🇭🇹",
+ "name": "flag: Haiti",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1ED 1F1FA",
+ "char": "🇭🇺",
+ "name": "flag: Hungary",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1E8",
+ "char": "🇮🇨",
+ "name": "flag: Canary Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1E9",
+ "char": "🇮🇩",
+ "name": "flag: Indonesia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1EA",
+ "char": "🇮🇪",
+ "name": "flag: Ireland",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F1",
+ "char": "🇮🇱",
+ "name": "flag: Israel",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F2",
+ "char": "🇮🇲",
+ "name": "flag: Isle of Man",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F3",
+ "char": "🇮🇳",
+ "name": "flag: India",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F4",
+ "char": "🇮🇴",
+ "name": "flag: British Indian Ocean Territory",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F6",
+ "char": "🇮🇶",
+ "name": "flag: Iraq",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F7",
+ "char": "🇮🇷",
+ "name": "flag: Iran",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F8",
+ "char": "🇮🇸",
+ "name": "flag: Iceland",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EE 1F1F9",
+ "char": "🇮🇹",
+ "name": "flag: Italy",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EF 1F1EA",
+ "char": "🇯🇪",
+ "name": "flag: Jersey",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EF 1F1F2",
+ "char": "🇯🇲",
+ "name": "flag: Jamaica",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EF 1F1F4",
+ "char": "🇯🇴",
+ "name": "flag: Jordan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1EF 1F1F5",
+ "char": "🇯🇵",
+ "name": "flag: Japan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1EA",
+ "char": "🇰🇪",
+ "name": "flag: Kenya",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1EC",
+ "char": "🇰🇬",
+ "name": "flag: Kyrgyzstan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1ED",
+ "char": "🇰🇭",
+ "name": "flag: Cambodia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1EE",
+ "char": "🇰🇮",
+ "name": "flag: Kiribati",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1F2",
+ "char": "🇰🇲",
+ "name": "flag: Comoros",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1F3",
+ "char": "🇰🇳",
+ "name": "flag: St. Kitts & Nevis",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1F5",
+ "char": "🇰🇵",
+ "name": "flag: North Korea",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1F7",
+ "char": "🇰🇷",
+ "name": "flag: South Korea",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1FC",
+ "char": "🇰🇼",
+ "name": "flag: Kuwait",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1FE",
+ "char": "🇰🇾",
+ "name": "flag: Cayman Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F0 1F1FF",
+ "char": "🇰🇿",
+ "name": "flag: Kazakhstan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1E6",
+ "char": "🇱🇦",
+ "name": "flag: Laos",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1E7",
+ "char": "🇱🇧",
+ "name": "flag: Lebanon",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1E8",
+ "char": "🇱🇨",
+ "name": "flag: St. Lucia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1EE",
+ "char": "🇱🇮",
+ "name": "flag: Liechtenstein",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1F0",
+ "char": "🇱🇰",
+ "name": "flag: Sri Lanka",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1F7",
+ "char": "🇱🇷",
+ "name": "flag: Liberia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1F8",
+ "char": "🇱🇸",
+ "name": "flag: Lesotho",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1F9",
+ "char": "🇱🇹",
+ "name": "flag: Lithuania",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1FA",
+ "char": "🇱🇺",
+ "name": "flag: Luxembourg",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1FB",
+ "char": "🇱🇻",
+ "name": "flag: Latvia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F1 1F1FE",
+ "char": "🇱🇾",
+ "name": "flag: Libya",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1E6",
+ "char": "🇲🇦",
+ "name": "flag: Morocco",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1E8",
+ "char": "🇲🇨",
+ "name": "flag: Monaco",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1E9",
+ "char": "🇲🇩",
+ "name": "flag: Moldova",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1EA",
+ "char": "🇲🇪",
+ "name": "flag: Montenegro",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1EB",
+ "char": "🇲🇫",
+ "name": "flag: St. Martin",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1EC",
+ "char": "🇲🇬",
+ "name": "flag: Madagascar",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1ED",
+ "char": "🇲🇭",
+ "name": "flag: Marshall Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F0",
+ "char": "🇲🇰",
+ "name": "flag: North Macedonia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F1",
+ "char": "🇲🇱",
+ "name": "flag: Mali",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F2",
+ "char": "🇲🇲",
+ "name": "flag: Myanmar (Burma)",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F3",
+ "char": "🇲🇳",
+ "name": "flag: Mongolia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F4",
+ "char": "🇲🇴",
+ "name": "flag: Macao SAR China",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F5",
+ "char": "🇲🇵",
+ "name": "flag: Northern Mariana Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F6",
+ "char": "🇲🇶",
+ "name": "flag: Martinique",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F7",
+ "char": "🇲🇷",
+ "name": "flag: Mauritania",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F8",
+ "char": "🇲🇸",
+ "name": "flag: Montserrat",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1F9",
+ "char": "🇲🇹",
+ "name": "flag: Malta",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1FA",
+ "char": "🇲🇺",
+ "name": "flag: Mauritius",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1FB",
+ "char": "🇲🇻",
+ "name": "flag: Maldives",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1FC",
+ "char": "🇲🇼",
+ "name": "flag: Malawi",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1FD",
+ "char": "🇲🇽",
+ "name": "flag: Mexico",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1FE",
+ "char": "🇲🇾",
+ "name": "flag: Malaysia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F2 1F1FF",
+ "char": "🇲🇿",
+ "name": "flag: Mozambique",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1E6",
+ "char": "🇳🇦",
+ "name": "flag: Namibia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1E8",
+ "char": "🇳🇨",
+ "name": "flag: New Caledonia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1EA",
+ "char": "🇳🇪",
+ "name": "flag: Niger",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1EB",
+ "char": "🇳🇫",
+ "name": "flag: Norfolk Island",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1EC",
+ "char": "🇳🇬",
+ "name": "flag: Nigeria",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1EE",
+ "char": "🇳🇮",
+ "name": "flag: Nicaragua",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1F1",
+ "char": "🇳🇱",
+ "name": "flag: Netherlands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1F4",
+ "char": "🇳🇴",
+ "name": "flag: Norway",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1F5",
+ "char": "🇳🇵",
+ "name": "flag: Nepal",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1F7",
+ "char": "🇳🇷",
+ "name": "flag: Nauru",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1FA",
+ "char": "🇳🇺",
+ "name": "flag: Niue",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F3 1F1FF",
+ "char": "🇳🇿",
+ "name": "flag: New Zealand",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F4 1F1F2",
+ "char": "🇴🇲",
+ "name": "flag: Oman",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1E6",
+ "char": "🇵🇦",
+ "name": "flag: Panama",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1EA",
+ "char": "🇵🇪",
+ "name": "flag: Peru",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1EB",
+ "char": "🇵🇫",
+ "name": "flag: French Polynesia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1EC",
+ "char": "🇵🇬",
+ "name": "flag: Papua New Guinea",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1ED",
+ "char": "🇵🇭",
+ "name": "flag: Philippines",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F0",
+ "char": "🇵🇰",
+ "name": "flag: Pakistan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F1",
+ "char": "🇵🇱",
+ "name": "flag: Poland",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F2",
+ "char": "🇵🇲",
+ "name": "flag: St. Pierre & Miquelon",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F3",
+ "char": "🇵🇳",
+ "name": "flag: Pitcairn Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F7",
+ "char": "🇵🇷",
+ "name": "flag: Puerto Rico",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F8",
+ "char": "🇵🇸",
+ "name": "flag: Palestinian Territories",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1F9",
+ "char": "🇵🇹",
+ "name": "flag: Portugal",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1FC",
+ "char": "🇵🇼",
+ "name": "flag: Palau",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F5 1F1FE",
+ "char": "🇵🇾",
+ "name": "flag: Paraguay",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F6 1F1E6",
+ "char": "🇶🇦",
+ "name": "flag: Qatar",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F7 1F1EA",
+ "char": "🇷🇪",
+ "name": "flag: Réunion",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F7 1F1F4",
+ "char": "🇷🇴",
+ "name": "flag: Romania",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F7 1F1F8",
+ "char": "🇷🇸",
+ "name": "flag: Serbia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F7 1F1FA",
+ "char": "🇷🇺",
+ "name": "flag: Russia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F7 1F1FC",
+ "char": "🇷🇼",
+ "name": "flag: Rwanda",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1E6",
+ "char": "🇸🇦",
+ "name": "flag: Saudi Arabia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1E7",
+ "char": "🇸🇧",
+ "name": "flag: Solomon Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1E8",
+ "char": "🇸🇨",
+ "name": "flag: Seychelles",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1E9",
+ "char": "🇸🇩",
+ "name": "flag: Sudan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1EA",
+ "char": "🇸🇪",
+ "name": "flag: Sweden",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1EC",
+ "char": "🇸🇬",
+ "name": "flag: Singapore",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1ED",
+ "char": "🇸🇭",
+ "name": "flag: St. Helena",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1EE",
+ "char": "🇸🇮",
+ "name": "flag: Slovenia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1EF",
+ "char": "🇸🇯",
+ "name": "flag: Svalbard & Jan Mayen",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F0",
+ "char": "🇸🇰",
+ "name": "flag: Slovakia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F1",
+ "char": "🇸🇱",
+ "name": "flag: Sierra Leone",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F2",
+ "char": "🇸🇲",
+ "name": "flag: San Marino",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F3",
+ "char": "🇸🇳",
+ "name": "flag: Senegal",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F4",
+ "char": "🇸🇴",
+ "name": "flag: Somalia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F7",
+ "char": "🇸🇷",
+ "name": "flag: Suriname",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F8",
+ "char": "🇸🇸",
+ "name": "flag: South Sudan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1F9",
+ "char": "🇸🇹",
+ "name": "flag: São Tomé & Príncipe",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1FB",
+ "char": "🇸🇻",
+ "name": "flag: El Salvador",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1FD",
+ "char": "🇸🇽",
+ "name": "flag: Sint Maarten",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1FE",
+ "char": "🇸🇾",
+ "name": "flag: Syria",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F8 1F1FF",
+ "char": "🇸🇿",
+ "name": "flag: Eswatini",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1E6",
+ "char": "🇹🇦",
+ "name": "flag: Tristan da Cunha",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1E8",
+ "char": "🇹🇨",
+ "name": "flag: Turks & Caicos Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1E9",
+ "char": "🇹🇩",
+ "name": "flag: Chad",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1EB",
+ "char": "🇹🇫",
+ "name": "flag: French Southern Territories",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1EC",
+ "char": "🇹🇬",
+ "name": "flag: Togo",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1ED",
+ "char": "🇹🇭",
+ "name": "flag: Thailand",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1EF",
+ "char": "🇹🇯",
+ "name": "flag: Tajikistan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F0",
+ "char": "🇹🇰",
+ "name": "flag: Tokelau",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F1",
+ "char": "🇹🇱",
+ "name": "flag: Timor-Leste",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F2",
+ "char": "🇹🇲",
+ "name": "flag: Turkmenistan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F3",
+ "char": "🇹🇳",
+ "name": "flag: Tunisia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F4",
+ "char": "🇹🇴",
+ "name": "flag: Tonga",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F7",
+ "char": "🇹🇷",
+ "name": "flag: Turkey",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1F9",
+ "char": "🇹🇹",
+ "name": "flag: Trinidad & Tobago",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1FB",
+ "char": "🇹🇻",
+ "name": "flag: Tuvalu",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1FC",
+ "char": "🇹🇼",
+ "name": "flag: Taiwan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1F9 1F1FF",
+ "char": "🇹🇿",
+ "name": "flag: Tanzania",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1E6",
+ "char": "🇺🇦",
+ "name": "flag: Ukraine",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1EC",
+ "char": "🇺🇬",
+ "name": "flag: Uganda",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1F2",
+ "char": "🇺🇲",
+ "name": "flag: U.S. Outlying Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1F3",
+ "char": "🇺🇳",
+ "name": "flag: United Nations",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1F8",
+ "char": "🇺🇸",
+ "name": "flag: United States",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1FE",
+ "char": "🇺🇾",
+ "name": "flag: Uruguay",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FA 1F1FF",
+ "char": "🇺🇿",
+ "name": "flag: Uzbekistan",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1E6",
+ "char": "🇻🇦",
+ "name": "flag: Vatican City",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1E8",
+ "char": "🇻🇨",
+ "name": "flag: St. Vincent & Grenadines",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1EA",
+ "char": "🇻🇪",
+ "name": "flag: Venezuela",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1EC",
+ "char": "🇻🇬",
+ "name": "flag: British Virgin Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1EE",
+ "char": "🇻🇮",
+ "name": "flag: U.S. Virgin Islands",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1F3",
+ "char": "🇻🇳",
+ "name": "flag: Vietnam",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FB 1F1FA",
+ "char": "🇻🇺",
+ "name": "flag: Vanuatu",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FC 1F1EB",
+ "char": "🇼🇫",
+ "name": "flag: Wallis & Futuna",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FC 1F1F8",
+ "char": "🇼🇸",
+ "name": "flag: Samoa",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FD 1F1F0",
+ "char": "🇽🇰",
+ "name": "flag: Kosovo",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FE 1F1EA",
+ "char": "🇾🇪",
+ "name": "flag: Yemen",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FE 1F1F9",
+ "char": "🇾🇹",
+ "name": "flag: Mayotte",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FF 1F1E6",
+ "char": "🇿🇦",
+ "name": "flag: South Africa",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FF 1F1F2",
+ "char": "🇿🇲",
+ "name": "flag: Zambia",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F1FF 1F1FC",
+ "char": "🇿🇼",
+ "name": "flag: Zimbabwe",
+ "category": "Flags (country-flag)",
+ "group": "Flags",
+ "subgroup": "country-flag"
+ },
+ {
+ "codes": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F",
+ "char": "🏴",
+ "name": "flag: England",
+ "category": "Flags (subdivision-flag)",
+ "group": "Flags",
+ "subgroup": "subdivision-flag"
+ },
+ {
+ "codes": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F",
+ "char": "🏴",
+ "name": "flag: Scotland",
+ "category": "Flags (subdivision-flag)",
+ "group": "Flags",
+ "subgroup": "subdivision-flag"
+ },
+ {
+ "codes": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F",
+ "char": "🏴",
+ "name": "flag: Wales",
+ "category": "Flags (subdivision-flag)",
+ "group": "Flags",
+ "subgroup": "subdivision-flag"
+ }
+ ],
+ "emojisGroups": [
+ {
+ "name": "Smileys & Emotion",
+ "emoji": {
+ "codes": "1F600",
+ "char": "😀",
+ "name": "grinning face"
+ }
+ },
+ {
+ "name": "People & Body",
+ "emoji": {
+ "codes": "1F91A",
+ "char": "🤚",
+ "name": "raised back of hand"
+ }
+ },
+ {
+ "name": "Animals & Nature",
+ "emoji": {
+ "codes": "1F435",
+ "char": "🐵",
+ "name": "monkey face"
+ }
+ },
+ {
+ "name": "Food & Drink",
+ "emoji": {
+ "codes": "1F34F",
+ "char": "🍏",
+ "name": "green apple"
+ }
+ },
+ {
+ "name": "Travel & Places",
+ "emoji": {
+ "codes": "1F697",
+ "char": "🚗",
+ "name": "automobile"
+ }
+ },
+ {
+ "name": "Activities",
+ "emoji": {
+ "codes": "26BD",
+ "char": "⚽",
+ "name": "soccer ball"
+ }
+ },
+ {
+ "name": "Objects",
+ "emoji": {
+ "codes": "231A",
+ "char": "⌚",
+ "name": "watch"
+ }
+ },
+ {
+ "name": "Symbols",
+ "emoji": {
+ "codes": "2705",
+ "char": "✅",
+ "name": "check mark button"
+ }
+ },
+ {
+ "name": "Flags",
+ "emoji": {
+ "codes": "1F3F3",
+ "char": "🏳",
+ "name": "white flag"
+ }
+ }
+ ]
}
\ No newline at end of file
diff --git a/public/assets/images/default-avatar.png b/public/assets/images/default-avatar.png
index bc9b7799..29a74bdc 100644
Binary files a/public/assets/images/default-avatar.png and b/public/assets/images/default-avatar.png differ
diff --git a/public/css/app.css b/public/css/app.css
index f6a36ac1..d65e921e 100644
--- a/public/css/app.css
+++ b/public/css/app.css
@@ -1 +1,375 @@
-#viewport{width:100%;transition:all .2s ease;flex:1}#application-wrapper,#viewport{display:flex;height:100%}#application-wrapper #content,#single-page{position:relative;width:100%}#single-page{overflow-x:hidden;height:100%;padding-left:25px;padding-right:25px}#single-page #page-content{margin:0 auto}#single-page #page-content.full-width{max-width:100%}#single-page #page-content.medium-width{max-width:700px}#single-page #page-content.large-width{max-width:1190px}#single-page #page-content.small-width{max-width:690px}#single-page #page-content.center-page{height:100%;padding-top:20px;margin-bottom:50px;display:grid;width:100%}#single-page #page-content.center-page .content-page{margin:auto;width:100%}.form-fixed-width{width:700px;margin:0 auto}.form-group,.form-group-label{margin-bottom:25px}.form-group-label{font-size:1.125em;font-weight:800;letter-spacing:.3px;display:block}.menu-list-wrapper.vertical{margin-bottom:20px}.menu-list-wrapper.vertical .menu-list-item{display:block;padding:12px 15px 12px 25px}.menu-list-wrapper.horizontal{display:flex;border-bottom:2px solid #f8f8f8;margin-bottom:30px;overflow-x:auto;z-index:9;position:-webkit-sticky;position:sticky;background:#fff;top:40px}.menu-list-wrapper.horizontal::-webkit-scrollbar{display:none}.menu-list-wrapper.horizontal .menu-list-item{display:inline-block;padding:15px 10px;margin:15px 10px 0;border-bottom:2px solid transparent}.menu-list-wrapper.horizontal .menu-list-item:first-child{margin-left:0}.menu-list-wrapper.horizontal .menu-list-item.router-link-exact-active{border-bottom:2px solid #00bc7e}.menu-list-wrapper .menu-list-item{text-decoration:none;cursor:pointer;position:relative;white-space:nowrap}.menu-list-wrapper .menu-list-item.link{display:flex;align-items:center}.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg circle,.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg ellipse,.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg line,.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg path,.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg polyline,.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg rect,.menu-list-wrapper .menu-list-item.link.trash:hover svg circle,.menu-list-wrapper .menu-list-item.link.trash:hover svg ellipse,.menu-list-wrapper .menu-list-item.link.trash:hover svg line,.menu-list-wrapper .menu-list-item.link.trash:hover svg path,.menu-list-wrapper .menu-list-item.link.trash:hover svg polyline,.menu-list-wrapper .menu-list-item.link.trash:hover svg rect{stroke:#fd397a}.menu-list-wrapper .menu-list-item.link.trash.is-active-trash .label,.menu-list-wrapper .menu-list-item.link.trash:hover .label{color:#fd397a}.menu-list-wrapper .menu-list-item.link.is-active svg circle,.menu-list-wrapper .menu-list-item.link.is-active svg ellipse,.menu-list-wrapper .menu-list-item.link.is-active svg line,.menu-list-wrapper .menu-list-item.link.is-active svg path,.menu-list-wrapper .menu-list-item.link.is-active svg polyline,.menu-list-wrapper .menu-list-item.link.is-active svg rect,.menu-list-wrapper .menu-list-item.link.router-link-exact-active svg circle,.menu-list-wrapper .menu-list-item.link.router-link-exact-active svg ellipse,.menu-list-wrapper .menu-list-item.link.router-link-exact-active svg line,.menu-list-wrapper .menu-list-item.link.router-link-exact-active svg path,.menu-list-wrapper .menu-list-item.link.router-link-exact-active svg polyline,.menu-list-wrapper .menu-list-item.link.router-link-exact-active svg rect,.menu-list-wrapper .menu-list-item.link:hover svg circle,.menu-list-wrapper .menu-list-item.link:hover svg ellipse,.menu-list-wrapper .menu-list-item.link:hover svg line,.menu-list-wrapper .menu-list-item.link:hover svg path,.menu-list-wrapper .menu-list-item.link:hover svg polyline,.menu-list-wrapper .menu-list-item.link:hover svg rect{stroke:#00bc7e}.menu-list-wrapper .menu-list-item.link.is-active .label,.menu-list-wrapper .menu-list-item.link.router-link-exact-active .label,.menu-list-wrapper .menu-list-item.link:hover .label{color:#00bc7e}.menu-list-wrapper .menu-list-item.link .icon{margin-right:12px;line-height:0}.menu-list-wrapper .menu-list-item.link .icon circle,.menu-list-wrapper .menu-list-item.link .icon ellipse,.menu-list-wrapper .menu-list-item.link .icon line,.menu-list-wrapper .menu-list-item.link .icon path,.menu-list-wrapper .menu-list-item.link .icon polyline,.menu-list-wrapper .menu-list-item.link .icon rect{stroke:#1b2539}.menu-list-wrapper .menu-list-item.link .text-label{font-size:1em}.menu-list-wrapper .menu-list-item.is-active .delete-icon,.menu-list-wrapper .menu-list-item:hover .delete-icon{display:block}.menu-list-wrapper .menu-list-item .folder-icon{line-height:0;width:15px;margin-right:9px;vertical-align:middle;margin-top:-1px}.menu-list-wrapper .menu-list-item .delete-icon{display:none;position:absolute;right:15px;top:50%;transform:translateY(-50%)}.menu-list-wrapper .menu-list-item .label{font-size:.8125em;font-weight:700;vertical-align:middle;white-space:nowrap;max-width:210px;overflow:hidden;text-overflow:ellipsis;display:inline-block;color:#1b2539;line-height:1;padding-top:2px}.menu-list-wrapper.favourites.is-dragenter .menu-list{border:2px dashed #00bc7e;border-radius:8px}.menu-list-wrapper.favourites .menu-list{border:2px dashed transparent}.menu-list-wrapper.favourites .menu-list .menu-list-item{padding:8px 23px}.menu-list-wrapper.favourites .menu-list .menu-list-item .label{max-width:140px}.menu-list-wrapper.favourites .menu-list .menu-list-item .icon{margin-right:5px;width:20px}.menu-list-wrapper.favourites .menu-list .menu-list-item .icon circle,.menu-list-wrapper.favourites .menu-list .menu-list-item .icon ellipse,.menu-list-wrapper.favourites .menu-list .menu-list-item .icon line,.menu-list-wrapper.favourites .menu-list .menu-list-item .icon path,.menu-list-wrapper.favourites .menu-list .menu-list-item .icon polyline,.menu-list-wrapper.favourites .menu-list .menu-list-item .icon rect{transition:all .15s ease}.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon circle,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon ellipse,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon line,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon path,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon polyline,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon rect,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon circle,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon ellipse,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon line,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon path,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon polyline,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon rect,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon circle,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon ellipse,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon line,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon path,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon polyline,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon rect{stroke:#00bc7e}.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .label,.menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .label,.menu-list-wrapper.favourites .menu-list .menu-list-item:hover .label{color:#00bc7e}.empty-note{font-size:.75em;color:rgba(27,37,57,.7);display:block}.table .action-icons{white-space:nowrap}.table .action-icons .icon,.table .action-icons .icon-wrapper,.table .action-icons a{display:inline-block;margin-left:10px}.table .action-icons .icon-wrapper:first-child,.table .action-icons .icon:first-child,.table .action-icons a:first-child{margin-left:0}.table .action-icons .icon{cursor:pointer}.table .action-icons .icon circle,.table .action-icons .icon line,.table .action-icons .icon path,.table .action-icons .icon polyline{stroke:#1b2539}.table .action-icons .icon.icon-trash circle,.table .action-icons .icon.icon-trash line,.table .action-icons .icon.icon-trash path,.table .action-icons .icon.icon-trash polyline{stroke:#fe6057}.table .cell-item{white-space:nowrap;font-weight:700}.mt-70{margin-top:70px}.capitalize{text-transform:capitalize}@media only screen and (max-width:1024px){#single-page #page-content.full-width,#single-page #page-content.medium-width,#single-page #page-content.small-width{max-width:100%;width:100%}.menu-list-wrapper .menu-list-item{padding:12px 15px 12px 20px}.menu-list-wrapper.favourites .menu-list .menu-list-item{padding:8px 18px}}@media only screen and (max-width:960px){#single-page{padding-left:30px;padding-right:30px}#single-page #page-content,#single-page #page-content.center-page{padding-top:0}.menu-list-wrapper.horizontal{top:30px}.form-fixed-width{width:100%}}@media only screen and (max-width:690px){#single-page{padding-left:15px;padding-right:15px}}@media (prefers-color-scheme:dark){.empty-note{color:#7d858c}.menu-list-wrapper.horizontal{border-bottom:2px solid hsla(0,0%,100%,.02);background:#131414}.menu-list-wrapper .menu-list-item.link .icon circle,.menu-list-wrapper .menu-list-item.link .icon ellipse,.menu-list-wrapper .menu-list-item.link .icon line,.menu-list-wrapper .menu-list-item.link .icon path,.menu-list-wrapper .menu-list-item.link .icon polyline,.menu-list-wrapper .menu-list-item.link .icon rect{stroke:#bec6cf}.menu-list-wrapper .menu-list-item .label{color:#bec6cf}.menu-list-wrapper .menu-list-item .icon circle,.menu-list-wrapper .menu-list-item .icon ellipse,.menu-list-wrapper .menu-list-item .icon line,.menu-list-wrapper .menu-list-item .icon path,.menu-list-wrapper .menu-list-item .icon polyline,.menu-list-wrapper .menu-list-item .icon rect{stroke:#bec6cf}.menu-list-wrapper .menu-list-item:hover{background:rgba(0,188,126,.1)}.menu-list-wrapper .menu-list-item:hover .label{color:#00bc7e}.menu-list-wrapper .menu-list-item:hover .icon circle,.menu-list-wrapper .menu-list-item:hover .icon ellipse,.menu-list-wrapper .menu-list-item:hover .icon line,.menu-list-wrapper .menu-list-item:hover .icon path,.menu-list-wrapper .menu-list-item:hover .icon polyline,.menu-list-wrapper .menu-list-item:hover .icon rect{stroke:#00bc7e}.table .action-icons .icon circle,.table .action-icons .icon line,.table .action-icons .icon path,.table .action-icons .icon polyline{stroke:#bec6cf}}.info-box-wrapper{margin:0 20px}.windows #content-sidebar{scrollbar-width:none}.windows #content-sidebar::-webkit-scrollbar{width:0}.windows ::-webkit-scrollbar{width:18px;height:18px;cursor:pointer}.windows ::-webkit-scrollbar-thumb{border:6px solid #fff;background:#7f7f7f;border-radius:25px}@media (prefers-color-scheme:dark){.windows ::-webkit-scrollbar-thumb{border:6px solid #131414;background:#1e2024!important}}
\ No newline at end of file
+#viewport {
+ width: 100%;
+ transition: all .2s ease;
+ flex: 1
+}
+
+#application-wrapper, #viewport {
+ display: flex;
+ height: 100%
+}
+
+#application-wrapper #content, #single-page {
+ position: relative;
+ width: 100%
+}
+
+#single-page {
+ overflow-x: hidden;
+ height: 100%;
+ padding-left: 25px;
+ padding-right: 25px
+}
+
+#single-page #page-content {
+ margin: 0 auto
+}
+
+#single-page #page-content.full-width {
+ max-width: 100%
+}
+
+#single-page #page-content.medium-width {
+ max-width: 700px
+}
+
+#single-page #page-content.large-width {
+ max-width: 1190px
+}
+
+#single-page #page-content.small-width {
+ max-width: 690px
+}
+
+#single-page #page-content.center-page {
+ height: 100%;
+ padding-top: 20px;
+ margin-bottom: 50px;
+ display: grid;
+ width: 100%
+}
+
+#single-page #page-content.center-page .content-page {
+ margin: auto;
+ width: 100%
+}
+
+.form-fixed-width {
+ width: 700px;
+ margin: 0 auto
+}
+
+.form-group, .form-group-label {
+ margin-bottom: 25px
+}
+
+.form-group-label {
+ font-size: 1.125em;
+ font-weight: 800;
+ letter-spacing: .3px;
+ display: block
+}
+
+.menu-list-wrapper.vertical {
+ margin-bottom: 20px
+}
+
+.menu-list-wrapper.vertical .menu-list-item {
+ display: block;
+ padding: 12px 15px 12px 25px
+}
+
+.menu-list-wrapper.horizontal {
+ display: flex;
+ border-bottom: 2px solid #f8f8f8;
+ margin-bottom: 30px;
+ overflow-x: auto;
+ z-index: 9;
+ position: -webkit-sticky;
+ position: sticky;
+ background: #fff;
+ top: 40px
+}
+
+.menu-list-wrapper.horizontal::-webkit-scrollbar {
+ display: none
+}
+
+.menu-list-wrapper.horizontal .menu-list-item {
+ display: inline-block;
+ padding: 15px 10px;
+ margin: 15px 10px 0;
+ border-bottom: 2px solid transparent
+}
+
+.menu-list-wrapper.horizontal .menu-list-item:first-child {
+ margin-left: 0
+}
+
+.menu-list-wrapper.horizontal .menu-list-item.router-link-exact-active {
+ border-bottom: 2px solid #00bc7e
+}
+
+.menu-list-wrapper .menu-list-item {
+ text-decoration: none;
+ cursor: pointer;
+ position: relative;
+ white-space: nowrap
+}
+
+.menu-list-wrapper .menu-list-item.link {
+ display: flex;
+ align-items: center
+}
+
+.menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg circle, .menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg ellipse, .menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg line, .menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg path, .menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg polyline, .menu-list-wrapper .menu-list-item.link.trash.is-active-trash svg rect, .menu-list-wrapper .menu-list-item.link.trash:hover svg circle, .menu-list-wrapper .menu-list-item.link.trash:hover svg ellipse, .menu-list-wrapper .menu-list-item.link.trash:hover svg line, .menu-list-wrapper .menu-list-item.link.trash:hover svg path, .menu-list-wrapper .menu-list-item.link.trash:hover svg polyline, .menu-list-wrapper .menu-list-item.link.trash:hover svg rect {
+ stroke: #fd397a
+}
+
+.menu-list-wrapper .menu-list-item.link.trash.is-active-trash .label, .menu-list-wrapper .menu-list-item.link.trash:hover .label {
+ color: #fd397a
+}
+
+.menu-list-wrapper .menu-list-item.link.is-active svg circle, .menu-list-wrapper .menu-list-item.link.is-active svg ellipse, .menu-list-wrapper .menu-list-item.link.is-active svg line, .menu-list-wrapper .menu-list-item.link.is-active svg path, .menu-list-wrapper .menu-list-item.link.is-active svg polyline, .menu-list-wrapper .menu-list-item.link.is-active svg rect, .menu-list-wrapper .menu-list-item.link.router-link-exact-active svg circle, .menu-list-wrapper .menu-list-item.link.router-link-exact-active svg ellipse, .menu-list-wrapper .menu-list-item.link.router-link-exact-active svg line, .menu-list-wrapper .menu-list-item.link.router-link-exact-active svg path, .menu-list-wrapper .menu-list-item.link.router-link-exact-active svg polyline, .menu-list-wrapper .menu-list-item.link.router-link-exact-active svg rect, .menu-list-wrapper .menu-list-item.link:hover svg circle, .menu-list-wrapper .menu-list-item.link:hover svg ellipse, .menu-list-wrapper .menu-list-item.link:hover svg line, .menu-list-wrapper .menu-list-item.link:hover svg path, .menu-list-wrapper .menu-list-item.link:hover svg polyline, .menu-list-wrapper .menu-list-item.link:hover svg rect {
+ stroke: #00bc7e
+}
+
+.menu-list-wrapper .menu-list-item.link.is-active .label, .menu-list-wrapper .menu-list-item.link.router-link-exact-active .label, .menu-list-wrapper .menu-list-item.link:hover .label {
+ color: #00bc7e
+}
+
+.menu-list-wrapper .menu-list-item.link .icon {
+ margin-right: 12px;
+ line-height: 0
+}
+
+.menu-list-wrapper .menu-list-item.link .icon circle, .menu-list-wrapper .menu-list-item.link .icon ellipse, .menu-list-wrapper .menu-list-item.link .icon line, .menu-list-wrapper .menu-list-item.link .icon path, .menu-list-wrapper .menu-list-item.link .icon polyline, .menu-list-wrapper .menu-list-item.link .icon rect {
+ stroke: #1b2539
+}
+
+.menu-list-wrapper .menu-list-item.link .text-label {
+ font-size: 1em
+}
+
+.menu-list-wrapper .menu-list-item.is-active .delete-icon, .menu-list-wrapper .menu-list-item:hover .delete-icon {
+ display: block
+}
+
+.menu-list-wrapper .menu-list-item .folder-icon {
+ line-height: 0;
+ width: 15px;
+ margin-right: 9px;
+ vertical-align: middle;
+ margin-top: -1px
+}
+
+.menu-list-wrapper .menu-list-item .delete-icon {
+ display: none;
+ position: absolute;
+ right: 15px;
+ top: 50%;
+ transform: translateY(-50%)
+}
+
+.menu-list-wrapper .menu-list-item .label {
+ font-size: .8125em;
+ font-weight: 700;
+ vertical-align: middle;
+ white-space: nowrap;
+ max-width: 210px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: inline-block;
+ color: #1b2539;
+ line-height: 1;
+ padding-top: 2px
+}
+
+.menu-list-wrapper.favourites.is-dragenter .menu-list {
+ border: 2px dashed #00bc7e;
+ border-radius: 8px
+}
+
+.menu-list-wrapper.favourites .menu-list {
+ border: 2px dashed transparent
+}
+
+.menu-list-wrapper.favourites .menu-list .menu-list-item {
+ padding: 8px 23px
+}
+
+.menu-list-wrapper.favourites .menu-list .menu-list-item .label {
+ max-width: 140px
+}
+
+.menu-list-wrapper.favourites .menu-list .menu-list-item .icon {
+ margin-right: 5px;
+ width: 20px
+}
+
+.menu-list-wrapper.favourites .menu-list .menu-list-item .icon circle, .menu-list-wrapper.favourites .menu-list .menu-list-item .icon ellipse, .menu-list-wrapper.favourites .menu-list .menu-list-item .icon line, .menu-list-wrapper.favourites .menu-list .menu-list-item .icon path, .menu-list-wrapper.favourites .menu-list .menu-list-item .icon polyline, .menu-list-wrapper.favourites .menu-list .menu-list-item .icon rect {
+ transition: all .15s ease
+}
+
+.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon circle, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon ellipse, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon line, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon path, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon polyline, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .folder-icon rect, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon circle, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon ellipse, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon line, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon path, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon polyline, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .folder-icon rect, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon circle, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon ellipse, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon line, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon path, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon polyline, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .folder-icon rect {
+ stroke: #00bc7e
+}
+
+.menu-list-wrapper.favourites .menu-list .menu-list-item.is-current .label, .menu-list-wrapper.favourites .menu-list .menu-list-item.is-selected .label, .menu-list-wrapper.favourites .menu-list .menu-list-item:hover .label {
+ color: #00bc7e
+}
+
+.empty-note {
+ font-size: .75em;
+ color: rgba(27, 37, 57, .7);
+ display: block
+}
+
+.table .action-icons {
+ white-space: nowrap
+}
+
+.table .action-icons .icon, .table .action-icons .icon-wrapper, .table .action-icons a {
+ display: inline-block;
+ margin-left: 10px
+}
+
+.table .action-icons .icon-wrapper:first-child, .table .action-icons .icon:first-child, .table .action-icons a:first-child {
+ margin-left: 0
+}
+
+.table .action-icons .icon {
+ cursor: pointer
+}
+
+.table .action-icons .icon circle, .table .action-icons .icon line, .table .action-icons .icon path, .table .action-icons .icon polyline {
+ stroke: #1b2539
+}
+
+.table .action-icons .icon.icon-trash circle, .table .action-icons .icon.icon-trash line, .table .action-icons .icon.icon-trash path, .table .action-icons .icon.icon-trash polyline {
+ stroke: #fe6057
+}
+
+.table .cell-item {
+ white-space: nowrap;
+ font-weight: 700
+}
+
+.mt-70 {
+ margin-top: 70px
+}
+
+.capitalize {
+ text-transform: capitalize
+}
+
+@media only screen and (max-width: 1024px) {
+ #single-page #page-content.full-width, #single-page #page-content.medium-width, #single-page #page-content.small-width {
+ max-width: 100%;
+ width: 100%
+ }
+
+ .menu-list-wrapper .menu-list-item {
+ padding: 12px 15px 12px 20px
+ }
+
+ .menu-list-wrapper.favourites .menu-list .menu-list-item {
+ padding: 8px 18px
+ }
+}
+
+@media only screen and (max-width: 960px) {
+ #single-page {
+ padding-left: 30px;
+ padding-right: 30px
+ }
+
+ #single-page #page-content, #single-page #page-content.center-page {
+ padding-top: 0
+ }
+
+ .menu-list-wrapper.horizontal {
+ top: 30px
+ }
+
+ .form-fixed-width {
+ width: 100%
+ }
+}
+
+@media only screen and (max-width: 690px) {
+ #single-page {
+ padding-left: 15px;
+ padding-right: 15px
+ }
+}
+
+@media (prefers-color-scheme: dark) {
+ .empty-note {
+ color: #7d858c
+ }
+
+ .menu-list-wrapper.horizontal {
+ border-bottom: 2px solid hsla(0, 0%, 100%, .02);
+ background: #131414
+ }
+
+ .menu-list-wrapper .menu-list-item.link .icon circle, .menu-list-wrapper .menu-list-item.link .icon ellipse, .menu-list-wrapper .menu-list-item.link .icon line, .menu-list-wrapper .menu-list-item.link .icon path, .menu-list-wrapper .menu-list-item.link .icon polyline, .menu-list-wrapper .menu-list-item.link .icon rect {
+ stroke: #bec6cf
+ }
+
+ .menu-list-wrapper .menu-list-item .label {
+ color: #bec6cf
+ }
+
+ .menu-list-wrapper .menu-list-item .icon circle, .menu-list-wrapper .menu-list-item .icon ellipse, .menu-list-wrapper .menu-list-item .icon line, .menu-list-wrapper .menu-list-item .icon path, .menu-list-wrapper .menu-list-item .icon polyline, .menu-list-wrapper .menu-list-item .icon rect {
+ stroke: #bec6cf
+ }
+
+ .menu-list-wrapper .menu-list-item:hover {
+ background: rgba(0, 188, 126, .1)
+ }
+
+ .menu-list-wrapper .menu-list-item:hover .label {
+ color: #00bc7e
+ }
+
+ .menu-list-wrapper .menu-list-item:hover .icon circle, .menu-list-wrapper .menu-list-item:hover .icon ellipse, .menu-list-wrapper .menu-list-item:hover .icon line, .menu-list-wrapper .menu-list-item:hover .icon path, .menu-list-wrapper .menu-list-item:hover .icon polyline, .menu-list-wrapper .menu-list-item:hover .icon rect {
+ stroke: #00bc7e
+ }
+
+ .table .action-icons .icon circle, .table .action-icons .icon line, .table .action-icons .icon path, .table .action-icons .icon polyline {
+ stroke: #bec6cf
+ }
+}
+
+.info-box-wrapper {
+ margin: 0 20px
+}
+
+.windows #content-sidebar {
+ scrollbar-width: none
+}
+
+.windows #content-sidebar::-webkit-scrollbar {
+ width: 0
+}
+
+.windows ::-webkit-scrollbar {
+ width: 18px;
+ height: 18px;
+ cursor: pointer
+}
+
+.windows ::-webkit-scrollbar-thumb {
+ border: 6px solid #fff;
+ background: #7f7f7f;
+ border-radius: 25px
+}
+
+@media (prefers-color-scheme: dark) {
+ .windows ::-webkit-scrollbar-thumb {
+ border: 6px solid #131414;
+ background: #1e2024 !important
+ }
+}
\ No newline at end of file
diff --git a/public/css/invoice.css b/public/css/invoice.css
deleted file mode 100644
index 967241cf..00000000
--- a/public/css/invoice.css
+++ /dev/null
@@ -1 +0,0 @@
-*{outline:0;margin:0;padding:0;font-family:Nunito,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:16px;text-decoration:none}body{background:#f6f6f6}#toolbar-wrapper{max-width:800px;margin:30px auto}#toolbar-wrapper .button{background:#fff;margin-right:15px;border-radius:8px;padding:7px 10px;cursor:pointer;border:none;transition:all .15s ease}#toolbar-wrapper .button .icon{height:14px;vertical-align:middle}#toolbar-wrapper .button .icon circle,#toolbar-wrapper .button .icon line,#toolbar-wrapper .button .icon path,#toolbar-wrapper .button .icon polyline,#toolbar-wrapper .button .icon rect{transition:all .15s ease}#toolbar-wrapper .button .label{transition:all .15s ease;font-size:.875em;font-weight:700;color:#1c1d1f}#toolbar-wrapper .button:active{transform:scale(.95)}#toolbar-wrapper .button:hover{background:rgba(0,188,126,.1)}#toolbar-wrapper .button:hover .icon circle,#toolbar-wrapper .button:hover .icon line,#toolbar-wrapper .button:hover .icon path,#toolbar-wrapper .button:hover .icon polyline,#toolbar-wrapper .button:hover .icon rect{stroke:#00bc7e}#toolbar-wrapper .button:hover .label{color:#00bc7e}#invoice-wrapper{max-width:800px;padding:50px;margin:0 auto;background:#fff;border-radius:8px}.table{width:100%}.table .table-header{border-bottom:1px solid #f8f8f8}.table .table-header td{padding-bottom:10px;font-size:.75em;font-weight:700;color:#00bc7e}.table .table-header td:last-child{text-align:right}.table .table-body td{font-size:1em;font-weight:700}.table .table-body td:last-child{text-align:right}.list{margin-bottom:20px}.list .list-item{display:block;margin-bottom:5px}.list .list-item b{font-size:1em;font-weight:700}.list .list-item span{font-size:1em;font-weight:500}.invoice-header{display:flex;justify-content:space-between;align-items:center}.invoice-header .logo img{height:40px;width:auto}.invoice-header .title h1{font-size:1.875em;font-weight:300;color:#00bc7e}.invoice-subject{margin-top:40px;background:#fafafa;padding:15px 20px;border-radius:10px}.invoice-subject .list{margin-bottom:0}.invoice-partners{display:flex;justify-content:space-between;margin-top:40px}.invoice-partners .partner:last-child{min-width:250px}.invoice-partners .partner-title{color:#00bc7e;font-size:1.375em;font-weight:300;margin-bottom:10px}.invoice-order{margin-top:40px}.invoice-summary{margin-top:60px;text-align:right}.invoice-summary b{font-weight:700;font-size:1.375em}@media print{#toolbar-wrapper{display:none}#invoice-wrapper{padding:0;margin:0}.invoice-subject{padding:0}@page{margin:0}body{margin:1.6cm}}
\ No newline at end of file
diff --git a/public/mix-manifest.json b/public/mix-manifest.json
index 760f55c7..e445b0e6 100644
--- a/public/mix-manifest.json
+++ b/public/mix-manifest.json
@@ -1,65 +1,135 @@
{
- "/chunks/files~chunks/shared-files~chunks/shared-page.js": "/chunks/files~chunks/shared-files~chunks/shared-page.js?id=74636ea45210d3b31adf",
- "/js/main.js": "/js/main.js?id=4c6692bd2b1bf818d332",
- "/css/app.css": "/css/app.css?id=dfd52fc997b919cd3686",
- "/chunks/admin.js": "/chunks/admin.js?id=7672646537b5813becf0",
- "/chunks/admin-account.js": "/chunks/admin-account.js?id=3f5a34aa8341af8d2b4c",
- "/chunks/app-appearance.js": "/chunks/app-appearance.js?id=9ec9a42482cb302a05f6",
- "/chunks/app-billings.js": "/chunks/app-billings.js?id=92903bd1d316b3db1dfa",
- "/chunks/app-email.js": "/chunks/app-email.js?id=9d646578982ba61813b6",
- "/chunks/app-index.js": "/chunks/app-index.js?id=4623bd961647897a5b81",
- "/chunks/app-others.js": "/chunks/app-others.js?id=b19a701cdfa06e4817ff",
- "/chunks/app-payments.js": "/chunks/app-payments.js?id=11c86d822269f1a1577e",
- "/chunks/app-settings.js": "/chunks/app-settings.js?id=6784314933372fb1adf0",
- "/chunks/app-setup.js": "/chunks/app-setup.js?id=d304bcf7d4157e81f3e2",
- "/chunks/billings-detail.js": "/chunks/billings-detail.js?id=b73a5b6f7d2a448cc5ab",
- "/chunks/contact-us.js": "/chunks/contact-us.js?id=81906d205ba0107c5105",
- "/chunks/create-new-password.js": "/chunks/create-new-password.js?id=004908727045abd0852e",
- "/chunks/dashboard.js": "/chunks/dashboard.js?id=cdfd468f0d0f98b9f081",
- "/chunks/database.js": "/chunks/database.js?id=b8d8269f77c52f78c784",
- "/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=2e3af103d13536c50757",
- "/chunks/environment-setup.js": "/chunks/environment-setup.js?id=106f81cefe76c62d476e",
- "/chunks/files.js": "/chunks/files.js?id=b213d4fe15c2a9933f32",
- "/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=95ce5e5685dc9315f515",
- "/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=6db12008aa646ad5fb6f",
- "/chunks/invoices.js": "/chunks/invoices.js?id=83389adf0760820af6f5",
- "/chunks/landing-page.js": "/chunks/landing-page.js?id=546ed735edf0d80c8a7e",
- "/chunks/not-found-shared.js": "/chunks/not-found-shared.js?id=848666d6c49c613f7f99",
- "/chunks/page-edit.js": "/chunks/page-edit.js?id=bd41ae13951c2a5025c3",
- "/chunks/pages.js": "/chunks/pages.js?id=df7245abef9e3b77a218",
- "/chunks/plan.js": "/chunks/plan.js?id=cfd7b4ee7e21639a837d",
- "/chunks/plan-create.js": "/chunks/plan-create.js?id=9bb62af36193ee9648d3",
- "/chunks/plan-delete.js": "/chunks/plan-delete.js?id=7b7601f044e0ef47720b",
- "/chunks/plan-settings.js": "/chunks/plan-settings.js?id=8d3e75ff9adb22a25d57",
- "/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=3b4a29497fc878f503db",
- "/chunks/plans.js": "/chunks/plans.js?id=feb924949bffcdf3d9fb",
- "/chunks/profile.js": "/chunks/profile.js?id=f990697f8d4ff45df434",
- "/chunks/purchase-code.js": "/chunks/purchase-code.js?id=5d7406ecd84c676db8fb",
- "/chunks/settings.js": "/chunks/settings.js?id=d16d9e2cda6aa3a3f6dc",
- "/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=b05e24dd8be60f62ee27",
- "/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=72d317b39264987e6ed0",
- "/chunks/settings-password.js": "/chunks/settings-password.js?id=014597c63c94d3ac9f60",
- "/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=2a0ea9cf661deba6fc13",
- "/chunks/settings-storage.js": "/chunks/settings-storage.js?id=b3f25de02dd4ef072df0",
- "/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=aa3d963f578d7bc5ff88",
- "/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=47090233afc7b0cdf855",
- "/chunks/shared-files.js": "/chunks/shared-files.js?id=ba10fd3f52a7b62d3092",
- "/chunks/shared-page.js": "/chunks/shared-page.js?id=8e0b9c767ed8a703138a",
- "/chunks/sign-in.js": "/chunks/sign-in.js?id=c52ce81c3dad56d7a7d8",
- "/chunks/sign-up.js": "/chunks/sign-up.js?id=2f12850d320b2413cf54",
- "/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=6622381f1d96e8319999",
- "/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=f1b093a3bcfebd5bc8a5",
- "/chunks/subscription-service.js": "/chunks/subscription-service.js?id=e0e2f821aac16b32da34",
- "/chunks/upgrade.js": "/chunks/upgrade.js?id=0c8d40bed72e86359529",
- "/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=a8db2246f9326e5c5957",
- "/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=f050f10627424b730dc2",
- "/chunks/user.js": "/chunks/user.js?id=6f2ab796211a3ac8670f",
- "/chunks/user-create.js": "/chunks/user-create.js?id=0d630acda4552c315417",
- "/chunks/user-delete.js": "/chunks/user-delete.js?id=db041eae3aef3e45197a",
- "/chunks/user-detail.js": "/chunks/user-detail.js?id=8cf2fe554e8d67ac8677",
- "/chunks/user-invoices.js": "/chunks/user-invoices.js?id=a0613909cb0c21817804",
- "/chunks/user-password.js": "/chunks/user-password.js?id=653bba3eb8d117c3a043",
- "/chunks/user-storage.js": "/chunks/user-storage.js?id=630b0ff649e16d3627af",
- "/chunks/user-subscription.js": "/chunks/user-subscription.js?id=0b4226ba77f10b83de4a",
- "/chunks/users.js": "/chunks/users.js?id=04ca09662595fae56488"
+ "/js/main.js": "/js/main.js",
+ "/css/app.css": "/css/app.css",
+ "/chunks/admin.js": "/chunks/admin.js?id=f3df96ed0302c713ab20",
+ "/chunks/admin-account.js": "/chunks/admin-account.js?id=3036df3e72596fabc42e",
+ "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js": "/chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chu~c7a13fb0.js?id=62b552a0492fe95b2223",
+ "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a001bb84.js": "/chunks/admin-account~chunks/app-setup~chunks/billings-detail~chunks/create-new-password~chunks/datab~a001bb84.js?id=0cad8279d29d79cd0e82",
+ "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js": "/chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/~eeab5771.js?id=99dbb760d4e3dd0acdbf",
+ "/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/admin~chunks/files~chunks/settings~chunks/shared-files~chunks/shared/file-browser.js?id=9b66c2dab4c6103bb53c",
+ "/chunks/admin~chunks/platform.js": "/chunks/admin~chunks/platform.js?id=3d9f93a03cb1ffa61d01",
+ "/chunks/admin~chunks/platform~chunks/shared.js": "/chunks/admin~chunks/platform~chunks/shared.js?id=12f0aaeb615c37d0515d",
+ "/chunks/app-appearance.js": "/chunks/app-appearance.js?id=b4e2d99a172f06a1d312",
+ "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~605f4c49.js?id=45c8f27411287c7bbf73",
+ "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~8cc7d96f.js?id=7702f37f277478ad66c6",
+ "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js": "/chunks/app-appearance~chunks/app-billings~chunks/app-email~chunks/app-index~chunks/app-others~chunks~b9e5655a.js?id=04f0cd9719723459b685",
+ "/chunks/app-billings.js": "/chunks/app-billings.js?id=82133cc16f55222bbbe6",
+ "/chunks/app-email.js": "/chunks/app-email.js?id=c578a85112c6a4b1ed0e",
+ "/chunks/app-index.js": "/chunks/app-index.js?id=7f07dceace5c9c8255bb",
+ "/chunks/app-language.js": "/chunks/app-language.js?id=e97b8b4e0a0f5ac93c97",
+ "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~38c276fc.js": "/chunks/app-language~chunks/dashboard~chunks/files~chunks/invoices~chunks/pages~chunks/plans~chunks/s~38c276fc.js?id=91d6a4649c9277a7bb29",
+ "/chunks/app-others.js": "/chunks/app-others.js?id=9156adba3b1697a8bf3e",
+ "/chunks/app-payments.js": "/chunks/app-payments.js?id=7e1a982c90174f568fb2",
+ "/chunks/app-settings.js": "/chunks/app-settings.js?id=bbf2a2e436d939f7fc07",
+ "/chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pages~chunks/plan~chunk~8a0e1d25.js": "/chunks/app-settings~chunks/dashboard~chunks/invoices~chunks/page-edit~chunks/pages~chunks/plan~chunk~8a0e1d25.js?id=e71bb0286189734a8aec",
+ "/chunks/app-setup.js": "/chunks/app-setup.js?id=d0e3e046e147ca928f34",
+ "/chunks/billings-detail.js": "/chunks/billings-detail.js?id=d0ade32264f71dd7a2af",
+ "/chunks/contact-us.js": "/chunks/contact-us.js?id=f5276b101b2e0c97d6d1",
+ "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js": "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.js?id=22bd5db44c72e8de5f5b",
+ "/chunks/create-new-password.js": "/chunks/create-new-password.js?id=48dc53ccbd502c2739ec",
+ "/chunks/dashboard.js": "/chunks/dashboard.js?id=74bd69ac9feddf058188",
+ "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js": "/chunks/dashboard~chunks/invoices~chunks/pages~chunks/plan-subscribers~chunks/plans~chunks/settings-i~0e2a0654.js?id=7540af768b1cfda01a13",
+ "/chunks/database.js": "/chunks/database.js?id=7374830dc3cbddf41abb",
+ "/chunks/dynamic-page.js": "/chunks/dynamic-page.js?id=6dccc2158cc6278f683d",
+ "/chunks/environment-setup.js": "/chunks/environment-setup.js?id=208de84df68177288a2a",
+ "/chunks/files.js": "/chunks/files.js?id=40b4464ce393cb112111",
+ "/chunks/files~chunks/platform~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared-files~chunks/shared/file-browser.js?id=39233d603662ca3738e8",
+ "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser.js?id=da7fad654568667d799f",
+ "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~chunks/sha~8510f6c9.js": "/chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~chunks/sha~8510f6c9.js?id=b4ccb4a816e5c72a0b85",
+ "/chunks/files~chunks/settings-subscription~chunks/shared-files~chunks/shared/file-browser~chunks/user~9058a49f.js": "/chunks/files~chunks/settings-subscription~chunks/shared-files~chunks/shared/file-browser~chunks/user~9058a49f.js?id=31a17ad1d2536342abbe",
+ "/chunks/files~chunks/shared-files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser.js?id=8912841f29b16a3ecbf9",
+ "/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js": "/chunks/files~chunks/shared-files~chunks/shared/file-browser~chunks/shared/single-file.js?id=9b875b7ea10b575524e6",
+ "/chunks/files~chunks/shared/file-browser.js": "/chunks/files~chunks/shared/file-browser.js?id=a67929ed0c257f501268",
+ "/chunks/forgotten-password.js": "/chunks/forgotten-password.js?id=877a9289b77ac3885042",
+ "/chunks/homepage.js": "/chunks/homepage.js?id=14154b40ea69f91fef31",
+ "/chunks/installation-disclaimer.js": "/chunks/installation-disclaimer.js?id=fa49cb6f6c1027d24d57",
+ "/chunks/invoices.js": "/chunks/invoices.js?id=81df0d453a53fd224e13",
+ "/chunks/not-found-shared.js": "/chunks/not-found-shared.js?id=7fc7f9b6f10bdfac770e",
+ "/chunks/page-edit.js": "/chunks/page-edit.js?id=dbb7e8cb377a08c8adc2",
+ "/chunks/pages.js": "/chunks/pages.js?id=9c31ba518ce43a3595ef",
+ "/chunks/plan.js": "/chunks/plan.js?id=396a1053f0c7089de936",
+ "/chunks/plan-create.js": "/chunks/plan-create.js?id=92ca81965dc17b3ec7a3",
+ "/chunks/plan-delete.js": "/chunks/plan-delete.js?id=f193816778245ea66d02",
+ "/chunks/plan-settings.js": "/chunks/plan-settings.js?id=66123f72696b47a986a2",
+ "/chunks/plan-subscribers.js": "/chunks/plan-subscribers.js?id=08e2056bc3744b2ea8f9",
+ "/chunks/plans.js": "/chunks/plans.js?id=608bdbd5c041b728691a",
+ "/chunks/platform.js": "/chunks/platform.js?id=559a62d18ff169793e54",
+ "/chunks/platform~chunks/shared.js": "/chunks/platform~chunks/shared.js?id=3d5804463c897995e9d1",
+ "/chunks/profile.js": "/chunks/profile.js?id=fb4a46afdd09cdcdc7da",
+ "/chunks/profile~chunks/settings-password.js": "/chunks/profile~chunks/settings-password.js?id=d448806bfefc6cc43f0d",
+ "/chunks/purchase-code.js": "/chunks/purchase-code.js?id=e00ee12cde704060e15b",
+ "/chunks/settings.js": "/chunks/settings.js?id=2637c005a9c8b01cfc9b",
+ "/chunks/settings-create-payment-methods.js": "/chunks/settings-create-payment-methods.js?id=c12436dc2933527ce1f5",
+ "/chunks/settings-invoices.js": "/chunks/settings-invoices.js?id=444b9bbc310647ddd297",
+ "/chunks/settings-password.js": "/chunks/settings-password.js?id=d24053a92c2594439d04",
+ "/chunks/settings-payment-methods.js": "/chunks/settings-payment-methods.js?id=3bc709a228c0849a6f62",
+ "/chunks/settings-storage.js": "/chunks/settings-storage.js?id=ced13fc6a34233fb53aa",
+ "/chunks/settings-subscription.js": "/chunks/settings-subscription.js?id=22e5c49d5b0a154e1a28",
+ "/chunks/setup-wizard.js": "/chunks/setup-wizard.js?id=c6b88005b133268ed88f",
+ "/chunks/shared.js": "/chunks/shared.js?id=2c38f535d52e0e448846",
+ "/chunks/shared-files.js": "/chunks/shared-files.js?id=cde3c7a58d2da0015555",
+ "/chunks/shared/authenticate.js": "/chunks/shared/authenticate.js?id=3d5c7754d438830a4204",
+ "/chunks/shared/file-browser.js": "/chunks/shared/file-browser.js?id=3127fab4cfd3d5f00a72",
+ "/chunks/shared/single-file.js": "/chunks/shared/single-file.js?id=e8aedb75df7fe227d693",
+ "/chunks/sign-in.js": "/chunks/sign-in.js?id=61e5b97e8273aec430ad",
+ "/chunks/sign-up.js": "/chunks/sign-up.js?id=ce15b1156cf37c0a9703",
+ "/chunks/stripe-credentials.js": "/chunks/stripe-credentials.js?id=1acdec3a157c8943a88d",
+ "/chunks/subscription-plans.js": "/chunks/subscription-plans.js?id=a843f8cf90ff1e3168e8",
+ "/chunks/subscription-service.js": "/chunks/subscription-service.js?id=90c1aa9431689a89eb3d",
+ "/chunks/upgrade-billing.js": "/chunks/upgrade-billing.js?id=d76e4522f424ce996e8f",
+ "/chunks/upgrade-billing~chunks/upgrade-plan.js": "/chunks/upgrade-billing~chunks/upgrade-plan.js?id=e1658ebec711765f67fc",
+ "/chunks/upgrade-plan.js": "/chunks/upgrade-plan.js?id=35179531a8241da128e9",
+ "/chunks/user.js": "/chunks/user.js?id=6e9af0d22327a4cc82e9",
+ "/chunks/user-create.js": "/chunks/user-create.js?id=0ede0db725f2c822c336",
+ "/chunks/user-delete.js": "/chunks/user-delete.js?id=5af2fc09b4b639452756",
+ "/chunks/user-detail.js": "/chunks/user-detail.js?id=b9b70e43cf551a574443",
+ "/chunks/user-invoices.js": "/chunks/user-invoices.js?id=6c4d0e9e058be11dc1f7",
+ "/chunks/user-password.js": "/chunks/user-password.js?id=a4b4ab4f4af11533eb4d",
+ "/chunks/user-storage.js": "/chunks/user-storage.js?id=4aec2d7b60ec0bc35fb9",
+ "/chunks/user-subscription.js": "/chunks/user-subscription.js?id=99efdd410910267db66e",
+ "/chunks/users.js": "/chunks/users.js?id=f1057be5cf73ebc32c14",
+ "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~0d496e20.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~0d496e20.js?id=a9facd8e57a0dd054f8c",
+ "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~7afe9e20.js": "/vendors~chunks/admin~chunks/admin-account~chunks/app-appearance~chunks/app-billings~chunks/app-email~7afe9e20.js?id=6d6e7e4191c9e2705c8a",
+ "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js": "/vendors~chunks/files~chunks/platform~chunks/shared~chunks/shared-files~chunks/shared/file-browser~ch~52c14f2e.js?id=66afa0e341251a68c3d3",
+ "/chunks/app-language.5e86b6c8aedb968aabd1.hot-update.js": "/chunks/app-language.5e86b6c8aedb968aabd1.hot-update.js",
+ "/chunks/app-language.3e137679fcd212ecdb43.hot-update.js": "/chunks/app-language.3e137679fcd212ecdb43.hot-update.js",
+ "/chunks/app-language.8069ae5a36cc4868d1d3.hot-update.js": "/chunks/app-language.8069ae5a36cc4868d1d3.hot-update.js",
+ "/chunks/app-language.d4c9d87012f92cbb3694.hot-update.js": "/chunks/app-language.d4c9d87012f92cbb3694.hot-update.js",
+ "/chunks/app-language.c0acc236afe078713927.hot-update.js": "/chunks/app-language.c0acc236afe078713927.hot-update.js",
+ "/chunks/app-language.42b3b09042f97ffb073a.hot-update.js": "/chunks/app-language.42b3b09042f97ffb073a.hot-update.js",
+ "/chunks/app-language.7478a2ac686bc8208aac.hot-update.js": "/chunks/app-language.7478a2ac686bc8208aac.hot-update.js",
+ "/chunks/app-language.695a92293d8dc92d833b.hot-update.js": "/chunks/app-language.695a92293d8dc92d833b.hot-update.js",
+ "/chunks/app-language.25fa944544b002f36615.hot-update.js": "/chunks/app-language.25fa944544b002f36615.hot-update.js",
+ "/chunks/app-language.aee54dee7bdbae4a4dad.hot-update.js": "/chunks/app-language.aee54dee7bdbae4a4dad.hot-update.js",
+ "/chunks/app-language.62fa61e8408e9fd42b23.hot-update.js": "/chunks/app-language.62fa61e8408e9fd42b23.hot-update.js",
+ "/js/main.21d047cff85c2cc93f65.hot-update.js": "/js/main.21d047cff85c2cc93f65.hot-update.js",
+ "/chunks/app-language.13a02b269488a9ed8054.hot-update.js": "/chunks/app-language.13a02b269488a9ed8054.hot-update.js",
+ "/chunks/app-language.ff6a3c1bce44294e69aa.hot-update.js": "/chunks/app-language.ff6a3c1bce44294e69aa.hot-update.js",
+ "/chunks/app-language.0aff16e91050419f056f.hot-update.js": "/chunks/app-language.0aff16e91050419f056f.hot-update.js",
+ "/chunks/admin.00d9afd473b8b4521765.hot-update.js": "/chunks/admin.00d9afd473b8b4521765.hot-update.js",
+ "/chunks/admin.b85158f2cba3bfbbf404.hot-update.js": "/chunks/admin.b85158f2cba3bfbbf404.hot-update.js",
+ "/chunks/admin.bf53021a67ae75f1b0ee.hot-update.js": "/chunks/admin.bf53021a67ae75f1b0ee.hot-update.js",
+ "/chunks/admin.bda5e8845d2e437ffe7c.hot-update.js": "/chunks/admin.bda5e8845d2e437ffe7c.hot-update.js",
+ "/chunks/admin.a97d84e1d8754867cef5.hot-update.js": "/chunks/admin.a97d84e1d8754867cef5.hot-update.js",
+ "/chunks/app-language.8ca3efeede3cedbd37e0.hot-update.js": "/chunks/app-language.8ca3efeede3cedbd37e0.hot-update.js",
+ "/chunks/app-language.23f838b7be45ce10476b.hot-update.js": "/chunks/app-language.23f838b7be45ce10476b.hot-update.js",
+ "/chunks/app-language.fd910667c3258a91322b.hot-update.js": "/chunks/app-language.fd910667c3258a91322b.hot-update.js",
+ "/chunks/app-language.6a163294803727b4d501.hot-update.js": "/chunks/app-language.6a163294803727b4d501.hot-update.js",
+ "/chunks/platform.085176bd0065608cb370.hot-update.js": "/chunks/platform.085176bd0065608cb370.hot-update.js",
+ "/chunks/dashboard.f475c4f86956a8e5419b.hot-update.js": "/chunks/dashboard.f475c4f86956a8e5419b.hot-update.js",
+ "/chunks/app-language.1dd1423a8af00cb8c9bd.hot-update.js": "/chunks/app-language.1dd1423a8af00cb8c9bd.hot-update.js",
+ "/chunks/app-language.040639168a8e73d40dec.hot-update.js": "/chunks/app-language.040639168a8e73d40dec.hot-update.js",
+ "/chunks/app-language.72377b182d4f8ae86208.hot-update.js": "/chunks/app-language.72377b182d4f8ae86208.hot-update.js",
+ "/chunks/app-language.d82931f09bfdd6dbc955.hot-update.js": "/chunks/app-language.d82931f09bfdd6dbc955.hot-update.js",
+ "/chunks/app-language.2193825771658065f586.hot-update.js": "/chunks/app-language.2193825771658065f586.hot-update.js",
+ "/chunks/app-language.cab91ceba0b383f64680.hot-update.js": "/chunks/app-language.cab91ceba0b383f64680.hot-update.js",
+ "/chunks/app-language.a42ea53577d7e0f0a5fb.hot-update.js": "/chunks/app-language.a42ea53577d7e0f0a5fb.hot-update.js",
+ "/chunks/app-language.09d631da1a2172e96bce.hot-update.js": "/chunks/app-language.09d631da1a2172e96bce.hot-update.js",
+ "/chunks/app-appearance.690e1a1f6d721bca8cdf.hot-update.js": "/chunks/app-appearance.690e1a1f6d721bca8cdf.hot-update.js",
+ "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.51e62febff164672078a.hot-update.js": "/chunks/contact-us~chunks/dynamic-page~chunks/homepage.51e62febff164672078a.hot-update.js",
+ "/chunks/app-language.439fa6fafc54298cdf2b.hot-update.js": "/chunks/app-language.439fa6fafc54298cdf2b.hot-update.js",
+ "/chunks/app-language.9ee4a795d26a6e44820c.hot-update.js": "/chunks/app-language.9ee4a795d26a6e44820c.hot-update.js",
+ "/js/main.8517a680822ffe9748c9.hot-update.js": "/js/main.8517a680822ffe9748c9.hot-update.js",
+ "/chunks/admin.9396f79fef53ad7070fe.hot-update.js": "/chunks/admin.9396f79fef53ad7070fe.hot-update.js",
+ "/chunks/platform.9396f79fef53ad7070fe.hot-update.js": "/chunks/platform.9396f79fef53ad7070fe.hot-update.js"
}
diff --git a/public/sass/invoice.scss b/public/sass/invoice.scss
index a8cbded9..8de712b3 100644
--- a/public/sass/invoice.scss
+++ b/public/sass/invoice.scss
@@ -3,7 +3,6 @@ $text: #1c1d1f;
$text-muted: rgba($text, 0.7);
$light_background: #f4f6f6;
$light_mode_border: #F8F8F8;
-$theme: #00BC7E;
@mixin font-size($size) {
font-size:($size/16) + 0em;
@@ -70,17 +69,12 @@ body {
}
&:hover {
- background: rgba($theme, 0.1);
.icon {
path, line, polyline, rect, circle {
- stroke: $theme;
+ color: inherit;
}
}
-
- .label {
- color: $theme;
- }
}
}
}
@@ -103,7 +97,6 @@ body {
padding-bottom: 10px;
@include font-size(12);
font-weight: 700;
- color: $theme;
&:last-child {
text-align: right;
@@ -159,7 +152,6 @@ body {
h1 {
@include font-size(30);
font-weight: 300;
- color: $theme;
}
}
}
@@ -185,7 +177,6 @@ body {
}
.partner-title {
- color: $theme;
@include font-size(22);
font-weight: 300;
margin-bottom: 10px;
diff --git a/resources/babel.babel b/resources/babel.babel
deleted file mode 100644
index 85d1eaed..00000000
--- a/resources/babel.babel
+++ /dev/null
@@ -1,11569 +0,0 @@
-
-
-
- vue-json
- babel.babel
-
-
-
-
-
- actions
-
-
- create_folder
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- move
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- preview
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- share
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- upload
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- activation
-
-
- stripe
-
-
- button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- admin_menu
-
-
- dashboard
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- invoices
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pages
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plans
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- admin_page_dashboard
-
-
- backer_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- license
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- version
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- w_latest_users
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- w_total_premium
-
-
- link
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- w_total_space
-
-
- link
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- w_total_users
-
-
- link
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- admin_page_invoices
-
-
- empty
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- table
-
-
- number
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- payed
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- total
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- admin_page_plans
-
-
- create_plan_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- delete_plan_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- disclaimer_delete_plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- disclaimer_edit_price
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- empty
-
-
- button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- form
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- name_delete_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- name_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- price
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- price_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- status
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- status_help
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_helper
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_details
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_pricing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- subscribers
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- table
-
-
- name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- price
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- status
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscribers
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- tabs
-
-
- delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscribers
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- admin_page_user
-
-
- change_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- create_user
-
-
- avatar
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- group_details
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- group_settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_conf_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- submit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- delete_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- invoices
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- label_change_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_delete_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_person_info
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_delete_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- save_role
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- select_role
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- send_password_link
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscription
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- interval_mo
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- table
-
-
- action
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- created_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- role
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_used
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- tabs
-
-
- delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- detail
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- invoices
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscription
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- admin_pages
-
-
- form
-
-
- content
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- content_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- slug
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- visibility
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- visibility_help
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- table
-
-
- page
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- slug
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- status
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- admin_settings
-
-
- appearance
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- favicon
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- logo
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- logo_horizontal
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_appearance
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_general
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- billings
-
-
- address
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- address_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- city
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- city_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- company_name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- company_name_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- country
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- country_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- phone_number
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- phone_number_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- postal_code
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- postal_code_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_billing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_company
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- state
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- state_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- vat
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- vat_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- email
-
-
- driver
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- driver_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- email_disclaimer
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- encryption
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- encryption_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- host
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- host_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- port
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- port_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- save_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- username
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- username_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- others
-
-
- allow_registration
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- allow_registration_help
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- contact_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- contact_email_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- default_storage
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- default_storage_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- google_analytics
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- google_analytics_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_others
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_limit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_limit_help
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- payments
-
-
- allow_payments
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- button_submit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- button_testing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- credentials_disclaimer
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_payments
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_create_acc
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_create_webhook
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_currency
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_currency_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_pub_key
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_pub_key_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_sec_key
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_sec_key_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_setup
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_webhook_key_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- webhook_url
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- tabs
-
-
- appearance
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- billings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- others
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- payments
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- alerts
-
-
- error_confirm
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- success_confirm
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- context_menu
-
-
- add_folder
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- add_to_favourites
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- create_folder
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- detail
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- download
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- empty_trash
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- log_out
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- move
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- profile_settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- remove_from_favourites
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- rename
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- restore
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- share
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- share_edit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- upload
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- cookie_disclaimer
-
-
- button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- datatable
-
-
- paginate_info
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- empty_page
-
-
- call_to_action
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- errors
-
-
- capacity_digit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- file_detail
-
-
- author
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- author_participant
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- created_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- shared
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- size
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- where
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- folder
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- item_counts
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- global
-
-
- active
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- admin
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- cancel
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- canceled
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- confirm_action
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- default
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- free
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- get_it
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- menu
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- monthly_ac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- or
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- premium
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- saas
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscription
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- total
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- upgrade_plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- input_image
-
-
- supported
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- inputs
-
-
- placeholder_search_files
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- item_thumbnail
-
-
- deleted_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- original_location
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- locations
-
-
- home
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- shared
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- trash
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- menu
-
-
- admin
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- files
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- invoices
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- latest
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- logout
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- payment_cards
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- profile
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- shared
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscription
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- trash
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- messages
-
-
- nothing_from_participants
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- nothing_to_preview
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- nothing_was_found
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- notice
-
-
- stripe_activation
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_activation_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_contact_us
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- error_message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- form
-
-
- email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- email_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- message_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- submit_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- success_message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_create_password
-
-
- button_update
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_confirm_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_new_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_forgotten_password
-
-
- button_get_link
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pass_reseted_signin
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pass_reseted_subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pass_reseted_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pass_sennded_subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pass_sennded_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password_remember_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password_remember_text
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_index
-
-
- get_started_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- menu
-
-
- contact_us
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- log_in
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pricing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- sign_in
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- sign_feature_1
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- sign_feature_2
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- sign_up_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_login
-
-
- button_next
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- registration_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- registration_text
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_pricing_tables
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- storage_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_registration
-
-
- agreement
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- button_create_account
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- have_an_account
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_confirm_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_confirm_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_shared
-
-
- download_file
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- submit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_shared_404
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_sign_in
-
-
- button_log_in
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password_reset_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- password_reset_text
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subtitle
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- page_upgrade_account
-
-
- change_payment
-
-
- change_payment
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pay_by_new_card
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- you_can
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- desription
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- errors
-
-
- pay_by_another_card
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- section_billing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_card
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- section_summary
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- summary
-
-
- period
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- submit_button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- submit_disclaimer
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_create_folder
-
-
- folder_default_name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_delete_card
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_deleted_plan
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_deleted_user
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_deleted_user_aborted
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_error
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_exceed_limit
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_move_item
-
-
- cancel
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- submit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_pass_changed
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_passport_error
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_paylod_error
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_rename
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_set_card
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_share_create
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_share_edit
-
-
- change_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- confirm
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- save
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stop
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_signup_error
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_subscription_cancel
-
-
- button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_subscription_resumed
-
-
- button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- popup_trashed
-
-
- message
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- preview_type
-
-
- grid
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- list
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- profile
-
-
- change_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- profile_info
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- store_pass
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- pronouns
-
-
- of
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- roles
-
-
- admin
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- routes
-
-
- create_new_password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- routes_title
-
-
- appearance
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- billings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- dashboard
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- email
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- invoices
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- others
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- page_edit
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pages
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- payment_methods
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- payments
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan_create
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan_delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan_settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- pricing_plans
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- profile
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- profile_settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings_mobile
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings_password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- settings_storage
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscribers
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- subscription
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- upgrade_billing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- upgrade_plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- user_create
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users_delete
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users_detail
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users_list
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users_password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users_storage_usage
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- users_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- rows
-
-
- card
-
-
- expiration
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- number
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- status
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- invoice
-
-
- number
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- payed
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- total
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
-
- shared
-
-
- can_download
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- editor
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- empty_shared
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- visitor
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- shared_form
-
-
- button_done
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- button_generate
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_password_protection
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_permission
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- label_shared_url
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- placeholder_permission
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- sidebar
-
-
- favourites
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- favourites_empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- folders_empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- home
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- latest
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- locations_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- my_shared
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- navigator_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- participant_uploads
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- tools_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- storage
-
-
- audios
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- documents
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- images
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- others
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- sec_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- sec_details
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- total_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- total_used
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- videos
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- toaster
-
-
- account_upgraded
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- card_deleted
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- card_new_add
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- card_set
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- changed_capacity
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- changed_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- created_user
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- email_set
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan_created
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- sended_password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- stripe_set
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- types
-
-
- file
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- folder
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- upgrade_banner
-
-
- button
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- uploading
-
-
- progress
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_add_card
-
-
- default_description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- default_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_box_delete
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_box_password
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_box_role
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_box_storage
-
-
- description
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_invoices
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_password
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_payments
-
-
- add_card
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- card_field_title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- delete_card
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- field_loading
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- set_as_default
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- store_card
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_settings
-
-
- address
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- address_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- city
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- city_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- country
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- country_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- name
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- name_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- phone_number
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- phone_number_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- postal_code
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- postal_code_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- state
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- state_plac
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_account
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title_billing
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- user_subscription
-
-
- billed
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- cancel_plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- canceled_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- created_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- empty
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- ends_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- renews_at
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- resume_plan
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- status
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- title
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
- validation_errors
-
-
- incorrect_password
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
- wrong_image
- false
-
-
-
-
-
- en-US
- false
-
-
- sk-SK
- false
-
-
- zh-CHS
- false
-
-
-
-
-
-
-
- false
-
-
- en-US
-
- js/i18n/lang/en.json
-
-
- sk-SK
-
- js/i18n/lang/sk.json
-
-
- zh-CHS
-
- js/i18n/lang/cn.json
-
-
-
-
- js/i18n/lang/en.json
-
-
- js/i18n/lang/sk.json
-
-
- js/i18n/lang/cn.json
-
-
-
- true
-
- $t('%1')
-
-
-
-
- en-US
-
- tab
- namespaced-json
- true
-
-
diff --git a/resources/js/App.vue b/resources/js/App.vue
index 2b64871f..d2f93d17 100644
--- a/resources/js/App.vue
+++ b/resources/js/App.vue
@@ -1,147 +1,33 @@
-
+
+
+
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/resources/js/components/FilesView/ButtonUpload.vue b/resources/js/components/FilesView/ButtonUpload.vue
index bed57af5..08e00165 100644
--- a/resources/js/components/FilesView/ButtonUpload.vue
+++ b/resources/js/components/FilesView/ButtonUpload.vue
@@ -31,8 +31,8 @@
diff --git a/resources/js/components/FilesView/DragUI.vue b/resources/js/components/FilesView/DragUI.vue
index 3ce2b488..2d217bec 100644
--- a/resources/js/components/FilesView/DragUI.vue
+++ b/resources/js/components/FilesView/DragUI.vue
@@ -68,15 +68,13 @@ export default {
events.$on('drop', () => {
this.isVisible = false
})
-
-
}
}
diff --git a/resources/js/components/FilesView/FileItemGrid.vue b/resources/js/components/FilesView/FileItemGrid.vue
index 05b7c536..c3ce09ad 100644
--- a/resources/js/components/FilesView/FileItemGrid.vue
+++ b/resources/js/components/FilesView/FileItemGrid.vue
@@ -10,29 +10,29 @@
-
+
{{ item.mimetype }}
-
+
-
+
-
-
+
+
-
+
{{ itemName }}
@@ -40,12 +40,12 @@
-
+
-
-
+
+
@@ -59,23 +59,24 @@
-
+
\ No newline at end of file
diff --git a/resources/js/components/FilesView/Icons/SortingAndPreviewIcon.vue b/resources/js/components/FilesView/Icons/SortingAndPreviewIcon.vue
index 292052d5..7111405e 100644
--- a/resources/js/components/FilesView/Icons/SortingAndPreviewIcon.vue
+++ b/resources/js/components/FilesView/Icons/SortingAndPreviewIcon.vue
@@ -1,20 +1,19 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/resources/js/components/FilesView/ImageMetaData.vue b/resources/js/components/FilesView/ImageMetaData.vue
index 00e26f54..aa5cfd01 100644
--- a/resources/js/components/FilesView/ImageMetaData.vue
+++ b/resources/js/components/FilesView/ImageMetaData.vue
@@ -107,8 +107,8 @@ export default {
diff --git a/resources/js/components/FilesView/MobileMenu.vue b/resources/js/components/FilesView/MobileMenu.vue
index 9f46e0b3..86e58ee9 100644
--- a/resources/js/components/FilesView/MobileMenu.vue
+++ b/resources/js/components/FilesView/MobileMenu.vue
@@ -315,11 +315,11 @@ export default {
computed: {
...mapGetters(['fileInfoDetail', 'user']),
favourites() {
- return this.user.relationships.favourites.data.attributes.folders
+ return this.user.data.relationships.favourites.data.attributes.folders
},
isInFavourites() {
return this.favourites.find(
- (el) => el.unique_id == this.fileInfoDetail[0].unique_id
+ (el) => el.id == this.fileInfoDetail[0].id
)
},
isFile() {
@@ -369,7 +369,7 @@ export default {
if (
this.favourites &&
!this.favourites.find(
- (el) => el.unique_id == this.fileInfoDetail[0].unique_id
+ (el) => el.id == this.fileInfoDetail[0].id
)
) {
this.$store.dispatch('addToFavourites', this.fileInfoDetail[0])
@@ -416,8 +416,8 @@ export default {
diff --git a/resources/js/components/FilesView/MobileMultiSelectMenu.vue b/resources/js/components/FilesView/MobileMultiSelectMenu.vue
index 489f5f19..3389cf8c 100644
--- a/resources/js/components/FilesView/MobileMultiSelectMenu.vue
+++ b/resources/js/components/FilesView/MobileMultiSelectMenu.vue
@@ -75,8 +75,8 @@ export default {
diff --git a/resources/js/components/FilesView/Option.vue b/resources/js/components/FilesView/Option.vue
index 30494694..b9329374 100644
--- a/resources/js/components/FilesView/Option.vue
+++ b/resources/js/components/FilesView/Option.vue
@@ -1,26 +1,31 @@
-