From 990a53c9c788c07156a8dd64db77d6d0235a4b48 Mon Sep 17 00:00:00 2001 From: sa0ChunLuyu Date: Wed, 23 Aug 2023 23:27:46 +0800 Subject: [PATCH] =?UTF-8?q?LuCode3AdminMix=20=E5=9F=BA=E7=A1=80=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E8=BF=81=E7=A7=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/.editorconfig | 18 + api/.env.example | 62 + api/.gitattributes | 11 + api/.gitignore | 36 + api/app/Console/Kernel.php | 27 + api/app/Exceptions/Handler.php | 30 + .../Controllers/AdminAccountController.php | 41 + .../Http/Controllers/AdminAuthController.php | 196 + .../Controllers/AdminAuthGroupController.php | 71 + api/app/Http/Controllers/AdminController.php | 214 + api/app/Http/Controllers/ConfigController.php | 105 + api/app/Http/Controllers/Controller.php | 18 + .../Controllers/ImageCaptchaController.php | 113 + .../Http/Controllers/RequestLogController.php | 90 + api/app/Http/Controllers/UploadController.php | 110 + api/app/Http/Controllers/YoController.php | 18 + api/app/Http/Kernel.php | 68 + api/app/Http/Middleware/Authenticate.php | 17 + api/app/Http/Middleware/EncryptCookies.php | 17 + .../PreventRequestsDuringMaintenance.php | 17 + .../Middleware/RedirectIfAuthenticated.php | 30 + api/app/Http/Middleware/TrimStrings.php | 19 + api/app/Http/Middleware/TrustHosts.php | 20 + api/app/Http/Middleware/TrustProxies.php | 28 + api/app/Http/Middleware/ValidateSignature.php | 22 + api/app/Http/Middleware/VerifyCsrfToken.php | 17 + api/app/Http/Request/ChangeAdminPassword.php | 45 + api/app/Http/Request/EditAdmin.php | 53 + api/app/Http/Request/EditAdminAuth.php | 52 + api/app/Http/Request/EditAdminAuthGroup.php | 47 + api/app/Http/Request/EditConfig.php | 47 + api/app/Http/Request/UpdateAdminInfo.php | 47 + api/app/Libraries/Login.php | 77 + api/app/Libraries/Lu.php | 185 + api/app/Libraries/Yo.php | 39 + api/app/Models/Admin.php | 10 + api/app/Models/AdminAccount.php | 10 + api/app/Models/AdminAuth.php | 10 + api/app/Models/AdminAuthGroup.php | 10 + api/app/Models/AdminToken.php | 10 + api/app/Models/Config.php | 10 + api/app/Models/ImageCaptcha.php | 10 + api/app/Models/Model.php | 14 + api/app/Models/RequestLog.php | 10 + api/app/Models/Upload.php | 10 + api/app/Providers/AppServiceProvider.php | 25 + api/app/Providers/AuthServiceProvider.php | 26 + .../Providers/BroadcastServiceProvider.php | 19 + api/app/Providers/EventServiceProvider.php | 38 + api/app/Providers/RouteServiceProvider.php | 40 + api/artisan | 53 + api/bootstrap/app.php | 55 + api/bootstrap/cache/.gitignore | 2 + api/composer.json | 72 + api/composer.lock | 6006 +++++++++++++++++ api/config/app.php | 188 + api/config/auth.php | 115 + api/config/broadcasting.php | 71 + api/config/cache.php | 111 + api/config/code.php | 42 + api/config/cors.php | 34 + api/config/database.php | 151 + api/config/filesystems.php | 76 + api/config/hashing.php | 52 + api/config/logging.php | 131 + api/config/mail.php | 125 + api/config/queue.php | 109 + api/config/sanctum.php | 67 + api/config/services.php | 34 + api/config/session.php | 201 + api/config/view.php | 36 + api/database/.gitignore | 1 + api/database/factories/UserFactory.php | 38 + ...2023_07_29_021050_create_configs_table.php | 32 + .../2023_07_29_042032_create_admins_table.php | 32 + ..._29_042123_create_admin_accounts_table.php | 31 + ..._042139_create_admin_auth_groups_table.php | 31 + ..._07_29_042142_create_admin_auths_table.php | 37 + ...07_29_042151_create_admin_tokens_table.php | 30 + .../2023_07_29_105144_push_admin_data.php | 47 + .../2023_07_29_105144_push_auth_data.php | 131 + .../2023_07_29_143353_push_config_data.php | 94 + ..._29_214939_create_image_captchas_table.php | 27 + ...2023_08_08_092916_create_uploads_table.php | 34 + api/database/seeders/DatabaseSeeder.php | 22 + api/public/favicon.ico | Bin 0 -> 4286 bytes api/public/index.php | 55 + api/public/robots.txt | 2 + api/resources/css/app.css | 0 api/resources/js/app.js | 1 + api/resources/js/bootstrap.js | 32 + api/resources/views/emails/example.blade.php | 16 + api/resources/views/welcome.blade.php | 140 + api/routes/api.php | 19 + api/routes/channels.php | 18 + api/routes/console.php | 19 + api/routes/web.php | 65 + api/storage/app/public/assets/captcha.ttf | Bin 0 -> 20952 bytes .../app/public/assets/default/avatar.png | Bin 0 -> 2152 bytes .../app/public/assets/default/favicon.png | Bin 0 -> 9104 bytes .../app/public/assets/default/login_bg.png | Bin 0 -> 59273 bytes .../app/public/assets/default/login_cover.png | Bin 0 -> 122781 bytes .../app/public/assets/default/logo.png | Bin 0 -> 9104 bytes api/storage/framework/.gitignore | 9 + api/storage/framework/cache/.gitignore | 3 + api/storage/framework/cache/data/.gitignore | 2 + api/storage/framework/sessions/.gitignore | 2 + api/storage/framework/testing/.gitignore | 2 + api/storage/framework/views/.gitignore | 2 + api/storage/logs/.gitignore | 2 + 110 files changed, 10966 insertions(+) create mode 100644 api/.editorconfig create mode 100644 api/.env.example create mode 100644 api/.gitattributes create mode 100644 api/.gitignore create mode 100644 api/app/Console/Kernel.php create mode 100644 api/app/Exceptions/Handler.php create mode 100644 api/app/Http/Controllers/AdminAccountController.php create mode 100644 api/app/Http/Controllers/AdminAuthController.php create mode 100644 api/app/Http/Controllers/AdminAuthGroupController.php create mode 100644 api/app/Http/Controllers/AdminController.php create mode 100644 api/app/Http/Controllers/ConfigController.php create mode 100644 api/app/Http/Controllers/Controller.php create mode 100644 api/app/Http/Controllers/ImageCaptchaController.php create mode 100644 api/app/Http/Controllers/RequestLogController.php create mode 100644 api/app/Http/Controllers/UploadController.php create mode 100644 api/app/Http/Controllers/YoController.php create mode 100644 api/app/Http/Kernel.php create mode 100644 api/app/Http/Middleware/Authenticate.php create mode 100644 api/app/Http/Middleware/EncryptCookies.php create mode 100644 api/app/Http/Middleware/PreventRequestsDuringMaintenance.php create mode 100644 api/app/Http/Middleware/RedirectIfAuthenticated.php create mode 100644 api/app/Http/Middleware/TrimStrings.php create mode 100644 api/app/Http/Middleware/TrustHosts.php create mode 100644 api/app/Http/Middleware/TrustProxies.php create mode 100644 api/app/Http/Middleware/ValidateSignature.php create mode 100644 api/app/Http/Middleware/VerifyCsrfToken.php create mode 100644 api/app/Http/Request/ChangeAdminPassword.php create mode 100644 api/app/Http/Request/EditAdmin.php create mode 100644 api/app/Http/Request/EditAdminAuth.php create mode 100644 api/app/Http/Request/EditAdminAuthGroup.php create mode 100644 api/app/Http/Request/EditConfig.php create mode 100644 api/app/Http/Request/UpdateAdminInfo.php create mode 100755 api/app/Libraries/Login.php create mode 100644 api/app/Libraries/Lu.php create mode 100755 api/app/Libraries/Yo.php create mode 100644 api/app/Models/Admin.php create mode 100644 api/app/Models/AdminAccount.php create mode 100644 api/app/Models/AdminAuth.php create mode 100644 api/app/Models/AdminAuthGroup.php create mode 100644 api/app/Models/AdminToken.php create mode 100644 api/app/Models/Config.php create mode 100644 api/app/Models/ImageCaptcha.php create mode 100644 api/app/Models/Model.php create mode 100644 api/app/Models/RequestLog.php create mode 100644 api/app/Models/Upload.php create mode 100644 api/app/Providers/AppServiceProvider.php create mode 100644 api/app/Providers/AuthServiceProvider.php create mode 100644 api/app/Providers/BroadcastServiceProvider.php create mode 100644 api/app/Providers/EventServiceProvider.php create mode 100644 api/app/Providers/RouteServiceProvider.php create mode 100755 api/artisan create mode 100644 api/bootstrap/app.php create mode 100644 api/bootstrap/cache/.gitignore create mode 100644 api/composer.json create mode 100644 api/composer.lock create mode 100644 api/config/app.php create mode 100644 api/config/auth.php create mode 100644 api/config/broadcasting.php create mode 100644 api/config/cache.php create mode 100644 api/config/code.php create mode 100644 api/config/cors.php create mode 100644 api/config/database.php create mode 100644 api/config/filesystems.php create mode 100644 api/config/hashing.php create mode 100644 api/config/logging.php create mode 100644 api/config/mail.php create mode 100644 api/config/queue.php create mode 100644 api/config/sanctum.php create mode 100644 api/config/services.php create mode 100644 api/config/session.php create mode 100644 api/config/view.php create mode 100644 api/database/.gitignore create mode 100644 api/database/factories/UserFactory.php create mode 100644 api/database/migrations/2023_07_29_021050_create_configs_table.php create mode 100644 api/database/migrations/2023_07_29_042032_create_admins_table.php create mode 100644 api/database/migrations/2023_07_29_042123_create_admin_accounts_table.php create mode 100644 api/database/migrations/2023_07_29_042139_create_admin_auth_groups_table.php create mode 100644 api/database/migrations/2023_07_29_042142_create_admin_auths_table.php create mode 100644 api/database/migrations/2023_07_29_042151_create_admin_tokens_table.php create mode 100644 api/database/migrations/2023_07_29_105144_push_admin_data.php create mode 100644 api/database/migrations/2023_07_29_105144_push_auth_data.php create mode 100644 api/database/migrations/2023_07_29_143353_push_config_data.php create mode 100644 api/database/migrations/2023_07_29_214939_create_image_captchas_table.php create mode 100644 api/database/migrations/2023_08_08_092916_create_uploads_table.php create mode 100644 api/database/seeders/DatabaseSeeder.php create mode 100644 api/public/favicon.ico create mode 100644 api/public/index.php create mode 100644 api/public/robots.txt create mode 100644 api/resources/css/app.css create mode 100644 api/resources/js/app.js create mode 100644 api/resources/js/bootstrap.js create mode 100644 api/resources/views/emails/example.blade.php create mode 100644 api/resources/views/welcome.blade.php create mode 100644 api/routes/api.php create mode 100644 api/routes/channels.php create mode 100644 api/routes/console.php create mode 100644 api/routes/web.php create mode 100644 api/storage/app/public/assets/captcha.ttf create mode 100644 api/storage/app/public/assets/default/avatar.png create mode 100644 api/storage/app/public/assets/default/favicon.png create mode 100644 api/storage/app/public/assets/default/login_bg.png create mode 100644 api/storage/app/public/assets/default/login_cover.png create mode 100644 api/storage/app/public/assets/default/logo.png create mode 100644 api/storage/framework/.gitignore create mode 100644 api/storage/framework/cache/.gitignore create mode 100644 api/storage/framework/cache/data/.gitignore create mode 100644 api/storage/framework/sessions/.gitignore create mode 100644 api/storage/framework/testing/.gitignore create mode 100644 api/storage/framework/views/.gitignore create mode 100644 api/storage/logs/.gitignore diff --git a/api/.editorconfig b/api/.editorconfig new file mode 100644 index 0000000..74d2ba1 --- /dev/null +++ b/api/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_size = 2 + +[docker-compose.yml] +indent_size = 2 diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 0000000..4788833 --- /dev/null +++ b/api/.env.example @@ -0,0 +1,62 @@ +APP_NAME=入魔入佛 +APP_ENV=local +APP_KEY=base64:q3NPkuRVhdHFRkVskaqQatUEs+fXcFVgJNiDtE9nSAA= +APP_DEBUG=true +APP_URL=http://127.0.0.1:8000 + +REQUEST_LOG=true +TIMEZONE=Asia/Shanghai + +LOG_CHANNEL=stack +LOG_DEPRECATIONS_CHANNEL=null +LOG_LEVEL=debug + +DB_CONNECTION=mysql +DB_HOST=127.0.0.1 +DB_PORT=3306 +DB_DATABASE=xxxxxxx +DB_USERNAME=xxxxxxx +DB_PASSWORD=xxxxxxx + +BROADCAST_DRIVER=log +CACHE_DRIVER=file +FILESYSTEM_DISK=local +QUEUE_CONNECTION=sync +SESSION_DRIVER=file +SESSION_LIFETIME=120 + +MEMCACHED_HOST=127.0.0.1 + +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 + +MAIL_MAILER=smtp +MAIL_HOST=mailpit +MAIL_PORT=1025 +MAIL_USERNAME=null +MAIL_PASSWORD=null +MAIL_ENCRYPTION=null +MAIL_FROM_ADDRESS="hello@example.com" +MAIL_FROM_NAME="${APP_NAME}" + +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_DEFAULT_REGION=us-east-1 +AWS_BUCKET= +AWS_USE_PATH_STYLE_ENDPOINT=false + +PUSHER_APP_ID= +PUSHER_APP_KEY= +PUSHER_APP_SECRET= +PUSHER_HOST= +PUSHER_PORT=443 +PUSHER_SCHEME=https +PUSHER_APP_CLUSTER=mt1 + +VITE_APP_NAME="${APP_NAME}" +VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}" +VITE_PUSHER_HOST="${PUSHER_HOST}" +VITE_PUSHER_PORT="${PUSHER_PORT}" +VITE_PUSHER_SCHEME="${PUSHER_SCHEME}" +VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" diff --git a/api/.gitattributes b/api/.gitattributes new file mode 100644 index 0000000..fcb21d3 --- /dev/null +++ b/api/.gitattributes @@ -0,0 +1,11 @@ +* text=auto eol=lf + +*.blade.php diff=html +*.css diff=css +*.html diff=html +*.md diff=markdown +*.php diff=php + +/.github export-ignore +CHANGELOG.md export-ignore +.styleci.yml export-ignore diff --git a/api/.gitignore b/api/.gitignore new file mode 100644 index 0000000..8631525 --- /dev/null +++ b/api/.gitignore @@ -0,0 +1,36 @@ +# ---> Laravel +/vendor/ +npm-debug.log +yarn-error.log + +# Laravel 4 specific +bootstrap/compiled.php +app/storage/ + +# Laravel 5 & Lumen specific +public/storage + +# Laravel 5 & Lumen specific with changed public path +public_html/storage +public_html/hot + +storage/app/public/assets/upload +storage/app/log +storage/*.key +.env +Homestead.yaml +Homestead.json +/.vagrant +.phpunit.result.cache + +# ---> Vue +# gitignore template for Vue.js projects +# +# Recommended template: Node.gitignore + +# TODO: where does this rule come from? +docs/_book + +# TODO: where does this rule come from? +test/ + diff --git a/api/app/Console/Kernel.php b/api/app/Console/Kernel.php new file mode 100644 index 0000000..e6b9960 --- /dev/null +++ b/api/app/Console/Kernel.php @@ -0,0 +1,27 @@ +command('inspire')->hourly(); + } + + /** + * Register the commands for the application. + */ + protected function commands(): void + { + $this->load(__DIR__.'/Commands'); + + require base_path('routes/console.php'); + } +} diff --git a/api/app/Exceptions/Handler.php b/api/app/Exceptions/Handler.php new file mode 100644 index 0000000..56af264 --- /dev/null +++ b/api/app/Exceptions/Handler.php @@ -0,0 +1,30 @@ + + */ + protected $dontFlash = [ + 'current_password', + 'password', + 'password_confirmation', + ]; + + /** + * Register the exception handling callbacks for the application. + */ + public function register(): void + { + $this->reportable(function (Throwable $e) { + // + }); + } +} diff --git a/api/app/Http/Controllers/AdminAccountController.php b/api/app/Http/Controllers/AdminAccountController.php new file mode 100644 index 0000000..7da19a5 --- /dev/null +++ b/api/app/Http/Controllers/AdminAccountController.php @@ -0,0 +1,41 @@ +post('hash'); + $code = $request->post('code'); + $time = $request->post('time'); + $uuid = $request->post('uuid'); + $captcha = new ImageCaptchaController(); + $captcha_check = $captcha->check($hash, $code, $time, $uuid); + if ($captcha_check != 0) Yo::error_echo($captcha_check); + $old_password = $request->post('old_password'); + $password = $request->post('password'); + $admin_account = AdminAccount::where('admin', Login::$info->id) + ->where('type', 1) + ->where('del', 2) + ->first(); + if (!$admin_account) Yo::error_echo(100001, ['账号']); + if (!password_verify($old_password, $admin_account->secret)) Yo::error_echo(100008); + if ($old_password == $password) Yo::error_echo(100009); + $admin_account->secret = bcrypt($password); + $admin_account->save(); + if (Login::$info->initial_password == 1) { + Login::$info->initial_password = 2; + Login::$info->save(); + } + return Yo::update_echo(Login::$info->init_password); + } +} diff --git a/api/app/Http/Controllers/AdminAuthController.php b/api/app/Http/Controllers/AdminAuthController.php new file mode 100644 index 0000000..37a88ec --- /dev/null +++ b/api/app/Http/Controllers/AdminAuthController.php @@ -0,0 +1,196 @@ +name = $request->post('name'); + $admin_auth->title = $request->post('title'); + $admin_auth->icon = $request->post('icon') ?? ''; + $pid = $request->post('pid'); + $type = $request->post('type'); + if ($type == 1 && $pid != 0) Yo::error_echo(100029); + if ($type == 2 && $pid != 0) { + $p_info = AdminAuth::where('id', $pid)->where('pid', 0)->where('type', 1)->first(); + if (!$p_info) Yo::error_echo(100001, ['组路由']); + } + $admin_auth->pid = $pid; + $admin_auth->type = $type; + $admin_auth->check = $request->post('check'); + $admin_auth->show = $request->post('show'); + $admin_auth->status = $request->post('status'); + $admin_auth->message = $request->post('message') ?? ''; + $admin_auth->order = $request->post('order'); + $admin_auth->save(); + $admin_auth = AdminAuth::where('id', $admin_auth->id)->first(); + return Yo::echo([ + 'info' => $admin_auth + ]); + } + + public function update(EditAdminAuth $request) + { + Login::admin([8]); + $admin_auth = AdminAuth::where('id', $request->post('id'))->where('del', 2)->first(); + if (!$admin_auth) Yo::error_echo(100001, ['路由']); + $admin_auth->name = $request->post('name'); + $admin_auth->title = $request->post('title'); + $admin_auth->icon = $request->post('icon') ?? ''; + $pid = $request->post('pid'); + $type = $request->post('type'); + if ($type == 1 && $pid != 0) Yo::error_echo(100029); + if ($type == 2 && $pid != 0) { + $p_info = AdminAuth::where('id', $pid)->where('pid', 0)->where('type', 1)->first(); + if (!$p_info) Yo::error_echo(100001, ['组路由']); + } + $admin_auth->pid = $pid; + $admin_auth->type = $type; + $admin_auth->check = $request->post('check'); + $admin_auth->show = $request->post('show'); + $admin_auth->status = $request->post('status'); + $admin_auth->message = $request->post('message') ?? ''; + $admin_auth->order = $request->post('order'); + $admin_auth->save(); + $admin_auth = AdminAuth::where('id', $admin_auth->id)->first(); + return Yo::echo([ + 'info' => $admin_auth + ]); + } + + public function delete(Request $request) + { + Login::admin([8]); + $admin_auth = AdminAuth::where('id', $request->post('id'))->where('del', 2)->first(); + if (!$admin_auth) Yo::error_echo(100001, ['路由']); + $son_count = AdminAuth::where('pid', $admin_auth->id)->where('del', 2)->count(); + if ($son_count != 0) Yo::error_echo(100030); + $admin_auth->del = 1; + $admin_auth->save(); + return Yo::delete_echo($admin_auth->id); + } + + public function list(Request $request) + { + Login::admin([8]); + $auth_group = AdminAuth::where('pid', 0)->where('type', 1)->where('del', 2)->orderBy('order', 'desc')->get(); + $list = []; + foreach ($auth_group as $item) { + $data = [ + 'info' => $item, + ]; + $auth_group_list = AdminAuth::where('pid', $item->id)->where('type', 2)->where('check', 1)->where('del', 2)->orderBy('order', 'desc')->get(); + $data['list'] = $auth_group_list; + $list[] = $data; + } + $auth_group_single = AdminAuth::where('pid', 0)->where('type', 2)->where('check', 1)->where('del', 2)->orderBy('order', 'desc')->get()->toArray(); + return Yo::echo([ + 'list' => array_merge($list, $auth_group_single) + ]); + } + + public function select(Request $request) + { + Login::admin([8]); + $auth_group = AdminAuth::where('pid', 0)->where('type', 1)->where('del', 2)->orderBy('order', 'desc')->get(); + return Yo::echo([ + 'list' => $auth_group + ]); + } + + public function choose() + { + Login::admin(); + $auth_group = AdminAuth::where('pid', 0)->where('type', 1)->where('del', 2)->orderBy('order', 'desc')->get(); + $list = []; + foreach ($auth_group as $item) { + $data = [ + 'info' => $item, + ]; + $auth_group_list = AdminAuth::where('pid', $item->id)->where('type', 2)->where('check', 1)->where('del', 2)->orderBy('order', 'desc')->get(); + $data['list'] = $auth_group_list; + if (count($data['list']) == 0) continue; + $list[] = $data; + } + $auth_group_single = AdminAuth::where('pid', 0)->where('type', 2)->where('check', 1)->where('del', 2)->orderBy('order', 'desc')->get(); + if (count($auth_group_single) != 0) { + $list[] = [ + 'info' => [ + 'id' => 0, + 'title' => '未分组', + ], + 'list' => $auth_group_single + ]; + } + return Yo::echo([ + 'list' => $list + ]); + } + + public function menu() + { + Login::admin(); + $menu_group = AdminAuth::select('id', 'name', 'title', 'icon', 'status', 'type') + ->where('pid', 0)->where('show', 1)->where('del', 2) + ->orderBy('order', 'desc')->get(); + $list = []; + foreach ($menu_group as $item) { + if ($item->type == 2) { + $list[] = [ + "id" => $item->id, + "name" => $item->name, + "title" => $item->title, + "icon" => $item->icon, + "status" => $item->status, + "children" => [] + ]; + } else { + switch (Login::$info->admin_auth_group) { + case -1: + $auth_list = AdminAuth::select('id', 'name', 'title', 'icon', 'status')->where('pid', $item->id) + ->where('type', 2)->where('show', 1)->where('status', 1)->where('del', 2) + ->orderBy('order', 'desc')->get(); + break; + case 0: + $auth_list = AdminAuth::select('id', 'name', 'title', 'icon', 'status')->where('pid', $item->id) + ->where('type', 2)->where('check_type', 1)->where('show', 1)->where('status', 1)->where('del', 2) + ->orderBy('order', 'desc')->get(); + break; + default: + $admin_auth = AdminAuth::find(Login::$info->admin_auth_group); + $auths = json_decode($admin_auth->auths, true); + $auth_list = AdminAuth::select('id', 'name', 'title', 'icon', 'status') + ->where(function ($query) use ($auths, $item) { + $query->whereIn('id', $auths)->where('pid', $item->id)->where('type', 2)->where('check_type', 2)->where('show', 1)->where('status', 1)->where('del', 2); + }) + ->orWhere(function ($query) use ($auths, $item) { + $query->where('type', 2)->where('pid', $item->id)->where('check_type', 1)->where('show', 1)->where('status', 1)->where('del', 2); + }) + ->orderBy('order', 'desc')->get(); + } + if (count($auth_list) !== 0) { + $list[] = [ + "id" => $item->id, + "name" => $item->name, + "title" => $item->title, + "icon" => $item->icon, + "status" => $item->status, + "children" => $auth_list + ]; + } + } + } + return Yo::echo([ + 'list' => $list + ]); + } +} diff --git a/api/app/Http/Controllers/AdminAuthGroupController.php b/api/app/Http/Controllers/AdminAuthGroupController.php new file mode 100644 index 0000000..3338b8d --- /dev/null +++ b/api/app/Http/Controllers/AdminAuthGroupController.php @@ -0,0 +1,71 @@ +name = $request->post('name'); + $admin_auth_group->admin_auths = $request->post('admin_auths'); + $admin_auth_group->remark = $request->post('remark') ?? ''; + $admin_auth_group->status = $request->post('status'); + $admin_auth_group->save(); + return Yo::echo([ + 'info' => $admin_auth_group + ]); + } + + public function update(EditAdminAuthGroup $request) + { + Login::admin([4]); + $admin_auth_group = AdminAuthGroup::where('id', $request->post('id')) + ->where('del', 2)->first(); + if (!$admin_auth_group) Yo::error_echo(100001, ['权限组']); + $admin_auth_group->name = $request->post('name'); + $admin_auth_group->admin_auths = $request->post('admin_auths'); + $admin_auth_group->remark = $request->post('remark') ?? ''; + $admin_auth_group->status = $request->post('status'); + $admin_auth_group->save(); + return Yo::echo([ + 'info' => $admin_auth_group + ]); + } + + public function delete(Request $request) + { + Login::admin([4]); + $admin_auth_group = AdminAuthGroup::where('id', $request->post('id')) + ->where('del', 2)->first(); + if (!$admin_auth_group) Yo::error_echo(100001, ['权限组']); + $admin_auth_group->del = 1; + $admin_auth_group->save(); + return Yo::delete_echo($admin_auth_group->id); + } + + public function list(Request $request) + { + Login::admin(); + $admin_auth_group = AdminAuthGroup::where('del', 2)->get(); + return Yo::echo([ + 'list' => $admin_auth_group + ]); + } + + public function select(Request $request) + { + Login::admin(); + $admin_auth_group = AdminAuthGroup::where('del', 2)->get(); + return Yo::echo([ + 'list' => $admin_auth_group + ]); + } +} diff --git a/api/app/Http/Controllers/AdminController.php b/api/app/Http/Controllers/AdminController.php new file mode 100644 index 0000000..3c95859 --- /dev/null +++ b/api/app/Http/Controllers/AdminController.php @@ -0,0 +1,214 @@ +post('account'); + $admin_account = AdminAccount::where('account', $account)->where('type', 1)->where('del', 2)->first(); + if ($admin_account) Yo::error_echo(100023); + $admin = new Admin(); + $admin->nickname = $request->post('nickname'); + $admin->avatar = $request->post('avatar'); + $admin->admin_auth_group = $request->post('admin_auth_group'); + $admin->initial_password = $request->post('initial_password'); + $admin->status = $request->post('status'); + $admin->save(); + $admin_account = new AdminAccount(); + $admin_account->admin = $admin->id; + $admin_account->account = $account; + $admin_account->secret = bcrypt($request->post('password')); + $admin_account->type = 1; + $admin_account->save(); + $admin_info = Admin::select(['id', 'nickname', 'avatar', 'status', 'admin_auth_group', 'initial_password']) + ->selectRaw("IFNULL((select account from admin_accounts where admin_accounts.admin = admins.id and type = 1),'') as account") + ->selectRaw("IFNULL((select name from admin_auth_groups where admin_auth_groups.id = admins.admin_auth_group),'') as admin_auth_group_name") + ->where('id', $admin->id)->first(); + return Yo::echo([ + 'info' => $admin_info + ]); + } + + public function update(EditAdmin $request) + { + Login::admin([5]); + $id = $request->post('id'); + $account = $request->post('account'); + $admin_account = AdminAccount::where('admin', '!=', $id)->where('account', $account)->where('type', 1)->where('del', 2)->first(); + if ($admin_account) Yo::error_echo(100023); + $admin = Admin::where('id', $id)->where('del', 2)->first(); + if (!$admin) Yo::error_echo(100001, ['管理员']); + $admin_account = AdminAccount::where('admin', $id)->where('del', 2)->first(); + if (!$admin_account) Yo::error_echo(100001, ['管理员']); + $admin->nickname = $request->post('nickname'); + $admin->avatar = $request->post('avatar'); + $admin->admin_auth_group = $request->post('admin_auth_group'); + $admin->initial_password = $request->post('initial_password'); + $admin->status = $request->post('status'); + $admin->save(); + if ($admin_account->account != $account) { + $admin_account->account = $request->post('account'); + $admin_account->save(); + } + $admin_info = Admin::select(['id', 'nickname', 'avatar', 'status', 'admin_auth_group', 'initial_password']) + ->selectRaw("IFNULL((select account from admin_accounts where admin_accounts.admin = admins.id and type = 1),'') as account") + ->selectRaw("IFNULL((select name from admin_auth_groups where admin_auth_groups.id = admins.admin_auth_group),'') as admin_auth_group_name") + ->where('id', $admin->id)->first(); + return Yo::echo([ + 'info' => $admin_info + ]); + } + + public function delete(Request $request) + { + Login::admin([5]); + $id = $request->post('id'); + $admin = Admin::where('id', $id)->where('del', 2)->first(); + if (!$admin) Yo::error_echo(100001, ['管理员']); + $admin_account = AdminAccount::where('admin', $id)->where('del', 2)->first(); + if (!$admin_account) Yo::error_echo(100001, ['管理员']); + $admin->del = 1; + $admin->save(); + $admin_account->del = 1; + $admin_account->save(); + return Yo::delete_echo($admin->id); + } + + public function list(Request $request) + { + Login::admin([5]); + $status = $request->post('status'); + $search = $request->post('search'); + $admin_auth_group = $request->post('admin_auth_group'); + $initial_password = $request->post('initial_password'); + $admin_list = Admin::select(['id', 'nickname', 'avatar', 'status', 'admin_auth_group', 'initial_password']) + ->selectRaw("IFNULL((select account from admin_accounts where admin_accounts.admin = admins.id and type = 1),'') as account") + ->selectRaw("IFNULL((select name from admin_auth_groups where admin_auth_groups.id = admins.admin_auth_group),'') as admin_auth_group_name") + ->where(function ($query) use ($status) { + if ($status != 0) $query->where('status', $status); + }) + ->where(function ($query) use ($admin_auth_group) { + if ($admin_auth_group != 0) $query->where('admin_auth_group', $admin_auth_group); + }) + ->where(function ($query) use ($initial_password) { + if ($initial_password != 0) $query->where('initial_password', $initial_password); + }) + ->where(function ($query) use ($search) { + if ($search != '') $query->where('nickname', 'like', "%$search%"); + }) + ->where('del', 2) + ->paginate(20); + return Yo::echo([ + 'list' => $admin_list + ]); + } + + public function quit() + { + Login::admin_check(); + if (!!Login::$token) { + Login::$token->del = 1; + Login::$token->save(); + } + return Yo::echo(); + } + + public function update_self(UpdateAdminInfo $request) + { + Login::admin(); + $nickname = $request->post('nickname'); + $avatar = $request->post('avatar'); + Login::$info->nickname = $nickname; + Login::$info->avatar = $avatar; + Login::$info->save(); + return Yo::update_echo(Login::$info->id); + } + + public function login(Request $request) + { + $captcha_type_config = Config::where('name', '后台密码登录验证')->first(); + if (!!$captcha_type_config) { + if ($captcha_type_config->value != '0') { + $hash = $request->post('hash'); + $code = $request->post('code'); + $time = $request->post('time'); + $uuid = $request->post('uuid'); + $captcha = null; + switch ($captcha_type_config->value) { + case '1': + $captcha = new ImageCaptchaController(); + break; + } + $captcha_check = $captcha->check($hash, $code, $time, $uuid); + if ($captcha_check != 0) Yo::error_echo($captcha_check); + } + } + $account = $request->post('account'); + $password = $request->post('password'); + $type = 1; + $admin_account = AdminAccount::where('account', $account) + ->where('type', $type) + ->where('del', 2) + ->first(); + if (!$admin_account) Yo::error_echo(100007); + if (!password_verify($password, $admin_account->secret)) Yo::error_echo(100007); + $admin = Admin::where('id', $admin_account->admin) + ->where('status', 1) + ->where('del', 2) + ->first(); + if (!$admin) Yo::error_echo(100003); + Login::$info = $admin; + Login::$type = 'admin'; + $token = $this->create_token($admin, $type); + return Yo::echo([ + 'token' => $token + ]); + } + + public function status() + { + Login::admin(); + return Yo::echo(); + } + + public function info() + { + Login::admin(); + return Yo::echo([ + 'info' => [ + 'id' => Login::$info->id, + 'nickname' => Login::$info->nickname, + 'avatar' => Login::$info->avatar, + 'initial_password' => Login::$info->initial_password, + ] + ]); + } + + public function create_token($info, $type = 1): string + { + if ($info->status != 1) Yo::error_echo(100003); + if ($info->del != 2) Yo::error_echo(100003); + $token_str = Str::orderedUuid(); + $token = new AdminToken(); + $token->admin = $info->id; + $token->token = $token_str; + // $type 1-密码登录 + $token->type = $type; + $token->save(); + return $token_str; + } +} diff --git a/api/app/Http/Controllers/ConfigController.php b/api/app/Http/Controllers/ConfigController.php new file mode 100644 index 0000000..6800cc4 --- /dev/null +++ b/api/app/Http/Controllers/ConfigController.php @@ -0,0 +1,105 @@ +name = $request->post('name'); + $config->value = $request->post('value') ?? ''; + $config->type = $request->post('type'); + $config->client = $request->post('client'); + $config->login = $request->post('login'); + $config->remark = $request->post('remark') ?? ''; + $config->save(); + $config = Config::find($config->id); + if (in_array($config->type, [3, 4, 5])) $config->value = json_decode($config->value, true); + return Yo::echo([ + 'info' => $config + ]); + } + + public function update(EditConfig $request) + { + Login::admin([7]); + $config = Config::where('id', $request->post('id'))->first(); + if (!$config) Yo::error_echo(100001, ['配置']); + $config->name = $request->post('name'); + $config->value = $request->post('value'); + $config->type = $request->post('type'); + $config->client = $request->post('client'); + $config->login = $request->post('login'); + $config->remark = $request->post('remark') ?? ''; + $config->save(); + if (in_array($config->type, [3, 4, 5])) $config->value = json_decode($config->value, true); + return Yo::echo([ + 'info' => $config + ]); + } + + public function delete(Request $request) + { + Login::admin([7]); + $config = Config::where('id', $request->post('id'))->first(); + if (!$config) Yo::error_echo(100001, ['配置']); + $config->delete(); + if (in_array($config->type, [3, 4, 5])) $config->value = json_decode($config->value, true); + return Yo::delete_echo($config->id); + } + + public function list() + { + Login::admin([7]); + $config = Config::get(); + foreach ($config as $item) { + if (in_array($item->type, [3, 4, 5])) $item->value = json_decode($item->value, true); + } + return Yo::echo([ + 'list' => $config + ]); + } + + public function get(Request $request) + { + $client = $request->get('client'); + if (!$client) $client = 'public'; + $client_number = 0; + switch ($client) { + case 'admin': + $client_number = 1; + Login::admin_check(); + break; + } + $config_arr = $request->post('config_arr'); + if (!$config_arr) $config_arr = []; + $configs = $this->getConfigList($config_arr, $client_number); + return Yo::echo($configs); + } + + public function getConfigList($arr, $client) + { + $config_arr = []; + foreach ($arr as $item) $config_arr[$item] = ''; + $config_db = Config::whereIn('name', $arr); + if (!Login::$info) $config_db->where('login', 2); + if ($client != 0) $config_db->whereIn('client', [0, $client]); + $config = $config_db->get(); + foreach ($config as $item) { + $value = $item->value; + if (in_array($item->type, [3, 4, 5])) { + $value = json_decode($value, true); + } + $config_arr[$item->name] = $value; + } + return $config_arr; + } +} diff --git a/api/app/Http/Controllers/Controller.php b/api/app/Http/Controllers/Controller.php new file mode 100644 index 0000000..4a38960 --- /dev/null +++ b/api/app/Http/Controllers/Controller.php @@ -0,0 +1,18 @@ +first(); + if ($captcha) return 100005; + if (time() - $time > 60 * 3) return 100005; + if (Hash::check($code . ',Captcha,' . $uuid . ',' . $time, $hash)) { + $captcha = new ImageCaptcha(); + $captcha->uuid = $uuid; + $captcha->save(); + return 0; + } else { + return 100006; + } + } + + public function create() + { + $captcha = $this->generateCaptcha(); + $imageBase64 = $this->getImageBase64($captcha['image']); + $time = time(); + $uuid = Str::orderedUuid(); + $code = mb_strtoupper($captcha['code']); + $hash = Hash::make($code . ',Captcha,' . $uuid . ',' . $time); + $ret = [ + 'image' => $imageBase64, + 'hash' => $hash, + 'time' => $time, + 'uuid' => $uuid, + ]; + if (app()->isLocal()) { + $ret['code'] = $code; + $ret['account'] = 'admin'; + $ret['password'] = '000000'; + } + return Yo::echo($ret); + } + + private function generateCaptcha() + { + $code = $this->generateRandomCode(); + $image = $this->generateImage($code); + return [ + 'code' => $code, + 'image' => $image + ]; + } + + private function generateRandomCode() + { + $code = ''; + $characters = '34acdefhkmnprstwxyACDEFGHKMNPQRWXY'; + for ($i = 0; $i < 6; $i++) { + $code .= $characters[rand(0, strlen($characters) - 1)]; + } + return $code; + } + + private function generateImage($code) + { + $draw_width = 120; + $draw_height = 40; + $image = imagecreate($draw_width, $draw_height); + imagecolorallocate($image, 255, 255, 255); + for ($i = 0; $i < 100; $i++) { + $x = rand(0, 120); + $y = rand(0, 40); + $color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); + imagesetpixel($image, $x, $y, $color); + } + for ($i = 0; $i < 5; $i++) { + $x1 = rand(0, 120); + $y1 = rand(0, 40); + $x2 = rand(0, 120); + $y2 = rand(0, 40); + $color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); + imageline($image, $x1, $y1, $x2, $y2, $color); + } + $font_file = 'assets/captcha.ttf'; + $original_path = Storage::disk('public')->path($font_file); + $code_size = 26; + for ($i = 0; $i < mb_strlen($code); $i++) { + $c = mb_substr($code, $i, 1); + $r = rand(-20, 20); + $c_box = imagettfbbox($code_size, $r, $original_path, $c); + imagettftext($image, $code_size, $r, 2 + ceil((18 - $c_box[2]) / 2) + (18 * $i), ceil(($draw_height - $c_box[5]) / 2), + imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200)), $original_path, $c); + } + ob_start(); + imagepng($image); + $imageData = ob_get_clean(); + return $imageData; + } + + private function getImageBase64($imageData) + { + $imageBase64 = base64_encode($imageData); + return 'data:image/png;base64,' . $imageBase64; + } +} diff --git a/api/app/Http/Controllers/RequestLogController.php b/api/app/Http/Controllers/RequestLogController.php new file mode 100644 index 0000000..8e118c6 --- /dev/null +++ b/api/app/Http/Controllers/RequestLogController.php @@ -0,0 +1,90 @@ +post('id'); + $type = $request->post('type'); + $log = DB::table('zz_request_log_' . date('ym', strtotime($request->post('created_at'))))->where('id', $id)->first(); + if (!$log) Yo::error_echo(100001, ['日志']); + $content = file_get_contents(base_path("/storage/app/$log->input")); + $sections = explode('-------------------------------', $content); + $data = '{}'; + if ($type == 'input') { + $post = self::txtClear($sections[0], 1); + $header = self::txtClear($sections[1], 1); + $data = '{ + "params":' . $log->params . ', + "input":' . $post . ', + "header":' . $header . ' +}'; + } else { + $result = self::txtClear($sections[2], 0); + $data = $result; + } + return Yo::echo([ + 'data' => $data, + ]); + } + + public function txtClear($content, $index) + { + $content_arr = explode("\n", $content); + return $content_arr[count($content_arr) - 1 - $index]; + } + + public function list(Request $request) + { + Login::admin([9]); + $search = $request->post('search'); + $time = $request->post('time'); + $method = $request->post('method'); + $code = $request->post('code'); + $start_time = !!$time[0] ? Lu::date(strtotime($time[0]), 'Y-m-d') : date('Y-m-01'); + $end_time = !!$time[1] ? Lu::date(strtotime($time[1]), 'Y-m-d') : date('Y-m-t'); + $ym_check = [ + date('Y-m', strtotime($start_time)), + date('Y-m', strtotime($end_time)), + ]; + if ($ym_check[0] !== $ym_check[1]) Yo::error_echo(100024); + $table_name = 'zz_request_log_' . date('ym', strtotime($start_time)); + $table_count = DB::select('select count(1) as c from information_schema.TABLES where table_schema = ? and table_name = ?', [env('DB_DATABASE'), $table_name])[0]; + if ($table_count->c === 0) Yo::error_echo(100001, ['日志表']); + $request_list = DB::table($table_name)->where(function ($query) use ($search) { + if ($search != '') $query->where('uuid', $search) + ->orWhere('token', $search) + ->orWhere('url', $search) + ->orWhere('ip', $search); + }) + ->where(function ($query) use ($start_time) { + if ($start_time != '') $query->where('created_at', '>=', $start_time); + }) + ->where(function ($query) use ($end_time) { + if ($end_time != '') $query->where('created_at', '<=', $end_time); + }) + ->where(function ($query) use ($method) { + if ($method != '') $query->where('method', $method); + }) + ->where(function ($query) use ($code) { + if ($code != '') $query->where('code', $code); + }) + ->orderBy('id', 'desc') + ->paginate(20); + return Yo::echo([ + 'list' => $request_list, + 'time' => [$start_time, $end_time], + ]); + } +} diff --git a/api/app/Http/Controllers/UploadController.php b/api/app/Http/Controllers/UploadController.php new file mode 100644 index 0000000..dd181b9 --- /dev/null +++ b/api/app/Http/Controllers/UploadController.php @@ -0,0 +1,110 @@ +groupBy('ext')->get(); + $from = ['AdminImage']; + return Yo::echo([ + 'ext' => $ext, + 'from' => $from, + ]); + } + + public function list(Request $request) + { + Login::admin([10]); + $search = $request->post('search'); + $time = $request->post('time'); + $start_time = !!$time[0] ? Lu::date(strtotime($time[0])) : ''; + $end_time = !!$time[1] ? Lu::date(strtotime($time[1])) : ''; + $ext = $request->post('ext'); + $from = $request->post('from'); + $from_map = [ + 'AdminImage' => '/api/Admin/Upload/image', + ]; + $from_search = ''; + if (!!$from) $from_search = $from_map[$from]; + $upload_list = Upload::where(function ($query) use ($search) { + if ($search != '') $query->where('uuid', $search) + ->orWhere('name', $search) + ->orWhere('md5', $search); + }) + ->where(function ($query) use ($start_time) { + if ($start_time != '') $query->where('created_at', '>=', $start_time); + }) + ->where(function ($query) use ($end_time) { + if ($end_time != '') $query->where('created_at', '<=', $end_time); + }) + ->where(function ($query) use ($ext) { + if ($ext != '') $query->where('ext', $ext); + }) + ->where(function ($query) use ($from_search) { + if ($from_search != '') $query->where('from', $from_search); + }) + ->orderBy('id', 'desc') + ->paginate(20); + return Yo::echo([ + 'list' => $upload_list + ]); + } + + public function delete(Request $request) + { + Login::admin([10]); + $id = $request->post('id'); + $upload = Upload::where('id', $id)->first(); + if (!$upload) Yo::error_echo(100001, ['上传文件']); + $upload->delete(); + unlink($upload->path); + return Yo::delete_echo($upload->id); + } + + public function image(Request $request) + { + $base64 = $request->post('base64'); + if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64, $result)) { + $type = ['png', 'jpeg', 'jpg', 'gif']; + if (!in_array($result[2], $type)) Yo::error_echo(100015); + $md5 = md5($base64); + $upload = Upload::where('md5', $md5)->first(); + if (!$upload) { + $disk = Storage::disk('public'); + $name = Str::orderedUuid(); + $date = date('Y/m'); + $path = "/assets/upload/image/$date/$name.$result[2]"; + $put = $disk->put($path, base64_decode(str_replace($result[1], '', $base64))); + if (!$put) Yo::error_echo(100016, ['put']); + $save = "/storage/assets/upload/image/$date/$name.$result[2]"; + $size = $disk->size($path); + $p = $disk->path($path); + $upload = new Upload(); + $upload->uuid = $name; + $upload->name = 'Base64-' . $md5; + $upload->path = $p; + $upload->url = $save; + $upload->from = explode('?', $_SERVER['REQUEST_URI'])[0]; + $upload->size = $size / 1024 / 1024; + $upload->ext = $result[2]; + $upload->md5 = $md5; + $upload->save(); + } + return Yo::echo([ + 'url' => $upload->url + ]); + } else { + Yo::error_echo(100016, ['base64']); + } + } +} diff --git a/api/app/Http/Controllers/YoController.php b/api/app/Http/Controllers/YoController.php new file mode 100644 index 0000000..557bce3 --- /dev/null +++ b/api/app/Http/Controllers/YoController.php @@ -0,0 +1,18 @@ + env('APP_NAME'), + 'datetime' => Lu::date(), + 'data' => request()->all() + ]); + } +} diff --git a/api/app/Http/Kernel.php b/api/app/Http/Kernel.php new file mode 100644 index 0000000..494c050 --- /dev/null +++ b/api/app/Http/Kernel.php @@ -0,0 +1,68 @@ + + */ + protected $middleware = [ + // \App\Http\Middleware\TrustHosts::class, + \App\Http\Middleware\TrustProxies::class, + \Illuminate\Http\Middleware\HandleCors::class, + \App\Http\Middleware\PreventRequestsDuringMaintenance::class, + \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, + \App\Http\Middleware\TrimStrings::class, + \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; + + /** + * The application's route middleware groups. + * + * @var array> + */ + protected $middlewareGroups = [ + 'web' => [ + \App\Http\Middleware\EncryptCookies::class, + \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, + \Illuminate\Session\Middleware\StartSession::class, + \Illuminate\View\Middleware\ShareErrorsFromSession::class, + \App\Http\Middleware\VerifyCsrfToken::class, + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + + 'api' => [ + // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, + \Illuminate\Routing\Middleware\ThrottleRequests::class.':api', + \Illuminate\Routing\Middleware\SubstituteBindings::class, + ], + ]; + + /** + * The application's middleware aliases. + * + * Aliases may be used instead of class names to conveniently assign middleware to routes and groups. + * + * @var array + */ + protected $middlewareAliases = [ + 'auth' => \App\Http\Middleware\Authenticate::class, + 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, + 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::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, + 'precognitive' => \Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class, + 'signed' => \App\Http\Middleware\ValidateSignature::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, + ]; +} diff --git a/api/app/Http/Middleware/Authenticate.php b/api/app/Http/Middleware/Authenticate.php new file mode 100644 index 0000000..d4ef644 --- /dev/null +++ b/api/app/Http/Middleware/Authenticate.php @@ -0,0 +1,17 @@ +expectsJson() ? null : route('login'); + } +} diff --git a/api/app/Http/Middleware/EncryptCookies.php b/api/app/Http/Middleware/EncryptCookies.php new file mode 100644 index 0000000..867695b --- /dev/null +++ b/api/app/Http/Middleware/EncryptCookies.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/api/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/api/app/Http/Middleware/PreventRequestsDuringMaintenance.php new file mode 100644 index 0000000..74cbd9a --- /dev/null +++ b/api/app/Http/Middleware/PreventRequestsDuringMaintenance.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + // + ]; +} diff --git a/api/app/Http/Middleware/RedirectIfAuthenticated.php b/api/app/Http/Middleware/RedirectIfAuthenticated.php new file mode 100644 index 0000000..afc78c4 --- /dev/null +++ b/api/app/Http/Middleware/RedirectIfAuthenticated.php @@ -0,0 +1,30 @@ +check()) { + return redirect(RouteServiceProvider::HOME); + } + } + + return $next($request); + } +} diff --git a/api/app/Http/Middleware/TrimStrings.php b/api/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000..88cadca --- /dev/null +++ b/api/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,19 @@ + + */ + protected $except = [ + 'current_password', + 'password', + 'password_confirmation', + ]; +} diff --git a/api/app/Http/Middleware/TrustHosts.php b/api/app/Http/Middleware/TrustHosts.php new file mode 100644 index 0000000..c9c58bd --- /dev/null +++ b/api/app/Http/Middleware/TrustHosts.php @@ -0,0 +1,20 @@ + + */ + public function hosts(): array + { + return [ + $this->allSubdomainsOfApplicationUrl(), + ]; + } +} diff --git a/api/app/Http/Middleware/TrustProxies.php b/api/app/Http/Middleware/TrustProxies.php new file mode 100644 index 0000000..3391630 --- /dev/null +++ b/api/app/Http/Middleware/TrustProxies.php @@ -0,0 +1,28 @@ +|string|null + */ + protected $proxies; + + /** + * The headers that should be used to detect proxies. + * + * @var int + */ + protected $headers = + Request::HEADER_X_FORWARDED_FOR | + Request::HEADER_X_FORWARDED_HOST | + Request::HEADER_X_FORWARDED_PORT | + Request::HEADER_X_FORWARDED_PROTO | + Request::HEADER_X_FORWARDED_AWS_ELB; +} diff --git a/api/app/Http/Middleware/ValidateSignature.php b/api/app/Http/Middleware/ValidateSignature.php new file mode 100644 index 0000000..093bf64 --- /dev/null +++ b/api/app/Http/Middleware/ValidateSignature.php @@ -0,0 +1,22 @@ + + */ + protected $except = [ + // 'fbclid', + // 'utm_campaign', + // 'utm_content', + // 'utm_medium', + // 'utm_source', + // 'utm_term', + ]; +} diff --git a/api/app/Http/Middleware/VerifyCsrfToken.php b/api/app/Http/Middleware/VerifyCsrfToken.php new file mode 100644 index 0000000..6f0f6c5 --- /dev/null +++ b/api/app/Http/Middleware/VerifyCsrfToken.php @@ -0,0 +1,17 @@ + + */ + protected $except = [ + '*' + ]; +} diff --git a/api/app/Http/Request/ChangeAdminPassword.php b/api/app/Http/Request/ChangeAdminPassword.php new file mode 100644 index 0000000..04a7352 --- /dev/null +++ b/api/app/Http/Request/ChangeAdminPassword.php @@ -0,0 +1,45 @@ + ['required', 'between:6,20'], + ]; + } + + public function messages() + { + return [ + 'password.required' => 100009, + 'password.between' => 100010, + ]; + } + + public function failedValidation(Validator $validator) + { + Yo::error_echo($validator->errors()->first()); + } +} diff --git a/api/app/Http/Request/EditAdmin.php b/api/app/Http/Request/EditAdmin.php new file mode 100644 index 0000000..621d8ca --- /dev/null +++ b/api/app/Http/Request/EditAdmin.php @@ -0,0 +1,53 @@ + ['required', 'between:1,50'], + 'nickname' => ['required', 'between:1,50'], + 'avatar' => ['between:0,200'], + 'password' => ['required', 'between:6,20'], + ]; + } + + public function messages() + { + return [ + 'account.required' => 100020, + 'account.between' => 100021, + 'nickname.required' => 100012, + 'nickname.between' => 100013, + 'avatar.between' => 100014, + 'password.required' => 100022, + 'password.between' => 100010, + ]; + } + + public function failedValidation(Validator $validator) + { + Yo::error_echo($validator->errors()->first()); + } +} diff --git a/api/app/Http/Request/EditAdminAuth.php b/api/app/Http/Request/EditAdminAuth.php new file mode 100644 index 0000000..5f20e22 --- /dev/null +++ b/api/app/Http/Request/EditAdminAuth.php @@ -0,0 +1,52 @@ + ['required', 'between:1,200'], + 'title' => ['required', 'between:1,20'], + 'icon' => ['between:0,100'], + 'message' => ['between:0,50'], + ]; + } + + public function messages() + { + return [ + 'name.required' => 100025, + 'name.between' => 100026, + 'title.required' => 100017, + 'title.between' => 100018, + 'icon.between' => 100027, + 'message.between' => 100028, + ]; + } + + public function failedValidation(Validator $validator) + { + Yo::error_echo($validator->errors()->first()); + } +} diff --git a/api/app/Http/Request/EditAdminAuthGroup.php b/api/app/Http/Request/EditAdminAuthGroup.php new file mode 100644 index 0000000..64c754a --- /dev/null +++ b/api/app/Http/Request/EditAdminAuthGroup.php @@ -0,0 +1,47 @@ + ['required', 'between:1,20'], + 'remark' => ['between:0,100'], + ]; + } + + public function messages() + { + return [ + 'name.required' => 100017, + 'name.between' => 100018, + 'remark.between' => 100019, + ]; + } + + public function failedValidation(Validator $validator) + { + Yo::error_echo($validator->errors()->first()); + } +} diff --git a/api/app/Http/Request/EditConfig.php b/api/app/Http/Request/EditConfig.php new file mode 100644 index 0000000..a299b2d --- /dev/null +++ b/api/app/Http/Request/EditConfig.php @@ -0,0 +1,47 @@ + ['required', 'between:1,50'], + 'remark' => ['between:0,100'], + ]; + } + + public function messages() + { + return [ + 'name.required' => 100031, + 'name.between' => 100032, + 'remark.between' => 100019, + ]; + } + + public function failedValidation(Validator $validator) + { + Yo::error_echo($validator->errors()->first()); + } +} diff --git a/api/app/Http/Request/UpdateAdminInfo.php b/api/app/Http/Request/UpdateAdminInfo.php new file mode 100644 index 0000000..f5ff42a --- /dev/null +++ b/api/app/Http/Request/UpdateAdminInfo.php @@ -0,0 +1,47 @@ + ['required', 'between:1,50'], + 'avatar' => ['between:0,200'], + ]; + } + + public function messages() + { + return [ + 'nickname.required' => 100012, + 'nickname.between' => 100013, + 'avatar.between' => 100014, + ]; + } + + public function failedValidation(Validator $validator) + { + Yo::error_echo($validator->errors()->first()); + } +} diff --git a/api/app/Libraries/Login.php b/api/app/Libraries/Login.php new file mode 100755 index 0000000..0546e56 --- /dev/null +++ b/api/app/Libraries/Login.php @@ -0,0 +1,77 @@ +id === 1) return ['code' => 0]; + if (self::$info->admin_auth_group === -1) return ['code' => 0]; + $auth = AdminAuth::where('id', $auth)->where('status', 1)->where('del', 2)->first(); + if (!$auth) return ['code' => 100004, 'message' => '权限不足']; + if (self::$info->admin_auth_group === 0) { + if ($auth->check !== 1) return ['code' => 100004, 'message' => '权限不足']; + } else { + if ($auth->check === 1) return ['code' => 0]; + $admin_auth = AdminAuthGroup::select('id') + ->where('id', self::$info->admin_auth_group) + ->where('del', 2) + ->first(); + if (!$admin_auth) return ['code' => 100004, 'message' => '权限不足']; + if ($admin_auth->status != 1) return ['code' => 100004, 'message' => !!$admin_auth->message ? $admin_auth->message : '权限不足']; + $admin_auths = json_decode($admin_auth, true); + if (!in_array((string)$auth, $admin_auths)) return ['code' => 100004, 'message' => !!$admin_auth->message ? $admin_auth->message : '权限不足']; + } + return ['code' => 0]; + } + + public static function admin_check($auths = [], $or_ids = []): array + { + if (!request()->header('Authorization')) return ['code' => 100002]; + $token_arr = explode('Bearer ', request()->header('Authorization')); + if (!isset($token_arr[1])) return ['code' => 100002]; + $token = $token_arr[1]; + if (!$token) return ['code' => 100002]; + $admin_token = AdminToken::where('token', $token)->where('del', 2)->where('updated_at', '>', Lu::date(time() - (60 * 60 * 24 * 3)))->first(); + if (!$admin_token) return ['code' => 100002]; + $admin = Admin::where('id', $admin_token->admin)->where('del', 2)->where('status', 1)->first(); + if (!$admin) return ['code' => 100003]; + self::$info = $admin; + self::$token = $admin_token; + self::$type = 'admin'; + foreach ($auths as $item) { + $auth_check_res = self::check_admin_auth($item); + if ($auth_check_res['code'] != 0) return $auth_check_res; + } + $ret = 0; + $ret_code = ['code' => 0]; + foreach ($or_ids as $item) { + $auth_check_res = self::check_admin_auth($item); + if ($auth_check_res['code'] == 0) { + $ret++; + } else { + $ret_code = $auth_check_res; + } + } + if ($ret == 0 && $ret_code != 0) return $ret_code; + $admin_token->updated_at = Lu::date(); + $admin_token->save(); + return ['code' => 0]; + } + + public static function admin($auths = [], $or_ids = []) + { + $check_res = self::admin_check($auths, $or_ids); + if ($check_res['code'] != 0) Yo::error_echo($check_res['code'], [ + isset($check_res['message']) && !!$check_res['message'] ? $check_res['message'] : '' + ]); + } +} diff --git a/api/app/Libraries/Lu.php b/api/app/Libraries/Lu.php new file mode 100644 index 0000000..5ee1292 --- /dev/null +++ b/api/app/Libraries/Lu.php @@ -0,0 +1,185 @@ +c === 0) { + Schema::create($table_name, function (Blueprint $table) { + $table->id(); + $table->string('uuid', 50); + $table->string('token', 50); + $table->string('ip', 15); + $table->string('url', 300); + $table->string('method', 10); + $table->longtext('params'); + $table->tinyInteger('type')->comment('1-文字 2-文件'); + $table->longtext('input'); + $table->longtext('header'); + $table->string('code', 10)->nullable(); + $table->text('result')->nullable(); + $table->decimal('spend', 6, 3)->nullable(); + $table->timestamps(); + }); + } + self::$request = new \App\Models\RequestLog; + self::$request->setTable($table_name); + } + + public static function RequestLog() + { + if ($_SERVER['REQUEST_METHOD'] !== 'OPTIONS' && env('REQUEST_LOG') && !self::$request) { + self::CheckTableName(); + self::$spend = self::time(); + $token = ''; + if (!!request()->header('Authorization')) { + $token_arr = explode('Bearer ', request()->header('Authorization')); + $token = $token_arr[1] ?? ''; + } + $uuid = Str::orderedUuid(); + $date = date('Y/m/d'); + self::$path = "log/$date/$uuid.txt"; + self::$request->uuid = $uuid; + self::$request->token = $token; + self::$request->ip = self::ip(); + self::$request->url = explode('?', $_SERVER['REQUEST_URI'])[0]; + self::$request->method = $_SERVER['REQUEST_METHOD']; + $type = 1; + $input_data = !!request()->post() ? json_encode(request()->post(), JSON_UNESCAPED_UNICODE) : '{}'; + $str_len = mb_strlen($input_data); + $str_size = $str_len / 1024; + if ($str_size > 40) $type = 2; + $params_data = !!$_GET ? json_encode($_GET, JSON_UNESCAPED_UNICODE) : '{}'; + $header_data = !!request()->header() ? self::transformedHeaders() : '{}'; + $str_len = mb_strlen($header_data); + $str_size = $str_len / 1024; + if ($str_size > 40) $type = 2; + self::$request->input = $input_data; + self::$request->params = $params_data; + self::$request->header = $header_data; + self::$request->type = $type; + self::$request->save(); + } + } + + public static function transformedHeaders() + { + $header_data = request()->header(); + $header = []; + foreach ($header_data as $key => $header_datum) { + if (count($header_datum) == 1) { + $header[$key] = $header_datum[0]; + } else { + $header[$key] = $header_datum; + } + } + return json_encode($header, JSON_UNESCAPED_UNICODE); + } + + public static function ip() + { + if (getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { + $ip = getenv('HTTP_CLIENT_IP'); + } elseif (getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { + $ip = getenv('HTTP_X_FORWARDED_FOR'); + } elseif (getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { + $ip = getenv('REMOTE_ADDR'); + } elseif (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { + $ip = $_SERVER['REMOTE_ADDR']; + } + $res = preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches [0] : ''; + return $res; + } + + public static function date($time = false, $format = "Y-m-d H:i:s") + { + if (!$time) $time = time(); + return date($format, $time); + } + + public static function time() + { + return floor(microtime(true) * 1000); + } + + public static function exit($data = []) + { + $res = $data; + if ($_SERVER['REQUEST_METHOD'] !== 'OPTIONS' && env('REQUEST_LOG') && !!self::$request) { + $data_str = !!$data ? json_encode($data, JSON_UNESCAPED_UNICODE) : '{}'; + $str_len = strlen($data_str); + $str_size = $str_len / 1024; + $type = self::$request->type; + if ($str_size > 40) $type = 2; + if ($type == 2) { + $input_data = self::$request->input; + $header_data = self::$request->header; + $disk = Storage::disk('local'); + $disk->append(self::$path, "POST: +$input_data +------------------------------- +HEADER: +$header_data +------------------------------- +RESULT: +$data_str"); + self::$request->input = self::$path; + self::$request->header = self::$path; + self::$request->result = self::$path; + self::$request->type = 2; + } else { + self::$request->result = $data_str; + } + self::$request->code = (isset($data['code']) && !!$data['code']) ? $data['code'] : 0; + self::$request->spend = (self::time() - self::$spend) / 1000; + self::$request->save(); + } + return response()->json($res)->setEncodingOptions(JSON_UNESCAPED_UNICODE); + } + + public static function echo($message = '', $code = 200, $data = []) + { + $return = []; + $return['code'] = intval($code); + if ($message) $return['message'] = $message; + if ($data) $return['data'] = $data; + return self::exit($return); + } + + public static function post($url, $data, $type = 'json') + { + $curl = curl_init(); + curl_setopt($curl, CURLOPT_URL, $url); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_POST, true); + if ($type === 'data') { + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data); + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); + } + if ($type === 'json') { + $data_string = json_encode($data, JSON_UNESCAPED_UNICODE); + curl_setopt($curl, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json; charset=utf-8', + 'Content-Length: ' . strlen($data_string) + ]); + curl_setopt($curl, CURLOPT_POSTFIELDS, $data_string); + } + $r = curl_exec($curl); + curl_close($curl); + return $r; + } +} diff --git a/api/app/Libraries/Yo.php b/api/app/Libraries/Yo.php new file mode 100755 index 0000000..41da2b6 --- /dev/null +++ b/api/app/Libraries/Yo.php @@ -0,0 +1,39 @@ + $id]); + } + + public static function delete_echo($id = 0) + { + return Lu::echo(config('code.200.d'), 200, ['id' => $id]); + } + + public static function update_echo($id = 0) + { + return Lu::echo(config('code.200.u'), 200, ['id' => $id]); + } + + public static function error_echo($code, $replace = []) + { + $msg = config("code.{$code}"); + if (count($replace)) $msg = Str::replaceArray('?', $replace, $msg); + throw new HttpResponseException(Lu::echo($msg, $code)); + } + + public static function debug($data) + { + throw new HttpResponseException(Lu::echo('Debug', 100000, $data)); + } + + public static function echo($data = []) + { + return Lu::echo(config('code.200.r'), 200, $data); + } +} diff --git a/api/app/Models/Admin.php b/api/app/Models/Admin.php new file mode 100644 index 0000000..8626776 --- /dev/null +++ b/api/app/Models/Admin.php @@ -0,0 +1,10 @@ +format('Y-m-d H:i:s'); + } +} diff --git a/api/app/Models/RequestLog.php b/api/app/Models/RequestLog.php new file mode 100644 index 0000000..1b48c86 --- /dev/null +++ b/api/app/Models/RequestLog.php @@ -0,0 +1,10 @@ + + */ + protected $policies = [ + // + ]; + + /** + * Register any authentication / authorization services. + */ + public function boot(): void + { + // + } +} diff --git a/api/app/Providers/BroadcastServiceProvider.php b/api/app/Providers/BroadcastServiceProvider.php new file mode 100644 index 0000000..2be04f5 --- /dev/null +++ b/api/app/Providers/BroadcastServiceProvider.php @@ -0,0 +1,19 @@ +> + */ + protected $listen = [ + Registered::class => [ + SendEmailVerificationNotification::class, + ], + ]; + + /** + * Register any events for your application. + */ + public function boot(): void + { + // + } + + /** + * Determine if events and listeners should be automatically discovered. + */ + public function shouldDiscoverEvents(): bool + { + return false; + } +} diff --git a/api/app/Providers/RouteServiceProvider.php b/api/app/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..1cf5f15 --- /dev/null +++ b/api/app/Providers/RouteServiceProvider.php @@ -0,0 +1,40 @@ +by($request->user()?->id ?: $request->ip()); + }); + + $this->routes(function () { + Route::middleware('api') + ->prefix('api') + ->group(base_path('routes/api.php')); + + Route::middleware('web') + ->group(base_path('routes/web.php')); + }); + } +} diff --git a/api/artisan b/api/artisan new file mode 100755 index 0000000..67a3329 --- /dev/null +++ b/api/artisan @@ -0,0 +1,53 @@ +#!/usr/bin/env php +make(Illuminate\Contracts\Console\Kernel::class); + +$status = $kernel->handle( + $input = new Symfony\Component\Console\Input\ArgvInput, + new Symfony\Component\Console\Output\ConsoleOutput +); + +/* +|-------------------------------------------------------------------------- +| Shutdown The Application +|-------------------------------------------------------------------------- +| +| Once Artisan has finished running, we will fire off the shutdown events +| so that any final work may be done by the application before we shut +| down the process. This is the last thing to happen to the request. +| +*/ + +$kernel->terminate($input, $status); + +exit($status); diff --git a/api/bootstrap/app.php b/api/bootstrap/app.php new file mode 100644 index 0000000..037e17d --- /dev/null +++ b/api/bootstrap/app.php @@ -0,0 +1,55 @@ +singleton( + Illuminate\Contracts\Http\Kernel::class, + App\Http\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Console\Kernel::class, + App\Console\Kernel::class +); + +$app->singleton( + Illuminate\Contracts\Debug\ExceptionHandler::class, + App\Exceptions\Handler::class +); + +/* +|-------------------------------------------------------------------------- +| Return The Application +|-------------------------------------------------------------------------- +| +| This script returns the application instance. The instance is given to +| the calling script so we can separate the building of the instances +| from the actual running of the application and sending responses. +| +*/ + +return $app; diff --git a/api/bootstrap/cache/.gitignore b/api/bootstrap/cache/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/api/bootstrap/cache/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/api/composer.json b/api/composer.json new file mode 100644 index 0000000..af3759d --- /dev/null +++ b/api/composer.json @@ -0,0 +1,72 @@ +{ + "name": "laravel/laravel", + "type": "project", + "description": "The skeleton application for the Laravel framework.", + "keywords": [ + "laravel", + "framework" + ], + "license": "MIT", + "require": { + "php": "^8.1", + "guzzlehttp/guzzle": "^7.2", + "laravel/framework": "^10.10", + "laravel/sanctum": "^3.2", + "laravel/tinker": "^2.8" + }, + "require-dev": { + "fakerphp/faker": "^1.9.1", + "laravel/pint": "^1.0", + "laravel/sail": "^1.18", + "mockery/mockery": "^1.4.4", + "nunomaduro/collision": "^7.0", + "phpunit/phpunit": "^10.1", + "spatie/laravel-ignition": "^2.0" + }, + "autoload": { + "classmap": [ + "app/Libraries" + ], + "psr-4": { + "App\\": "app/", + "Database\\Factories\\": "database/factories/", + "Database\\Seeders\\": "database/seeders/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "scripts": { + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", + "@php artisan package:discover --ansi" + ], + "post-update-cmd": [ + "@php artisan vendor:publish --tag=laravel-assets --ansi --force" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate --ansi" + ] + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "config": { + "optimize-autoloader": true, + "preferred-install": "dist", + "sort-packages": true, + "allow-plugins": { + "pestphp/pest-plugin": true, + "php-http/discovery": true + } + }, + "minimum-stability": "stable", + "prefer-stable": true +} diff --git a/api/composer.lock b/api/composer.lock new file mode 100644 index 0000000..fe3a15c --- /dev/null +++ b/api/composer.lock @@ -0,0 +1,6006 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "aa322c53454393ed775cfe4807d54a50", + "packages": [ + { + "name": "brick/math", + "version": "0.11.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/brick/math/0.11.0/brick-math-0.11.0.zip", + "reference": "0ad82ce168c82ba30d1c01ec86116ab52f589478", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "5.0.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "time": "2023-01-15T23:15:59+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/dflydev/dot-access-data/v3.0.2/dflydev-dot-access-data-v3.0.2.zip", + "reference": "f41715465d65213d644d3141a6a93081be5d3549", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "time": "2022-10-27T11:44:00+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.8", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/inflector/2.0.8/doctrine-inflector-2.0.8.zip", + "reference": "f9301a5b2fb1216b2b08f02ba04dc45423db6bff", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^11.0", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^8.5 || ^9.5", + "vimeo/psalm": "^4.25 || ^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "time": "2023-06-16T13:40:37+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/doctrine/lexer/3.0.0/doctrine-lexer-3.0.0.zip", + "reference": "84a527db05647743d50373e0ec53a152f2cde568", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "time": "2022-12-15T16:57:16+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.3.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/dragonmantank/cron-expression/v3.3.2/dragonmantank-cron-expression-v3.3.2.zip", + "reference": "782ca5968ab8b954773518e9e49a6f892a34b2a8", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2022-09-10T18:51:20+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/egulias/email-validator/4.0.1/egulias-email-validator-4.0.1.zip", + "reference": "3a85486b709bc384dae8eb78fb2eec649bdb64ff", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2023-01-14T14:17:03+00:00" + }, + { + "name": "fruitcake/php-cors", + "version": "v1.2.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/fruitcake/php-cors/v1.2.0/fruitcake-php-cors-v1.2.0.zip", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "time": "2022-02-20T15:07:15+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.1.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/graham-campbell/result-type/v1.1.1/graham-campbell-result-type-v1.1.1.zip", + "reference": "672eff8cf1d6fe1ef09ca0f89c4b287d6a3eb831", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "phpoption/phpoption": "^1.9.1" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "time": "2023-02-25T20:23:15+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.7.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/guzzle/7.7.0/guzzlehttp-guzzle-7.7.0.zip", + "reference": "fb7566caccf22d74d1ab270de3551f72a58399f5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "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": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "time": "2023-05-21T14:04:53+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/promises/2.0.0/guzzlehttp-promises-2.0.0.zip", + "reference": "3a494dc7dc1d7d12e511890177ae2d0e6c107da6", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "time": "2023-05-21T13:50:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.5.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/psr7/2.5.0/guzzlehttp-psr7-2.5.0.zip", + "reference": "b635f279edd83fc275f822a1188157ffea568ff6", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.29 || ^9.5.23" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2023-04-17T16:11:26+00:00" + }, + { + "name": "guzzlehttp/uri-template", + "version": "v1.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/guzzlehttp/uri-template/v1.0.1/guzzlehttp-uri-template-v1.0.1.zip", + "reference": "b945d74a55a25a949158444f09ec0d3c120d69e2", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-php80": "^1.17" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.19 || ^9.5.8", + "uri-template/tests": "1.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\UriTemplate\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + } + ], + "description": "A polyfill class for uri_template of PHP", + "keywords": [ + "guzzlehttp", + "uri-template" + ], + "time": "2021-10-07T12:57:01+00:00" + }, + { + "name": "laravel/framework", + "version": "v10.16.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/laravel/framework/v10.16.1/laravel-framework-v10.16.1.zip", + "reference": "5c93d2795c393b462481179ce42dedfb30cc19b5", + "shasum": "" + }, + "require": { + "brick/math": "^0.9.3|^0.10.2|^0.11", + "composer-runtime-api": "^2.2", + "doctrine/inflector": "^2.0.5", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1|^4.0", + "ext-ctype": "*", + "ext-filter": "*", + "ext-hash": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "fruitcake/php-cors": "^1.2", + "guzzlehttp/uri-template": "^1.0", + "laravel/serializable-closure": "^1.3", + "league/commonmark": "^2.2.1", + "league/flysystem": "^3.8.0", + "monolog/monolog": "^3.0", + "nesbot/carbon": "^2.62.1", + "nunomaduro/termwind": "^1.13", + "php": "^8.1", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "ramsey/uuid": "^4.7", + "symfony/console": "^6.2", + "symfony/error-handler": "^6.2", + "symfony/finder": "^6.2", + "symfony/http-foundation": "^6.2", + "symfony/http-kernel": "^6.2", + "symfony/mailer": "^6.2", + "symfony/mime": "^6.2", + "symfony/process": "^6.2", + "symfony/routing": "^6.2", + "symfony/uid": "^6.2", + "symfony/var-dumper": "^6.2", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", + "vlucas/phpdotenv": "^5.4.1", + "voku/portable-ascii": "^2.0" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "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", + "illuminate/pipeline": "self.version", + "illuminate/process": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", + "doctrine/dbal": "^3.5.1", + "ext-gmp": "*", + "fakerphp/faker": "^1.21", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^8.4", + "pda/pheanstalk": "^4.0", + "phpstan/phpdoc-parser": "^1.15", + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^10.0.7", + "predis/predis": "^2.0.2", + "symfony/cache": "^6.2", + "symfony/http-client": "^6.2.4" + }, + "suggest": { + "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^3.5.1).", + "ext-apcu": "Required to use the APC cache driver.", + "ext-fileinfo": "Required to use the Filesystem class.", + "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 and console signal trapping.", + "ext-pdo": "Required to use all database features.", + "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).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", + "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 (^9.5.8|^10.0.7).", + "predis/predis": "Required to use the predis connector (^2.0.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 (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.2).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.2).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.2).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.2).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "10.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\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" + ] + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "time": "2023-07-26T03:30:46+00:00" + }, + { + "name": "laravel/sanctum", + "version": "v3.2.5", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/laravel/sanctum/v3.2.5/laravel-sanctum-v3.2.5.zip", + "reference": "8ebda85d59d3c414863a7f4d816ef8302faad876", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/console": "^9.21|^10.0", + "illuminate/contracts": "^9.21|^10.0", + "illuminate/database": "^9.21|^10.0", + "illuminate/support": "^9.21|^10.0", + "php": "^8.0.2" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "orchestra/testbench": "^7.0|^8.0", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sanctum\\SanctumServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sanctum\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Sanctum provides a featherweight authentication system for SPAs and simple APIs.", + "keywords": [ + "auth", + "laravel", + "sanctum" + ], + "time": "2023-05-01T19:39:51+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.3.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/laravel/serializable-closure/v1.3.1/laravel-serializable-closure-v1.3.1.zip", + "reference": "e5a3057a5591e1cfe8183034b0203921abe2c902", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "nesbot/carbon": "^2.61", + "pestphp/pest": "^1.21.3", + "phpstan/phpstan": "^1.8.2", + "symfony/var-dumper": "^5.4.11" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "time": "2023-07-14T13:56:28+00:00" + }, + { + "name": "laravel/tinker", + "version": "v2.8.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/laravel/tinker/v2.8.1/laravel-tinker-v2.8.1.zip", + "reference": "04a2d3bd0d650c0764f70bf49d1ee39393e4eb10", + "shasum": "" + }, + "require": { + "illuminate/console": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0", + "php": "^7.2.5|^8.0", + "psy/psysh": "^0.10.4|^0.11.1", + "symfony/var-dumper": "^4.3.4|^5.0|^6.0" + }, + "require-dev": { + "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|^9.0|^10.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Tinker\\TinkerServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Tinker\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Powerful REPL for the Laravel framework.", + "keywords": [ + "REPL", + "Tinker", + "laravel", + "psysh" + ], + "time": "2023-02-15T16:40:09+00:00" + }, + { + "name": "league/commonmark", + "version": "2.4.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/league/commonmark/2.4.0/league-commonmark-2.4.0.zip", + "reference": "d44a24690f16b8c1808bf13b1bd54ae4c63ea048", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.21", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "time": "2023-03-24T15:16:10+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/league/config/v1.2.0/league-config-v1.2.0.zip", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "time": "2022-12-11T20:36:23+00:00" + }, + { + "name": "league/flysystem", + "version": "3.15.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/league/flysystem/3.15.1/league-flysystem-3.15.1.zip", + "reference": "a141d430414fcb8bf797a18716b09f759a385bed", + "shasum": "" + }, + "require": { + "league/flysystem-local": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "conflict": { + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.1", + "aws/aws-sdk-php": "^3.220.0", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "time": "2023-05-04T09:04:26+00:00" + }, + { + "name": "league/flysystem-local", + "version": "3.15.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/league/flysystem-local/3.15.0/league-flysystem-local-3.15.0.zip", + "reference": "543f64c397fefdf9cfeac443ffb6beff602796b3", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/flysystem": "^3.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\Local\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Local filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "file", + "files", + "filesystem", + "local" + ], + "time": "2023-05-02T20:02:14+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.11.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/league/mime-type-detection/1.11.0/league-mime-type-detection-1.11.0.zip", + "reference": "ff6248ea87a9f116e78edd6002e39e5128a0d4dd", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "time": "2022-04-17T13:12:02+00:00" + }, + { + "name": "monolog/monolog", + "version": "3.4.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/monolog/monolog/3.4.0/monolog-monolog-3.4.0.zip", + "reference": "e2392369686d420ca32df3803de28b5d6f76867d", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1", + "predis/predis": "^1.1 || ^2", + "ruflin/elastica": "^7", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "time": "2023-06-21T08:46:11+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.68.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/nesbot/carbon/2.68.1/nesbot-carbon-2.68.1.zip", + "reference": "4f991ed2a403c85efbc4f23eb4030063fdbe01da", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.1.4", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "ondrejmirtes/better-reflection": "*", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.99 || ^1.7.14", + "phpunit/php-file-iterator": "^2.0.5 || ^3.0.6", + "phpunit/phpunit": "^7.5.20 || ^8.5.26 || ^9.5.20", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "time": "2023-06-20T18:29:04+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/nette/schema/v1.2.3/nette-schema-v1.2.3.zip", + "reference": "abbdbb70e0245d5f3bf77874cea1dfb0c930d06f", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.3" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^1.0", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "time": "2022-10-13T01:24:26+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/nette/utils/v4.0.0/nette-utils-v4.0.0.zip", + "reference": "cacdbf5a91a657ede665c541eda28941d4b09c1e", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.3" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.4", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "time": "2023-02-02T10:41:53+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.16.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/nikic/php-parser/v4.16.0/nikic-php-parser-v4.16.0.zip", + "reference": "19526a33fb561ef417e822e85f08a00db4059c17", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "time": "2023-06-25T14:52:30+00:00" + }, + { + "name": "nunomaduro/termwind", + "version": "v1.15.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/nunomaduro/termwind/v1.15.1/nunomaduro-termwind-v1.15.1.zip", + "reference": "8ab0b32c8caa4a2e09700ea32925441385e4a5dc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "time": "2023-02-08T01:06:31+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpoption/phpoption/1.9.1/phpoption-phpoption-1.9.1.zip", + "reference": "dd3a383e599f49777d8b628dadbb90cae435b87e", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.32 || ^9.6.3 || ^10.0.12" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "time": "2023-02-25T19:38:58+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/container/2.0.2/psr-container-2.0.2.zip", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/event-dispatcher/1.0.0/psr-event-dispatcher-1.0.0.zip", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-client/1.0.2/psr-http-client-1.0.2.zip", + "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "time": "2023-04-10T20:12:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-factory/1.0.2/psr-http-factory-1.0.2.zip", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/http-message/2.0/psr-http-message-2.0.zip", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/log/3.0.0/psr-log-3.0.0.zip", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "psr/simple-cache", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psr/simple-cache/3.0.0/psr-simple-cache-3.0.0.zip", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2021-10-29T13:26:27+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.11.19", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/psy/psysh/v0.11.19/psy-psysh-v0.11.19.zip", + "reference": "1724ceff278daeeac5a006744633bacbb2dc4706", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^4.0 || ^3.1", + "php": "^8.0 || ^7.0.8", + "symfony/console": "^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.", + "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "0.11.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "time": "2023-07-15T19:42:19+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/ralouphie/getallheaders/3.0.3/ralouphie-getallheaders-3.0.3.zip", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/ramsey/collection/2.0.0/ramsey-collection-2.0.0.zip", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.4", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/ramsey/uuid/4.7.4/ramsey-uuid-4.7.4.zip", + "reference": "60a4c63ab724854332900504274f6150ff26d286", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "time": "2023-04-15T23:01:58+00:00" + }, + { + "name": "symfony/console", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/console/v6.3.0/symfony-console-v6.3.0.zip", + "reference": "8788808b07cf0bdd6e4b7fdd23d8ddb1470c83b7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "time": "2023-05-29T12:49:39+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/css-selector/v6.3.0/symfony-css-selector-v6.3.0.zip", + "reference": "88453e64cd86c5b60e8d2fb2c6f953bbc353ffbf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "time": "2023-03-20T16:43:42+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/deprecation-contracts/v3.3.0/symfony-deprecation-contracts-v3.3.0.zip", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/error-handler/v6.3.0/symfony-error-handler-v6.3.0.zip", + "reference": "99d2d814a6351461af350ead4d963bd67451236f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "time": "2023-05-10T12:03:13+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/event-dispatcher/v6.3.0/symfony-event-dispatcher-v6.3.0.zip", + "reference": "3af8ac1a3f98f6dbc55e10ae59c9e44bfc38dfaa", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "time": "2023-04-21T14:41:17+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/event-dispatcher-contracts/v3.3.0/symfony-event-dispatcher-contracts-v3.3.0.zip", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/finder/v6.3.0/symfony-finder-v6.3.0.zip", + "reference": "d9b01ba073c44cef617c7907ce2419f8d00d75e2", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "time": "2023-04-02T01:25:41+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.3.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/http-foundation/v6.3.1/symfony-http-foundation-v6.3.1.zip", + "reference": "e0ad0d153e1c20069250986cd9e9dd1ccebb0d66", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.2" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3.0", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", + "symfony/mime": "^5.4|^6.0", + "symfony/rate-limiter": "^5.2|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "time": "2023-06-24T11:51:27+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v6.3.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/http-kernel/v6.3.1/symfony-http-kernel-v6.3.1.zip", + "reference": "161e16fd2e35fb4881a43bc8b383dfd5be4ac374", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^6.2.7", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.4", + "symfony/config": "<6.1", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<6.3", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", + "symfony/var-dumper": "<6.3", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/clock": "^6.2", + "symfony/config": "^6.1", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^6.3", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^5.4|^6.0", + "symfony/property-access": "^5.4.5|^6.0.5", + "symfony/routing": "^5.4|^6.0", + "symfony/serializer": "^6.3", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^5.4|^6.0", + "symfony/validator": "^6.3", + "symfony/var-exporter": "^6.2", + "twig/twig": "^2.13|^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "time": "2023-06-26T06:07:32+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/mailer/v6.3.0/symfony-mailer-v6.3.0.zip", + "reference": "7b03d9be1dea29bfec0a6c7b603f5072a4c97435", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^6.2", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/messenger": "^6.2", + "symfony/twig-bridge": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "time": "2023-05-29T12:49:39+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/mime/v6.3.0/symfony-mime-v6.3.0.zip", + "reference": "7b5d2121858cd6efbed778abce9cfdd7ab1f62ad", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", + "symfony/serializer": "^6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "time": "2023-04-28T15:57:00+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-ctype/v1.27.0/symfony-polyfill-ctype-v1.27.0.zip", + "reference": "5bbc823adecdae860bb64756d639ecfec17b050a", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-intl-grapheme/v1.27.0/symfony-polyfill-intl-grapheme-v1.27.0.zip", + "reference": "511a08c03c1960e08a883f4cffcacd219b758354", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-intl-idn/v1.27.0/symfony-polyfill-intl-idn-v1.27.0.zip", + "reference": "639084e360537a19f9ee352433b84ce831f3d2da", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-intl-normalizer/v1.27.0/symfony-polyfill-intl-normalizer-v1.27.0.zip", + "reference": "19bd1e4fcd5b91116f14d8533c57831ed00571b6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-mbstring/v1.27.0/symfony-polyfill-mbstring-v1.27.0.zip", + "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php72/v1.27.0/symfony-polyfill-php72-v1.27.0.zip", + "reference": "869329b1e9894268a8a61dabb69153029b7a8c97", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php80/v1.27.0/symfony-polyfill-php80-v1.27.0.zip", + "reference": "7a6ff3f1959bb01aefccb463a0f2cd3d3d2fd936", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-php83/v1.27.0/symfony-polyfill-php83-v1.27.0.zip", + "reference": "508c652ba3ccf69f8c97f251534f229791b52a57", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.27.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/polyfill-uuid/v1.27.0/symfony-polyfill-uuid-v1.27.0.zip", + "reference": "f3cf1a645c2734236ed1e2e671e273eeb3586166", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.27-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "time": "2022-11-03T14:55:06+00:00" + }, + { + "name": "symfony/process", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/process/v6.3.0/symfony-process-v6.3.0.zip", + "reference": "8741e3ed7fe2e91ec099e02446fb86667a0f1628", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "time": "2023-05-19T08:06:44+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.3.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/routing/v6.3.1/symfony-routing-v6.3.1.zip", + "reference": "d37ad1779c38b8eb71996d17dc13030dcb7f9cf5", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "time": "2023-06-05T15:30:22+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/service-contracts/v3.3.0/symfony-service-contracts-v3.3.0.zip", + "reference": "40da9cc13ec349d9e4966ce18b5fbcd724ab10a4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/string", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/string/v6.3.0/symfony-string-v6.3.0.zip", + "reference": "f2e190ee75ff0f5eced645ec0be5c66fac81f51f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/intl": "^6.2", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "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", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "time": "2023-03-21T21:06:29+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/translation/v6.3.0/symfony-translation-v6.3.0.zip", + "reference": "f72b2cba8f79dd9d536f534f76874b58ad37876f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.5|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/service-contracts": "<2.5", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^2.5|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/routing": "^5.4|^6.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "time": "2023-05-19T12:46:45+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/translation-contracts/v3.3.0/symfony-translation-contracts-v3.3.0.zip", + "reference": "02c24deb352fb0d79db5486c0c79905a85e37e86", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "time": "2023-05-30T17:17:10+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/uid/v6.3.0/symfony-uid-v6.3.0.zip", + "reference": "01b0f20b1351d997711c56f1638f7a8c3061e384", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "time": "2023-04-08T07:25:02+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.3.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/var-dumper/v6.3.1/symfony-var-dumper-v6.3.1.zip", + "reference": "c81268d6960ddb47af17391a27d222bd58cf0515", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "time": "2023-06-21T12:08:28+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.6", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/tijsverkoyen/css-to-inline-styles/2.2.6/tijsverkoyen-css-to-inline-styles-2.2.6.zip", + "reference": "c42125b83a4fa63b187fdf29f9c93cb7733da30c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "time": "2023-01-03T09:29:04+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.5.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/vlucas/phpdotenv/v5.5.0/vlucas-phpdotenv-v5.5.0.zip", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, + "branch-alias": { + "dev-master": "5.5-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "time": "2022-10-16T01:01:54+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "2.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/voku/portable-ascii/2.0.1/voku-portable-ascii-2.0.1.zip", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "time": "2022-03-08T17:03:00+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/webmozart/assert/1.11.0/webmozart-assert-1.11.0.zip", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "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": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "fakerphp/faker", + "version": "v1.23.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/fakerphp/faker/v1.23.0/fakerphp-faker-v1.23.0.zip", + "reference": "e3daa170d00fde61ea7719ef47bb09bb8f1d9b01", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "phpunit/phpunit": "^9.5.26", + "symfony/phpunit-bridge": "^5.4.16" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.21-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "time": "2023-06-12T08:44:38+00:00" + }, + { + "name": "filp/whoops", + "version": "2.15.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/filp/whoops/2.15.3/filp-whoops-2.15.3.zip", + "reference": "c83e88a30524f9360b11f585f71e6b17313b7187", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.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": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "time": "2023-07-13T12:00:00+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/hamcrest/hamcrest-php/v2.0.1/hamcrest-hamcrest-php-v2.0.1.zip", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/pint", + "version": "v1.10.5", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/laravel/pint/v1.10.5/laravel-pint-v1.10.5.zip", + "reference": "a458fb057bfa2f5a09888a8aa349610be807b0c3", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "php": "^8.1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.21.1", + "illuminate/view": "^10.5.1", + "laravel-zero/framework": "^10.1.1", + "mockery/mockery": "^1.5.1", + "nunomaduro/larastan": "^2.5.1", + "nunomaduro/termwind": "^1.15.1", + "pestphp/pest": "^2.4.0" + }, + "bin": [ + "builds/pint" + ], + "type": "project", + "autoload": { + "psr-4": { + "App\\": "app/", + "Database\\Seeders\\": "database/seeders/", + "Database\\Factories\\": "database/factories/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An opinionated code formatter for PHP.", + "homepage": "https://laravel.com", + "keywords": [ + "format", + "formatter", + "lint", + "linter", + "php" + ], + "time": "2023-07-14T10:26:01+00:00" + }, + { + "name": "laravel/sail", + "version": "v1.23.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/laravel/sail/v1.23.1/laravel-sail-v1.23.1.zip", + "reference": "62582606f80466aa81fba40b193b289106902853", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.0|^9.0|^10.0", + "illuminate/contracts": "^8.0|^9.0|^10.0", + "illuminate/support": "^8.0|^9.0|^10.0", + "php": "^8.0", + "symfony/yaml": "^6.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0|^7.0|^8.0", + "phpstan/phpstan": "^1.10" + }, + "bin": [ + "bin/sail" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Sail\\SailServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Sail\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Docker files for running a basic Laravel application.", + "keywords": [ + "docker", + "laravel" + ], + "time": "2023-06-28T18:31:28+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.6.4", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/mockery/mockery/1.6.4/mockery-mockery-1.6.4.zip", + "reference": "d1413755e26fe56a63455f7753221c86cbb88f66", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": ">=7.4,<8.3" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3", + "psalm/plugin-phpunit": "^0.18.4", + "symplify/easy-coding-standard": "^11.5.0", + "vimeo/psalm": "^5.13.1" + }, + "type": "library", + "autoload": { + "files": [ + "library/helpers.php", + "library/Mockery.php" + ], + "psr-4": { + "Mockery\\": "library/Mockery" + } + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "https://github.com/padraic", + "role": "Author" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "https://davedevelopment.co.uk", + "role": "Developer" + }, + { + "name": "Nathanael Esayeas", + "email": "nathanael.esayeas@protonmail.com", + "homepage": "https://github.com/ghostwriter", + "role": "Lead Developer" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2023-07-19T15:51:02+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/myclabs/deep-copy/1.11.1/myclabs-deep-copy-1.11.1.zip", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v7.7.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/nunomaduro/collision/v7.7.0/nunomaduro-collision-v7.7.0.zip", + "reference": "69a07197d055456d29911116fca3bc2c985f524b", + "shasum": "" + }, + "require": { + "filp/whoops": "^2.15.2", + "nunomaduro/termwind": "^1.15.1", + "php": "^8.1.0", + "symfony/console": "^6.3.0" + }, + "conflict": { + "phpunit/phpunit": "<10.1.2" + }, + "require-dev": { + "brianium/paratest": "^7.2.2", + "laravel/framework": "^10.14.1", + "laravel/pint": "^1.10.3", + "laravel/sail": "^1.23.0", + "laravel/sanctum": "^3.2.5", + "laravel/tinker": "^2.8.1", + "nunomaduro/larastan": "^2.6.3", + "orchestra/testbench-core": "^8.5.8", + "pestphp/pest": "^2.8.1", + "phpunit/phpunit": "^10.2.2", + "sebastian/environment": "^6.0.1", + "spatie/laravel-ignition": "^2.2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "./src/Adapters/Phpunit/Autoload.php" + ], + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "time": "2023-06-29T09:10:16+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phar-io/manifest/2.0.3/phar-io-manifest-2.0.3.zip", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "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/" + ] + }, + "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": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phar-io/version/3.2.1/phar-io-version-3.2.1.zip", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpunit/php-code-coverage/10.1.2/phpunit-php-code-coverage-10.1.2.zip", + "reference": "db1497ec8dd382e82c962f7abbe0320e4882ee4e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.15", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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" + ], + "time": "2023-05-22T09:04:27+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.0.2", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpunit/php-file-iterator/4.0.2/phpunit-php-file-iterator-4.0.2.zip", + "reference": "5647d65443818959172645e7ed999217360654b6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-05-07T09:13:23+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpunit/php-invoker/4.0.0/phpunit-php-invoker-4.0.0.zip", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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" + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpunit/php-text-template/3.0.0/phpunit-php-text-template-3.0.0.zip", + "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-02-03T06:56:46+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpunit/php-timer/6.0.0/phpunit-php-timer-6.0.0.zip", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.2.6", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/phpunit/phpunit/10.2.6/phpunit-phpunit-10.2.6.zip", + "reference": "1c17815c129f133f3019cc18e8d0c8622e6d9bcd", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.0", + "sebastian/global-state": "^6.0", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.2-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "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": "2023-07-17T12:08:28+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/cli-parser/2.0.0/sebastian-cli-parser-2.0.0.zip", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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", + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/code-unit/2.0.0/sebastian-code-unit-2.0.0.zip", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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", + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/code-unit-reverse-lookup/3.0.0/sebastian-code-unit-reverse-lookup-3.0.0.zip", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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/", + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/comparator/5.0.0/sebastian-comparator-5.0.0.zip", + "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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" + ], + "time": "2023-02-03T07:07:16+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/complexity/3.0.0/sebastian-complexity-3.0.0.zip", + "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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", + "time": "2023-02-03T06:59:47+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.0.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/diff/5.0.3/sebastian-diff-5.0.3.zip", + "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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" + ], + "time": "2023-05-01T07:48:21+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/environment/6.0.1/sebastian-environment-6.0.1.zip", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/exporter/5.0.0/sebastian-exporter-5.0.0.zip", + "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "time": "2023-02-03T07:06:49+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/global-state/6.0.1/sebastian-global-state-6.0.1.zip", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-07-19T07:19:23+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/lines-of-code/2.0.0/sebastian-lines-of-code-2.0.0.zip", + "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.10", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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", + "time": "2023-02-03T07:08:02+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/object-enumerator/5.0.0/sebastian-object-enumerator-5.0.0.zip", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/object-reflector/3.0.0/sebastian-object-reflector-3.0.0.zip", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/recursion-context/5.0.0/sebastian-recursion-context-5.0.0.zip", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "https://github.com/sebastianbergmann/recursion-context", + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/type/4.0.0/sebastian-type-4.0.0.zip", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/sebastian/version/4.0.1/sebastian-version-4.0.1.zip", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "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": "2023-02-07T11:34:05+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.5.3", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/spatie/backtrace/1.5.3/spatie-backtrace-1.5.3.zip", + "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "time": "2023-06-28T12:59:17+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.4.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/spatie/flare-client-php/1.4.1/spatie-flare-client-php-1.4.1.zip", + "reference": "943894c6a6b00501365ac0b91ae0dce56f2226fa", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0|^10.0", + "nesbot/carbon": "^2.62.1", + "php": "^8.0", + "spatie/backtrace": "^1.5.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.3.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "time": "2023-07-06T09:29:49+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.9.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/spatie/ignition/1.9.0/spatie-ignition-1.9.0.zip", + "reference": "de24ff1e01814d5043bd6eb4ab36a5a852a04973", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "spatie/backtrace": "^1.5.3", + "spatie/flare-client-php": "^1.4.0", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "illuminate/cache": "^9.52", + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "psr/simple-cache-implementation": "*", + "symfony/cache": "^6.0", + "symfony/process": "^5.4|^6.0", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "simple-cache-implementation": "To cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "time": "2023-06-28T13:24:59+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "2.2.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/spatie/laravel-ignition/2.2.0/spatie-laravel-ignition-2.2.0.zip", + "reference": "dd15fbe82ef5392798941efae93c49395a87d943", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^10.0", + "php": "^8.1", + "spatie/flare-client-php": "^1.3.5", + "spatie/ignition": "^1.9", + "symfony/console": "^6.2.3", + "symfony/var-dumper": "^6.2.3" + }, + "require-dev": { + "livewire/livewire": "^2.11", + "mockery/mockery": "^1.5.1", + "openai-php/client": "^0.3.4", + "orchestra/testbench": "^8.0", + "pestphp/pest": "^1.22.3", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-deprecation-rules": "^1.1.1", + "phpstan/phpstan-phpunit": "^1.3.3", + "vlucas/phpdotenv": "^5.5" + }, + "suggest": { + "openai-php/client": "Require get solutions from OpenAI", + "psr/simple-cache-implementation": "Needed to cache solutions from OpenAI" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "time": "2023-06-28T13:51:52+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.3.0", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/symfony/yaml/v6.3.0/symfony-yaml-v6.3.0.zip", + "reference": "a9a8337aa641ef2aa39c3e028f9107ec391e5927", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "time": "2023-04-28T13:28:14+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "dist": { + "type": "zip", + "url": "https://mirrors.cloud.tencent.com/repository/composer/theseer/tokenizer/1.2.1/theseer-tokenizer-1.2.1.zip", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "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", + "time": "2021-07-28T10:34:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/api/config/app.php b/api/config/app.php new file mode 100644 index 0000000..770f93f --- /dev/null +++ b/api/config/app.php @@ -0,0 +1,188 @@ + env('APP_NAME', 'Laravel'), + + /* + |-------------------------------------------------------------------------- + | Application Environment + |-------------------------------------------------------------------------- + | + | This value determines the "environment" your application is currently + | running in. This may determine how you prefer to configure various + | services the application utilizes. Set this in your ".env" file. + | + */ + + 'env' => env('APP_ENV', 'production'), + + /* + |-------------------------------------------------------------------------- + | Application Debug Mode + |-------------------------------------------------------------------------- + | + | When your application is in debug mode, detailed error messages with + | stack traces will be shown on every error that occurs within your + | application. If disabled, a simple generic error page is shown. + | + */ + + 'debug' => (bool)env('APP_DEBUG', false), + + /* + |-------------------------------------------------------------------------- + | Application URL + |-------------------------------------------------------------------------- + | + | This URL is used by the console to properly generate URLs when using + | the Artisan command line tool. You should set this to the root of + | your application so that it is used when running Artisan tasks. + | + */ + + 'url' => env('APP_URL', 'http://localhost'), + + 'asset_url' => env('ASSET_URL'), + + /* + |-------------------------------------------------------------------------- + | Application Timezone + |-------------------------------------------------------------------------- + | + | Here you may specify the default timezone for your application, which + | will be used by the PHP date and date-time functions. We have gone + | ahead and set this to a sensible default for you out of the box. + | + */ + + 'timezone' => env('TIMEZONE'), + + /* + |-------------------------------------------------------------------------- + | Application Locale Configuration + |-------------------------------------------------------------------------- + | + | The application locale determines the default locale that will be used + | by the translation service provider. You are free to set this value + | to any of the locales which will be supported by the application. + | + */ + + 'locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Application Fallback Locale + |-------------------------------------------------------------------------- + | + | The fallback locale determines the locale to use when the current one + | is not available. You may change the value to correspond to any of + | the language folders that are provided through your application. + | + */ + + 'fallback_locale' => 'en', + + /* + |-------------------------------------------------------------------------- + | Faker Locale + |-------------------------------------------------------------------------- + | + | This locale will be used by the Faker PHP library when generating fake + | data for your database seeds. For example, this will be used to get + | localized telephone numbers, street address information and more. + | + */ + + 'faker_locale' => 'en_US', + + /* + |-------------------------------------------------------------------------- + | Encryption Key + |-------------------------------------------------------------------------- + | + | This key is used by the Illuminate encrypter service and should be set + | to a random, 32 character string, otherwise these encrypted strings + | will not be safe. Please do this before deploying an application! + | + */ + + 'key' => env('APP_KEY'), + + 'cipher' => 'AES-256-CBC', + + /* + |-------------------------------------------------------------------------- + | Maintenance Mode Driver + |-------------------------------------------------------------------------- + | + | These configuration options determine the driver used to determine and + | manage Laravel's "maintenance mode" status. The "cache" driver will + | allow maintenance mode to be controlled across multiple machines. + | + | Supported drivers: "file", "cache" + | + */ + + 'maintenance' => [ + 'driver' => 'file', + // 'store' => 'redis', + ], + + /* + |-------------------------------------------------------------------------- + | Autoloaded Service Providers + |-------------------------------------------------------------------------- + | + | The service providers listed here will be automatically loaded on the + | request to your application. Feel free to add your own services to + | this array to grant expanded functionality to your applications. + | + */ + + 'providers' => ServiceProvider::defaultProviders()->merge([ + /* + * Package Service Providers... + */ + + /* + * Application Service Providers... + */ + App\Providers\AppServiceProvider::class, + App\Providers\AuthServiceProvider::class, + // App\Providers\BroadcastServiceProvider::class, + App\Providers\EventServiceProvider::class, + App\Providers\RouteServiceProvider::class, + ])->toArray(), + + /* + |-------------------------------------------------------------------------- + | Class Aliases + |-------------------------------------------------------------------------- + | + | This array of class aliases will be registered when this application + | is started. However, feel free to register as many as you wish as + | the aliases are "lazy" loaded so they don't hinder performance. + | + */ + + 'aliases' => Facade::defaultAliases()->merge([ + // 'Example' => App\Facades\Example::class, + ])->toArray(), + +]; diff --git a/api/config/auth.php b/api/config/auth.php new file mode 100644 index 0000000..9548c15 --- /dev/null +++ b/api/config/auth.php @@ -0,0 +1,115 @@ + [ + 'guard' => 'web', + 'passwords' => 'users', + ], + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session" + | + */ + + 'guards' => [ + 'web' => [ + 'driver' => 'session', + 'provider' => 'users', + ], + ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + + 'providers' => [ + 'users' => [ + 'driver' => 'eloquent', + 'model' => App\Models\User::class, + ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], + ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expiry time is the number of minutes that each reset token will be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + | The throttle setting is the number of seconds a user must wait before + | generating more password reset tokens. This prevents the user from + | quickly generating a very large amount of password reset tokens. + | + */ + + 'passwords' => [ + 'users' => [ + 'provider' => 'users', + 'table' => 'password_reset_tokens', + 'expire' => 60, + 'throttle' => 60, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Password Confirmation Timeout + |-------------------------------------------------------------------------- + | + | Here you may define the amount of seconds before a password confirmation + | times out and the user is prompted to re-enter their password via the + | confirmation screen. By default, the timeout lasts for three hours. + | + */ + + 'password_timeout' => 10800, + +]; diff --git a/api/config/broadcasting.php b/api/config/broadcasting.php new file mode 100644 index 0000000..2410485 --- /dev/null +++ b/api/config/broadcasting.php @@ -0,0 +1,71 @@ + env('BROADCAST_DRIVER', 'null'), + + /* + |-------------------------------------------------------------------------- + | Broadcast Connections + |-------------------------------------------------------------------------- + | + | Here you may define all of the broadcast connections that will be used + | to broadcast events to other systems or over websockets. Samples of + | each available type of connection are provided inside this array. + | + */ + + 'connections' => [ + + 'pusher' => [ + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), + 'options' => [ + 'cluster' => env('PUSHER_APP_CLUSTER'), + 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com', + 'port' => env('PUSHER_PORT', 443), + 'scheme' => env('PUSHER_SCHEME', 'https'), + 'encrypted' => true, + 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https', + ], + 'client_options' => [ + // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html + ], + ], + + 'ably' => [ + 'driver' => 'ably', + 'key' => env('ABLY_KEY'), + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + ], + + 'log' => [ + 'driver' => 'log', + ], + + 'null' => [ + 'driver' => 'null', + ], + + ], + +]; diff --git a/api/config/cache.php b/api/config/cache.php new file mode 100644 index 0000000..d4171e2 --- /dev/null +++ b/api/config/cache.php @@ -0,0 +1,111 @@ + env('CACHE_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Cache Stores + |-------------------------------------------------------------------------- + | + | Here you may define all of the cache "stores" for your application as + | well as their drivers. You may even define multiple stores for the + | same cache driver to group types of items stored in your caches. + | + | Supported drivers: "apc", "array", "database", "file", + | "memcached", "redis", "dynamodb", "octane", "null" + | + */ + + 'stores' => [ + + 'apc' => [ + 'driver' => 'apc', + ], + + 'array' => [ + 'driver' => 'array', + 'serialize' => false, + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'cache', + 'connection' => null, + 'lock_connection' => null, + ], + + 'file' => [ + 'driver' => 'file', + 'path' => storage_path('framework/cache/data'), + 'lock_path' => storage_path('framework/cache/data'), + ], + + 'memcached' => [ + 'driver' => 'memcached', + 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), + 'sasl' => [ + env('MEMCACHED_USERNAME'), + env('MEMCACHED_PASSWORD'), + ], + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, + ], + 'servers' => [ + [ + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), + 'weight' => 100, + ], + ], + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'cache', + 'lock_connection' => 'default', + ], + + 'dynamodb' => [ + 'driver' => 'dynamodb', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), + 'endpoint' => env('DYNAMODB_ENDPOINT'), + ], + + 'octane' => [ + 'driver' => 'octane', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Cache Key Prefix + |-------------------------------------------------------------------------- + | + | When utilizing the APC, database, memcached, Redis, or DynamoDB cache + | stores there might be other applications using the same cache. For + | that reason, you may prefix every cache key to avoid collisions. + | + */ + + 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'), + +]; diff --git a/api/config/code.php b/api/config/code.php new file mode 100644 index 0000000..8ed77ae --- /dev/null +++ b/api/config/code.php @@ -0,0 +1,42 @@ + [ + 'c' => '增加成功', + 'd' => '删除成功', + 'u' => '修改成功', + 'r' => '获取成功', + ], + 100000 => '?', + 100001 => '?不存在或不可用', + 100002 => '请登录', + 100003 => '账号不可用或不存在', + 100004 => '?', + 100005 => '验证码已过期', + 100006 => '验证码错误', + 100007 => '账号不存在或密码错误', + 100008 => '旧密码错误', + 100009 => '请输入新密码', + 100010 => '密码长度应在6-20位字符之间', + 100011 => '新旧密码相同', + 100012 => '请输入昵称', + 100013 => '昵称长度应在1-50位字符之间', + 100014 => '头像上传链接异常', + 100015 => '请上传规定以内的图片格式', + 100016 => '上传图片失败,[?]错误', + 100017 => '请输入权限名称', + 100018 => '权限名称长度应在1-20位字符之间', + 100019 => '备注长度应在100位字符以内', + 100020 => '请输入账号', + 100021 => '账号长度应在1-50位字符之间', + 100022 => '请输入密码', + 100023 => '账号已存在', + 100024 => '请求日志不支持跨月查询', + 100025 => '请输入权限路径', + 100026 => '路径名称长度应在1-200位字符之间', + 100027 => '图标长度应在100位字符以内', + 100028 => '提示消息长度应在50位字符以内', + 100029 => '路由组不能添加到子级', + 100030 => '请先删除该组下的子级', + 100031 => '请输入参数名称', + 100032 => '参数名称长度应在1-50位字符之间', +]; diff --git a/api/config/cors.php b/api/config/cors.php new file mode 100644 index 0000000..8a39e6d --- /dev/null +++ b/api/config/cors.php @@ -0,0 +1,34 @@ + ['api/*', 'sanctum/csrf-cookie'], + + 'allowed_methods' => ['*'], + + 'allowed_origins' => ['*'], + + 'allowed_origins_patterns' => [], + + 'allowed_headers' => ['*'], + + 'exposed_headers' => [], + + 'max_age' => 0, + + 'supports_credentials' => false, + +]; diff --git a/api/config/database.php b/api/config/database.php new file mode 100644 index 0000000..137ad18 --- /dev/null +++ b/api/config/database.php @@ -0,0 +1,151 @@ + env('DB_CONNECTION', 'mysql'), + + /* + |-------------------------------------------------------------------------- + | Database Connections + |-------------------------------------------------------------------------- + | + | Here are each of the database connections setup for your application. + | Of course, examples of configuring each database platform that is + | supported by Laravel is shown below to make development simple. + | + | + | All database work in Laravel is done through the PHP PDO facilities + | so make sure you have the driver for your particular database of + | choice installed on your machine before you begin development. + | + */ + + 'connections' => [ + + 'sqlite' => [ + 'driver' => 'sqlite', + 'url' => env('DATABASE_URL'), + 'database' => env('DB_DATABASE', database_path('database.sqlite')), + 'prefix' => '', + 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), + ], + + 'mysql' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], + + 'pgsql' => [ + 'driver' => 'pgsql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '5432'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + 'search_path' => 'public', + 'sslmode' => 'prefer', + ], + + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + 'prefix_indexes' => true, + // 'encrypt' => env('DB_ENCRYPT', 'yes'), + // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'), + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Migration Repository Table + |-------------------------------------------------------------------------- + | + | This table keeps track of all the migrations that have already run for + | your application. Using this information, we can determine which of + | the migrations on disk haven't actually been run in the database. + | + */ + + 'migrations' => 'migrations', + + /* + |-------------------------------------------------------------------------- + | Redis Databases + |-------------------------------------------------------------------------- + | + | Redis is an open source, fast, and advanced key-value store that also + | provides a richer body of commands than a typical key-value system + | such as APC or Memcached. Laravel makes it easy to dig right in. + | + */ + + 'redis' => [ + + 'client' => env('REDIS_CLIENT', 'phpredis'), + + 'options' => [ + 'cluster' => env('REDIS_CLUSTER', 'redis'), + 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), + ], + + 'default' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_DB', '0'), + ], + + 'cache' => [ + 'url' => env('REDIS_URL'), + 'host' => env('REDIS_HOST', '127.0.0.1'), + 'username' => env('REDIS_USERNAME'), + 'password' => env('REDIS_PASSWORD'), + 'port' => env('REDIS_PORT', '6379'), + 'database' => env('REDIS_CACHE_DB', '1'), + ], + + ], + +]; diff --git a/api/config/filesystems.php b/api/config/filesystems.php new file mode 100644 index 0000000..e9d9dbd --- /dev/null +++ b/api/config/filesystems.php @@ -0,0 +1,76 @@ + env('FILESYSTEM_DISK', 'local'), + + /* + |-------------------------------------------------------------------------- + | Filesystem Disks + |-------------------------------------------------------------------------- + | + | Here you may configure as many filesystem "disks" as you wish, and you + | may even configure multiple disks of the same driver. Defaults have + | been set up for each driver as an example of the required values. + | + | Supported Drivers: "local", "ftp", "sftp", "s3" + | + */ + + 'disks' => [ + + 'local' => [ + 'driver' => 'local', + 'root' => storage_path('app'), + 'throw' => false, + ], + + 'public' => [ + 'driver' => 'local', + 'root' => storage_path('app/public'), + 'url' => env('APP_URL').'/storage', + 'visibility' => 'public', + 'throw' => false, + ], + + 's3' => [ + 'driver' => 's3', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION'), + 'bucket' => env('AWS_BUCKET'), + 'url' => env('AWS_URL'), + 'endpoint' => env('AWS_ENDPOINT'), + 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Symbolic Links + |-------------------------------------------------------------------------- + | + | Here you may configure the symbolic links that will be created when the + | `storage:link` Artisan command is executed. The array keys should be + | the locations of the links and the values should be their targets. + | + */ + + 'links' => [ + public_path('storage') => storage_path('app/public'), + ], + +]; diff --git a/api/config/hashing.php b/api/config/hashing.php new file mode 100644 index 0000000..bcd3be4 --- /dev/null +++ b/api/config/hashing.php @@ -0,0 +1,52 @@ + 'bcrypt', + + /* + |-------------------------------------------------------------------------- + | Bcrypt Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Bcrypt algorithm. This will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'bcrypt' => [ + 'rounds' => env('BCRYPT_ROUNDS', 10), + ], + + /* + |-------------------------------------------------------------------------- + | Argon Options + |-------------------------------------------------------------------------- + | + | Here you may specify the configuration options that should be used when + | passwords are hashed using the Argon algorithm. These will allow you + | to control the amount of time it takes to hash the given password. + | + */ + + 'argon' => [ + 'memory' => 65536, + 'threads' => 1, + 'time' => 4, + ], + +]; diff --git a/api/config/logging.php b/api/config/logging.php new file mode 100644 index 0000000..c44d276 --- /dev/null +++ b/api/config/logging.php @@ -0,0 +1,131 @@ + env('LOG_CHANNEL', 'stack'), + + /* + |-------------------------------------------------------------------------- + | Deprecations Log Channel + |-------------------------------------------------------------------------- + | + | This option controls the log channel that should be used to log warnings + | regarding deprecated PHP and library features. This allows you to get + | your application ready for upcoming major versions of dependencies. + | + */ + + 'deprecations' => [ + 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'), + 'trace' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "monolog", + | "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + 'ignore_exceptions' => false, + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/laravel.log'), + 'level' => env('LOG_LEVEL', 'debug'), + 'days' => 14, + 'replace_placeholders' => true, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => env('LOG_LEVEL', 'critical'), + 'replace_placeholders' => true, + ], + + 'papertrail' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class), + 'handler_with' => [ + 'host' => env('PAPERTRAIL_URL'), + 'port' => env('PAPERTRAIL_PORT'), + 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'), + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'stderr' => [ + 'driver' => 'monolog', + 'level' => env('LOG_LEVEL', 'debug'), + 'handler' => StreamHandler::class, + 'formatter' => env('LOG_STDERR_FORMATTER'), + 'with' => [ + 'stream' => 'php://stderr', + ], + 'processors' => [PsrLogMessageProcessor::class], + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('LOG_LEVEL', 'debug'), + 'facility' => LOG_USER, + 'replace_placeholders' => true, + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('LOG_LEVEL', 'debug'), + 'replace_placeholders' => true, + ], + + 'null' => [ + 'driver' => 'monolog', + 'handler' => NullHandler::class, + ], + + 'emergency' => [ + 'path' => storage_path('logs/laravel.log'), + ], + ], + +]; diff --git a/api/config/mail.php b/api/config/mail.php new file mode 100644 index 0000000..bd7a177 --- /dev/null +++ b/api/config/mail.php @@ -0,0 +1,125 @@ + env('MAIL_MAILER', 'smtp'), + + /* + |-------------------------------------------------------------------------- + | Mailer Configurations + |-------------------------------------------------------------------------- + | + | Here you may configure all of the mailers used by your application plus + | their respective settings. Several examples have been configured for + | you and you are free to add your own as your application requires. + | + | Laravel supports a variety of mail "transport" drivers to be used while + | sending an e-mail. You will specify which one you are using for your + | mailers below. You are free to add additional mailers as required. + | + | Supported: "smtp", "sendmail", "mailgun", "ses", "ses-v2", + | "postmark", "log", "array", "failover" + | + */ + + 'mailers' => [ + 'smtp' => [ + 'transport' => 'smtp', + 'url' => env('MAIL_URL'), + 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), + 'port' => env('MAIL_PORT', 587), + 'encryption' => env('MAIL_ENCRYPTION', 'ssl'), + 'username' => env('MAIL_USERNAME'), + 'password' => env('MAIL_PASSWORD'), + 'timeout' => null, + 'local_domain' => env('MAIL_EHLO_DOMAIN'), + ], + + 'ses' => [ + 'transport' => 'ses', + ], + + 'mailgun' => [ + 'transport' => 'mailgun', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'postmark' => [ + 'transport' => 'postmark', + // 'client' => [ + // 'timeout' => 5, + // ], + ], + + 'sendmail' => [ + 'transport' => 'sendmail', + 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'), + ], + + 'log' => [ + 'transport' => 'log', + 'channel' => env('MAIL_LOG_CHANNEL'), + ], + + 'array' => [ + 'transport' => 'array', + ], + + 'failover' => [ + 'transport' => 'failover', + 'mailers' => [ + 'smtp', + 'log', + ], + ], + ], + + /* + |-------------------------------------------------------------------------- + | Global "From" Address + |-------------------------------------------------------------------------- + | + | You may wish for all e-mails sent by your application to be sent from + | the same address. Here, you may specify a name and address that is + | used globally for all e-mails that are sent by your application. + | + */ + + 'from' => [ + 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), + 'name' => env('MAIL_FROM_NAME', 'Example'), + ], + + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + +]; diff --git a/api/config/queue.php b/api/config/queue.php new file mode 100644 index 0000000..01c6b05 --- /dev/null +++ b/api/config/queue.php @@ -0,0 +1,109 @@ + env('QUEUE_CONNECTION', 'sync'), + + /* + |-------------------------------------------------------------------------- + | Queue Connections + |-------------------------------------------------------------------------- + | + | Here you may configure the connection information for each server that + | is used by your application. A default configuration has been added + | for each back-end shipped with Laravel. You are free to add more. + | + | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" + | + */ + + 'connections' => [ + + 'sync' => [ + 'driver' => 'sync', + ], + + 'database' => [ + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', + 'retry_after' => 90, + 'after_commit' => false, + ], + + 'beanstalkd' => [ + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', + 'retry_after' => 90, + 'block_for' => 0, + 'after_commit' => false, + ], + + 'sqs' => [ + 'driver' => 'sqs', + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), + 'queue' => env('SQS_QUEUE', 'default'), + 'suffix' => env('SQS_SUFFIX'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + 'after_commit' => false, + ], + + 'redis' => [ + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => env('REDIS_QUEUE', 'default'), + 'retry_after' => 90, + 'block_for' => null, + 'after_commit' => false, + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Job Batching + |-------------------------------------------------------------------------- + | + | The following options configure the database and table that store job + | batching information. These options can be updated to any database + | connection and table which has been defined by your application. + | + */ + + 'batching' => [ + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'job_batches', + ], + + /* + |-------------------------------------------------------------------------- + | Failed Queue Jobs + |-------------------------------------------------------------------------- + | + | These options configure the behavior of failed queue job logging so you + | can control which database and table are used to store the jobs that + | have failed. You may change them to any database / table you wish. + | + */ + + 'failed' => [ + 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'), + 'database' => env('DB_CONNECTION', 'mysql'), + 'table' => 'failed_jobs', + ], + +]; diff --git a/api/config/sanctum.php b/api/config/sanctum.php new file mode 100644 index 0000000..529cfdc --- /dev/null +++ b/api/config/sanctum.php @@ -0,0 +1,67 @@ + explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( + '%s%s', + 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', + Sanctum::currentApplicationUrlWithPort() + ))), + + /* + |-------------------------------------------------------------------------- + | Sanctum Guards + |-------------------------------------------------------------------------- + | + | This array contains the authentication guards that will be checked when + | Sanctum is trying to authenticate a request. If none of these guards + | are able to authenticate the request, Sanctum will use the bearer + | token that's present on an incoming request for authentication. + | + */ + + 'guard' => ['web'], + + /* + |-------------------------------------------------------------------------- + | Expiration Minutes + |-------------------------------------------------------------------------- + | + | This value controls the number of minutes until an issued token will be + | considered expired. If this value is null, personal access tokens do + | not expire. This won't tweak the lifetime of first-party sessions. + | + */ + + 'expiration' => null, + + /* + |-------------------------------------------------------------------------- + | Sanctum Middleware + |-------------------------------------------------------------------------- + | + | When authenticating your first-party SPA with Sanctum you may need to + | customize some of the middleware Sanctum uses while processing the + | request. You may change the middleware listed below as required. + | + */ + + 'middleware' => [ + 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class, + 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class, + ], + +]; diff --git a/api/config/services.php b/api/config/services.php new file mode 100644 index 0000000..0ace530 --- /dev/null +++ b/api/config/services.php @@ -0,0 +1,34 @@ + [ + 'domain' => env('MAILGUN_DOMAIN'), + 'secret' => env('MAILGUN_SECRET'), + 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), + 'scheme' => 'https', + ], + + 'postmark' => [ + 'token' => env('POSTMARK_TOKEN'), + ], + + 'ses' => [ + 'key' => env('AWS_ACCESS_KEY_ID'), + 'secret' => env('AWS_SECRET_ACCESS_KEY'), + 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), + ], + +]; diff --git a/api/config/session.php b/api/config/session.php new file mode 100644 index 0000000..8fed97c --- /dev/null +++ b/api/config/session.php @@ -0,0 +1,201 @@ + env('SESSION_DRIVER', 'file'), + + /* + |-------------------------------------------------------------------------- + | Session Lifetime + |-------------------------------------------------------------------------- + | + | Here you may specify the number of minutes that you wish the session + | to be allowed to remain idle before it expires. If you want them + | to immediately expire on the browser closing, set that option. + | + */ + + 'lifetime' => env('SESSION_LIFETIME', 120), + + 'expire_on_close' => false, + + /* + |-------------------------------------------------------------------------- + | Session Encryption + |-------------------------------------------------------------------------- + | + | This option allows you to easily specify that all of your session data + | should be encrypted before it is stored. All encryption will be run + | automatically by Laravel and you can use the Session like normal. + | + */ + + 'encrypt' => false, + + /* + |-------------------------------------------------------------------------- + | Session File Location + |-------------------------------------------------------------------------- + | + | When using the native session driver, we need a location where session + | files may be stored. A default has been set for you but a different + | location may be specified. This is only needed for file sessions. + | + */ + + 'files' => storage_path('framework/sessions'), + + /* + |-------------------------------------------------------------------------- + | Session Database Connection + |-------------------------------------------------------------------------- + | + | When using the "database" or "redis" session drivers, you may specify a + | connection that should be used to manage these sessions. This should + | correspond to a connection in your database configuration options. + | + */ + + 'connection' => env('SESSION_CONNECTION'), + + /* + |-------------------------------------------------------------------------- + | Session Database Table + |-------------------------------------------------------------------------- + | + | When using the "database" session driver, you may specify the table we + | should use to manage the sessions. Of course, a sensible default is + | provided for you; however, you are free to change this as needed. + | + */ + + 'table' => 'sessions', + + /* + |-------------------------------------------------------------------------- + | Session Cache Store + |-------------------------------------------------------------------------- + | + | While using one of the framework's cache driven session backends you may + | list a cache store that should be used for these sessions. This value + | must match with one of the application's configured cache "stores". + | + | Affects: "apc", "dynamodb", "memcached", "redis" + | + */ + + 'store' => env('SESSION_STORE'), + + /* + |-------------------------------------------------------------------------- + | Session Sweeping Lottery + |-------------------------------------------------------------------------- + | + | Some session drivers must manually sweep their storage location to get + | rid of old sessions from storage. Here are the chances that it will + | happen on a given request. By default, the odds are 2 out of 100. + | + */ + + 'lottery' => [2, 100], + + /* + |-------------------------------------------------------------------------- + | Session Cookie Name + |-------------------------------------------------------------------------- + | + | Here you may change the name of the cookie used to identify a session + | instance by ID. The name specified here will get used every time a + | new session cookie is created by the framework for every driver. + | + */ + + 'cookie' => env( + 'SESSION_COOKIE', + Str::slug(env('APP_NAME', 'laravel'), '_').'_session' + ), + + /* + |-------------------------------------------------------------------------- + | Session Cookie Path + |-------------------------------------------------------------------------- + | + | The session cookie path determines the path for which the cookie will + | be regarded as available. Typically, this will be the root path of + | your application but you are free to change this when necessary. + | + */ + + 'path' => '/', + + /* + |-------------------------------------------------------------------------- + | Session Cookie Domain + |-------------------------------------------------------------------------- + | + | Here you may change the domain of the cookie used to identify a session + | in your application. This will determine which domains the cookie is + | available to in your application. A sensible default has been set. + | + */ + + 'domain' => env('SESSION_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | HTTPS Only Cookies + |-------------------------------------------------------------------------- + | + | By setting this option to true, session cookies will only be sent back + | to the server if the browser has a HTTPS connection. This will keep + | the cookie from being sent to you when it can't be done securely. + | + */ + + 'secure' => env('SESSION_SECURE_COOKIE'), + + /* + |-------------------------------------------------------------------------- + | HTTP Access Only + |-------------------------------------------------------------------------- + | + | Setting this value to true will prevent JavaScript from accessing the + | value of the cookie and the cookie will only be accessible through + | the HTTP protocol. You are free to modify this option if needed. + | + */ + + 'http_only' => true, + + /* + |-------------------------------------------------------------------------- + | Same-Site Cookies + |-------------------------------------------------------------------------- + | + | This option determines how your cookies behave when cross-site requests + | take place, and can be used to mitigate CSRF attacks. By default, we + | will set this value to "lax" since this is a secure default value. + | + | Supported: "lax", "strict", "none", null + | + */ + + 'same_site' => 'lax', + +]; diff --git a/api/config/view.php b/api/config/view.php new file mode 100644 index 0000000..22b8a18 --- /dev/null +++ b/api/config/view.php @@ -0,0 +1,36 @@ + [ + resource_path('views'), + ], + + /* + |-------------------------------------------------------------------------- + | Compiled View Path + |-------------------------------------------------------------------------- + | + | This option determines where all the compiled Blade templates will be + | stored for your application. Typically, this is within the storage + | directory. However, as usual, you are free to change this value. + | + */ + + 'compiled' => env( + 'VIEW_COMPILED_PATH', + realpath(storage_path('framework/views')) + ), + +]; diff --git a/api/database/.gitignore b/api/database/.gitignore new file mode 100644 index 0000000..9b19b93 --- /dev/null +++ b/api/database/.gitignore @@ -0,0 +1 @@ +*.sqlite* diff --git a/api/database/factories/UserFactory.php b/api/database/factories/UserFactory.php new file mode 100644 index 0000000..a6ecc0a --- /dev/null +++ b/api/database/factories/UserFactory.php @@ -0,0 +1,38 @@ + + */ +class UserFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + 'name' => fake()->name(), + 'email' => fake()->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } + + /** + * Indicate that the model's email address should be unverified. + */ + public function unverified(): static + { + return $this->state(fn (array $attributes) => [ + 'email_verified_at' => null, + ]); + } +} diff --git a/api/database/migrations/2023_07_29_021050_create_configs_table.php b/api/database/migrations/2023_07_29_021050_create_configs_table.php new file mode 100644 index 0000000..46e6ccb --- /dev/null +++ b/api/database/migrations/2023_07_29_021050_create_configs_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name', 50)->index(); + $table->longText('value'); + $table->tinyInteger('type')->comment('1-文字 2-图片 3-文字数组 4-图片数组 5-JSON 6-富文本 7-开关 8-颜色')->index(); + $table->tinyInteger('client')->comment('类型 0-公共 1-后台')->index(); + $table->tinyInteger('login')->comment('登录类型 1-登录获取 2-随时获取')->index(); + $table->string('remark', 100); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('configs'); + } +}; diff --git a/api/database/migrations/2023_07_29_042032_create_admins_table.php b/api/database/migrations/2023_07_29_042032_create_admins_table.php new file mode 100644 index 0000000..b9c3247 --- /dev/null +++ b/api/database/migrations/2023_07_29_042032_create_admins_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('nickname', 50)->comment('名称'); + $table->string('avatar', 200)->default('')->comment('头像'); + $table->integer('admin_auth_group')->comment('权限组ID')->index(); + $table->integer('initial_password')->default(1)->comment('1-下次登录需要修改密码 2-已经修改密码'); + $table->tinyInteger('status')->default(1)->comment('1-正常 2-禁用'); + $table->tinyInteger('del')->default(2)->comment('1-删除 2-正常'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('admins'); + } +}; diff --git a/api/database/migrations/2023_07_29_042123_create_admin_accounts_table.php b/api/database/migrations/2023_07_29_042123_create_admin_accounts_table.php new file mode 100644 index 0000000..a81a4f3 --- /dev/null +++ b/api/database/migrations/2023_07_29_042123_create_admin_accounts_table.php @@ -0,0 +1,31 @@ +id(); + $table->bigInteger('admin')->index(); + $table->string('account', 50)->index(); + $table->string('secret', 80); + $table->tinyInteger('type')->comment('1-账号密码'); + $table->tinyInteger('del')->default(2)->comment('1-删除 2-正常'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('admin_accounts'); + } +}; diff --git a/api/database/migrations/2023_07_29_042139_create_admin_auth_groups_table.php b/api/database/migrations/2023_07_29_042139_create_admin_auth_groups_table.php new file mode 100644 index 0000000..029b96a --- /dev/null +++ b/api/database/migrations/2023_07_29_042139_create_admin_auth_groups_table.php @@ -0,0 +1,31 @@ +id(); + $table->string('name', 20)->comment('名称'); + $table->string('admin_auths', 1000)->comment('权限IDS JSON'); + $table->string('remark', 100)->comment('备注'); + $table->tinyInteger('status')->default(1)->comment('1-可用 2-禁用'); + $table->tinyInteger('del')->default(2)->comment('1-删除 2-正常'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('admin_auth_groups'); + } +}; diff --git a/api/database/migrations/2023_07_29_042142_create_admin_auths_table.php b/api/database/migrations/2023_07_29_042142_create_admin_auths_table.php new file mode 100644 index 0000000..044cda1 --- /dev/null +++ b/api/database/migrations/2023_07_29_042142_create_admin_auths_table.php @@ -0,0 +1,37 @@ +id(); + $table->string('name', 200)->comment('名称'); + $table->string('title', 20)->comment('显示标题'); + $table->string('icon', 100)->default('')->comment('显示图标'); + $table->integer('pid')->comment('上级ID'); + $table->tinyInteger('type')->comment('1-分组 2-页面/接口'); + $table->tinyInteger('check')->comment('1-需要验证 2-不需要验证'); + $table->tinyInteger('show')->default(1)->comment('1-显示 2-不显示'); + $table->tinyInteger('status')->default(1)->comment('1-正常 2-禁用'); + $table->tinyInteger('del')->default(2)->comment('1-删除 2-正常'); + $table->string('message', 50)->comment('验证失败的提示信息'); + $table->integer('order')->default(0)->comment('排序'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('admin_auths'); + } +}; diff --git a/api/database/migrations/2023_07_29_042151_create_admin_tokens_table.php b/api/database/migrations/2023_07_29_042151_create_admin_tokens_table.php new file mode 100644 index 0000000..f96d67c --- /dev/null +++ b/api/database/migrations/2023_07_29_042151_create_admin_tokens_table.php @@ -0,0 +1,30 @@ +id(); + $table->bigInteger('admin')->index()->comment('账号ID'); + $table->string('token', 50)->comment('TOKEN')->index(); + $table->tinyInteger('type')->comment('1-后台'); + $table->tinyInteger('del')->default(2)->comment('1-删除 2-正常'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('admin_tokens'); + } +}; diff --git a/api/database/migrations/2023_07_29_105144_push_admin_data.php b/api/database/migrations/2023_07_29_105144_push_admin_data.php new file mode 100644 index 0000000..2cb1c01 --- /dev/null +++ b/api/database/migrations/2023_07_29_105144_push_admin_data.php @@ -0,0 +1,47 @@ + 'admin', + 'nickname' => '超级管理员', + 'password' => bcrypt('000000'), + 'admin_auth_group' => -1, + ], + ]; + foreach ($data as $datum) { + $admin = new App\Models\Admin(); + $admin->nickname = $datum['nickname']; + $admin->admin_auth_group = $datum['admin_auth_group']; + $admin->save(); + $admin_account = new App\Models\AdminAccount(); + $admin_account->admin = $admin->id; + $admin_account->account = $datum['account']; + $admin_account->secret = $datum['password']; + $admin_account->type = 1; + $admin_account->save(); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/api/database/migrations/2023_07_29_105144_push_auth_data.php b/api/database/migrations/2023_07_29_105144_push_auth_data.php new file mode 100644 index 0000000..9299adc --- /dev/null +++ b/api/database/migrations/2023_07_29_105144_push_auth_data.php @@ -0,0 +1,131 @@ + 'admin_basics', + 'title' => '后台基础接口', + 'icon' => '', + 'pid' => '0', + 'type' => '1', + 'check' => '2', + 'show' => '2', + ], [ + 'name' => 'admin_basics_login', + 'title' => '后台登录', + 'icon' => '', + 'pid' => '1', + 'type' => '2', + 'check' => '1', + 'show' => '2', + 'message' => '该账号所属权限组已被禁止登录后台' + ], [ + 'name' => 'admin', + 'title' => '管理员设置', + 'icon' => 'every-user', + 'pid' => '0', + 'type' => '1', + 'check' => '2', + 'show' => '1', + 'message' => '' + ], [ + 'name' => 'admin-auth', + 'title' => '权限管理', + 'icon' => 'personal-privacy', + 'pid' => '3', + 'type' => '2', + 'check' => '1', + 'show' => '1', + 'message' => '该账号所属权限组不能对权限分组进行设置' + ], [ + 'name' => 'admin-list', + 'title' => '管理员列表', + 'icon' => 'every-user', + 'pid' => '3', + 'type' => '2', + 'check' => '1', + 'show' => '1', + 'message' => '该账号所属权限组不能对管理员进行设置' + ], [ + 'name' => 'config', + 'title' => '后台管理', + 'icon' => 'setting', + 'pid' => '0', + 'type' => '1', + 'check' => '2', + 'show' => '1', + ], [ + 'name' => 'config-config', + 'title' => '后台配置', + 'icon' => 'setting-config', + 'pid' => '6', + 'type' => '2', + 'check' => '1', + 'show' => '1', + 'message' => '该账号所属权限组不能对参数配置进行设置' + ], [ + 'name' => 'config-router', + 'title' => '路由配置', + 'icon' => 'left-and-right-branch', + 'pid' => '6', + 'type' => '2', + 'check' => '1', + 'show' => '1', + 'message' => '该账号所属权限组不能对路由进行设置' + ], [ + 'name' => 'config-log', + 'title' => '请求日志', + 'icon' => 'log', + 'pid' => '6', + 'type' => '2', + 'check' => '1', + 'show' => '1', + 'message' => '该账号所属权限组不能查看请求日志' + ], [ + 'name' => 'config-upload', + 'title' => '上传管理', + 'icon' => 'upload', + 'pid' => '6', + 'type' => '2', + 'check' => '1', + 'show' => '1', + 'message' => '该账号所属权限组不能查看上传管理' + ]]; + foreach ($data as $datum) { + $auth = new App\Models\AdminAuth(); + $auth->name = $datum['name']; + $auth->title = $datum['title']; + $auth->icon = $datum['icon']; + $auth->pid = $datum['pid']; + $auth->type = $datum['type']; + $auth->check = $datum['check']; + $auth->show = $datum['show']; + $auth->message = $datum['message'] ?? ''; + $auth->status = 1; + $auth->del = 2; + $auth->order = 0; + $auth->save(); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/api/database/migrations/2023_07_29_143353_push_config_data.php b/api/database/migrations/2023_07_29_143353_push_config_data.php new file mode 100644 index 0000000..5f2dbd7 --- /dev/null +++ b/api/database/migrations/2023_07_29_143353_push_config_data.php @@ -0,0 +1,94 @@ + 'Logo', + 'value' => '/storage/assets/default/logo.png', + 'type' => '2', + 'client' => '0', + 'login' => '2', + ], [ + 'name' => 'Favicon', + 'value' => '/storage/assets/default/favicon.png', + 'type' => '2', + 'client' => '0', + 'login' => '2', + ], [ + 'name' => 'Login欢迎图片', + 'value' => '/storage/assets/default/login_cover.png', + 'type' => '2', + 'client' => '1', + 'login' => '2', + ], [ + 'name' => 'Login背景图', + 'value' => '/storage/assets/default/login_bg.png', + 'type' => '2', + 'client' => '1', + 'login' => '2', + ], [ + 'name' => 'Login背景色', + 'value' => '#1681fd', + 'type' => '8', + 'client' => '1', + 'login' => '2', + ], [ + 'name' => '网站名称', + 'value' => env('APP_NAME'), + 'type' => '1', + 'client' => '0', + 'login' => '2', + ], [ + 'name' => '网站介绍', + 'value' => '中后台前后端一站式解决方案', + 'type' => '1', + 'client' => '0', + 'login' => '2', + ], [ + 'name' => '后台密码登录验证', + 'value' => '1', + 'type' => '7', + 'client' => '1', + 'login' => '2', + 'remark' => '0-关闭 1-图形', + ], [ + 'name' => '后台扫码登录开关', + 'value' => '0', + 'type' => '7', + 'client' => '1', + 'login' => '2', + 'remark' => '0-关闭 1-开启', + ]]; + foreach ($data as $datum) { + $config = new App\Models\Config(); + $config->name = $datum['name']; + $config->value = $datum['value']; + $config->type = $datum['type']; + $config->client = $datum['client']; + $config->login = $datum['login']; + $config->remark = $datum['remark'] ?? ''; + $config->save(); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +} diff --git a/api/database/migrations/2023_07_29_214939_create_image_captchas_table.php b/api/database/migrations/2023_07_29_214939_create_image_captchas_table.php new file mode 100644 index 0000000..65641c0 --- /dev/null +++ b/api/database/migrations/2023_07_29_214939_create_image_captchas_table.php @@ -0,0 +1,27 @@ +id(); + $table->string('uuid', 60)->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('image_captchas'); + } +}; diff --git a/api/database/migrations/2023_08_08_092916_create_uploads_table.php b/api/database/migrations/2023_08_08_092916_create_uploads_table.php new file mode 100644 index 0000000..7616651 --- /dev/null +++ b/api/database/migrations/2023_08_08_092916_create_uploads_table.php @@ -0,0 +1,34 @@ +id(); + $table->string('uuid', 80)->comment('UUID')->index(); + $table->string('name', 100)->comment('文件名')->index(); + $table->string('path', 200)->comment('路径'); + $table->string('url', 200)->comment('访问链接'); + $table->string('from', 100)->comment('上传接口')->index(); + $table->decimal('size', 20, 4)->comment('大小'); + $table->string('ext', 10)->comment('后缀')->index(); + $table->string('md5', 80)->comment('MD5')->index(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('uploads'); + } +}; diff --git a/api/database/seeders/DatabaseSeeder.php b/api/database/seeders/DatabaseSeeder.php new file mode 100644 index 0000000..a9f4519 --- /dev/null +++ b/api/database/seeders/DatabaseSeeder.php @@ -0,0 +1,22 @@ +create(); + + // \App\Models\User::factory()->create([ + // 'name' => 'Test User', + // 'email' => 'test@example.com', + // ]); + } +} diff --git a/api/public/favicon.ico b/api/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..da5f01d2c9f264450f117c5a4a4c2722341843b2 GIT binary patch literal 4286 zcmeH|v1%1T6oyBU5G06*h*-!)LXcFcQUr@j2qGyrX>NC+Y+f`|lBBm@x=3rUe8 zecoaV@i|iD0rCJr$L}*47&g1>-kS@HaR1A{Gjq;AduGm@*&D(Ie!X7s8TPM+a3h3p z7h(#1sQoYSjWN!^h%#_-MDH2)HM_%3EX{kzcn^AI2EifXi9sgRXs=*@1Yg6C@H%XR zpNQsbgnjJOHNGaZYk3c!G>J}q-)LV}=vJ{kfVOKD{x+sQqHTD&LA;62vnwOF-N*T? zEND6QGwL31)##0r$4asdI_5Fq4V~L*Fkm~0{tK)+%ewe#SF$+1!(0xFOHBL>d!-i` ze;wv~O_D7-Q)xi^0#@xIlQec+gJ+TdgBkxZoP}k0cCI18InB!VLXxX>Et!L|M2d=;-%;2vmt(#E;WHO(Wjoz1gT}?=%PQ z-FosKm{;rFGrj}03v~<7`|qAd3Gb8l%6%o6ljl&I^gqqG6L8e9h8{xey9=1(Ptg0& z6}}UAt*hX~b^o4sS6C(Ra#z8LYyDY=UBMbmcfG4MjN|^t8HiQ*6=MO9V1zcm)qRLX eERJJ5z;YB1G~p=XF(aHf3LYnLLSnL2w0{7<0k7@= literal 0 HcmV?d00001 diff --git a/api/public/index.php b/api/public/index.php new file mode 100644 index 0000000..1d69f3a --- /dev/null +++ b/api/public/index.php @@ -0,0 +1,55 @@ +make(Kernel::class); + +$response = $kernel->handle( + $request = Request::capture() +)->send(); + +$kernel->terminate($request, $response); diff --git a/api/public/robots.txt b/api/public/robots.txt new file mode 100644 index 0000000..eb05362 --- /dev/null +++ b/api/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: diff --git a/api/resources/css/app.css b/api/resources/css/app.css new file mode 100644 index 0000000..e69de29 diff --git a/api/resources/js/app.js b/api/resources/js/app.js new file mode 100644 index 0000000..e59d6a0 --- /dev/null +++ b/api/resources/js/app.js @@ -0,0 +1 @@ +import './bootstrap'; diff --git a/api/resources/js/bootstrap.js b/api/resources/js/bootstrap.js new file mode 100644 index 0000000..846d350 --- /dev/null +++ b/api/resources/js/bootstrap.js @@ -0,0 +1,32 @@ +/** + * We'll load the axios HTTP library which allows us to easily issue requests + * to our Laravel back-end. This library automatically handles sending the + * CSRF token as a header based on the value of the "XSRF" token cookie. + */ + +import axios from 'axios'; +window.axios = axios; + +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; + +/** + * Echo exposes an expressive API for subscribing to channels and listening + * for events that are broadcast by Laravel. Echo and event broadcasting + * allows your team to easily build robust real-time web applications. + */ + +// import Echo from 'laravel-echo'; + +// import Pusher from 'pusher-js'; +// window.Pusher = Pusher; + +// window.Echo = new Echo({ +// broadcaster: 'pusher', +// key: import.meta.env.VITE_PUSHER_APP_KEY, +// cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1', +// wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`, +// wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80, +// wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443, +// forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https', +// enabledTransports: ['ws', 'wss'], +// }); diff --git a/api/resources/views/emails/example.blade.php b/api/resources/views/emails/example.blade.php new file mode 100644 index 0000000..cc08eef --- /dev/null +++ b/api/resources/views/emails/example.blade.php @@ -0,0 +1,16 @@ + + + + + + + Example Email + + +
+

