From f718ee48345cf5b5aa6f4408dac40be6d8a6c1fa Mon Sep 17 00:00:00 2001
From: kangwenjing <1138819403@qq.com>
Date: Tue, 17 Mar 2026 15:18:56 +0800
Subject: [PATCH] 1
---
public/vite.svg | 2 +-
.../sql/20260316_missing_page_menu_check.sql | 70 +++
.../20260316_permission_button_reconcile.sql | 256 ++++++++++
scripts/sql/20260316_worklog_menu_init.sql | 220 +++++++++
scripts/sql/20260317_page_menu_init.sql | 233 +++++++++
src/App.css | 2 +-
src/App.tsx | 181 ++++---
src/api/user.ts | 8 +
src/assets/error/404.png | 2 +-
src/assets/login-background.jpg | 2 +-
src/assets/pay.png | 2 +-
src/assets/react.svg | 2 +-
src/components/Navbar/index.tsx | 59 ++-
src/components/Navbar/navbar.css | 91 ++++
src/components/Permission/ReadonlyAction.tsx | 29 ++
src/components/Sidebar/index.tsx | 25 +-
src/components/Sidebar/sidebar.css | 74 +++
src/contexts/PermissionContext.tsx | 137 ++++--
src/index.css | 459 +++++++++++++++++-
src/layout/MainLayout.tsx | 37 +-
src/layout/layout.css | 129 ++++-
src/main.tsx | 113 ++++-
src/pages/Home/home.css | 222 ++++++++-
src/pages/Home/index.tsx | 180 ++++---
src/pages/Login/index.tsx | 165 +++++--
src/pages/Login/login.css | 274 +++++++++--
src/pages/Profile/AvatarUploader.tsx | 77 +++
src/pages/Profile/ResetPassword.tsx | 130 ++---
src/pages/Profile/UserInfo.tsx | 71 +--
src/pages/Profile/index.tsx | 194 ++++++--
src/pages/Profile/profile.css | 204 +++++++-
src/pages/dashboard/ProjectExecutionPage.tsx | 21 +-
src/pages/dashboard/project-execution.css | 13 +
src/pages/monitor/CacheListPage.tsx | 44 +-
src/pages/monitor/CacheMonitorPage.tsx | 10 +-
src/pages/monitor/JobMonitorPage.tsx | 96 ++--
src/pages/monitor/LoginLogPage.tsx | 71 +--
src/pages/monitor/OnlineUserPage.tsx | 22 +-
src/pages/monitor/OperationLogPage.tsx | 42 +-
src/pages/monitor/ServerMonitorPage.tsx | 11 +-
src/pages/monitor/cache-list.css | 2 +
src/pages/monitor/cache-monitor.css | 2 +
src/pages/monitor/job-monitor.css | 2 +
src/pages/monitor/login-log.css | 2 +
src/pages/monitor/monitor-shared.css | 74 +++
src/pages/monitor/online-user.css | 2 +
src/pages/monitor/operation-log.css | 2 +
src/pages/monitor/server-monitor.css | 2 +
src/pages/project/DemandManagePage.tsx | 203 +++++---
src/pages/project/ProjectDetailPage.tsx | 27 +-
src/pages/project/ProjectPage.tsx | 42 +-
src/pages/project/demand-manage.css | 120 +++++
src/pages/project/project-detail.css | 78 +++
src/pages/project/project.css | 24 +-
src/pages/projectBank/ProjectUserPage.tsx | 36 +-
src/pages/projectBank/UserProjectPage.tsx | 24 +-
src/pages/projectBank/UserScoreDetailPage.tsx | 2 +-
src/pages/projectBank/UserScorePage.tsx | 17 +-
src/pages/projectBank/project-user.css | 14 +
src/pages/projectBank/user-project.css | 11 +
src/pages/projectBank/user-score.css | 9 +
src/pages/system/ConfigPage.tsx | 118 +++--
src/pages/system/DeptPage.tsx | 37 +-
src/pages/system/DictPage.tsx | 116 +++--
src/pages/system/MenuPage.tsx | 459 +++++++++++++-----
src/pages/system/RolePage.tsx | 195 +++++---
src/pages/system/UserPage.tsx | 77 ++-
src/pages/system/config.css | 8 +-
src/pages/system/dept.css | 8 +-
src/pages/system/dict.css | 11 +-
src/pages/system/menu.css | 194 +++++++-
src/pages/system/role.css | 14 +-
src/pages/system/system-admin.css | 132 +++++
src/pages/system/user.css | 15 +-
.../workAppraisal/AppraisalDashboardPage.tsx | 39 +-
.../workAppraisal/AppraisalDetailPage.tsx | 36 +-
.../workAppraisal/AppraisalManagerPage.tsx | 24 +-
.../AppraisalManagerUserPage.tsx | 23 +-
.../AppraisalModuleDetailPage.tsx | 14 +-
src/pages/workAppraisal/ManagerPage.tsx | 30 +-
src/pages/workAppraisal/ManagerUserPage.tsx | 19 +-
src/pages/workAppraisal/NormalWorkerPage.tsx | 49 +-
src/pages/workAppraisal/TaskSetPage.tsx | 84 +++-
.../workAppraisal/appraisal-dashboard.css | 26 +-
src/pages/workAppraisal/appraisal-detail.css | 133 +++--
.../workAppraisal/appraisal-module-detail.css | 230 ++++++---
src/pages/workAppraisal/appraisal.css | 120 +++--
src/pages/workAppraisal/taskSet.css | 189 +++-----
src/pages/worklog/WorkLogPage.tsx | 216 ++++++---
src/pages/worklog/worklog.css | 403 ++++++++-------
src/routeMapper.ts | 6 +
src/styles/permission-link.css | 15 +
src/utils/echarts.ts | 15 +
src/utils/notify.ts | 43 ++
src/utils/request.ts | 18 +-
vite.config.ts | 66 +++
96 files changed, 6204 insertions(+), 1653 deletions(-)
create mode 100644 scripts/sql/20260316_missing_page_menu_check.sql
create mode 100644 scripts/sql/20260316_permission_button_reconcile.sql
create mode 100644 scripts/sql/20260316_worklog_menu_init.sql
create mode 100644 scripts/sql/20260317_page_menu_init.sql
create mode 100644 src/components/Navbar/navbar.css
create mode 100644 src/components/Permission/ReadonlyAction.tsx
create mode 100644 src/components/Sidebar/sidebar.css
create mode 100644 src/pages/Profile/AvatarUploader.tsx
create mode 100644 src/pages/monitor/monitor-shared.css
create mode 100644 src/pages/project/demand-manage.css
create mode 100644 src/pages/project/project-detail.css
create mode 100644 src/pages/system/system-admin.css
create mode 100644 src/styles/permission-link.css
create mode 100644 src/utils/echarts.ts
create mode 100644 src/utils/notify.ts
diff --git a/public/vite.svg b/public/vite.svg
index ee9fada..e7b8dfb 100644
--- a/public/vite.svg
+++ b/public/vite.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/scripts/sql/20260316_missing_page_menu_check.sql b/scripts/sql/20260316_missing_page_menu_check.sql
new file mode 100644
index 0000000..30d7b53
--- /dev/null
+++ b/scripts/sql/20260316_missing_page_menu_check.sql
@@ -0,0 +1,70 @@
+-- 页面菜单缺失清单 SQL
+-- 用途:
+-- 1. 检查前端当前已接入的页面路由,哪些还没有对应的 sys_menu 页面菜单
+-- 2. 只查询,不做插入
+--
+-- 说明:
+-- 1. 这里按前端当前实际路由整理了一份页面菜单基线
+-- 2. 仅检查 menu_type in ('M','C') 的目录/页面菜单
+-- 3. 管理员无需在角色管理中额外勾选页面;前端当前已按 admin 角色默认放行
+
+DROP TEMPORARY TABLE IF EXISTS tmp_page_menu_specs;
+CREATE TEMPORARY TABLE tmp_page_menu_specs (
+ path VARCHAR(128) NOT NULL,
+ component_like VARCHAR(255) NULL,
+ menu_name VARCHAR(128) NOT NULL,
+ remark VARCHAR(255) NULL
+);
+
+INSERT INTO tmp_page_menu_specs (path, component_like, menu_name, remark) VALUES
+('index', '%worklog%', '工作日志', 'WorkLogPage 首页'),
+('dashboard/project-execution', '%dashboard/project-execution%', '项目进度', 'ProjectExecutionPage'),
+('projectBank/projectProgress', '%dashboard/project-execution%', '项目进度(兼容)', 'ProjectExecutionPage 别名路由'),
+('projectBank/projectUser', '%projectBank/projectUser%', '项目成员', 'ProjectUserPage'),
+('projectBank/userProject', '%projectBank/userProject%', '人员项目', 'UserProjectPage'),
+('projectBank/userScore', '%projectBank/userScore%', '我的绩效', 'UserScorePage'),
+('projectBank/userScoreDetail', '%projectBank/userScoreDetail%', '绩效详情', 'UserScoreDetailPage'),
+('user/profile', '%Profile%', '个人中心', 'ProfilePage'),
+('monitor/cache', '%monitor/cache%', '缓存监控', 'CacheMonitorPage'),
+('monitor/job', '%monitor/job%', '定时任务', 'JobMonitorPage'),
+('monitor/logininfor', '%monitor/login%', '登录日志', 'LoginLogPage'),
+('monitor/online', '%monitor/online%', '在线用户', 'OnlineUserPage'),
+('monitor/operlog', '%monitor/operation%', '操作日志', 'OperationLogPage'),
+('monitor/server', '%monitor/server%', '服务监控', 'ServerMonitorPage'),
+('monitor/cacheList', '%monitor/cache-list%', '缓存列表', 'CacheListPage'),
+('system/user', '%system/user%', '用户管理', 'UserPage'),
+('system/role', '%system/role%', '角色管理', 'RolePage'),
+('system/menu', '%system/menu%', '菜单管理', 'MenuPage'),
+('system/dept', '%system/dept%', '部门管理', 'DeptPage'),
+('system/dict', '%system/dict%', '字典管理', 'DictPage'),
+('system/config', '%system/config%', '参数配置', 'ConfigPage'),
+('project', '%project/list%', '项目管理', 'ProjectPage 后端标准路径'),
+('project/list', '%project/list%', '项目管理', 'ProjectPage 前端兼容路径'),
+('project/detail', '%project/detail%', '项目详情', 'ProjectDetailPage'),
+('project/demandManage', '%project/%DemandManage%', '需求管理', 'DemandManagePage 后端路径'),
+('demandManage', '%project/%DemandManage%', '需求管理', 'DemandManagePage 前端兼容路径'),
+('workAppraisal/manager', '%workAppraisal/ManagerPage%', '经理评分', 'ManagerPage'),
+('workAppraisal/normalWorker', '%workAppraisal/NormalWorkerPage%', '员工评分', 'NormalWorkerPage'),
+('workAppraisal/managerUser', '%workAppraisal/ManagerUserPage%', '经理评分用户', 'ManagerUserPage'),
+('workAppraisal/taskSet', '%workAppraisal/TaskSetPage%', '任务设置', 'TaskSetPage'),
+('workAppraisal/detail', '%workAppraisal/AppraisalDetailPage%', '评分详情', 'AppraisalDetailPage'),
+('workAppraisal/taskModule', '%workAppraisal/AppraisalDashboardPage%', '绩效看板', 'AppraisalDashboardPage'),
+('workAppraisal/dashboard', '%workAppraisal/AppraisalDashboardPage%', '绩效看板(兼容)', 'AppraisalDashboardPage 别名路由'),
+('workAppraisal/moduleDetail', '%workAppraisal/AppraisalModuleDetailPage%', '模块详情', 'AppraisalModuleDetailPage'),
+('workAppraisal/myPerformance', '%projectBank/userScore%', '我的绩效(兼容)', 'UserScorePage 前端映射');
+
+SELECT
+ s.path,
+ s.menu_name,
+ s.remark
+FROM tmp_page_menu_specs s
+WHERE NOT EXISTS (
+ SELECT 1
+ FROM sys_menu m
+ WHERE m.menu_type IN ('M', 'C')
+ AND (
+ m.path = s.path
+ OR (s.component_like IS NOT NULL AND s.component_like <> '' AND m.component LIKE s.component_like)
+ )
+)
+ORDER BY s.path;
diff --git a/scripts/sql/20260316_permission_button_reconcile.sql b/scripts/sql/20260316_permission_button_reconcile.sql
new file mode 100644
index 0000000..9cc066d
--- /dev/null
+++ b/scripts/sql/20260316_permission_button_reconcile.sql
@@ -0,0 +1,256 @@
+-- 权限按钮对账与补齐脚本
+-- 用途:
+-- 1. 根据前端当前实际使用到的权限码,对 sys_menu 中的按钮菜单做补齐
+-- 2. 仅插入缺失按钮,不修改已有按钮,不重复插入
+-- 3. 执行前会先输出“未找到父页面菜单”的按钮清单,便于先补页面再补按钮
+--
+-- 说明:
+-- 1. 当前环境无法直接连库校验,这份脚本基于前端代码中的权限使用点生成
+-- 2. 父页面使用 sys_menu.path 定位,个别页面补充 component 模糊匹配兜底
+-- 3. 同一权限码如果在多个页面中复用,会按页面分别补按钮节点
+
+START TRANSACTION;
+
+DROP TEMPORARY TABLE IF EXISTS tmp_permission_button_specs;
+CREATE TEMPORARY TABLE tmp_permission_button_specs (
+ parent_path VARCHAR(128) NOT NULL,
+ parent_component_like VARCHAR(255) NULL,
+ menu_name VARCHAR(128) NOT NULL,
+ perms VARCHAR(128) NOT NULL,
+ order_num INT NOT NULL DEFAULT 1,
+ remark VARCHAR(255) NULL
+);
+
+INSERT INTO tmp_permission_button_specs (parent_path, parent_component_like, menu_name, perms, order_num, remark) VALUES
+-- 工作日志
+('index', '%worklog%', '新增日志', 'business:work:hour:add', 1, 'WorkLogPage 添加日志'),
+('index', '%worklog%', '编辑日志', 'business:work:hour:edit', 2, 'WorkLogPage 编辑/确认'),
+('index', '%worklog%', '更新日志', 'business:work:hour:update', 3, 'WorkLogPage 兼容旧权限码'),
+('index', '%worklog%', '删除日志', 'business:work:hour:remove', 4, 'WorkLogPage 删除/取消'),
+
+-- 项目管理
+('project', '%project/list%', '新增项目', 'business:project:add', 1, 'ProjectPage'),
+('project', '%project/list%', '编辑项目', 'business:project:edit', 2, 'ProjectPage/ProjectDetailPage'),
+('project', '%project/list%', '删除项目', 'business:project:remove', 3, 'ProjectPage'),
+('project', '%project/list%', '查看需求', 'project:demand:list', 4, 'ProjectPage'),
+
+-- 需求管理
+('demandManage', NULL, '新增需求', 'project:demand:add', 1, 'DemandManagePage'),
+('demandManage', NULL, '编辑需求', 'project:demand:edit', 2, 'DemandManagePage'),
+('demandManage', NULL, '删除需求', 'project:demand:remove', 3, 'DemandManagePage'),
+('demandManage', NULL, '新增版本', 'project:version:add', 4, 'DemandManagePage'),
+('demandManage', NULL, '编辑版本', 'project:version:edit', 5, 'DemandManagePage'),
+('demandManage', NULL, '删除版本', 'project:version:remove', 6, 'DemandManagePage'),
+
+-- 任务监控
+('job', NULL, '新增任务', 'monitor:job:add', 1, 'JobMonitorPage'),
+('job', NULL, '编辑任务', 'monitor:job:edit', 2, 'JobMonitorPage'),
+('job', NULL, '删除任务', 'monitor:job:remove', 3, 'JobMonitorPage'),
+('job', NULL, '导出任务', 'monitor:job:export', 4, 'JobMonitorPage'),
+('job', NULL, '查询任务', 'monitor:job:query', 5, 'JobMonitorPage'),
+('job', NULL, '状态修改', 'monitor:job:changeStatus', 6, 'JobMonitorPage'),
+
+-- 缓存列表
+('cacheList', NULL, '清理缓存', 'monitor:cache:clear', 1, 'CacheListPage'),
+
+-- 在线用户
+('online', NULL, '强退用户', 'monitor:online:forceLogout', 1, 'OnlineUserPage'),
+
+-- 登录日志
+('logininfor', NULL, '删除日志', 'monitor:logininfor:remove', 1, 'LoginLogPage'),
+('logininfor', NULL, '清空日志', 'monitor:logininfor:clean', 2, 'LoginLogPage'),
+('logininfor', NULL, '账户解锁', 'monitor:logininfor:unlock', 3, 'LoginLogPage'),
+('logininfor', NULL, '导出日志', 'monitor:logininfor:export', 4, 'LoginLogPage'),
+
+-- 操作日志
+('operlog', NULL, '删除日志', 'monitor:operlog:remove', 1, 'OperationLogPage'),
+('operlog', NULL, '清空日志', 'monitor:operlog:clean', 2, 'OperationLogPage'),
+('operlog', NULL, '导出日志', 'monitor:operlog:export', 3, 'OperationLogPage'),
+
+-- 用户管理
+('user', NULL, '新增用户', 'system:user:add', 1, 'UserPage'),
+('user', NULL, '修改用户', 'system:user:edit', 2, 'UserPage'),
+('user', NULL, '删除用户', 'system:user:remove', 3, 'UserPage'),
+('user', NULL, '重置密码', 'system:user:resetPwd', 4, 'UserPage'),
+
+-- 角色管理
+('role', NULL, '新增角色', 'system:role:add', 1, 'RolePage'),
+('role', NULL, '修改角色', 'system:role:edit', 2, 'RolePage'),
+('role', NULL, '删除角色', 'system:role:remove', 3, 'RolePage'),
+('role', NULL, '导出角色', 'system:role:export', 4, 'RolePage'),
+('role', NULL, '数据权限', 'system:role:dataScope', 5, 'RolePage'),
+('role', NULL, '分配用户', 'system:role:authUser', 6, 'RolePage'),
+
+-- 菜单管理
+('menu', NULL, '新增菜单', 'system:menu:add', 1, 'MenuPage'),
+('menu', NULL, '修改菜单', 'system:menu:edit', 2, 'MenuPage'),
+('menu', NULL, '删除菜单', 'system:menu:remove', 3, 'MenuPage'),
+
+-- 部门管理
+('dept', NULL, '新增部门', 'system:dept:add', 1, 'DeptPage'),
+('dept', NULL, '修改部门', 'system:dept:edit', 2, 'DeptPage'),
+('dept', NULL, '删除部门', 'system:dept:remove', 3, 'DeptPage'),
+
+-- 字典管理
+('dict', NULL, '新增字典', 'system:dict:add', 1, 'DictPage'),
+('dict', NULL, '修改字典', 'system:dict:edit', 2, 'DictPage'),
+('dict', NULL, '删除字典', 'system:dict:remove', 3, 'DictPage'),
+('dict', NULL, '导出字典', 'system:dict:export', 4, 'DictPage'),
+('dict', NULL, '刷新缓存', 'system:dict:refreshCache', 5, 'DictPage'),
+
+-- 参数配置
+('config', NULL, '新增参数', 'system:config:add', 1, 'ConfigPage'),
+('config', NULL, '修改参数', 'system:config:edit', 2, 'ConfigPage'),
+('config', NULL, '删除参数', 'system:config:remove', 3, 'ConfigPage'),
+('config', NULL, '导出参数', 'system:config:export', 4, 'ConfigPage'),
+('config', NULL, '刷新缓存', 'system:config:refreshCache', 5, 'ConfigPage'),
+
+-- 绩效任务设置
+('taskSet', NULL, '新增任务', 'task:add', 1, 'TaskSetPage'),
+('taskSet', NULL, '创建任务', 'task:create', 2, 'TaskSetPage 兼容旧权限码'),
+('taskSet', NULL, '编辑任务', 'task:edit', 3, 'TaskSetPage'),
+('taskSet', NULL, '更新任务', 'task:update', 4, 'TaskSetPage 兼容旧权限码'),
+('taskSet', NULL, '删除任务', 'task:remove', 5, 'TaskSetPage'),
+('taskSet', NULL, '删除任务兼容', 'task:delete', 6, 'TaskSetPage 兼容旧权限码'),
+('taskSet', NULL, '指标配置', 'task:config', 7, 'TaskSetPage'),
+('taskSet', NULL, '设置指标', 'task:set', 8, 'TaskSetPage 兼容旧权限码'),
+
+-- 绩效看板
+('taskModule', NULL, '删除模板', 'examine:template:remove', 1, 'AppraisalDashboardPage'),
+('taskModule', NULL, '删除模板兼容', 'examine:template:delete', 2, 'AppraisalDashboardPage 兼容旧权限码'),
+
+-- 绩效打分相关页面
+('manager', NULL, '新增评分', 'examine:detail:add', 1, 'ManagerPage'),
+('manager', NULL, '编辑评分', 'examine:detail:edit', 2, 'ManagerPage'),
+('manager', NULL, '提交评分', 'examine:detail:submit', 3, 'ManagerPage'),
+
+('managerUser', NULL, '新增评分', 'examine:detail:add', 1, 'ManagerUserPage'),
+('managerUser', NULL, '编辑评分', 'examine:detail:edit', 2, 'ManagerUserPage'),
+('managerUser', NULL, '提交评分', 'examine:detail:submit', 3, 'ManagerUserPage'),
+
+('normalWorker', NULL, '新增评分', 'examine:detail:add', 1, 'NormalWorkerPage'),
+('normalWorker', NULL, '编辑评分', 'examine:detail:edit', 2, 'NormalWorkerPage'),
+('normalWorker', NULL, '提交评分', 'examine:detail:submit', 3, 'NormalWorkerPage'),
+
+('detail', NULL, '新增评分', 'examine:detail:add', 1, 'AppraisalDetailPage'),
+('detail', NULL, '编辑评分', 'examine:detail:edit', 2, 'AppraisalDetailPage'),
+('detail', NULL, '提交评分', 'examine:detail:submit', 3, 'AppraisalDetailPage');
+
+-- 先看哪些按钮找不到父页面
+SELECT
+ s.parent_path,
+ s.menu_name,
+ s.perms,
+ s.remark
+FROM tmp_permission_button_specs s
+WHERE (
+ SELECT m.menu_id
+ FROM sys_menu m
+ WHERE m.menu_type IN ('M', 'C')
+ AND (
+ m.path = s.parent_path
+ OR (s.parent_component_like IS NOT NULL AND s.parent_component_like <> '' AND m.component LIKE s.parent_component_like)
+ )
+ ORDER BY
+ CASE WHEN m.path = s.parent_path THEN 0 ELSE 1 END,
+ m.menu_id
+ LIMIT 1
+) IS NULL
+ORDER BY s.parent_path, s.order_num;
+
+-- 补齐缺失按钮
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ s.menu_name,
+ (
+ SELECT m.menu_id
+ FROM sys_menu m
+ WHERE m.menu_type IN ('M', 'C')
+ AND (
+ m.path = s.parent_path
+ OR (s.parent_component_like IS NOT NULL AND s.parent_component_like <> '' AND m.component LIKE s.parent_component_like)
+ )
+ ORDER BY
+ CASE WHEN m.path = s.parent_path THEN 0 ELSE 1 END,
+ m.menu_id
+ LIMIT 1
+ ) AS parent_id,
+ s.order_num,
+ '#',
+ '',
+ '',
+ '1',
+ '0',
+ 'F',
+ '0',
+ '0',
+ s.perms,
+ '#',
+ 'codex',
+ NOW(),
+ s.remark
+FROM tmp_permission_button_specs s
+WHERE (
+ SELECT m.menu_id
+ FROM sys_menu m
+ WHERE m.menu_type IN ('M', 'C')
+ AND (
+ m.path = s.parent_path
+ OR (s.parent_component_like IS NOT NULL AND s.parent_component_like <> '' AND m.component LIKE s.parent_component_like)
+ )
+ ORDER BY
+ CASE WHEN m.path = s.parent_path THEN 0 ELSE 1 END,
+ m.menu_id
+ LIMIT 1
+) IS NOT NULL
+AND NOT EXISTS (
+ SELECT 1
+ FROM sys_menu f
+ WHERE f.menu_type = 'F'
+ AND f.perms = s.perms
+ AND f.parent_id = (
+ SELECT m.menu_id
+ FROM sys_menu m
+ WHERE m.menu_type IN ('M', 'C')
+ AND (
+ m.path = s.parent_path
+ OR (s.parent_component_like IS NOT NULL AND s.parent_component_like <> '' AND m.component LIKE s.parent_component_like)
+ )
+ ORDER BY
+ CASE WHEN m.path = s.parent_path THEN 0 ELSE 1 END,
+ m.menu_id
+ LIMIT 1
+ )
+);
+
+-- 补齐后可查看这一批按钮
+SELECT
+ p.menu_name AS parent_menu_name,
+ p.path AS parent_path,
+ c.menu_name,
+ c.perms,
+ c.order_num
+FROM sys_menu c
+INNER JOIN sys_menu p ON p.menu_id = c.parent_id
+WHERE c.menu_type = 'F'
+ AND c.create_by = 'codex'
+ORDER BY p.path, c.order_num, c.menu_id;
+
+COMMIT;
diff --git a/scripts/sql/20260316_worklog_menu_init.sql b/scripts/sql/20260316_worklog_menu_init.sql
new file mode 100644
index 0000000..3e9c809
--- /dev/null
+++ b/scripts/sql/20260316_worklog_menu_init.sql
@@ -0,0 +1,220 @@
+-- 工作日志菜单与按钮补录
+-- 目标:
+-- 1. 确保 sys_menu 中存在工作日志页面菜单(/index)
+-- 2. 为工作日志页面补齐按钮权限项
+-- 3. 所有插入都做不存在判断,避免重复
+--
+-- 对应前端逻辑:
+-- - 页面路由:/index
+-- - 页面组件:component 包含 worklog 即可被前端识别为工作日志页
+-- - 按钮权限:
+-- business:work:hour:add
+-- business:work:hour:edit
+-- business:work:hour:remove
+
+START TRANSACTION;
+
+-- 1. 如果工作日志页面菜单不存在,则补一条页面菜单
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ '工作日志',
+ 0,
+ 1,
+ 'index',
+ 'worklog/index',
+ '',
+ '1',
+ '0',
+ 'C',
+ '0',
+ '0',
+ 'business:work:hour:list',
+ 'dashboard',
+ 'codex',
+ NOW(),
+ '工作日志首页菜单'
+FROM DUAL
+WHERE NOT EXISTS (
+ SELECT 1
+ FROM sys_menu
+ WHERE menu_type IN ('M', 'C')
+ AND (
+ path IN ('index', '/index')
+ OR component LIKE '%worklog%'
+ )
+);
+
+-- 2. 定位工作日志页面菜单
+SET @worklog_menu_id := (
+ SELECT menu_id
+ FROM sys_menu
+ WHERE menu_type IN ('M', 'C')
+ AND (
+ path IN ('index', '/index')
+ OR component LIKE '%worklog%'
+ )
+ ORDER BY
+ CASE
+ WHEN path IN ('index', '/index') THEN 0
+ ELSE 1
+ END,
+ menu_id
+ LIMIT 1
+);
+
+-- 3. 补录按钮:新增日志
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ '新增日志',
+ @worklog_menu_id,
+ 1,
+ '#',
+ '',
+ '',
+ '1',
+ '0',
+ 'F',
+ '0',
+ '0',
+ 'business:work:hour:add',
+ '#',
+ 'codex',
+ NOW(),
+ '工作日志页按钮:添加日志'
+FROM DUAL
+WHERE @worklog_menu_id IS NOT NULL
+ AND NOT EXISTS (
+ SELECT 1
+ FROM sys_menu
+ WHERE parent_id = @worklog_menu_id
+ AND menu_type = 'F'
+ AND perms = 'business:work:hour:add'
+ );
+
+-- 4. 补录按钮:编辑日志
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ '编辑日志',
+ @worklog_menu_id,
+ 2,
+ '#',
+ '',
+ '',
+ '1',
+ '0',
+ 'F',
+ '0',
+ '0',
+ 'business:work:hour:edit',
+ '#',
+ 'codex',
+ NOW(),
+ '工作日志页按钮:编辑/确认'
+FROM DUAL
+WHERE @worklog_menu_id IS NOT NULL
+ AND NOT EXISTS (
+ SELECT 1
+ FROM sys_menu
+ WHERE parent_id = @worklog_menu_id
+ AND menu_type = 'F'
+ AND perms = 'business:work:hour:edit'
+ );
+
+-- 5. 补录按钮:删除日志
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ '删除日志',
+ @worklog_menu_id,
+ 3,
+ '#',
+ '',
+ '',
+ '1',
+ '0',
+ 'F',
+ '0',
+ '0',
+ 'business:work:hour:remove',
+ '#',
+ 'codex',
+ NOW(),
+ '工作日志页按钮:删除/取消'
+FROM DUAL
+WHERE @worklog_menu_id IS NOT NULL
+ AND NOT EXISTS (
+ SELECT 1
+ FROM sys_menu
+ WHERE parent_id = @worklog_menu_id
+ AND menu_type = 'F'
+ AND perms = 'business:work:hour:remove'
+ );
+
+COMMIT;
diff --git a/scripts/sql/20260317_page_menu_init.sql b/scripts/sql/20260317_page_menu_init.sql
new file mode 100644
index 0000000..7a9377c
--- /dev/null
+++ b/scripts/sql/20260317_page_menu_init.sql
@@ -0,0 +1,233 @@
+-- 页面菜单自动补齐 SQL
+-- 目标:
+-- 1. 按若依常见模型补齐目录(M)与页面(C)菜单
+-- 2. 管理员无需依赖 sys_role_menu 勾选;前端已按 admin 角色默认放行
+-- 3. 仅插入缺失菜单,不重复插入
+--
+-- 说明:
+-- 1. 本脚本不删除已有数据,只补齐缺失目录/页面
+-- 2. 页面 path 采用“目录 + 子页面”的常见结构,贴近若依模型
+-- 3. 一些详情类页面设为隐藏 visible = '1',保留访问能力但不在侧边栏展示
+
+START TRANSACTION;
+
+DROP TEMPORARY TABLE IF EXISTS tmp_menu_dir_specs;
+CREATE TEMPORARY TABLE tmp_menu_dir_specs (
+ path VARCHAR(128) NOT NULL,
+ menu_name VARCHAR(128) NOT NULL,
+ icon VARCHAR(64) NULL,
+ order_num INT NOT NULL DEFAULT 1,
+ remark VARCHAR(255) NULL
+);
+
+DROP TEMPORARY TABLE IF EXISTS tmp_menu_page_specs;
+CREATE TEMPORARY TABLE tmp_menu_page_specs (
+ parent_path VARCHAR(128) NULL,
+ menu_name VARCHAR(128) NOT NULL,
+ path VARCHAR(128) NOT NULL,
+ component VARCHAR(255) NOT NULL,
+ perms VARCHAR(128) NULL,
+ icon VARCHAR(64) NULL,
+ order_num INT NOT NULL DEFAULT 1,
+ visible CHAR(1) NOT NULL DEFAULT '0',
+ is_cache CHAR(1) NOT NULL DEFAULT '0',
+ remark VARCHAR(255) NULL
+);
+
+INSERT INTO tmp_menu_dir_specs (path, menu_name, icon, order_num, remark) VALUES
+('dashboard', '看板统计', 'dashboard', 1, '首页看板目录'),
+('projectBank', '项目库', 'table', 2, '项目库目录'),
+('monitor', '系统监控', 'monitor', 3, '监控目录'),
+('system', '系统管理', 'system', 4, '系统管理目录'),
+('project', '项目管理', 'table', 5, '项目目录'),
+('workAppraisal', '绩效管理', 'chart', 6, '绩效目录'),
+('user', '用户中心', 'user', 7, '个人中心目录');
+
+INSERT INTO tmp_menu_page_specs (parent_path, menu_name, path, component, perms, icon, order_num, visible, is_cache, remark) VALUES
+-- 根页面
+(NULL, '工作日志', 'index', 'worklog/index', 'business:work:hour:list', 'dashboard', 1, '0', '0', '工作日志首页'),
+
+-- 看板统计
+('dashboard', '项目进度', 'project-execution', 'dashboard/project-execution', NULL, 'table', 1, '0', '0', '项目进度页面'),
+
+-- 项目库
+('projectBank', '项目进度(兼容)', 'projectProgress', 'dashboard/project-execution', NULL, 'table', 1, '1', '0', '兼容旧路径'),
+('projectBank', '项目成员', 'projectUser', 'projectBank/projectUser', NULL, 'peoples', 2, '0', '0', '项目成员页面'),
+('projectBank', '人员项目', 'userProject', 'projectBank/userProject', NULL, 'table', 3, '0', '0', '人员项目页面'),
+('projectBank', '我的绩效', 'userScore', 'projectBank/userScore', NULL, 'chart', 4, '0', '0', '我的绩效页面'),
+('projectBank', '绩效详情', 'userScoreDetail', 'projectBank/userScoreDetail', NULL, 'form', 5, '1', '0', '绩效详情页'),
+
+-- 用户中心
+('user', '个人中心', 'profile', 'profile/index', NULL, 'user', 1, '1', '0', '个人中心页面'),
+
+-- 系统监控
+('monitor', '缓存监控', 'cache', 'monitor/cache/index', NULL, 'cache', 1, '0', '0', '缓存监控'),
+('monitor', '定时任务', 'job', 'monitor/job/index', NULL, 'job', 2, '0', '0', '定时任务'),
+('monitor', '登录日志', 'logininfor', 'monitor/logininfor/index', NULL, 'user', 3, '0', '0', '登录日志'),
+('monitor', '在线用户', 'online', 'monitor/online/index', NULL, 'online', 4, '0', '0', '在线用户'),
+('monitor', '操作日志', 'operlog', 'monitor/operlog/index', NULL, 'form', 5, '0', '0', '操作日志'),
+('monitor', '服务监控', 'server', 'monitor/server/index', NULL, 'server', 6, '0', '0', '服务监控'),
+('monitor', '缓存列表', 'cacheList', 'monitor/cache-list/index', NULL, 'cache', 7, '0', '0', '缓存列表'),
+
+-- 系统管理
+('system', '用户管理', 'user', 'system/user/index', NULL, 'user', 1, '0', '0', '用户管理'),
+('system', '角色管理', 'role', 'system/role/index', NULL, 'peoples', 2, '0', '0', '角色管理'),
+('system', '菜单管理', 'menu', 'system/menu/index', NULL, 'tree-table', 3, '0', '0', '菜单管理'),
+('system', '部门管理', 'dept', 'system/dept/index', NULL, 'tree', 4, '0', '0', '部门管理'),
+('system', '字典管理', 'dict', 'system/dict/index', NULL, 'dict', 5, '0', '0', '字典管理'),
+('system', '参数配置', 'config', 'system/config/index', NULL, 'edit', 6, '0', '0', '参数配置'),
+
+-- 项目管理
+('project', '项目列表', 'list', 'project/list', NULL, 'table', 1, '0', '0', '项目列表'),
+('project', '项目详情', 'detail', 'project/detail', NULL, 'form', 2, '1', '0', '项目详情页'),
+('project', '需求管理', 'demandManage', 'project/DemandManagePage', NULL, 'edit', 3, '0', '0', '需求管理'),
+
+-- 绩效管理
+('workAppraisal', '经理评分', 'manager', 'workAppraisal/manager', NULL, 'build', 1, '0', '0', '经理评分页'),
+('workAppraisal', '员工评分', 'normalWorker', 'workAppraisal/normalWorker', NULL, 'chart', 2, '0', '0', '员工评分页'),
+('workAppraisal', '经理评分用户', 'managerUser', 'workAppraisal/managerUser', NULL, 'peoples', 3, '1', '0', '经理评分用户页'),
+('workAppraisal', '任务设置', 'taskSet', 'workAppraisal/taskSet', NULL, 'tool', 4, '0', '0', '任务设置页'),
+('workAppraisal', '评分详情', 'detail', 'workAppraisal/detail', NULL, 'form', 5, '1', '0', '评分详情页'),
+('workAppraisal', '绩效看板', 'taskModule', 'workAppraisal/taskModule', NULL, 'chart', 6, '0', '0', '绩效看板页'),
+('workAppraisal', '绩效看板(兼容)', 'dashboard', 'workAppraisal/taskModule', NULL, 'chart', 7, '1', '0', '兼容旧路径'),
+('workAppraisal', '模块详情', 'moduleDetail', 'workAppraisal/moduleDetail', NULL, 'form', 8, '1', '0', '模块详情页'),
+('workAppraisal', '我的绩效(兼容)', 'myPerformance', 'projectBank/userScore', NULL, 'chart', 9, '1', '0', '兼容旧路径');
+
+-- 1. 先补目录
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ d.menu_name,
+ 0,
+ d.order_num,
+ d.path,
+ '',
+ '',
+ '1',
+ '0',
+ 'M',
+ '0',
+ '0',
+ '',
+ d.icon,
+ 'codex',
+ NOW(),
+ d.remark
+FROM tmp_menu_dir_specs d
+WHERE NOT EXISTS (
+ SELECT 1
+ FROM sys_menu m
+ WHERE m.menu_type IN ('M', 'C')
+ AND m.parent_id = 0
+ AND m.path = d.path
+);
+
+-- 2. 再补页面
+INSERT INTO sys_menu (
+ menu_name,
+ parent_id,
+ order_num,
+ path,
+ component,
+ query,
+ is_frame,
+ is_cache,
+ menu_type,
+ visible,
+ status,
+ perms,
+ icon,
+ create_by,
+ create_time,
+ remark
+)
+SELECT
+ p.menu_name,
+ CASE
+ WHEN p.parent_path IS NULL OR p.parent_path = '' THEN 0
+ ELSE (
+ SELECT m.menu_id
+ FROM sys_menu m
+ WHERE m.menu_type = 'M'
+ AND m.path = p.parent_path
+ ORDER BY m.menu_id
+ LIMIT 1
+ )
+ END AS parent_id,
+ p.order_num,
+ p.path,
+ p.component,
+ '',
+ '1',
+ p.is_cache,
+ 'C',
+ p.visible,
+ '0',
+ COALESCE(p.perms, ''),
+ p.icon,
+ 'codex',
+ NOW(),
+ p.remark
+FROM tmp_menu_page_specs p
+WHERE (
+ p.parent_path IS NULL
+ OR EXISTS (
+ SELECT 1
+ FROM sys_menu m
+ WHERE m.menu_type = 'M'
+ AND m.path = p.parent_path
+ )
+)
+AND NOT EXISTS (
+ SELECT 1
+ FROM sys_menu c
+ WHERE c.menu_type IN ('M', 'C')
+ AND c.path = p.path
+ AND (
+ c.component = p.component
+ OR c.menu_name = p.menu_name
+ )
+ AND c.parent_id = CASE
+ WHEN p.parent_path IS NULL OR p.parent_path = '' THEN 0
+ ELSE (
+ SELECT m.menu_id
+ FROM sys_menu m
+ WHERE m.menu_type = 'M'
+ AND m.path = p.parent_path
+ ORDER BY m.menu_id
+ LIMIT 1
+ )
+ END
+);
+
+-- 3. 查看本次补齐结果
+SELECT
+ parent.menu_name AS parent_menu_name,
+ child.menu_name,
+ child.path,
+ child.component,
+ child.menu_type,
+ child.visible
+FROM sys_menu child
+LEFT JOIN sys_menu parent ON parent.menu_id = child.parent_id
+WHERE child.create_by = 'codex'
+ AND child.menu_type IN ('M', 'C')
+ORDER BY child.parent_id, child.order_num, child.menu_id;
+
+COMMIT;
diff --git a/src/App.css b/src/App.css
index 4a335ae..8e37785 100644
--- a/src/App.css
+++ b/src/App.css
@@ -1 +1 @@
-/* Remove default styles */
+/* Remove default styles */
\ No newline at end of file
diff --git a/src/App.tsx b/src/App.tsx
index 791ac7f..5e11781 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,45 +1,53 @@
+import { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate, Outlet, useLocation } from 'react-router-dom';
import { Spin } from 'antd';
-import LoginPage from './pages/Login';
-import JobMonitorPage from './pages/monitor/JobMonitorPage';
-import CacheMonitorPage from './pages/monitor/CacheMonitorPage';
-import LoginLogPage from './pages/monitor/LoginLogPage'; // Import LoginLogPage
-import OnlineUserPage from './pages/monitor/OnlineUserPage'; // Import OnlineUserPage
-import OperationLogPage from './pages/monitor/OperationLogPage'; // Import OperationLogPage
-import ServerMonitorPage from './pages/monitor/ServerMonitorPage'; // Import ServerMonitorPage
-import CacheListPage from './pages/monitor/CacheListPage'; // Import CacheListPage
-import UserPage from './pages/system/UserPage'; // Import UserPage
-import RolePage from './pages/system/RolePage'; // Import RolePage
-import MenuPage from './pages/system/MenuPage'; // Import MenuPage
-import DeptPage from './pages/system/DeptPage'; // Import DeptPage
-import DictPage from './pages/system/DictPage'; // Import DictPage
-import ConfigPage from './pages/system/ConfigPage'; // Import ConfigPage
-import ProjectPage from './pages/project/ProjectPage'; // Import ProjectPage
-import ProjectDetailPage from './pages/project/ProjectDetailPage'; // Import ProjectDetailPage
-import DemandManagePage from './pages/project/DemandManagePage'; // Import DemandManagePage
-import TaskSetPage from './pages/workAppraisal/TaskSetPage'; // Import TaskSetPage
-import ManagerPage from './pages/workAppraisal/ManagerPage';
-import ManagerUserPage from './pages/workAppraisal/ManagerUserPage';
-import AppraisalDetailPage from './pages/workAppraisal/AppraisalDetailPage'; // Import AppraisalDetailPage
-import NormalWorkerPage from './pages/workAppraisal/NormalWorkerPage';
-import AppraisalDashboardPage from './pages/workAppraisal/AppraisalDashboardPage';
-import AppraisalModuleDetailPage from './pages/workAppraisal/AppraisalModuleDetailPage';
-import WorkLogPage from './pages/worklog/WorkLogPage'; // Import WorkLogPage
-import ProjectExecutionPage from './pages/dashboard/ProjectExecutionPage';
-import ProjectUserPage from './pages/projectBank/ProjectUserPage';
-import UserProjectPage from './pages/projectBank/UserProjectPage';
-import UserScorePage from './pages/projectBank/UserScorePage';
-import UserScoreDetailPage from './pages/projectBank/UserScoreDetailPage';
-import ProfilePage from './pages/Profile';
-import MainLayout from './layout/MainLayout';
import './App.css';
import { getToken } from './utils/auth';
import { PermissionProvider, usePermission } from './contexts/PermissionContext';
+const LoginPage = lazy(() => import('./pages/Login'));
+const MainLayout = lazy(() => import('./layout/MainLayout'));
+const JobMonitorPage = lazy(() => import('./pages/monitor/JobMonitorPage'));
+const CacheMonitorPage = lazy(() => import('./pages/monitor/CacheMonitorPage'));
+const LoginLogPage = lazy(() => import('./pages/monitor/LoginLogPage'));
+const OnlineUserPage = lazy(() => import('./pages/monitor/OnlineUserPage'));
+const OperationLogPage = lazy(() => import('./pages/monitor/OperationLogPage'));
+const ServerMonitorPage = lazy(() => import('./pages/monitor/ServerMonitorPage'));
+const CacheListPage = lazy(() => import('./pages/monitor/CacheListPage'));
+const UserPage = lazy(() => import('./pages/system/UserPage'));
+const RolePage = lazy(() => import('./pages/system/RolePage'));
+const MenuPage = lazy(() => import('./pages/system/MenuPage'));
+const DeptPage = lazy(() => import('./pages/system/DeptPage'));
+const DictPage = lazy(() => import('./pages/system/DictPage'));
+const ConfigPage = lazy(() => import('./pages/system/ConfigPage'));
+const ProjectPage = lazy(() => import('./pages/project/ProjectPage'));
+const ProjectDetailPage = lazy(() => import('./pages/project/ProjectDetailPage'));
+const DemandManagePage = lazy(() => import('./pages/project/DemandManagePage'));
+const TaskSetPage = lazy(() => import('./pages/workAppraisal/TaskSetPage'));
+const ManagerPage = lazy(() => import('./pages/workAppraisal/ManagerPage'));
+const ManagerUserPage = lazy(() => import('./pages/workAppraisal/ManagerUserPage'));
+const AppraisalDetailPage = lazy(() => import('./pages/workAppraisal/AppraisalDetailPage'));
+const NormalWorkerPage = lazy(() => import('./pages/workAppraisal/NormalWorkerPage'));
+const AppraisalDashboardPage = lazy(() => import('./pages/workAppraisal/AppraisalDashboardPage'));
+const AppraisalModuleDetailPage = lazy(() => import('./pages/workAppraisal/AppraisalModuleDetailPage'));
+const WorkLogPage = lazy(() => import('./pages/worklog/WorkLogPage'));
+const ProjectExecutionPage = lazy(() => import('./pages/dashboard/ProjectExecutionPage'));
+const ProjectUserPage = lazy(() => import('./pages/projectBank/ProjectUserPage'));
+const UserProjectPage = lazy(() => import('./pages/projectBank/UserProjectPage'));
+const UserScorePage = lazy(() => import('./pages/projectBank/UserScorePage'));
+const UserScoreDetailPage = lazy(() => import('./pages/projectBank/UserScoreDetailPage'));
+const ProfilePage = lazy(() => import('./pages/Profile'));
+
+const RouteLoading = () => (
+
+
+
+);
+
const PrivateRoute = () => {
const location = useLocation();
const token = getToken();
- const { ready, loading, canAccessPath } = usePermission();
+ const { ready, loading, canAccessPath, defaultRoutePath } = usePermission();
if (!token) {
return ;
@@ -53,8 +61,26 @@ const PrivateRoute = () => {
);
}
+ if (location.pathname === '/') {
+ if (defaultRoutePath && defaultRoutePath !== '/') {
+ return ;
+ }
+ return (
+
+ 暂无可访问页面
+
+ );
+ }
+
if (!canAccessPath(location.pathname)) {
- return ;
+ if (defaultRoutePath && defaultRoutePath !== location.pathname) {
+ return ;
+ }
+ return (
+
+ 暂无权限访问当前页面
+
+ );
}
return ;
@@ -64,48 +90,53 @@ const PrivateRoute = () => {
function App() {
return (
-
- } />
- }>
- }>
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
- } />
+ }>
+
+ } />
+ }>
+ }>
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
-
-
+
+
);
}
diff --git a/src/api/user.ts b/src/api/user.ts
index 6c6b23a..4942b92 100644
--- a/src/api/user.ts
+++ b/src/api/user.ts
@@ -30,3 +30,11 @@ export function updateUserPwd(oldPassword: string, newPassword: string) {
params: data,
});
}
+
+export function uploadUserAvatar(data: FormData) {
+ return request<{ imgUrl?: string }, FormData>({
+ url: '/system/user/profile/avatar',
+ method: 'post',
+ data,
+ });
+}
diff --git a/src/assets/error/404.png b/src/assets/error/404.png
index fb8199f..a98e772 100644
--- a/src/assets/error/404.png
+++ b/src/assets/error/404.png
@@ -1 +1 @@
-iVBORw0KGgoAAAANSUhEUgAAAioAAAHbCAYAAACw33E7AAAgAElEQVR4nOy9d5xcV3nvf7t+Vfd+rU8vvdIDCRAQCBAEBERExV0URVEREVFEFAFFxQXsuBfEioiCIgiCe+/tPb3eU++p6j33/f6xZz2z1j27u2d2d9/l+Xk+eM0zZ87MvrP2Xmvf2hEREBERAREQAREQAREQAREQgRkIjBkhgIiIiIiIiIiIiIiIiAgyhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQAREQgRCFCkBERAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkberEIAAAACBjQAEj/YC/9k=
+iVBORw0KGgoAAAANSUhEUgAAAioAAAHbCAYAAACw33E7AAAgAElEQVR4nOy9d5xcV3nvf7t+Vfd+rU8vvdIDCRAQCBAEBERExV0URVEREVFEFAFFxQXsuBfEioiCIgiCe+/tPb3eU++p6j33/f6xZz2z1j27u2d2d9/l+Xk+eM0zZ87MvrP2Xmvf2hEREBERAREQAREQAREQAREQgRkIjBkhgIiIiIiIiIiIiIiIiAgyhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQAREQgRCFCkBERAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkBERAREQAREQAREQEQghUKIiIiIiIiIiIiIiIiIgAhChEQEREBERAREQAREQAREQEIQQqREQEREBERAREQAREQAREQgRCFCkberEIAAAACBjQAEj/YC/9k=
\ No newline at end of file
diff --git a/src/assets/login-background.jpg b/src/assets/login-background.jpg
index 9e31d16..9b72ae3 100644
--- a/src/assets/login-background.jpg
+++ b/src/assets/login-background.jpg
@@ -1 +1 @@
-g/9j/4AAQSkZJRgABAQEASABIAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAABgASAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEAAQBIAAAAAQABOEJJTQQGAAAAAAAEAAAAAjhCSU0EAgAAAAAABAAAAAD/4Q/gaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MCA3OS4xNjA0NTEsIDIwMTcvMDUvMDYtMDE6MDg6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiBwZGY6UHJvZHVjZXI9IkNvbnZlcnQgZnJvbSBBcHBsZSBCb29rIHRvIFBERiAoQXBwbGUgSW5jLikgLSBRdWFydHogMi4wIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkZBNjczQjlCQjNGNDExRTk4NjY0QzZERjhDMzYxNTMyIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkZBNjczQjlBQjNGNDExRTk4NjY0QzZERjhDMzYxNTMyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzIyQjE1NTM4RjM4MTFFOUExM0Q4RjhBRjE3RTBDRDQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzIyQjE1NTQ4RjM4MTFFOUExM0Q4RjhBRjE3RTBDRDQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAOGAAEABgAGgAfABdhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGZ3dHB0AAABwAAAABRia3B0AAAB1AAAABRyWFlaAAAB7AAAABRnWFlaAAACAAAAABRiWFlaAAACFAAAABRyVFJDAAACGAAQAMBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRsdW1pAAACjAAAAA埬
+g/9j/4AAQSkZJRgABAQEASABIAAD/4QAiRXhpZgAASUkqAAgAAAABABIBAwABAAAABgASAAAAAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEAAQBIAAAAAQABOEJJTQQGAAAAAAAEAAAAAjhCSU0EAgAAAAAABAAAAAD/4Q/gaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MCA3OS4xNjA0NTEsIDIwMTcvMDUvMDYtMDE6MDg6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiBwZGY6UHJvZHVjZXI9IkNvbnZlcnQgZnJvbSBBcHBsZSBCb29rIHRvIFBERiAoQXBwbGUgSW5jLikgLSBRdWFydHogMi4wIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkZBNjczQjlCQjNGNDExRTk4NjY0QzZERjhDMzYxNTMyIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkZBNjczQjlBQjNGNDExRTk4NjY0QzZERjhDMzYxNTMyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NzIyQjE1NTM4RjM4MTFFOUExM0Q4RjhBRjE3RTBDRDQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NzIyQjE1NTQ4RjM4MTFFOUExM0Q4RjhBRjE3RTBDRDQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAOGAAEABgAGgAfABdhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAABUAAAADNkZXNjAAABhAAAAGZ3dHB0AAABwAAAABRia3B0AAAB1AAAABRyWFlaAAAB7AAAABRnWFlaAAACAAAAABRiWFlaAAACFAAAABRyVFJDAAACGAAQAMBjaHJtAAACNAAAACRkbW5kAAACWAAAACRkbWRkAAACfAAAACRsdW1pAAACjAAAAA埬
\ No newline at end of file
diff --git a/src/assets/pay.png b/src/assets/pay.png
index b20caec..73bf42a 100644
--- a/src/assets/pay.png
+++ b/src/assets/pay.png
@@ -1 +1 @@
-iVBORw0KGgoAAAANSUhEUgAAAoAAAAFoCAYAAABq2s2dAAAKpmlDQ1BJQ0MgUHJvZmlsZQAASA2dlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjQhSYkYFEVFFRWLgqLgBFExgSJoQBBQYMmCIoKiouIFAVFFQREREREFFeHn/9/f7O/953vO+V7u+d/33n3nN4CAE/oA4CExzYskABiYmJjZ2Tn5+T8/I8AUEhYSDgoPCQ8REhEVFRkXFxkfHR8lJyYpLS4vNTZATE5MU11eX19fYGFiY2RlZmdoaWprbW9pam1vb3BxcXN0dXd4eXp7fH1+f4CBg4SFh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dYXA2FvUP+9p4+fn5/f4+v3/As6/7E/R2fj4+L8/Lv7Rfr5/L/8D/zP/iAAdM0QBhAIAhDAEEgYlgAIAiDAZgAsLChEMMAh2AhYBEYCLoCFgEmgGlgFngGfga+BqYCFYEKwRjBGcEywQvBDsEOARHBEwEUwRjBGcEJwQrBC8EOwQ9BFkEXQRzBHMEVwR3BIIElQSuBLcEuQTDhGEEnYSNBJlEm4SBhJvEkASVBKGErASvhLGEt4S7hMMEwMTBhMGEyYTRhNOE4YTrhPWE/4TNhO6E84T5hP+FCYUXhROCx4UThT+VB4WLhY2FG4UrhVuFq4W2hfeFz4VnhdeF94Z3hzeGj4dPhneHj4ZfhSeGn4avh2+Gr4fXh/eHz4d/h9+Kj4nfiR+L/4k/it+Jn4tfih+LL4s/i9+L34ufiB+Mv4r/jb+PP49/jD+P/5B/l3+R/6A/p3+V/4w/r3+T/4f/sAAVAhmBGsEIAQfBEAEJwQPBFIEVgR8BGQEYQRtBOgEfwR/BGUEcAR+BJUEiQSzBKMEqgS+BNMEwwTTBNME4wTDBOWE8wT1hPiE9QT9BQ8FEwUzBTcFSQLdBQ0FTwUrBYIFhQWqBYUFgQXFBYYFvQXABcQF0wXTBe8FyAXaBdoF+wX7Bg4GKwZLBmMGRwYtBm8GdgaZBq0GswaTBqcGvgbWBtIG3wbVBv8HAwcxBzsHLwc9B1EHSgdlB28HcAdcB34Hggd/B4cHoQeLh5AHoQedB64HrwfNB8EH0wfjB94H1wffB+8H9Af0B/YH/gf9B/4H/wf/BwEHgQdBBkEGQQ/BEAEZwYyBL0FwwTDBPME4wTjBN0E7QT/BQ0FKwWDBYUFqgWFBZcFyAXTBdMF5wX+BgcGIwYzBkMGRwa1BnsGsgbSBtMG5wbnBwsHIwc7By8HQAdIB2UHbweAB24HfQeGB4kHkgeVB5sHrwfBB8cH2wfvB/QH9Qf3B/4H/wf/B/8HAQeDBEEGQwYhBjkGQwY9Bl0GcwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGCBAgECBAoGFAIBBBIECAQIBggQDBAkGDAYKDA0OFBcaGCg2PDRAQ0pHVFVdX2BjaG1wc3R3ent/g4eLj5OXm5+jp6uvs7fDx8vP19/v8AAEBBAQGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHx8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdocWpua29zdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaHFqc3V5f4KMl56wtr6/xMjP0tff4uXq7/P3/v8AAQIECg4UGBwgLDBAUFhgZGiAiJCYoKiwuMDQ4PEBESExQVFhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaHFqb3F0eXp9f4OFj5SanqKvsr/Gy9HT2t7h5u3w9fn+//8BAgMICAwOEBQWGhweICEiJygtNT5ESktPUVZXWFpcXV9fY2RmaWpqbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v//wAABAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdocWpua29zdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQEEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hxanN1eX+CjJeer7GzwM/T2N3i5uvw9fj+//8CAwQEBQUGBwgICQoLDAwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaHFqc3V5f4KMl56wsbO9wsnO0dXa3eHn7fD2+f7/AgQFBggIDg8TFhscHyEmKCkwNjg8QUpOUldeYGVqdHx9goeLj5OYm6Glq7W3u8bJz9XY2+Dp6/L09/v9AAICAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdocWpua29zdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v//AQIBAQICAwMEBAUFBgYHBw==
+iVBORw0KGgoAAAANSUhEUgAAAoAAAAFoCAYAAABq2s2dAAAKpmlDQ1BJQ0MgUHJvZmlsZQAASA2dlndUU9kWh8+9N71QkhCKlNBraFICSA29SJEuKjQhSYkYFEVFFRWLgqLgBFExgSJoQBBQYMmCIoKiouIFAVFFQREREREFFeHn/9/f7O/953vO+V7u+d/33n3nN4CAE/oA4CExzYskABiYmJjZ2Tn5+T8/I8AUEhYSDgoPCQ8REhEVFRkXFxkfHR8lJyYpLS4vNTZATE5MU11eX19fYGFiY2RlZmdoaWprbW9pam1vb3BxcXN0dXd4eXp7fH1+f4CBg4SFh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dYXA2FvUP+9p4+fn5/f4+v3/As6/7E/R2fj4+L8/Lv7Rfr5/L/8D/zP/iAAdM0QBhAIAhDAEEgYlgAIAiDAZgAsLChEMMAh2AhYBEYCLoCFgEmgGlgFngGfga+BqYCFYEKwRjBGcEywQvBDsEOARHBEwEUwRjBGcEJwQrBC8EOwQ9BFkEXQRzBHMEVwR3BIIElQSuBLcEuQTDhGEEnYSNBJlEm4SBhJvEkASVBKGErASvhLGEt4S7hMMEwMTBhMGEyYTRhNOE4YTrhPWE/4TNhO6E84T5hP+FCYUXhROCx4UThT+VB4WLhY2FG4UrhVuFq4W2hfeFz4VnhdeF94Z3hzeGj4dPhneHj4ZfhSeGn4avh2+Gr4fXh/eHz4d/h9+Kj4nfiR+L/4k/it+Jn4tfih+LL4s/i9+L34ufiB+Mv4r/jb+PP49/jD+P/5B/l3+R/6A/p3+V/4w/r3+T/4f/sAAVAhmBGsEIAQfBEAEJwQPBFIEVgR8BGQEYQRtBOgEfwR/BGUEcAR+BJUEiQSzBKMEqgS+BNMEwwTTBNME4wTDBOWE8wT1hPiE9QT9BQ8FEwUzBTcFSQLdBQ0FTwUrBYIFhQWqBYUFgQXFBYYFvQXABcQF0wXTBe8FyAXaBdoF+wX7Bg4GKwZLBmMGRwYtBm8GdgaZBq0GswaTBqcGvgbWBtIG3wbVBv8HAwcxBzsHLwc9B1EHSgdlB28HcAdcB34Hggd/B4cHoQeLh5AHoQedB64HrwfNB8EH0wfjB94H1wffB+8H9Af0B/YH/gf9B/4H/wf/BwEHgQdBBkEGQQ/BEAEZwYyBL0FwwTDBPME4wTjBN0E7QT/BQ0FKwWDBYUFqgWFBZcFyAXTBdMF5wX+BgcGIwYzBkMGRwa1BnsGsgbSBtMG5wbnBwsHIwc7By8HQAdIB2UHbweAB24HfQeGB4kHkgeVB5sHrwfBB8cH2wfvB/QH9Qf3B/4H/wf/B/8HAQeDBEEGQwYhBjkGQwY9Bl0GcwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGQwZDBkMGCBAgECBAoGFAIBBBIECAQIBggQDBAkGDAYKDA0OFBcaGCg2PDRAQ0pHVFVdX2BjaG1wc3R3ent/g4eLj5OXm5+jp6uvs7fDx8vP19/v8AAEBBAQGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHx8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdocWpua29zdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQIEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaHFqc3V5f4KMl56wtr6/xMjP0tff4uXq7/P3/v8AAQIECg4UGBwgLDBAUFhgZGiAiJCYoKiwuMDQ4PEBESExQVFhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaHFqb3F0eXp9f4OFj5SanqKvsr/Gy9HT2t7h5u3w9fn+//8BAgMICAwOEBQWGhweICEiJygtNT5ESktPUVZXWFpcXV9fY2RmaWpqbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v//wAABAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdocWpua29zdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8AAQEEAgUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hxanN1eX+CjJeer7GzwM/T2N3i5uvw9fj+//8CAwQEBQUGBwgICQoLDAwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaHFqc3V5f4KMl56wsbO9wsnO0dXa3eHn7fD2+f7/AgQFBggIDg8TFhscHyEmKCkwNjg8QUpOUldeYGVqdHx9goeLj5OYm6Glq7W3u8bJz9XY2+Dp6/L09/v9AAICAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdocWpua29zdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v//AQIBAQICAwMEBAUFBgYHBw==
\ No newline at end of file
diff --git a/src/assets/react.svg b/src/assets/react.svg
index 8e0e0f1..6c87de9 100644
--- a/src/assets/react.svg
+++ b/src/assets/react.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx
index b2c7f1c..45e5d4d 100644
--- a/src/components/Navbar/index.tsx
+++ b/src/components/Navbar/index.tsx
@@ -1,9 +1,11 @@
import React from 'react';
-import { Button, Space } from 'antd';
-import { MenuFoldOutlined, MenuUnfoldOutlined, UserOutlined } from '@ant-design/icons';
+import { Avatar, Button, Dropdown, Space } from 'antd';
+import type { MenuProps } from 'antd';
+import { DownOutlined, LogoutOutlined, MenuFoldOutlined, MenuUnfoldOutlined, UserOutlined } from '@ant-design/icons';
import { useNavigate } from 'react-router-dom';
import { removeToken } from '../../utils/auth';
import { usePermission } from '@/contexts/PermissionContext';
+import './navbar.css';
interface AppNavbarProps {
collapsed: boolean;
@@ -18,26 +20,51 @@ const AppNavbar: React.FC = ({ collapsed, onToggle }) => {
navigate('/login');
};
+ const menuItems: MenuProps['items'] = [
+ {
+ key: 'profile',
+ icon: ,
+ label: '个人中心',
+ },
+ {
+ type: 'divider' as const,
+ },
+ {
+ key: 'logout',
+ icon: ,
+ label: '退出登录',
+ },
+ ];
+
+ const handleMenuClick: MenuProps['onClick'] = ({ key }) => {
+ if (key === 'profile') {
+ navigate('/user/profile');
+ return;
+ }
+ if (key === 'logout') {
+ handleLogout();
+ }
+ };
+
return (
-
+
:
}
onClick={onToggle}
- style={{
- fontSize: '16px',
- width: 64,
- height: 64,
- }}
+ className="app-navbar-toggle"
/>
-
- } onClick={() => navigate('/profile')}>
- {userName || '用户'}
-
-
-
+
+
+
+
+
);
};
diff --git a/src/components/Navbar/navbar.css b/src/components/Navbar/navbar.css
new file mode 100644
index 0000000..fd99cf6
--- /dev/null
+++ b/src/components/Navbar/navbar.css
@@ -0,0 +1,91 @@
+.app-navbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ min-height: 74px;
+ padding: 10px 16px;
+ border: 1px solid rgba(219, 228, 243, 0.82);
+ border-radius: 22px;
+ background: rgba(255, 255, 255, 0.82);
+ box-shadow: 0 14px 36px rgba(22, 32, 51, 0.05);
+ backdrop-filter: blur(12px);
+}
+
+.app-navbar-toggle.ant-btn {
+ display: grid;
+ place-items: center;
+ width: 46px;
+ min-width: 46px;
+ height: 46px;
+ border-radius: 14px;
+ color: #384866;
+ background: linear-gradient(180deg, rgba(247, 249, 255, 0.96), rgba(255, 255, 255, 0.96));
+ border: 1px solid rgba(219, 228, 243, 0.9);
+}
+
+.app-navbar-meta {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ margin-left: auto;
+}
+
+.app-navbar-copy {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-end;
+ gap: 2px;
+}
+
+.app-navbar-kicker {
+ color: #7d8cab;
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: 0.12em;
+ text-transform: uppercase;
+}
+
+.app-navbar-title {
+ color: #1a2439;
+ font-size: 14px;
+ font-weight: 700;
+}
+
+.app-navbar-user.ant-btn {
+ height: 48px;
+ padding: 6px 10px 6px 8px;
+ border-radius: 16px;
+ border: 1px solid rgba(219, 228, 243, 0.9);
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(246, 249, 255, 0.96));
+}
+
+.app-navbar-avatar {
+ background: linear-gradient(135deg, rgba(99, 91, 255, 0.18), rgba(25, 180, 184, 0.18));
+ color: #4f46e5;
+}
+
+.app-navbar-user-name {
+ color: #162033;
+ font-weight: 700;
+}
+
+.app-navbar-chevron {
+ font-size: 12px;
+ color: #7d8cab;
+}
+
+@media (max-width: 768px) {
+ .app-navbar {
+ min-height: 64px;
+ padding: 8px 10px;
+ }
+
+ .app-navbar-copy {
+ display: none;
+ }
+
+ .app-navbar-user-name {
+ display: none;
+ }
+}
diff --git a/src/components/Permission/ReadonlyAction.tsx b/src/components/Permission/ReadonlyAction.tsx
new file mode 100644
index 0000000..37af1ed
--- /dev/null
+++ b/src/components/Permission/ReadonlyAction.tsx
@@ -0,0 +1,29 @@
+import React from 'react';
+import '@/styles/permission-link.css';
+
+interface ReadonlyActionProps {
+ icon?: React.ReactNode;
+ children: React.ReactNode;
+ danger?: boolean;
+ className?: string;
+}
+
+const ReadonlyAction: React.FC
= ({
+ icon,
+ children,
+ danger = false,
+ className = '',
+}) => {
+ const classes = ['permission-link-disabled', danger ? 'is-danger' : '', className]
+ .filter(Boolean)
+ .join(' ');
+
+ return (
+
+ {icon}
+ {children}
+
+ );
+};
+
+export default ReadonlyAction;
diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx
index 7a17abb..da45ebf 100644
--- a/src/components/Sidebar/index.tsx
+++ b/src/components/Sidebar/index.tsx
@@ -30,17 +30,23 @@ import {
import { useLocation, useNavigate } from 'react-router-dom';
import { usePermission } from '@/contexts/PermissionContext';
import type { RouterNode } from '@/api/permission';
+import './sidebar.css';
type MenuItem = Required['items'][number];
+type MenuItemWithChildren = MenuItem & { children?: MenuItem[] };
const BACKEND_PATH_TO_APP_PATH: Record = {
'/project': '/project/list',
'/projectBank/userScore': '/workAppraisal/myPerformance',
+ '/system/logininfor': '/monitor/logininfor',
+ '/system/operlog': '/monitor/operlog',
};
const MENU_ROUTE_ALIASES: Record = {
'/projectBank/projectProgress': ['/dashboard/project-execution'],
'/workAppraisal/myPerformance': ['/projectBank/userScore'],
+ '/monitor/logininfor': ['/system/logininfor'],
+ '/monitor/operlog': ['/system/operlog'],
};
const ICON_MAP: Record = {
@@ -185,6 +191,8 @@ const buildMenuItems = (
};
const isRouteKey = (key: React.Key): key is string => typeof key === 'string' && key.startsWith('/');
+const getMenuItemChildren = (item: MenuItem): MenuItem[] | undefined =>
+ (item as MenuItemWithChildren).children;
const findMatchedPath = (menuItems: MenuItem[], pathname: string): string | null => {
for (const item of menuItems) {
@@ -192,7 +200,7 @@ const findMatchedPath = (menuItems: MenuItem[], pathname: string): string | null
continue;
}
- const children = item.children as MenuItem[] | undefined;
+ const children = getMenuItemChildren(item);
if (Array.isArray(children) && children.length > 0) {
const childHit = findMatchedPath(children, pathname);
if (childHit) {
@@ -200,14 +208,15 @@ const findMatchedPath = (menuItems: MenuItem[], pathname: string): string | null
}
}
- if (isRouteKey(item.key)) {
- const aliases = MENU_ROUTE_ALIASES[item.key] ?? [];
+ const itemKey = item.key;
+ if (itemKey !== undefined && isRouteKey(itemKey)) {
+ const aliases = MENU_ROUTE_ALIASES[itemKey] ?? [];
if (
- item.key === pathname ||
- pathname.startsWith(`${item.key}/`) ||
+ itemKey === pathname ||
+ pathname.startsWith(`${itemKey}/`) ||
aliases.some((alias) => alias === pathname || pathname.startsWith(`${alias}/`))
) {
- return item.key;
+ return itemKey;
}
}
}
@@ -229,7 +238,7 @@ const findParentKeys = (
return parentKeys;
}
- const children = item.children as MenuItem[] | undefined;
+ const children = getMenuItemChildren(item);
if (Array.isArray(children) && children.length > 0) {
const found = findParentKeys(children, targetKey, [...parentKeys, key]);
if (found) {
@@ -269,7 +278,7 @@ const AppSidebar: React.FC = () => {
return (