欢迎 {{ $data['name'] }}!

+

{{ $data['date'] }}

+
+ + diff --git a/api/resources/views/welcome.blade.php b/api/resources/views/welcome.blade.php new file mode 100644 index 0000000..638ec96 --- /dev/null +++ b/api/resources/views/welcome.blade.php @@ -0,0 +1,140 @@ + + + + + + + Laravel + + + + + + + + + + + + diff --git a/api/routes/api.php b/api/routes/api.php new file mode 100644 index 0000000..889937e --- /dev/null +++ b/api/routes/api.php @@ -0,0 +1,19 @@ +get('/user', function (Request $request) { + return $request->user(); +}); diff --git a/api/routes/channels.php b/api/routes/channels.php new file mode 100644 index 0000000..5d451e1 --- /dev/null +++ b/api/routes/channels.php @@ -0,0 +1,18 @@ +id === (int) $id; +}); diff --git a/api/routes/console.php b/api/routes/console.php new file mode 100644 index 0000000..e05f4c9 --- /dev/null +++ b/api/routes/console.php @@ -0,0 +1,19 @@ +comment(Inspiring::quote()); +})->purpose('Display an inspiring quote'); diff --git a/api/routes/web.php b/api/routes/web.php new file mode 100644 index 0000000..d60aceb --- /dev/null +++ b/api/routes/web.php @@ -0,0 +1,65 @@ +@clX-&rMs4{>aOZ^r`PJPN_Ud(q?69R@4MMovJeso5fEgR9S0Cm z5fEfk+)x?y35Ib&0UaG3pU#XvhGArM+#P)mRNnvGs_Ha>-_zgw{a!<*?)~m}Z`D2D zIsbFc|D0P2DT-n%S1MA;E??c#e`w1ep2o<>@Y=rX@Q!1@Z2H}w6@}b*ZQ6IirF#pn zmj9$EV!xuy-@bp(j@{`i_lzsb!f#-Hc|Qh>1+t(hi?FM-?mv9u)E!^azl{A>?7x1& z(Oo-=TPmMZl*L)>UwL@Psbk7QY*0XqOy2deI5}HREbU zSvd{I?^jf@f^Jtd#S}M+4H#Kmd#7zmKTX9x4%PmyRFu5Gwi)EN)eAN)P-ZE;%4wNB zJ5Bk9{F(9%MOFCT75csS65g_qfHLuFt{qd>V1#EiV>W*WTQL=Z|Av%J%IUNC!&t8} zTiM}kYiFN5`vuH*u8SkiAL)&)zy5u&T$wgBJblK@k@`6#q^jwLY1uBf$LsS4f}wCE z8jB~AwFynlsdOgWlFPTY6^iXsIy$Fzb@%l4^_K?z`Vam8J5y6qXa8CJNGw$nN>1rk zmMiao?4!YmZs>(#xA0NUOFrtRVj(z6(TJCf5vml8Xe4at`P|^ZD8>5Ilp!zWCuWu_ z8H$$rF>yqcDrzZBF`S2MV824|?5#dzlP~BA82Y2C<}xGASET4$#X-$V8G-r!R9G59 z3Mt3jh9J$qFrhUj8KO7ZYJ`K9%XAsWARQphC!0<+OOsaRiUx_LE2|4-7g4$+-KvwS z=hF+wltf=$>wZWk_s6AQot-nJAR=kFpT-BdNj7Hrq!hvxZBOTQT5O~YGi#_}HEOvu zT``pO*_Xr;u}H~7mD`jDmCs{w%27ivMGY@SDlyz>SkJK_B4Irbk(7g#{&FQ6 z!4yaUW4Xd$c~q236}{ULSR@*Wg`=f%rGJ!qNFSjRq!|g828wFLx%i}O zR|X(p2ze0i)A4Vyo604<;LNCBbyW0_;ao8q#y9J9u8bueq|>`C$bj6sJ|K0s2rry7 zXStWOmeWmkr!AKrd!3KkQa4SVgbu-&kL$TqDyL&uP{EAO5p+!T#X}KQ`aD6GBxy-i z#nA<-U(VmyxEfJ!yE#+!E}wJ1g~RfZ*1mj)!50zJGV68yw&{tKMig%D#cH`ojG3fL zIy|#Ws=ccoZxw>1X5ixM>9X~P)gn|G+ULcB3QF`Ox@ZXJN?m3Otx1wX9h?)jpfZMm zPjUqUF3q;Hp3`FR)j@os)J$B>BW!G|h9;>wb=k;ly%&4B+S1XUg31}=3!;2M10P)U zhwwqLROzh!daQlUK^TQbDB`OxUxr4>C(d7SwQ(GaX%q{^!8TU?U}W;l$_&D?H`cEL zouIo`54qeQ99!arcpiDgvOhSs6pNBQ-DF`=)?ZD@`cWB&0BD*?hHAtoO{3nTIih-( zj(x~5$P}}6NtH6>VLtW|k9%|`%ix?ab9_uUOOLgQ)7Sf&s9nnosxB5IGu}p4eSHM1 zWgA#5#uP7*ce=7nQGz8c8uSU6H>-NIn=%4Q*+T<`Vr!{C8jA*FK8odPdOuJag_@Q| z1&}~3;b0`3$EJfFkkL5Nmqe5vxL>5NOzTPGu`Y{TuJl!D!G_`SV26Qom_Px3sW$W2;1U4<+NxBsbBGTW;U_XMDyjCPB~B zmT6YMBTcr79z(Z!?MWxsjn}to{v&=%i~(QEWvGyBYRSYXtXk!f+FmwBaee4b>SgOW zOctg)0K_m|O_rq#YR4dbmuPfGjE6(PR_g7emxTzo?8u{%@5&^sOO% z2yFs$)o9%W0iukijG+_q)+d=K4zhGdslR57u+>pPpE;Jat&c5O<8$Qu+b-LB&+r`h z3aBOnwUl8yKc}lau5oMrPKg3Q+?wQbU1#%MvU@gjngbUqIZo2;OPAvR65w+zCHENmDa5 zvxIXh40h8Xqy~SY7ka2$O!6sj*3}3EdJes!*p0znyQva`cQ3O*d#Iw;e3p;&K3uxt z!5nXM4izV`?oAN)Dr9vGk>WZ?+cl$9n&J9Os8_-C=++3dJ)LQ_fOdva z{hbW?0})l^i;@mnJyWLiSmcLmm|{9ttAXR2Krz_dg0&HW86G{NR(?~V0C@~{DSrtj z-w;E;Dhqf$4?L15+P2MaUQhc~xJpwXBK#B_htw>Mz1L)?)4-E^#XO}AzGS&_3>cb` zl`>#}7%icVSekO77DP-abhO;haO$Wsumcz|P;8Axa6%1R2g-w$vM3hHm3jaXg|lbz z*RH_gcN83JwslUwpg)pS=_u)Ot?A+>LYU<%mrBF%zcu~7O}JFpD<-+&2#K!MF;iR{ zwh9Yv0%BA3l1(Jr9`1ygHKXfZ zsQG5PbxTDCr^cGnx-grYidoe~w7Gg}BhVPa2eN-}0VG%bE`y6};=H=fFI?^f--3M+ zxgbZEl42Qh%vv-4*gzSwD%JK!X+RXW%qa;ib!8e}^bTp@Gn_qfzjVIrrs~D`j{LP| zTPoG|66$OkM}~u(B6ap_bOY=vs`S93`US_akaItWaTTo9K)DjDk7AocK$r%k9l|kM zOF_~7jc)R*)Z8}PFEmvZO|2KzM}gdxn~Hun7Qlil7mMEbq>yfvjz^`?&P3+458J}D zv-MF+S4lOoDDnrR1kD%tdXC+HO}tC2g-7myMy*n|<6Fjnh#4|^VXHm0*qja9@wg?J zE50PccLb#Rpjyrl+z##u0m>l7(!$X(2E~TXAVSe_S55?v8;0}w;qaAL-uIzLT7#|r z{Y0rNQg(+cxI82%F5#r1^gh_oD9On8R4t?)?jE$Oe+N8+rOE6iP1IA&JD5l(a5Q;Q zlN!WSPp4RWrIXWcBMD*3GOQ zq}mY=ZdV#GDT+5YH`QVh*$$mAD07hMUVytOLGfdwRPL*kD`mz5tQ-PTBy2q*=R{Um zd96Q)z{0@|Xe$CuxH`ahp$Ml~!rkC5ovFO!^@GJWPW5yH8dPGm$E|NQwp~ye*kY~D zWCB4~x1BhcK)gN{S{+)tL_n=C=F~x4E9N2%n{7#NPWPn~xMjaLDXWIiH4~=IaMO`* zX=YK-cBDie?)*N~zYt;}f5FWHNc^8_PxHYTyv?l#U=ex^=B)vms&h=w^*!X zlmTT4BnYeE7=8fyKT5iAlC*P1qxMJYV}&9NJ_r*psToR(Hwz3lBDd}q`t>(EUn$!( z2l}@!EUvpw%DQ0s4Gis#Afq0dE~H0Q_38#uvx;*)?RC}b zHVDtRzy00s@$KKSby#ey-ndS9BC4)WSwx)|sNy9Nv?Hs=A8OpW8V(Q$mRjukX-DVh zBYHi;_!WhcMA&Ie&QaS`ASRfL^Nu)CCjet6F{CoiL2D4)BhBn~(w~fI>me1#7*HCi zZ!8pc;@ch)C)oq`ytWfrVl5i&c9B8TjPr(xx(kUmpYC7&+Zl{RIH1t~;-Tp44Qw1-VWXna;SfmTe7YB7&Tg=W}|)w$%O% zog1rp<1%MDWwx$RHd ze!+lPACk8uZP?AS<-*Vx?fryhRj-3{(7rDWxqpTDFp2STn2PDr#hB_*Wq0*YUdT-R zxR&_Lr-^}ju0uDB1w>Qw^2@>`S1z?fYeHU-J;)EHOd&9KI{fM}!8(%zGq+7St=y|T z-q0Ha8=Vw0a^QvX=WCGWXqFR>AiQL3funI?Miv}>0r}vt5|GRwvONF_oXt6c!ciYw z9Z8|iWJ--I3F2HRmoqv^WgCh)s4`sFJu>{4xDf6Fz9-&3+J8#42O^ef&5DCy(BOA~ zPEfwl+Kg}}lF$&Ci;%z5IYs@Ldwe=uuPEeAO$HVR!jPxvWbM1CcN%oBr*j`ibjI!jb9R{q1!oSSedJ=Q%)+^H1r$tbV#QR_4=r{ zM@&|A#0t(~c8-NU2NPJkRqR2(K{aIVK{d8NE-XmAD_J+2C zq8kT*FP0_A9Zy_zIjj?Qv&=s23%XoxY1GjT0$2u zoTCYl(z0`PXacF)D)bNYLx(p1P&3@>*=S2n{c_8;O{%;n=Y`h&%~t&DPny zz>Z%qJ!&+?hXnGzsXy5o468zKIhh26-Xu*={_}_^?);u;RL5%(^Q&KeSJF7lb>+~h&EQQo;d8` zxDitkFJrRT9i*$b0^>P1OP_r~{13##0U(*e*dzf(q6mHhF>4t03OEkQK!XsULsJ_I{AG6buHqtX+dweYmS&_#%*Guv;_{f4%L2R&8*@cyg#t99-g~c_TU) zikA9g60;l%1;e2%&td=OLs|)16gw!q7_~9oxfG*qkqZRk$*U91r&GHrl^hfT~hag&l)DH&7^Mg zA_4%0^E14&f~v$?tf7`PoE5_Elbg(CJ3jH$XL)IE+bk)*cEy)J@-T`lu9^Aq&uDb> z0KM@QGXR8$@3@D;($!I1>NZUG-o2u&>C$HUo76uDk7<~$!Id{*y@A2%3X~%`ruwe< z1=gzrerLI|Sy4iurOHreAB8y&<0P|(3Vpo>?p)6!D@A8ZB;B=Mm}4rS3uFTX7%-Ju3_Ml?_M-S zh77x>FAmY3M61yG2)jKuEZx;{!D^pnsHYf@cn!ZPj^q2bLigt}A}L5bv2IK#_@L{K zpEC45EFQjF3%(;V2WGzkxL)>GH5@LNh6xx9mI@PrX?{^h*6qD;0GimQsUj7d&AawwNh(3N8%N=IE60$KCGPFffD{u9AEEf#-`^!!laL z1=mz&xuNIXU+wO&umEcbiY=t!sXi=bjX3jpO_8O8t}T^nJnRc%Dm|{mf!8y^#{e6M z^X~$zey}`Hfm6o@-y>mJ8KG*2DjYm9sR{%E5PJp6DwXn}j(Mn|cm>1@56{5e;8+{H zc7JS}dTsuqBExy7D3b({TVO`m54kzZ9Z zA+Q$GMq-_~FVA#K9L{iUPG1$kTBHdvrvO%Xc@93cA6+ zVewP2Ch&6ic>BA%%UoInUzIziYiHKQ?yP}C=C;$W8qe=|vT<=`mXXYDv*cLS*@ z=Wk4Tm4X~ZPMXVc2g5DP8hI{C{M0o(-Gy4+g}oIRgSg|prg;OZB|>Z79Yx6S(D%8J z=NtrS2@=7V z@{aiOd`#%pRif=GR{Z9S5Y-yghnPtb`Nrz&W%-b#K#7T~P)aJwO0mJY} z-7*n0-3X4etsR{SPYHQfvNf63DAL@FoL<-(ilYK8Ip7mLTcKfwu2FQ1GGpWiHK2C) zZ&SO}+A(3`7+IPTw2-1eA)#*M2^X&GnR#&YnEFS^TC80uR;)uLi%u8rq!7MgAG%(K zQb}ZzHU9Y?^gEc8vqV?mjW=2GI_W=Jw zxki{&(8tgLduL7Uhj{DKbh;Q=#!eoTFHRKsYHVCT*vqr+<&5xG!P){oAG-Lm7f*uDJt*?@dK;6wtwqTOa}XfmCZ# z79bhV#uEnUU8L%?7~##twZPA|&w}2*$BhCY-K86%?Za)jSbHo0f>%YEU1~6l5%P?X zFJC(dItTK!ZC2=}=&I$^j!)|BG)-T)EymJDQIP{=_^;f{gfc_z8lYTld_1i{0IZ@m zv6CJVvz0F7NBg*z1bwd8o}($Mz`q)dkI+Ln=us-NuPwl;K>}j|90=fu3QNFgk>gt; z=ba?Vef@)S(21`&e}YI{2X5 z-8q=V?U0s?RZP&pmiJ93h?y-}DcYkx5P#s{tFMBNftrdLNU?fLj^4H9?4Be_D8g_r zexrhN_e(Eue@9l=)~*rcZRLq@Uxuks!AMK`H1#AVPfsGloJ(SvbO*Jhqh36RBigWD)$Si_ZUGCGDZ}?d>vsTW zXlf`5cZKUn8i=NBawX{@Ra;Pf=!5-GRghPv(c6b4*l|D5G&z%8BZigJ)W#g4xrBv+ zjQrmNg%zKpUeS4Qwry?Ofl`YD5mT0N!q(dPQ*N$cC&pJH-G`i3pgJn*INSmp?m&#R z+NpuU^8-$i<1nG;xPJuk9RCATCseqe+d_bd6dMr$_eTvlR$r&50T%=1Xi4RgDf7}C zH#LkP&!X<{p{<)CR?^+EUALfQC9G@;O<%ZcquA1dJ~Ej^`M=XXrGiXG`a{%ZKscFV zOUl+#iL~FXa!VBMs`}4HJQhuAVBC=-JLe%R0BW+YU$etdZEt1w_qh5A;C-ea?{MD! z*WlCG@6Yv$VwD*v@VuQNXbk6+>i%kLx0hE_e&m~ zmxHJU-x;N026Z$k^q0KoHwZUxhs$aNn z3fFnp2f+LO=)iHnyzJ7n#<;55C=TlKQ`;8q+^g4eikHNYm=AlIfmrzfvA$w{!T}AG)w{382ZgdIEaDbvX!IS7_hOLbrw1 z6vryV=*`Zywoa4$h?<;zqb-|lWA>b4yJEghajTBtE8iP4twf6l8i7{RH(t>akw^kP zo_>D_pyy1LbV7);dMcSr>nb1C(9{!(wiEdZA<)EdHjin-r*rs>J{Hr~HIKi0*AIIb zY=zqM)snLzt3TlAwXrYtY0r0&JW4aC5n$-G*(e(@`UW%2L;CiIXg##IhP?HejJ&O% zTjs_^YU2p6e}E-Ma)QX&a7;vCkV>Ep=bT(s--HvZi*u6rAiW9S%%}dOg{PJwd(evMthCXp2nUzdnutR&CxNGYb~_jhw>tq)|z;Q(6{vka;sV%ro6! zezbe)HE8J4kwd!v^zvM*O?pdeE)b9(24IizptQ%UZy>A30IZ(VRZp90h{=P{C(Kkq z_2Wb>*bKU>oomoq-;ALS@SJ-Og$1Athg(+p{DO>tS_WbPD-g5x(tY3yX8|w3p-!$# zbNX2`WZ=GvRJK-{t`ASt-<%kT(O{xD?W9=j0nmJk=5hQ+}@aVFy`UyCD zK*poU*mu&$ccaWUT>ZMgK31<&U%gmRbK$lR21&d4BKKFlaV;z?8C;$mB$2!TEniOV z30d^f!;nQk`X1*y(ZLA3n3K{Y>Eu4T4#d>}QQ;U@ooeH7oe2y9D=L9!8>ke0D9gh1 z3b{ehfb}Ag0hOso6?Db4oRQSIQv;20ERcm^zL{^4h2g}}G*+`M)fNlLG@^o=pYc4a zM@3~C(l@ldSl0L#UBjhHXO!?ZJS8gVe$3iaUA9Yz%#G-BN9y~q40M>z70 zgqv#-H7|n1Z}Kt6mf#LxN`QX!58fr*QXbkAk|MS9kDhpF&Ef07J{lE{x^UhVa zf;-@jRflb2h2>;FinOT0pqbCY>5NJrCLp%uB$XGYIDqoBQBPo*i=v9osCGX3s)@wKWJV;}cDfU$ zY7h6H)HMjgW$B)kM~VoQc#gxxah3KZa zY-^pM++BHBQA|aifclrA!EazK(=mhY6bolu&(6w**-%sP14SujBUkbWkwBRXHs6e1 z#}kNAib@|c)%CD>4i7jes4*+C2uv4z6s*h$aVWr9K1(B7hB+fBEDSpB(2yez&P1|_ z&I>$+g0uJ(CjcBMUfq*t54qNF*&7JuS@a@O;o(ASE{H(b5?xb;Aur&X0J$xBEl(n^ zDW=8)Al+SP&NplG#i1Dmq=#q&rARItN6$rH?(Z~d~E27T!O?j6Ml*t?8CAlw(J zb9e&1Uv^v9O#1PU@(LR>W0(IgnnE4 zew1B5tRb>Bfp4x&f29O8^v?x4(~BJPP^bw{B%PZgj4C?Wgs)P%91R35#l;yvsa{l9 zp2EXN5D(gR5VGL!0laNFbYufMCw(AFbWV~CnnlT3u$cGX>%YA_xP~dAuD49H1$x_X zDPSy~zu`Q^KSTrnQlf-cPzDI;JA=iwp570gGYUK-_kX%7s<$iZ84uT+Q^tK>XK z1uMs9ZBAjZRB45JGh@|*lr5qUX0XwCvBATCvEy@8-MNP7TNR>w=!< z;#fy4-V_nrJN!|ZN$<|NEI&^nbLLoeC-e;LviT=0EWEM@G#`5OxZjrO-DpEzvqTsv zq!K;!0G6!!z?ku_E2^(U8q;R=is~<>%^EKmSN6}fZoloL+k>?UKKa$Z11;|{-Q`L% zPV%^IcdOU!EqYu?p`bx3n!1{dr_G4Q-k_EThz-#1He~ekAg5Y=6nBmr3&(1}&Gk{H zOIc4*1}qPvy^Iq-FFNxD0`v;kj$s500$fZJmA2Y|Ua0)d!Uc;KNTfgG^EPgbY>(0O zM2;eb85G+dX)kS_JBPlWYKdnPDEg_%=-(n8qh&rBaK${fD;}nWfJr_JiQ9v-@n>eu zrAukW3bG3pjWxB!ri_tQuqofYf|f2xhbiCGngG9yj4+dUQ4OkMt&a&nXuFz-qRC3- z6CI4>KI^>brYF#EhdfLv#XzYSb9{feQGPxS)`kOfl!%$^> z=RNpb&c$A!KVuEDsK<^w)w^1G6Cww_3_&xS1kZ{u!jJ3$L!5QN7^hDTl>o(Mo)iGh zV+_Y=PnkHewk*uHGDf3%a%2uTmQ5Y~D*aH`uOFK0h0#Vfgl@g<=TiOnf8tnhS;)v5 zExBY4wMbR!)z2WQN*cB|6N&(Jj++ywrK8AzHPt(J=msDH=)ez4@=o)J6O}RPwTit6 z8Z4{Ly7?xNiCM08J{I2>hu`b$YUvDx^r*oPf01EJVR(Kgdb{}qR6K!IIya@Xn4tYt z#XkEylGt&q)f{N)-bVcHG@>{a58O6~?;LY*Fov+ZG3+2N+}1?v3D-QCu{+mOT7fY` zga9Q6fLY!kHP8b=FTqaWaG%99m*hOF*zNlAAI=-&1|2k$s;<&~?ZRS4M*TSA^Awm+ zA>L~mM^qo0tW@#@J-}M$NjfpEYFnx|t-(`{Kwdm+c=>vNUQ?YRY4A`jV;8EaLlo4K zDnIseK%0q8&G`5Ot_L5@*c|Mm%L1gL`QPHyHOwyy<@U2L(kb|D7pf!7*dQEtBvWB# zp+APQFm@*z?LjPj`w-&d=F6HvKHk8bny>}-sJktf!i|Gf(9!*SY7EZz3+_XH15b#T-|0T>vqYk8P-?sfe4LiVFtHeR)TZ)%qMv;8Flo z6CCPvXTD%9?jZ$%7ZkdF>OhU3z`vtnph7z~+q$c(xXCzhj9fBx_q?d7>U5-o?%Y51 z`s;N4n`GO%m2Da`nvF%7RvRTgRjpoTx8+wtsWm&FPUpc7&?kM3bK9B&L8L%tbl%-5 z1C4)UAXa))x%KlN4F$RT9P4Elyy743nnhFchP%i|(&4_wDry6zTGP1mR0d)WaBfV*K`9)Vz||3$ zZi=mLLOAhQX6JEq&7hm1dM8EJgdX~+7TuOaJ0o(B?y0|h=ll|y)4o9_d~eC<2*mA7 z^BCfAO={IEWF*)b_1iv_?A{CEp>b>Y_2D3TQOu|I&i2ddbLeEWyf(A)ASy=ze!|{; zZGv^VDLzfUNZ#q*#fuTB;d&VCY!^4fQ_b_Zi^AH|uD8G%WHK^H9T^vGh8bDX^H}X% zG+=m8PZWEHiXneH9`3{GgaI&NPTtRQenGe$Igg+MdqTN_HPeaB;O<$g*wP#9|0ttu zEtCW5LQOf4117-TBjiKaU+hP;U#j_hK$hoU1`%E@&xOei*Dk`n%2*Z71XguA zJY8EsfJ{uH6#@?#l3lFjjc>t(@H1B0RQbIq(Y;{jpIHOm8jUar}#OY3JMY_;6q>{I}*``g> zb_<=7s)GeD&~G4ft`Y3#=T{-9hBvBZ5x{AOL1a~~prQZ#idQY=s`mgOh2Rbh=3Z(Q z!)UG2%a(w61GwG7-QN&4bMU+#NYvg0{{3YK`>8vy&E@x=M7s$T<=yX=;X782Uj*kv zet0lVHs>5}rfE+MrP{y!eQl=DL7NMEsP7`wpj6YZBSd**-G@YQv=^N@$T^<}lc?EI zq-843B+92+Qy!m~iKn6aFh!k}N2=y__gB9R>Q0y|eBp&l@sU^uma^>ndN&HRJX5B; z!g3ez*lJ!+33S*@KRaEbb%9f~=Fm?T>S8{UIM6+y@NuF8!MKKsgpKw5+W_TxsLae) zE`rP-U_Ez)Ud$CCje4^$lzFmigs%5;8wQ68Jg?U7%hGlpU4^(2fZ#B~xyh%!#iKH_ z;jF-Uj2IxM@qA`1$~ev+fcM%b(1wj6uXp!IzXlOQ9_R+q#WR(Lr|odtN+&Ao1@zf&<6WR7c6P9o+pOG!_*)SZ~zdPg$u(7uIkYfU)=s!?vNjNb$ zTMJ_aHx(9hTxaPUC;-l#p0>s~7l7*lDL}}H{+!w){DBkw6$UBtj=84Z+&Y@NG9^It zw2Usl)s(B=iKl`aqf}0(LSA1Y-_{K6SF4BJQ`_6SQA)9<7MMtfXaL!j_6u+PrIs{) zbS%4wXq{#hCx);BE<=s1z4oRfnT);GxjCk8P?S~h`xWftI3_5fD{YB#0M7?Mpx`%O z2v!Q6s?`^;F#oQN%-Q58}?CRhk-rmVRwo6wjAs z4#%5?+Y7YVxAIr8Nq8-%bPB6~JekiYN!N#FKyjtM#T)Vlplr6+hX*Ds&c1LpfH+ri z&Rvb$IxxxIEsrcgex#kzMGAb<-_bu`*9Ea{>>ZpcA^area zUKxeYJ*eC;5v{ZBGdqgNLlluYH&B}KzP8+`M(}cn4IXW-z&m#nKH zye8C7=q=5_5rJnblBBFx9{hw$G@ydhHw;n8edN6_3r%!g*gPBBl@H&k!f zjzS!Ym@9oQ`yfQeu3ZkiGU&@oUDOZPnYa#mC1}b4OhRZsHrF+49%>^@yE4_I8l8-j zp=dHJe@)13>zAtW`Ur?{8szURf};H7AH%Kh@Xh#xBJmqX`1|qkHvV-Z<)`m|W9`|O ztA9i{`9|y-$Qf#XI8Xizzlo&Cd(XbCgym(8E7gxH$|(QVlK7L75(kyEIEmK*yl$z# z9>x39N}8tN^)Tjq2>T%=EywZx6kgxK>vaA79=wm@broJXNBkJ`?#0W-_FZRR7PsSl z5nh+#H5ISrcy;2sU&VE^c;Q?;ZkVQn*j|r!oF~(m6UJ*3Ud!;pIrMLM{Ti?LD$QaY z##Z6=Dqa`kwFKwJ@!q1?qM+O^5_q41R~9e$Qy!-(-g(?o96C_B6Az>pSjk?t49D&$HgR_fg*r-!J?Z2eN^G30@Hz z4*gSjMfkgsD>BU#xFixaR+?Z`*VJ8wqNO&pQ>*M6tDc(IY*COdi=n?{U@@^?8BFAUVr8TWA9pd#d9CL^tn5Bp1E?L zb>{9BD=%36+|$mHGuOD!+;Zk4XRgxm|MJ!CYv-M8Kl8p_XKvUxXUeKQ`%Yf4w>PIPe!wUAO1>MF)-^$@X>k_B!YH4GrzzakT5rm+7j1f^)fS z`>H8_#TS0pN@w=U1!wMZUH04;SH^0?WyhSG zd+r(cnVX*b{F$51Jagu*=bn7-nPm2D&iae@S-$}gLPycib*XY3A;vx=94C}4ekjOR z4l9>{v|q1$03`6c&}?^w@=uuc_h@*y67wwOZm9oCJQBBB`P0O_Yp~R}C?8R-Qgr9F z97o&nDDFHoz_csxgOS{TbLS{ikhJf?)=8Yd1D|{vpS>S@NARh8@b5n5LhS9r>p=bA z6WD5eo4@{3*5PW$5zrsNJs!b*_2CE8dim$;CO)qZH1`lbdk1E8{a-)5>%8yW_%>PG z*(%)8|EtVcwvB78M1lA&kWZH>|BY+LoYgpi)wu|?P!Ik)FzK6jLo!G4jeGveS?5;a z7ToDFT(z+pXR&HGDSyQ48GQOLm9uE^&;FHHZG7{;eofxI@(mK>E({nu7X;wfm*JEdT&rRq6)oP*@AjzNC_(uaHKIj3zC2knv~}M1JANSeKUO)#@-RYE^VSz} zA{A0fKMmgh=-~MZn{M4r_yO*S7U2^%sY^|j5oV#zMB@P(s^*-@o?fOKC2zHoGxR|& ziF-GAD0KTbZm^0&!sz>ueTV$BDl<8z4I#9f@64?wF(anOiJ72B!D;wFj$}G9k4x+-}s|Z9| zqUbYL=Lzo$Kzv(+t@vY*^Z`s1hMc0L|2_G*b}Q6XlsZ2@_GHkh%zloCZ1rh@)IYrS z_6)bR=8Ko3W=hHQl9m`4bpf3$nwk@8iPGD~Dh%{@kwrAP7&Z;4+LN|u$_StVE|(+$SPv41k3l)-RL29jYDq549SDONwHU7$g%fq9&;cIY=GqRx>MHU2 zBQ8}96!kkF%JFl~ib_;2u%90ZSW;;7iv%*y{dn2c9{ftIn@3d{GrGZ}WD; zCj>Sr@xKvVM$evqFfd;KPFh;}fWsybEL#U6U(2ZDc2?=KZ z9-9{iWA4{N^`BlBys(mH*FC@y${H2s5hvop(S!{!9475GjzB`Zn{{r`CqJ$=`Vc`b z)Sy>^>zob!Os%1Y@2vV3LbUpQ8(}52s75W8m-}1sb0QgW>P_}CfYOF<=J#%Pf!qWA zzb*qW&EFgj%p&-|lfgVL7}0rT6eGAd?ZpIk+x1HY`6RcA zsgmwHuljUOoi=PbXU|aPHdGFaHz;9)+8W$P=UP44x@0cD`cMIr$KN&9$Jey&87+<_ z5sDMtSmm%C5ziwvKj09ul|_e7xVfAb-wi_B&lZFiIWK(?Q^l}GwIGK7u+m_t>QA+3 zo>?TtF@C3AOf_qmO*!&ZLDSBxq?~vq&W>CZS;O(T~i)xd`A>1Sa>_ z#u6>le`j(*Z4=vjZNY6Egi@*odc6f#ChN-p{N2JT+J#EGCXyY`EWD}|3S|gQr-Y_> ztu1c8x%R6@DuY0VpBxFySkZfO3H{Zp>1sMn*5|vPo&B%DrDm~a9%;4WTYas&CP41X zKRP|TogRk=%K{|ATniObNT+;09ZFuBI1nt_gNE!W&DFNX|5bHQs>Ude_#`0Ah5Mm# z+z*-s5IFV*F?}q|Alw+Sy-10&l24iQIK8!<3(FISqN^V~i{$5@l`pu9uzfZDihU=& zmW(aYx$}A0yTjwpczRRaEp5z1^5M?Ku!3WkSj$JxFBnd2R#>b}B3Fd@7QY?*8c|W2 zK&IX*JFMXSNsY4+jQNNUF=~vUiC8AL{R4#5;CZX z5G+a70RTw2S~P3=a68~T*iqAEZ^w^tMXs$@en-rgk!v2Wl~U99wht@86bu#>nMS0g zSa5gvcrH-s`XPy0tnB|7+h&e>^P%75H&^zP_OPjO^t zO(*7N#AiIc$kf8l-Ihnc22&SK zvUz!12jyV#6VzrUI?MZnTB>*d{Qn*AmdYWeVf)&N(v*gN&y;@~PB z6?C2K{(72mRjj#h6n1W;FmfcOe1=CNF-fWyetDqT2Kd+WYsNe&cFW~NASHYp-ZdY) zI9j@mYvk5p%24;C(%1d-k?)p)$6Hbs!hkqpEI^W?OsJ5g?h(CW3*> zHjy(ET>n>ti>*lGH~x@s#Zau;rS}*F3A}d8=8HPv()n!T1piXL<=1^pTcX=c4o@lO zb-)r|lsvoqUtHeSr1}|vuwFL6&u9IPEP|b7BF+Aw`>;wgFt>rVr>yoifhV-Q<*XlR z{PD*cVv&S)PM8p6M_;s!k=K6{ZByzS9ITB}qNM>)Sg*k7p}4u_e$>TDp9Tpu!_Ij0XP{XrvLx| literal 0 HcmV?d00001 diff --git a/api/storage/app/public/assets/default/favicon.png b/api/storage/app/public/assets/default/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6c5cb351fa7fba8d026f8984584cdf20f548f2 GIT binary patch literal 9104 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 literal 0 HcmV?d00001 diff --git a/api/storage/app/public/assets/default/login_bg.png b/api/storage/app/public/assets/default/login_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..787837a256587e81c2ffd3abcac0324acff7a718 GIT binary patch literal 59273 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 B-!K3G literal 0 HcmV?d00001 diff --git a/api/storage/app/public/assets/default/login_cover.png b/api/storage/app/public/assets/default/login_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..8415c6aa3b8aebab6eaffc030c345d0a952b86c9 GIT binary patch literal 122781 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�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 =phb+`9|E4S1*Fa9von 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 z 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 literal 0 HcmV?d00001 diff --git a/api/storage/app/public/assets/default/logo.png b/api/storage/app/public/assets/default/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9a6c5cb351fa7fba8d026f8984584cdf20f548f2 GIT binary patch literal 9104 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 literal 0 HcmV?d00001 diff --git a/api/storage/framework/.gitignore b/api/storage/framework/.gitignore new file mode 100644 index 0000000..05c4471 --- /dev/null +++ b/api/storage/framework/.gitignore @@ -0,0 +1,9 @@ +compiled.php +config.php +down +events.scanned.php +maintenance.php +routes.php +routes.scanned.php +schedule-* +services.json diff --git a/api/storage/framework/cache/.gitignore b/api/storage/framework/cache/.gitignore new file mode 100644 index 0000000..01e4a6c --- /dev/null +++ b/api/storage/framework/cache/.gitignore @@ -0,0 +1,3 @@ +* +!data/ +!.gitignore diff --git a/api/storage/framework/cache/data/.gitignore b/api/storage/framework/cache/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/api/storage/framework/cache/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/api/storage/framework/sessions/.gitignore b/api/storage/framework/sessions/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/api/storage/framework/sessions/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/api/storage/framework/testing/.gitignore b/api/storage/framework/testing/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/api/storage/framework/testing/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/api/storage/framework/views/.gitignore b/api/storage/framework/views/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/api/storage/framework/views/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/api/storage/logs/.gitignore b/api/storage/logs/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/api/storage/logs/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore