From 751cb3cd8ec414b631ebf3dc8f446b3df7a7adc8 Mon Sep 17 00:00:00 2001 From: zhanghao <774378400@qq.com> Date: Mon, 29 Jun 2026 16:33:00 +0800 Subject: [PATCH] first commit --- .env.development | 14 + .env.production | 20 + .env.staging | 13 + .gitignore | 26 + Dockerfile | 10 + Dockerfile.frontend | 17 + LICENSE | 20 + README.md | 35 + html/ie.html | 46 + index.html | 215 ++ package.json | 66 + public/bot.svg | 54 + public/favicon.ico | Bin 0 -> 5663 bytes public/inspection/elfin10/elfin10.urdf.xacro | 465 +++++ .../inspection/elfin10/elfin10_gazebo.xacro | 134 ++ .../elfin10/elfin10_transmission.xacro | 69 + .../elfin10/meshes/elfin10/elfin_base.STL | Bin 0 -> 781684 bytes .../elfin10/meshes/elfin10/elfin_end_link.STL | Bin 0 -> 6036284 bytes .../elfin10/meshes/elfin10/elfin_link1.STL | Bin 0 -> 1040684 bytes .../elfin10/meshes/elfin10/elfin_link2.STL | Bin 0 -> 250184 bytes .../elfin10/meshes/elfin10/elfin_link3.STL | Bin 0 -> 1201084 bytes .../elfin10/meshes/elfin10/elfin_link4.STL | Bin 0 -> 224284 bytes .../elfin10/meshes/elfin10/elfin_link5.STL | Bin 0 -> 995684 bytes .../elfin10/meshes/elfin10/elfin_link6.STL | Bin 0 -> 6036284 bytes src/App.vue | 123 ++ src/adapters/URDFAdapter.js | 461 +++++ src/adapters/XacroAdapter.js | 624 ++++++ src/api/device/arm.js | 18 + src/api/device/dexHand.js | 19 + src/api/device/flow.js | 63 + src/api/device/microphone.js | 46 + src/api/device/profile.js | 45 + src/api/device/register.js | 146 ++ src/api/device/robot.js | 44 + src/api/device/speaker.js | 72 + src/api/device/terminal.js | 86 + src/api/evaluate/indicator.js | 68 + src/api/inspection/map.js | 33 + src/api/inspection/point.js | 32 + src/api/inspection/robot.js | 57 + src/api/inspection/runTask.js | 75 + src/api/inspection/task.js | 47 + src/api/intelligenceTest/car.js | 32 + src/api/intelligenceTest/mobilePhone.js | 32 + src/api/intelligenceTest/runningTask.js | 69 + src/api/intelligenceTest/taskManage.js | 47 + src/api/intelligenceTest/testCase.js | 32 + src/api/is/func/index.js | 63 + src/api/is/im/index.js | 32 + src/api/is/project/index.js | 76 + src/api/login.js | 60 + src/api/menu.js | 9 + src/api/monitor/cache.js | 57 + src/api/monitor/job.js | 71 + src/api/monitor/jobLog.js | 26 + src/api/monitor/logininfor.js | 34 + src/api/monitor/online.js | 18 + src/api/monitor/operlog.js | 26 + src/api/monitor/server.js | 9 + src/api/system/config.js | 60 + src/api/system/dept.js | 52 + src/api/system/dict/data.js | 52 + src/api/system/dict/type.js | 60 + src/api/system/file.js | 44 + src/api/system/group.js | 44 + src/api/system/menu.js | 60 + src/api/system/notice.js | 44 + src/api/system/post.js | 44 + src/api/system/role.js | 119 ++ src/api/system/user.js | 136 ++ src/api/system/vehOper.js | 44 + src/api/test/config.js | 78 + src/api/test/detect.js | 44 + src/api/test/log.js | 72 + src/api/test/params.js | 60 + src/api/tool/gen.js | 85 + src/api/touch_interaction.js | 14 + src/api/vi/corpus.js | 77 + src/api/vi/plan.js | 44 + src/api/vi/project.js | 83 + src/assets/401_images/401.gif | Bin 0 -> 164227 bytes src/assets/404_images/404.png | Bin 0 -> 98071 bytes src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes src/assets/icons/svg/404.svg | 1 + src/assets/icons/svg/bot.svg | 54 + src/assets/icons/svg/bug.svg | 1 + src/assets/icons/svg/build.svg | 1 + src/assets/icons/svg/button.svg | 1 + src/assets/icons/svg/cascader.svg | 1 + src/assets/icons/svg/chart.svg | 1 + src/assets/icons/svg/checkbox.svg | 1 + src/assets/icons/svg/chevron-down.svg | 4 + src/assets/icons/svg/chevron-left.svg | 4 + src/assets/icons/svg/chevron-right.svg | 4 + src/assets/icons/svg/chevron-stop.svg | 16 + src/assets/icons/svg/chevron-up.svg | 4 + src/assets/icons/svg/clipboard.svg | 1 + src/assets/icons/svg/code.svg | 1 + src/assets/icons/svg/color.svg | 1 + src/assets/icons/svg/component.svg | 1 + src/assets/icons/svg/cpu.svg | 17 + src/assets/icons/svg/dashboard.svg | 1 + src/assets/icons/svg/date-range.svg | 1 + src/assets/icons/svg/date.svg | 1 + src/assets/icons/svg/dict.svg | 1 + src/assets/icons/svg/documentation.svg | 1 + src/assets/icons/svg/download.svg | 1 + src/assets/icons/svg/drag.svg | 1 + src/assets/icons/svg/druid.svg | 1 + src/assets/icons/svg/edit.svg | 1 + src/assets/icons/svg/education.svg | 1 + src/assets/icons/svg/email.svg | 1 + src/assets/icons/svg/example.svg | 1 + src/assets/icons/svg/excel.svg | 1 + src/assets/icons/svg/exit-fullscreen.svg | 1 + src/assets/icons/svg/eye-open.svg | 1 + src/assets/icons/svg/eye.svg | 1 + src/assets/icons/svg/form.svg | 1 + src/assets/icons/svg/fullscreen.svg | 1 + src/assets/icons/svg/gamepad.svg | 8 + src/assets/icons/svg/github.svg | 1 + src/assets/icons/svg/guide.svg | 1 + src/assets/icons/svg/icon.svg | 1 + src/assets/icons/svg/input.svg | 1 + src/assets/icons/svg/international.svg | 1 + src/assets/icons/svg/job.svg | 1 + src/assets/icons/svg/language.svg | 1 + src/assets/icons/svg/link.svg | 1 + src/assets/icons/svg/list.svg | 1 + src/assets/icons/svg/locate-fixed.svg | 9 + src/assets/icons/svg/lock.svg | 1 + src/assets/icons/svg/log.svg | 1 + src/assets/icons/svg/logininfor.svg | 1 + src/assets/icons/svg/map.svg | 6 + src/assets/icons/svg/message.svg | 1 + src/assets/icons/svg/money.svg | 1 + src/assets/icons/svg/monitor.svg | 2 + src/assets/icons/svg/moon.svg | 1 + src/assets/icons/svg/navigation.svg | 4 + src/assets/icons/svg/nested.svg | 1 + src/assets/icons/svg/number.svg | 1 + src/assets/icons/svg/online.svg | 1 + src/assets/icons/svg/password.svg | 1 + src/assets/icons/svg/pause.svg | 6 + src/assets/icons/svg/pdf.svg | 1 + src/assets/icons/svg/people.svg | 1 + src/assets/icons/svg/peoples.svg | 1 + src/assets/icons/svg/phone.svg | 1 + src/assets/icons/svg/post.svg | 1 + src/assets/icons/svg/qq.svg | 1 + src/assets/icons/svg/question.svg | 1 + src/assets/icons/svg/radio.svg | 1 + src/assets/icons/svg/rate.svg | 1 + src/assets/icons/svg/redis-list.svg | 2 + src/assets/icons/svg/redis.svg | 1 + src/assets/icons/svg/remove.svg | 1 + src/assets/icons/svg/row.svg | 1 + src/assets/icons/svg/search.svg | 1 + src/assets/icons/svg/select.svg | 1 + src/assets/icons/svg/server.svg | 1 + src/assets/icons/svg/shopping.svg | 1 + src/assets/icons/svg/size.svg | 1 + src/assets/icons/svg/skill.svg | 1 + src/assets/icons/svg/slider.svg | 1 + src/assets/icons/svg/star.svg | 1 + src/assets/icons/svg/start.svg | 6 + src/assets/icons/svg/stop.svg | 6 + src/assets/icons/svg/sunny.svg | 1 + src/assets/icons/svg/swagger.svg | 1 + src/assets/icons/svg/switch.svg | 1 + src/assets/icons/svg/system.svg | 2 + src/assets/icons/svg/tab.svg | 1 + src/assets/icons/svg/table.svg | 1 + src/assets/icons/svg/textarea.svg | 1 + src/assets/icons/svg/theme.svg | 1 + src/assets/icons/svg/time-range.svg | 1 + src/assets/icons/svg/time.svg | 1 + src/assets/icons/svg/tool.svg | 1 + src/assets/icons/svg/tree-table.svg | 1 + src/assets/icons/svg/tree.svg | 1 + src/assets/icons/svg/upload.svg | 1 + src/assets/icons/svg/user.svg | 1 + src/assets/icons/svg/validCode.svg | 1 + src/assets/icons/svg/wechat.svg | 1 + src/assets/icons/svg/zip.svg | 1 + src/assets/icons/svg/zoom-in.svg | 7 + src/assets/icons/svg/zoom-out.svg | 6 + src/assets/images/arm.png | Bin 0 -> 34989 bytes src/assets/images/dark.svg | 39 + src/assets/images/hand.png | Bin 0 -> 756499 bytes src/assets/images/hand2.png | Bin 0 -> 32423 bytes src/assets/images/index-background.jpg | Bin 0 -> 321822 bytes src/assets/images/light.svg | 39 + src/assets/images/login-background-back.jpg | Bin 0 -> 521275 bytes src/assets/images/login-background.jpg | Bin 0 -> 220025 bytes src/assets/images/pay.png | Bin 0 -> 140720 bytes src/assets/images/profile.jpg | Bin 0 -> 81131 bytes src/assets/images/robot.png | Bin 0 -> 276439 bytes src/assets/logo/logo.png | Bin 0 -> 5663 bytes src/assets/styles/btn.scss | 99 + src/assets/styles/element-ui.scss | 96 + src/assets/styles/index.scss | 187 ++ src/assets/styles/mixin.scss | 66 + src/assets/styles/ruoyi.scss | 301 +++ src/assets/styles/sidebar.scss | 236 +++ src/assets/styles/transition.scss | 49 + src/assets/styles/variables.module.scss | 286 +++ src/components/Breadcrumb/index.vue | 98 + src/components/Crontab/day.vue | 174 ++ src/components/Crontab/hour.vue | 133 ++ src/components/Crontab/index.vue | 309 +++ src/components/Crontab/min.vue | 126 ++ src/components/Crontab/month.vue | 141 ++ src/components/Crontab/result.vue | 540 +++++ src/components/Crontab/second.vue | 128 ++ src/components/Crontab/week.vue | 197 ++ src/components/Crontab/year.vue | 149 ++ src/components/DictTag/index.vue | 82 + src/components/EditTable/index.vue | 299 +++ src/components/Editor/index.vue | 251 +++ src/components/FileUpload/index.vue | 213 ++ src/components/Hamburger/index.vue | 42 + src/components/HeaderSearch/index.vue | 187 ++ src/components/IconSelect/index.vue | 111 + src/components/IconSelect/requireIcons.js | 8 + src/components/ImagePreview/index.vue | 92 + src/components/ImageUpload/index.vue | 216 ++ src/components/Pagination/index.vue | 105 + src/components/ParentView/index.vue | 3 + src/components/RightToolbar/index.vue | 134 ++ src/components/RuoYi/Doc/index.vue | 13 + src/components/RuoYi/Git/index.vue | 13 + src/components/Screenfull/index.vue | 22 + src/components/SizeSelect/index.vue | 45 + src/components/SvgIcon/index.vue | 42 + src/components/SvgIcon/svgicon.js | 10 + src/components/TableSearch/index.vue | 69 + src/components/TableTags/index.vue | 24 + src/components/TopNav/index.vue | 216 ++ src/components/Video/index.vue | 27 + src/components/iFrame/index.vue | 31 + src/controllers/FileHandler.js | 553 +++++ src/directive/common/copyText.js | 66 + src/directive/index.js | 9 + src/directive/permission/hasPermi.js | 28 + src/directive/permission/hasRole.js | 28 + src/enum/index.js | 110 + src/hooks/tableHeight.ts | 21 + src/hooks/usePlayAudio.ts | 38 + src/layout/components/AppMain.vue | 88 + src/layout/components/IframeToggle/index.vue | 25 + src/layout/components/InnerLink/index.vue | 24 + src/layout/components/Navbar.vue | 205 ++ src/layout/components/Settings/index.vue | 204 ++ src/layout/components/Sidebar/Link.vue | 63 + src/layout/components/Sidebar/Logo.vue | 99 + src/layout/components/Sidebar/SidebarItem.vue | 100 + src/layout/components/Sidebar/index.vue | 104 + src/layout/components/TagsView/ScrollPane.vue | 107 + src/layout/components/TagsView/index.vue | 365 ++++ src/layout/components/index.js | 4 + src/layout/index.vue | 114 ++ src/main.js | 95 + src/models/UnifiedRobotModel.js | 181 ++ src/permission.js | 75 + src/plugins/auth.js | 60 + src/plugins/cache.js | 79 + src/plugins/download.js | 79 + src/plugins/index.js | 18 + src/plugins/modal.js | 82 + src/plugins/tab.js | 69 + src/plugins/websocket.js | 183 ++ src/router/index.js | 162 ++ src/settings.js | 47 + src/store/index.js | 3 + src/store/modules/app.js | 46 + src/store/modules/dict.js | 57 + src/store/modules/flow.js | 22 + src/store/modules/inspection.js | 37 + src/store/modules/permission.js | 142 ++ src/store/modules/settings.js | 48 + src/store/modules/tagsView.js | 182 ++ src/store/modules/user.js | 75 + src/style/variable.scss | 71 + src/utils/FileUtils.js | 144 ++ src/utils/auth.js | 15 + src/utils/convertNodeRedToLogicFlow.js | 105 + src/utils/dict.js | 24 + src/utils/dynamicTitle.js | 15 + src/utils/errorCode.js | 6 + src/utils/eventBus.js | 3 + src/utils/flow.js | 370 ++++ src/utils/fn.js | 94 + src/utils/generator/config.js | 452 +++++ src/utils/generator/css.js | 18 + src/utils/generator/drawingDefalut.js | 29 + src/utils/generator/html.js | 359 ++++ src/utils/generator/icon.json | 1 + src/utils/generator/js.js | 370 ++++ src/utils/generator/render.js | 156 ++ src/utils/index.js | 407 ++++ src/utils/jsencrypt.js | 30 + src/utils/permission.js | 51 + src/utils/request.js | 152 ++ src/utils/requestController.js | 94 + src/utils/ruoyi.js | 246 +++ src/utils/scroll-to.js | 58 + src/utils/theme.js | 49 + src/utils/validate.js | 114 ++ src/views/device/profile/index.vue | 508 +++++ .../register/components/Camera/index.vue | 330 +++ .../register/components/ControlCard/index.vue | 36 + .../components/DexHand/LeftBottomHand.vue | 431 ++++ .../components/DexHand/LeftTopHand.vue | 270 +++ .../components/DexHand/RightBottomCharts.vue | 229 +++ .../components/DexHand/RightTopCharts.vue | 162 ++ .../register/components/DexHand/index.vue | 158 ++ .../device/register/components/Head/index.vue | 314 +++ .../components/LogicFlow/CustomGroup.js | 103 + .../components/LogicFlow/IPlayer/config.ts | 59 + .../components/LogicFlow/IPlayer/index.vue | 62 + .../components/LogicFlow/customFlow.vue | 238 +++ .../components/LogicFlow/customFlowNode.js | 134 ++ .../register/components/LogicFlow/index.vue | 294 +++ .../MechanicalArm/components/JointControl.vue | 133 ++ .../MechanicalArm/components/UrdfViewer.vue | 394 ++++ .../components/MechanicalArm/index.vue | 350 ++++ .../register/components/Microphone/index.vue | 225 +++ .../register/components/Motor/index.vue | 76 + .../register/components/Speaker/index.vue | 276 +++ .../SpeechSynthesis/AudioPlayer.vue | 108 + .../components/SpeechSynthesis/chat.vue | 699 +++++++ .../components/SpeechSynthesis/img/ai.png | Bin 0 -> 12001 bytes .../components/SpeechSynthesis/img/user.png | Bin 0 -> 11973 bytes .../components/SpeechSynthesis/index.vue | 65 + .../SpeechSynthesis/soundRecording.vue | 115 ++ .../components/TouchInteraction/ai.png | Bin 0 -> 12001 bytes .../components/TouchInteraction/index.vue | 512 +++++ .../components/TouchInteraction/zsj.png | Bin 0 -> 11973 bytes src/views/device/register/components/index.js | 59 + src/views/device/register/index.vue | 414 ++++ src/views/device/robot/ContextMenu.vue | 89 + src/views/device/robot/TechButtonWithLine.vue | 547 +++++ src/views/device/robot/index.vue | 874 ++++++++ src/views/device/terminal/index.vue | 316 +++ src/views/error/401.vue | 82 + src/views/error/404.vue | 227 +++ src/views/flow/components/Aside.vue | 76 + .../flow/components/FormItemRecursive.vue | 221 ++ src/views/flow/components/NodeState.vue | 176 ++ src/views/flow/components/NodeTitle.vue | 272 +++ src/views/flow/components/OuterNode.vue | 43 + src/views/flow/components/ParamsDrawer.vue | 1800 +++++++++++++++++ src/views/flow/components/TestRun.vue | 146 ++ src/views/flow/config.js | 700 +++++++ src/views/flow/icon/audio.svg | 1 + src/views/flow/icon/awaken.svg | 1 + src/views/flow/icon/camera.svg | 1 + src/views/flow/icon/dialogue.svg | 1 + src/views/flow/icon/end.svg | 1 + src/views/flow/icon/expression.svg | 1 + src/views/flow/icon/group.svg | 3 + src/views/flow/icon/loop.svg | 1 + src/views/flow/icon/microphone.svg | 4 + src/views/flow/icon/plan.svg | 1 + src/views/flow/icon/sleep.svg | 1 + src/views/flow/icon/start.svg | 6 + src/views/flow/icon/stopLoop.svg | 1 + src/views/flow/icon/switch.svg | 7 + src/views/flow/icon/touch.svg | 1 + src/views/flow/icon/video.svg | 3 + src/views/flow/index.vue | 939 +++++++++ src/views/flow/nodes/common/endNode.js | 196 ++ src/views/flow/nodes/common/endNode.vue | 246 +++ src/views/flow/nodes/common/index.js | 11 + src/views/flow/nodes/common/selectAreaNode.js | 102 + .../flow/nodes/common/selectAreaNode.vue | 59 + src/views/flow/nodes/common/serviceNode.js | 213 ++ src/views/flow/nodes/common/serviceNode.vue | 144 ++ src/views/flow/nodes/common/startNode.js | 204 ++ src/views/flow/nodes/common/startNode.vue | 157 ++ src/views/flow/nodes/function/codeNode.js | 213 ++ src/views/flow/nodes/function/codeNode.vue | 139 ++ src/views/flow/nodes/function/currentLoop.vue | 256 +++ .../flow/nodes/function/currentLoopNode.js | 219 ++ src/views/flow/nodes/function/httpNode.js | 213 ++ src/views/flow/nodes/function/httpNode.vue | 141 ++ src/views/flow/nodes/function/index.js | 23 + src/views/flow/nodes/function/loop.js | 286 +++ src/views/flow/nodes/function/loop.vue | 116 ++ src/views/flow/nodes/function/sdAgent.js | 213 ++ src/views/flow/nodes/function/sdAgent.vue | 124 ++ src/views/flow/nodes/function/sleep.js | 213 ++ src/views/flow/nodes/function/sleep.vue | 125 ++ src/views/flow/nodes/function/stopLoop.js | 191 ++ src/views/flow/nodes/function/stopLoop.vue | 197 ++ src/views/flow/nodes/function/subEnd.js | 186 ++ src/views/flow/nodes/function/subEnd.vue | 145 ++ src/views/flow/nodes/function/subStart.js | 185 ++ src/views/flow/nodes/function/subStart.vue | 106 + src/views/flow/nodes/function/switch.js | 318 +++ src/views/flow/nodes/function/switch.vue | 642 ++++++ src/views/home/components/BarChart.vue | 117 ++ src/views/home/components/LineChart.vue | 118 ++ src/views/home/index.vue | 307 +++ src/views/index.vue | 14 + src/views/inspection/alarm/index.vue | 3 + src/views/inspection/cockpit/canvasUtils.js | 619 ++++++ .../inspection/cockpit/components/Header.vue | 161 ++ .../cockpit/components/ManualTakeover.vue | 674 ++++++ .../cockpit/components/MapCanvas.vue | 457 +++++ .../cockpit/components/MapOverview.vue | 403 ++++ .../inspection/cockpit/components/Monitor.vue | 120 ++ .../cockpit/components/UrdfView.vue | 330 +++ src/views/inspection/cockpit/index.vue | 47 + src/views/inspection/map/index.vue | 580 ++++++ src/views/inspection/point/index.vue | 399 ++++ src/views/inspection/robot/index.vue | 335 +++ src/views/inspection/runTask/index.vue | 626 ++++++ src/views/inspection/runTask/task-log.vue | 73 + src/views/inspection/runTask/task-steps.vue | 88 + src/views/inspection/task/index.vue | 385 ++++ src/views/intelligenceTest/car/index.vue | 304 +++ .../intelligenceTest/mobilePhone/index.vue | 321 +++ .../intelligenceTest/runningTask/index.vue | 647 ++++++ .../intelligenceTest/runningTask/task-log.vue | 71 + .../runningTask/task-steps.vue | 88 + .../intelligenceTest/taskManage/index.vue | 357 ++++ src/views/intelligenceTest/testCase/index.vue | 330 +++ src/views/login.vue | 236 +++ src/views/monitor/cache/index.vue | 132 ++ src/views/monitor/cache/list.vue | 246 +++ src/views/monitor/druid/index.vue | 13 + src/views/monitor/job/index.vue | 501 +++++ src/views/monitor/job/log.vue | 283 +++ src/views/monitor/logininfor/index.vue | 233 +++ src/views/monitor/online/index.vue | 109 + src/views/monitor/operlog/index.vue | 310 +++ src/views/monitor/server/index.vue | 187 ++ src/views/redirect/index.vue | 14 + src/views/register.vue | 219 ++ src/views/system/config/index.vue | 316 +++ src/views/system/dept/index.vue | 283 +++ src/views/system/dict/data.vue | 362 ++++ src/views/system/dict/index.vue | 420 ++++ src/views/system/file/index.vue | 350 ++++ src/views/system/group/index.vue | 289 +++ src/views/system/menu/index.vue | 461 +++++ src/views/system/notice/index.vue | 292 +++ src/views/system/post/index.vue | 287 +++ src/views/system/role/authUser.vue | 179 ++ src/views/system/role/index.vue | 593 ++++++ src/views/system/role/selectUser.vue | 144 ++ src/views/system/user/authRole.vue | 116 ++ src/views/system/user/index.vue | 547 +++++ src/views/system/user/profile/index.vue | 87 + src/views/system/user/profile/resetPwd.vue | 59 + src/views/system/user/profile/userAvatar.vue | 180 ++ src/views/system/user/profile/userInfo.vue | 67 + src/views/system/vehOper/index.vue | 349 ++++ src/views/test/configs/Run.vue | 172 ++ src/views/test/configs/index.vue | 696 +++++++ src/views/test/detect/index.vue | 477 +++++ src/views/test/log/index.vue | 450 +++++ src/views/test/params/index.vue | 431 ++++ src/views/tool/build/CodeTypeDialog.vue | 71 + src/views/tool/build/DraggableItem.vue | 68 + src/views/tool/build/IconsDialog.vue | 115 ++ src/views/tool/build/RightPanel.vue | 918 +++++++++ src/views/tool/build/TreeNodeDialog.vue | 93 + src/views/tool/build/index.vue | 653 ++++++ src/views/tool/gen/basicInfoForm.vue | 48 + src/views/tool/gen/createTable.vue | 46 + src/views/tool/gen/editTable.vue | 200 ++ src/views/tool/gen/genInfoForm.vue | 306 +++ src/views/tool/gen/importTable.vue | 126 ++ src/views/tool/gen/index.vue | 310 +++ src/views/tool/swagger/index.vue | 9 + vite.config.js | 93 + vite/plugins/auto-import.js | 12 + vite/plugins/compression.js | 28 + vite/plugins/index.js | 26 + vite/plugins/setup-extend.js | 5 + vite/plugins/svg-icon.js | 10 + 484 files changed, 58782 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Dockerfile.frontend create mode 100644 LICENSE create mode 100644 README.md create mode 100644 html/ie.html create mode 100644 index.html create mode 100644 package.json create mode 100644 public/bot.svg create mode 100644 public/favicon.ico create mode 100644 public/inspection/elfin10/elfin10.urdf.xacro create mode 100644 public/inspection/elfin10/elfin10_gazebo.xacro create mode 100644 public/inspection/elfin10/elfin10_transmission.xacro create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_base.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_end_link.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_link1.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_link2.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_link3.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_link4.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_link5.STL create mode 100644 public/inspection/elfin10/meshes/elfin10/elfin_link6.STL create mode 100644 src/App.vue create mode 100644 src/adapters/URDFAdapter.js create mode 100644 src/adapters/XacroAdapter.js create mode 100644 src/api/device/arm.js create mode 100644 src/api/device/dexHand.js create mode 100644 src/api/device/flow.js create mode 100644 src/api/device/microphone.js create mode 100644 src/api/device/profile.js create mode 100644 src/api/device/register.js create mode 100644 src/api/device/robot.js create mode 100644 src/api/device/speaker.js create mode 100644 src/api/device/terminal.js create mode 100644 src/api/evaluate/indicator.js create mode 100644 src/api/inspection/map.js create mode 100644 src/api/inspection/point.js create mode 100644 src/api/inspection/robot.js create mode 100644 src/api/inspection/runTask.js create mode 100644 src/api/inspection/task.js create mode 100644 src/api/intelligenceTest/car.js create mode 100644 src/api/intelligenceTest/mobilePhone.js create mode 100644 src/api/intelligenceTest/runningTask.js create mode 100644 src/api/intelligenceTest/taskManage.js create mode 100644 src/api/intelligenceTest/testCase.js create mode 100644 src/api/is/func/index.js create mode 100644 src/api/is/im/index.js create mode 100644 src/api/is/project/index.js create mode 100644 src/api/login.js create mode 100644 src/api/menu.js create mode 100644 src/api/monitor/cache.js create mode 100644 src/api/monitor/job.js create mode 100644 src/api/monitor/jobLog.js create mode 100644 src/api/monitor/logininfor.js create mode 100644 src/api/monitor/online.js create mode 100644 src/api/monitor/operlog.js create mode 100644 src/api/monitor/server.js create mode 100644 src/api/system/config.js create mode 100644 src/api/system/dept.js create mode 100644 src/api/system/dict/data.js create mode 100644 src/api/system/dict/type.js create mode 100644 src/api/system/file.js create mode 100644 src/api/system/group.js create mode 100644 src/api/system/menu.js create mode 100644 src/api/system/notice.js create mode 100644 src/api/system/post.js create mode 100644 src/api/system/role.js create mode 100644 src/api/system/user.js create mode 100644 src/api/system/vehOper.js create mode 100644 src/api/test/config.js create mode 100644 src/api/test/detect.js create mode 100644 src/api/test/log.js create mode 100644 src/api/test/params.js create mode 100644 src/api/tool/gen.js create mode 100644 src/api/touch_interaction.js create mode 100644 src/api/vi/corpus.js create mode 100644 src/api/vi/plan.js create mode 100644 src/api/vi/project.js create mode 100644 src/assets/401_images/401.gif create mode 100644 src/assets/404_images/404.png create mode 100644 src/assets/404_images/404_cloud.png create mode 100644 src/assets/icons/svg/404.svg create mode 100644 src/assets/icons/svg/bot.svg create mode 100644 src/assets/icons/svg/bug.svg create mode 100644 src/assets/icons/svg/build.svg create mode 100644 src/assets/icons/svg/button.svg create mode 100644 src/assets/icons/svg/cascader.svg create mode 100644 src/assets/icons/svg/chart.svg create mode 100644 src/assets/icons/svg/checkbox.svg create mode 100644 src/assets/icons/svg/chevron-down.svg create mode 100644 src/assets/icons/svg/chevron-left.svg create mode 100644 src/assets/icons/svg/chevron-right.svg create mode 100644 src/assets/icons/svg/chevron-stop.svg create mode 100644 src/assets/icons/svg/chevron-up.svg create mode 100644 src/assets/icons/svg/clipboard.svg create mode 100644 src/assets/icons/svg/code.svg create mode 100644 src/assets/icons/svg/color.svg create mode 100644 src/assets/icons/svg/component.svg create mode 100644 src/assets/icons/svg/cpu.svg create mode 100644 src/assets/icons/svg/dashboard.svg create mode 100644 src/assets/icons/svg/date-range.svg create mode 100644 src/assets/icons/svg/date.svg create mode 100644 src/assets/icons/svg/dict.svg create mode 100644 src/assets/icons/svg/documentation.svg create mode 100644 src/assets/icons/svg/download.svg create mode 100644 src/assets/icons/svg/drag.svg create mode 100644 src/assets/icons/svg/druid.svg create mode 100644 src/assets/icons/svg/edit.svg create mode 100644 src/assets/icons/svg/education.svg create mode 100644 src/assets/icons/svg/email.svg create mode 100644 src/assets/icons/svg/example.svg create mode 100644 src/assets/icons/svg/excel.svg create mode 100644 src/assets/icons/svg/exit-fullscreen.svg create mode 100644 src/assets/icons/svg/eye-open.svg create mode 100644 src/assets/icons/svg/eye.svg create mode 100644 src/assets/icons/svg/form.svg create mode 100644 src/assets/icons/svg/fullscreen.svg create mode 100644 src/assets/icons/svg/gamepad.svg create mode 100644 src/assets/icons/svg/github.svg create mode 100644 src/assets/icons/svg/guide.svg create mode 100644 src/assets/icons/svg/icon.svg create mode 100644 src/assets/icons/svg/input.svg create mode 100644 src/assets/icons/svg/international.svg create mode 100644 src/assets/icons/svg/job.svg create mode 100644 src/assets/icons/svg/language.svg create mode 100644 src/assets/icons/svg/link.svg create mode 100644 src/assets/icons/svg/list.svg create mode 100644 src/assets/icons/svg/locate-fixed.svg create mode 100644 src/assets/icons/svg/lock.svg create mode 100644 src/assets/icons/svg/log.svg create mode 100644 src/assets/icons/svg/logininfor.svg create mode 100644 src/assets/icons/svg/map.svg create mode 100644 src/assets/icons/svg/message.svg create mode 100644 src/assets/icons/svg/money.svg create mode 100644 src/assets/icons/svg/monitor.svg create mode 100644 src/assets/icons/svg/moon.svg create mode 100644 src/assets/icons/svg/navigation.svg create mode 100644 src/assets/icons/svg/nested.svg create mode 100644 src/assets/icons/svg/number.svg create mode 100644 src/assets/icons/svg/online.svg create mode 100644 src/assets/icons/svg/password.svg create mode 100644 src/assets/icons/svg/pause.svg create mode 100644 src/assets/icons/svg/pdf.svg create mode 100644 src/assets/icons/svg/people.svg create mode 100644 src/assets/icons/svg/peoples.svg create mode 100644 src/assets/icons/svg/phone.svg create mode 100644 src/assets/icons/svg/post.svg create mode 100644 src/assets/icons/svg/qq.svg create mode 100644 src/assets/icons/svg/question.svg create mode 100644 src/assets/icons/svg/radio.svg create mode 100644 src/assets/icons/svg/rate.svg create mode 100644 src/assets/icons/svg/redis-list.svg create mode 100644 src/assets/icons/svg/redis.svg create mode 100644 src/assets/icons/svg/remove.svg create mode 100644 src/assets/icons/svg/row.svg create mode 100644 src/assets/icons/svg/search.svg create mode 100644 src/assets/icons/svg/select.svg create mode 100644 src/assets/icons/svg/server.svg create mode 100644 src/assets/icons/svg/shopping.svg create mode 100644 src/assets/icons/svg/size.svg create mode 100644 src/assets/icons/svg/skill.svg create mode 100644 src/assets/icons/svg/slider.svg create mode 100644 src/assets/icons/svg/star.svg create mode 100644 src/assets/icons/svg/start.svg create mode 100644 src/assets/icons/svg/stop.svg create mode 100644 src/assets/icons/svg/sunny.svg create mode 100644 src/assets/icons/svg/swagger.svg create mode 100644 src/assets/icons/svg/switch.svg create mode 100644 src/assets/icons/svg/system.svg create mode 100644 src/assets/icons/svg/tab.svg create mode 100644 src/assets/icons/svg/table.svg create mode 100644 src/assets/icons/svg/textarea.svg create mode 100644 src/assets/icons/svg/theme.svg create mode 100644 src/assets/icons/svg/time-range.svg create mode 100644 src/assets/icons/svg/time.svg create mode 100644 src/assets/icons/svg/tool.svg create mode 100644 src/assets/icons/svg/tree-table.svg create mode 100644 src/assets/icons/svg/tree.svg create mode 100644 src/assets/icons/svg/upload.svg create mode 100644 src/assets/icons/svg/user.svg create mode 100644 src/assets/icons/svg/validCode.svg create mode 100644 src/assets/icons/svg/wechat.svg create mode 100644 src/assets/icons/svg/zip.svg create mode 100644 src/assets/icons/svg/zoom-in.svg create mode 100644 src/assets/icons/svg/zoom-out.svg create mode 100644 src/assets/images/arm.png create mode 100644 src/assets/images/dark.svg create mode 100644 src/assets/images/hand.png create mode 100644 src/assets/images/hand2.png create mode 100644 src/assets/images/index-background.jpg create mode 100644 src/assets/images/light.svg create mode 100644 src/assets/images/login-background-back.jpg create mode 100644 src/assets/images/login-background.jpg create mode 100644 src/assets/images/pay.png create mode 100644 src/assets/images/profile.jpg create mode 100644 src/assets/images/robot.png create mode 100644 src/assets/logo/logo.png create mode 100644 src/assets/styles/btn.scss create mode 100644 src/assets/styles/element-ui.scss create mode 100644 src/assets/styles/index.scss create mode 100644 src/assets/styles/mixin.scss create mode 100644 src/assets/styles/ruoyi.scss create mode 100644 src/assets/styles/sidebar.scss create mode 100644 src/assets/styles/transition.scss create mode 100644 src/assets/styles/variables.module.scss create mode 100644 src/components/Breadcrumb/index.vue create mode 100644 src/components/Crontab/day.vue create mode 100644 src/components/Crontab/hour.vue create mode 100644 src/components/Crontab/index.vue create mode 100644 src/components/Crontab/min.vue create mode 100644 src/components/Crontab/month.vue create mode 100644 src/components/Crontab/result.vue create mode 100644 src/components/Crontab/second.vue create mode 100644 src/components/Crontab/week.vue create mode 100644 src/components/Crontab/year.vue create mode 100644 src/components/DictTag/index.vue create mode 100644 src/components/EditTable/index.vue create mode 100644 src/components/Editor/index.vue create mode 100644 src/components/FileUpload/index.vue create mode 100644 src/components/Hamburger/index.vue create mode 100644 src/components/HeaderSearch/index.vue create mode 100644 src/components/IconSelect/index.vue create mode 100644 src/components/IconSelect/requireIcons.js create mode 100644 src/components/ImagePreview/index.vue create mode 100644 src/components/ImageUpload/index.vue create mode 100644 src/components/Pagination/index.vue create mode 100644 src/components/ParentView/index.vue create mode 100644 src/components/RightToolbar/index.vue create mode 100644 src/components/RuoYi/Doc/index.vue create mode 100644 src/components/RuoYi/Git/index.vue create mode 100644 src/components/Screenfull/index.vue create mode 100644 src/components/SizeSelect/index.vue create mode 100644 src/components/SvgIcon/index.vue create mode 100644 src/components/SvgIcon/svgicon.js create mode 100644 src/components/TableSearch/index.vue create mode 100644 src/components/TableTags/index.vue create mode 100644 src/components/TopNav/index.vue create mode 100644 src/components/Video/index.vue create mode 100644 src/components/iFrame/index.vue create mode 100644 src/controllers/FileHandler.js create mode 100644 src/directive/common/copyText.js create mode 100644 src/directive/index.js create mode 100644 src/directive/permission/hasPermi.js create mode 100644 src/directive/permission/hasRole.js create mode 100644 src/enum/index.js create mode 100644 src/hooks/tableHeight.ts create mode 100644 src/hooks/usePlayAudio.ts create mode 100644 src/layout/components/AppMain.vue create mode 100644 src/layout/components/IframeToggle/index.vue create mode 100644 src/layout/components/InnerLink/index.vue create mode 100644 src/layout/components/Navbar.vue create mode 100644 src/layout/components/Settings/index.vue create mode 100644 src/layout/components/Sidebar/Link.vue create mode 100644 src/layout/components/Sidebar/Logo.vue create mode 100644 src/layout/components/Sidebar/SidebarItem.vue create mode 100644 src/layout/components/Sidebar/index.vue create mode 100644 src/layout/components/TagsView/ScrollPane.vue create mode 100644 src/layout/components/TagsView/index.vue create mode 100644 src/layout/components/index.js create mode 100644 src/layout/index.vue create mode 100644 src/main.js create mode 100644 src/models/UnifiedRobotModel.js create mode 100644 src/permission.js create mode 100644 src/plugins/auth.js create mode 100644 src/plugins/cache.js create mode 100644 src/plugins/download.js create mode 100644 src/plugins/index.js create mode 100644 src/plugins/modal.js create mode 100644 src/plugins/tab.js create mode 100644 src/plugins/websocket.js create mode 100644 src/router/index.js create mode 100644 src/settings.js create mode 100644 src/store/index.js create mode 100644 src/store/modules/app.js create mode 100644 src/store/modules/dict.js create mode 100644 src/store/modules/flow.js create mode 100644 src/store/modules/inspection.js create mode 100644 src/store/modules/permission.js create mode 100644 src/store/modules/settings.js create mode 100644 src/store/modules/tagsView.js create mode 100644 src/store/modules/user.js create mode 100644 src/style/variable.scss create mode 100644 src/utils/FileUtils.js create mode 100644 src/utils/auth.js create mode 100644 src/utils/convertNodeRedToLogicFlow.js create mode 100644 src/utils/dict.js create mode 100644 src/utils/dynamicTitle.js create mode 100644 src/utils/errorCode.js create mode 100644 src/utils/eventBus.js create mode 100644 src/utils/flow.js create mode 100644 src/utils/fn.js create mode 100644 src/utils/generator/config.js create mode 100644 src/utils/generator/css.js create mode 100644 src/utils/generator/drawingDefalut.js create mode 100644 src/utils/generator/html.js create mode 100644 src/utils/generator/icon.json create mode 100644 src/utils/generator/js.js create mode 100644 src/utils/generator/render.js create mode 100644 src/utils/index.js create mode 100644 src/utils/jsencrypt.js create mode 100644 src/utils/permission.js create mode 100644 src/utils/request.js create mode 100644 src/utils/requestController.js create mode 100644 src/utils/ruoyi.js create mode 100644 src/utils/scroll-to.js create mode 100644 src/utils/theme.js create mode 100644 src/utils/validate.js create mode 100644 src/views/device/profile/index.vue create mode 100644 src/views/device/register/components/Camera/index.vue create mode 100644 src/views/device/register/components/ControlCard/index.vue create mode 100644 src/views/device/register/components/DexHand/LeftBottomHand.vue create mode 100644 src/views/device/register/components/DexHand/LeftTopHand.vue create mode 100644 src/views/device/register/components/DexHand/RightBottomCharts.vue create mode 100644 src/views/device/register/components/DexHand/RightTopCharts.vue create mode 100644 src/views/device/register/components/DexHand/index.vue create mode 100644 src/views/device/register/components/Head/index.vue create mode 100644 src/views/device/register/components/LogicFlow/CustomGroup.js create mode 100644 src/views/device/register/components/LogicFlow/IPlayer/config.ts create mode 100644 src/views/device/register/components/LogicFlow/IPlayer/index.vue create mode 100644 src/views/device/register/components/LogicFlow/customFlow.vue create mode 100644 src/views/device/register/components/LogicFlow/customFlowNode.js create mode 100644 src/views/device/register/components/LogicFlow/index.vue create mode 100644 src/views/device/register/components/MechanicalArm/components/JointControl.vue create mode 100644 src/views/device/register/components/MechanicalArm/components/UrdfViewer.vue create mode 100644 src/views/device/register/components/MechanicalArm/index.vue create mode 100644 src/views/device/register/components/Microphone/index.vue create mode 100644 src/views/device/register/components/Motor/index.vue create mode 100644 src/views/device/register/components/Speaker/index.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/AudioPlayer.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/chat.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/img/ai.png create mode 100644 src/views/device/register/components/SpeechSynthesis/img/user.png create mode 100644 src/views/device/register/components/SpeechSynthesis/index.vue create mode 100644 src/views/device/register/components/SpeechSynthesis/soundRecording.vue create mode 100644 src/views/device/register/components/TouchInteraction/ai.png create mode 100644 src/views/device/register/components/TouchInteraction/index.vue create mode 100644 src/views/device/register/components/TouchInteraction/zsj.png create mode 100644 src/views/device/register/components/index.js create mode 100644 src/views/device/register/index.vue create mode 100644 src/views/device/robot/ContextMenu.vue create mode 100644 src/views/device/robot/TechButtonWithLine.vue create mode 100644 src/views/device/robot/index.vue create mode 100644 src/views/device/terminal/index.vue create mode 100644 src/views/error/401.vue create mode 100644 src/views/error/404.vue create mode 100644 src/views/flow/components/Aside.vue create mode 100644 src/views/flow/components/FormItemRecursive.vue create mode 100644 src/views/flow/components/NodeState.vue create mode 100644 src/views/flow/components/NodeTitle.vue create mode 100644 src/views/flow/components/OuterNode.vue create mode 100644 src/views/flow/components/ParamsDrawer.vue create mode 100644 src/views/flow/components/TestRun.vue create mode 100644 src/views/flow/config.js create mode 100644 src/views/flow/icon/audio.svg create mode 100644 src/views/flow/icon/awaken.svg create mode 100644 src/views/flow/icon/camera.svg create mode 100644 src/views/flow/icon/dialogue.svg create mode 100644 src/views/flow/icon/end.svg create mode 100644 src/views/flow/icon/expression.svg create mode 100644 src/views/flow/icon/group.svg create mode 100644 src/views/flow/icon/loop.svg create mode 100644 src/views/flow/icon/microphone.svg create mode 100644 src/views/flow/icon/plan.svg create mode 100644 src/views/flow/icon/sleep.svg create mode 100644 src/views/flow/icon/start.svg create mode 100644 src/views/flow/icon/stopLoop.svg create mode 100644 src/views/flow/icon/switch.svg create mode 100644 src/views/flow/icon/touch.svg create mode 100644 src/views/flow/icon/video.svg create mode 100644 src/views/flow/index.vue create mode 100644 src/views/flow/nodes/common/endNode.js create mode 100644 src/views/flow/nodes/common/endNode.vue create mode 100644 src/views/flow/nodes/common/index.js create mode 100644 src/views/flow/nodes/common/selectAreaNode.js create mode 100644 src/views/flow/nodes/common/selectAreaNode.vue create mode 100644 src/views/flow/nodes/common/serviceNode.js create mode 100644 src/views/flow/nodes/common/serviceNode.vue create mode 100644 src/views/flow/nodes/common/startNode.js create mode 100644 src/views/flow/nodes/common/startNode.vue create mode 100644 src/views/flow/nodes/function/codeNode.js create mode 100644 src/views/flow/nodes/function/codeNode.vue create mode 100644 src/views/flow/nodes/function/currentLoop.vue create mode 100644 src/views/flow/nodes/function/currentLoopNode.js create mode 100644 src/views/flow/nodes/function/httpNode.js create mode 100644 src/views/flow/nodes/function/httpNode.vue create mode 100644 src/views/flow/nodes/function/index.js create mode 100644 src/views/flow/nodes/function/loop.js create mode 100644 src/views/flow/nodes/function/loop.vue create mode 100644 src/views/flow/nodes/function/sdAgent.js create mode 100644 src/views/flow/nodes/function/sdAgent.vue create mode 100644 src/views/flow/nodes/function/sleep.js create mode 100644 src/views/flow/nodes/function/sleep.vue create mode 100644 src/views/flow/nodes/function/stopLoop.js create mode 100644 src/views/flow/nodes/function/stopLoop.vue create mode 100644 src/views/flow/nodes/function/subEnd.js create mode 100644 src/views/flow/nodes/function/subEnd.vue create mode 100644 src/views/flow/nodes/function/subStart.js create mode 100644 src/views/flow/nodes/function/subStart.vue create mode 100644 src/views/flow/nodes/function/switch.js create mode 100644 src/views/flow/nodes/function/switch.vue create mode 100644 src/views/home/components/BarChart.vue create mode 100644 src/views/home/components/LineChart.vue create mode 100644 src/views/home/index.vue create mode 100644 src/views/index.vue create mode 100644 src/views/inspection/alarm/index.vue create mode 100644 src/views/inspection/cockpit/canvasUtils.js create mode 100644 src/views/inspection/cockpit/components/Header.vue create mode 100644 src/views/inspection/cockpit/components/ManualTakeover.vue create mode 100644 src/views/inspection/cockpit/components/MapCanvas.vue create mode 100644 src/views/inspection/cockpit/components/MapOverview.vue create mode 100644 src/views/inspection/cockpit/components/Monitor.vue create mode 100644 src/views/inspection/cockpit/components/UrdfView.vue create mode 100644 src/views/inspection/cockpit/index.vue create mode 100644 src/views/inspection/map/index.vue create mode 100644 src/views/inspection/point/index.vue create mode 100644 src/views/inspection/robot/index.vue create mode 100644 src/views/inspection/runTask/index.vue create mode 100644 src/views/inspection/runTask/task-log.vue create mode 100644 src/views/inspection/runTask/task-steps.vue create mode 100644 src/views/inspection/task/index.vue create mode 100644 src/views/intelligenceTest/car/index.vue create mode 100644 src/views/intelligenceTest/mobilePhone/index.vue create mode 100644 src/views/intelligenceTest/runningTask/index.vue create mode 100644 src/views/intelligenceTest/runningTask/task-log.vue create mode 100644 src/views/intelligenceTest/runningTask/task-steps.vue create mode 100644 src/views/intelligenceTest/taskManage/index.vue create mode 100644 src/views/intelligenceTest/testCase/index.vue create mode 100644 src/views/login.vue create mode 100644 src/views/monitor/cache/index.vue create mode 100644 src/views/monitor/cache/list.vue create mode 100644 src/views/monitor/druid/index.vue create mode 100644 src/views/monitor/job/index.vue create mode 100644 src/views/monitor/job/log.vue create mode 100644 src/views/monitor/logininfor/index.vue create mode 100644 src/views/monitor/online/index.vue create mode 100644 src/views/monitor/operlog/index.vue create mode 100644 src/views/monitor/server/index.vue create mode 100644 src/views/redirect/index.vue create mode 100644 src/views/register.vue create mode 100644 src/views/system/config/index.vue create mode 100644 src/views/system/dept/index.vue create mode 100644 src/views/system/dict/data.vue create mode 100644 src/views/system/dict/index.vue create mode 100644 src/views/system/file/index.vue create mode 100644 src/views/system/group/index.vue create mode 100644 src/views/system/menu/index.vue create mode 100644 src/views/system/notice/index.vue create mode 100644 src/views/system/post/index.vue create mode 100644 src/views/system/role/authUser.vue create mode 100644 src/views/system/role/index.vue create mode 100644 src/views/system/role/selectUser.vue create mode 100644 src/views/system/user/authRole.vue create mode 100644 src/views/system/user/index.vue create mode 100644 src/views/system/user/profile/index.vue create mode 100644 src/views/system/user/profile/resetPwd.vue create mode 100644 src/views/system/user/profile/userAvatar.vue create mode 100644 src/views/system/user/profile/userInfo.vue create mode 100644 src/views/system/vehOper/index.vue create mode 100644 src/views/test/configs/Run.vue create mode 100644 src/views/test/configs/index.vue create mode 100644 src/views/test/detect/index.vue create mode 100644 src/views/test/log/index.vue create mode 100644 src/views/test/params/index.vue create mode 100644 src/views/tool/build/CodeTypeDialog.vue create mode 100644 src/views/tool/build/DraggableItem.vue create mode 100644 src/views/tool/build/IconsDialog.vue create mode 100644 src/views/tool/build/RightPanel.vue create mode 100644 src/views/tool/build/TreeNodeDialog.vue create mode 100644 src/views/tool/build/index.vue create mode 100644 src/views/tool/gen/basicInfoForm.vue create mode 100644 src/views/tool/gen/createTable.vue create mode 100644 src/views/tool/gen/editTable.vue create mode 100644 src/views/tool/gen/genInfoForm.vue create mode 100644 src/views/tool/gen/importTable.vue create mode 100644 src/views/tool/gen/index.vue create mode 100644 src/views/tool/swagger/index.vue create mode 100644 vite.config.js create mode 100644 vite/plugins/auto-import.js create mode 100644 vite/plugins/compression.js create mode 100644 vite/plugins/index.js create mode 100644 vite/plugins/setup-extend.js create mode 100644 vite/plugins/svg-icon.js diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..9ddffd1 --- /dev/null +++ b/.env.development @@ -0,0 +1,14 @@ +# 页面标题 +VITE_APP_TITLE = 招商车研AI测评机器人模拟测试平台 + +# 开发环境配置 +VITE_APP_ENV = 'development' + +# 招商车研物联网平台/开发环境 +VITE_APP_BASE_API = '/dev-api' + +VITE_API_URL = http://192.168.0.201:13080 +VITE_WS_URL = ws://192.168.0.201:13080/ws + +# explanation +VITE_INSPECTION_TYPE = "inspection" \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..4c5aa50 --- /dev/null +++ b/.env.production @@ -0,0 +1,20 @@ +# 页面标题 +VITE_APP_TITLE = 智能座舱测评AI机器人 + +# 生产环境配置 +VITE_APP_ENV = 'production' + +# 招商车研物联网平台/生产环境 +VITE_APP_BASE_API = '/prod-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip + +#node-red 服务地址 +VITE_NODE_RED_URL = 'http://10.148.108.59:13080' + +VITE_API_URL = http://192.168.28.10:13080 +VITE_WS_URL = ws://192.168.0.201:13080/ws + +# explanation +VITE_INSPECTION_TYPE = "inspection" \ No newline at end of file diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..66d8d56 --- /dev/null +++ b/.env.staging @@ -0,0 +1,13 @@ +# 页面标题 +VITE_APP_TITLE = 招商车研物联网平台管理系统 + +# 生产环境配置 +VITE_APP_ENV = 'staging' + +# 招商车研物联网平台管理系统/生产环境 +VITE_APP_BASE_API = '/stage-api' + +# 是否在打包时开启压缩,支持 gzip 和 brotli +VITE_BUILD_COMPRESS = gzip +VITE_API_URL = http://10.148.121.100:13080 +VITE_WS_URL = ws://192.168.0.201:13080/ws \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57a04df --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local +.history + +package-lock.json +yarn.lock +bin/ +pnpm-lock.yaml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4219e85 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM node:18 + +WORKDIR /app + +COPY package*.json ./ + +RUN npm install + + +COPY . . diff --git a/Dockerfile.frontend b/Dockerfile.frontend new file mode 100644 index 0000000..28e0423 --- /dev/null +++ b/Dockerfile.frontend @@ -0,0 +1,17 @@ +# 使用官方的 Node.js 镜像作为基础镜像 +FROM node:18 + +# 设置工作目录 +WORKDIR /app + +# 复制 package.json 和 package-lock.json(如果存在)到工作目录 +COPY package*.json ./ + +# 安装项目依赖 +RUN npm install + +# 复制项目文件到工作目录 +COPY . . + +# 构建项目 +RUN npm run build diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8564f29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 RuoYi + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5e715c1 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ + +## 前端运行 + +```bash +# 安装依赖 +yarn --registry=https://registry.npmmirror.com + +# 启动服务 +yarn dev + +# 构建测试环境 yarn build:stage +# 构建生产环境 yarn build:prod +# 前端访问地址 http://localhost:80 +``` + +## 内置功能 + +1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 +2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 +3. 岗位管理:配置系统用户所属担任职务。 +4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 +5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 +6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 +7. 参数管理:对系统动态配置常用参数。 +8. 通知公告:系统通知公告信息发布维护。 +9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 +10. 登录日志:系统登录日志记录查询包含登录异常。 +11. 在线用户:当前系统中活跃用户状态监控。 +12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 +13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 +14. 系统接口:根据业务代码自动生成相关的api接口文档。 +15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 +16. 缓存监控:对系统的缓存信息查询,命令统计等。 +17. 在线构建器:拖动表单元素生成相应的HTML代码。 +18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 diff --git a/html/ie.html b/html/ie.html new file mode 100644 index 0000000..052ffcd --- /dev/null +++ b/html/ie.html @@ -0,0 +1,46 @@ + + + +
+ +您正在使用 Internet Explorer 的早期版本(IE11以下版本或使用该内核的浏览器)。这意味着在升级浏览器前,您将无法访问此网站。
+自 2016 年 1 月 12 日起,Microsoft 不再为 IE 11 以下版本提供相应支持和更新。没有关键的浏览器安全更新,您的电脑可能易受有害病毒、间谍软件和其他恶意软件的攻击,它们可以窃取或损害您的业务数据和信息。请参阅 微软对 Internet Explorer 早期版本的支持将于 2016 年 1 月 12 日结束的说明 。
+推荐使用以下浏览器的最新版本。如果您的电脑已有以下浏览器的最新版本则直接使用该浏览器访问即可。
+ +(!nqIm*{NYsjTN#NR$63myU-_ZsX?qIZ=(AavV(6O&?q#yH&TeTXHGEe0f^V+KLh{OE5obcw SC>K`tTExR jVj&rc)}_J?rDAgR?IeGw%3L2c23(EpN%i38eAbe*)>$2@*U_zwSj{ z@zbaZD}T`7G|Kr6$X5g2ujFq|f64iYS3x4+#LKA@BzT(6$W-@?jGwA?X|L%W{HJO@ zLTcd?x+ix(5;56-a_7_u=F8J`il@3~edo!>tLEeMmj2U0A0f58B|k|7oj~eS1R?7L z^W|we6%loHws|(=ON(o|Hm#7e4$5CYyba_ooTuxiTBRPO6E;QB=!|R IQX<=# z6FmLu#a1 L+#_>($ z$);03vcJYI`C}sD6ET0BOUTk9!PDo~Z&QakXML}TIGdq`-d>!MAtAN!3F!oqh$%!A z7KAJ<=F8K=60TOeIp@?Li7<;M*SlnB@9e^nkXqi7iyL>HZro#?Wk`bCkf$QFBXe*2 zoVTjDM2=^fmUSh^zn9?FrQ}-#r|H*(d)sI5+gBuHnrrcX jsJ8}_xnx18m@KU%BN>O{y-V^^^Gt43*R zx%i>ojxJ{l0>iWqZ7zk-T+-riYiEO8#((cK*zKa0v6I8YwfYfTL(-gH#^%on*Ioqd z32Cz^l4WW=Mhj~_n}}UCa@pS}E@2$i_gI?`FJlerhHDiIYz#SjWf{v6H(YxYZ+VE< zMz-w7^ln>v8rq59Sc_*%*~KPdTFO?5Le`{ @sWX8>7!wu~33U^_R=o&@*9L-~DsQ#{Gz=){4oU zjfOcROe9b%Pm<+q^yV;aK(=W_bk&R7U5DM)&%F(@v3{`LLU$}@Wm|@6r+>Xo#EMM| z^g~(t8o!QfWnsy&v}^AzWlKkfX@z %i`%?0$)G?Z%=3L`?2wXv@O?(1W*iu=}rA%JxqT*Phl0 z3qh?vb5Q#q3fCGw8%soF?d4kK<8h33M_Sn^K?3d3`_6%(*5*|K#>JoNcnH*5zA2Jb zIvuW^T*q7RX8$Z!-JaPDwQ^M(B}nYv7s>va9Ih#gCJ=G{d&RO-1{+J$m$XrW1lF6P z%&KyQJshnX&B_$^5U92JcqH3I<0f?6aI#T;NdQ|gxt-DW*(VDnNMQRbO4ea7Os#Tz zV|Mso9s;%EKcP|kUzpZ!*Y{+jc+YKWvl4xcQ4OOklpulQQBm4vF0LneHO$x(QNcr? z*74VoZ1STpt>BA7WF!1?O6%^+JbKmaBkda_ma^L=#%TQlCWQ3 2 zwY>9HrJjSWysLNW>6Pv_N{~3SB9gUDGe-MbaVFW=wdIX<@#}uQ*MNE+0=00=E6UIc zzgxEw=Qdj0&*qs$k-)i(X6iwR=$C9U1n@!n{z+JD2>hEr*@BL0O|_-!&FWkifZ; z-V%CP-TpfulX3lIVGn^?xH2e8mKW8nB;$u0@q<%Y*tR$iV(+0d%XTd-Hf)GtJTg4J z1PPo`6=g_?<<{Yz9gGjP_j(A_!cm|oC5|n(f}`6T74Gf#^mZh0o>!E#A5L0x4(dkS zzDaG&3$<`G)9uof6V~l%m5hE$BG0Hr0&AMy%}^g&JO9mLe4j0khd?cyV-)33i|5wH zFaPNcCaa#=2MO#kR9A&+TkEaQ`j8bZJOpatT&XCXYW1;}^}ViVJ>K3kCnAA8pQ3T6 zovQBWxmS-W*v~_t7S7-lC$+~)v+JLW^&Y1NdFFN`a0HWQO{E&zo7I!`B%6oY2|F)k zy+4O(8=DRZ!F(^~Udn#C5$? Tz;&K_d!fhr gm=e1qXYKTRkE8Y0)jN9#)WX)Jxnxxw{q(f<`l$88JT2JJ{E3Zi z)6eM{-lsaWGLD{_h-pNi1c@pC{KV3X>Fe}2MR|R1fqt%2e4|10x*h_xunrYv;e+k^ zjvASaTKUR*>I#W!MP{)rxB7@SKcauo2X$& 7nY)WoJ0(chhb1Yc--$t>*7OULS*mVrg^dpBbv;+oQu=8kP=dsU9+O$m zc z4wN8~INMm3GGPf}qt}`+z2ofO%!)yv*4a4YS;62uvaVK#>9c3`X1vW&f<(!w 8*z`2-NzJc`Dl;kV@EKM06nH84)N!qFdAy*0e`TVIu*Jjg&!pECRJw&7Hv(Y)>d` zY$xIw5q#951c@QlXRxb}69^jvsHg8Q+{U^TgFvm-(X-jnU`5ziKt#MEZLG6IpahAV zvuCpl%fG68Kd&gikJ_j0JT%C<7=u8qLsRCn=+hrnx9_H*vGI`zZUZGqOz1kFExGkU z*f_nbp!VmevDTRw1Zs_)vy^>}{!`f4OT<+oE)andBr?rd%DP9t6*kh+*eIWWyi*P& zP^ oC_y6kiB&B3;&;MEL+a_(R)<-aV-Tnnv~>duF7!p% z$U;O`BCZjE5+vH**uYL#`6O&i{Cu6Q3F%|qh(Vy%qbl3ji9B&do3AJ07!lkCN|4Af zaT{w^Esp3{t+rjz2R=`2gzYcqS#fYJ`O%opu0?kh>tHAm9f+7i1WJ&=b%pM>v&A*` znt$qZV-ToSH}e#B_FWrcBR&xmh_Hx22@<%jD9Yf@>5b(zO#M&{0=26CHi6Aq-&okl zLqroI(j6#gqXY?DS17K*t$aqm5~K9&F$mOpeS942*06@KQHY4)M5HGIB}m}9LT{x! zE^aJt^qZC?27y}DPmg6cTC2iF%_qf;OGM11lA{C(TqVfsrC2E=aMM9^VhjSc68$rl zjjvcj*w|gPl+kA0L9;SF6-to6bwyGBTUyizdzI5F8G}Hr3a!Vp8H4f&8&` v$w_| zP;1!o`HY2pR^8uGdx_{k#C;-Af&{KB6pNL5`iIBG?FTUk)Up>XWw~p75H`jWk>W{l z`!o?KK>}9^iXpWApczuElzlh`fm+YkuVOg@{}MKSp|Mefi1S3C1PNSMC}I}%^p=rD z?VB+O)av}x2KMadzlDucM06)2nh2C2f$IuIrl7I$L&se9wHO3y eZ+cfZo|g3fD#Bkc>zYqzb7yyTel00VAQ7L47*7OBkid0? zypYnAHXiTIZ&Z#!pw_qwQ`o>`ZG??bBEAxFzIcR%5+rb4QIwU<8yL|u;~3E~2-NDC zbRv5?xv{V@ln9H6mn9-BlpulYilXF=>|zwVxmn*BgFvm_zmH=(wHm@kc_K;@QJe^r zAc5-&ousB7Xf(W&T`v@aK&`58# )Pg8M0@oEqdG)%l5q`6+H6#XsTGhsmX9;KI5jNt# z>1*sF;tZ7>B}m}9LchF5v@<%7kG7u2AW*CBzY|%GSs8_md_?3XA}^I3B}m{ZLAM#y z(`k&@e0(5*TJ6V9Wfza65;pkQpfO_e@qrQ~a9yGICa9-pPE*>h6oWvmcTZ=qNfQ$Z z8|#ROPF>obR64>!2@<%jD9Qrr=>?lNunWf^P-|a;2-YlL9ARTQ5!Hz3Lv@7`Bye3J zKV<6Zzc1}#H;zG|R>O_++4XauRenB4x4J}>i|k@|rWQmA61c7?N*n6ww^I+a562)- zOI^B@Wqj~K*l170bs`=Rff6KeT~U;5G&WKP53!3=dmw>YZ&$5iSvLM9Y~&&$4H1Qi zKnW7KuF$<2_4L1A_q9{TAW$p+gbgf9o_~amendPaVm%QkK?2tmIz6YJUVKD5dtVF! zwKB!o# v9N#|Btggof64PgyEaN|E#M$eI(>tx+Q5o&pbUKK6 zp_aEClOCS5GG;1jKY5qkvvMM_YLv+)eHS3s+C%yWi_Q~mex8VVp%&I5%_T%^AY$Kj zZ|x$nsJqFAP7V<5@mJ5wY(&8 _UE*WrTWvY#k?A0B?_i-YP5So#%>%< vhs zLhR0!Qrjp&;`9!az1$ffZuNr}rng%psbn`BIom=4wY=@I>_TR{_AjA!;%SR4lpqnb z!DM631ZdfIXQLUe+>69^qNGjjME`zfNTAlSH70v>HNf${An)jf)$BfZ3_ZMJCObNr z#R}(3t5xm0JmlZ(7Q0z5opx;K&XB2J87nz6o#Wx5D1U6OYcKtEt$sAie-=uR2ufkG z(6#Bc$+x)QB>)TD#+1Wo2g!wy`h0T*O#(oB-{QH 9q_+S;&tc85{gOz3^e#_FK4ZZG2*meY=aH1c}AB z8GD`~Nces<+&I#Hd1{$<`9H%#0=1GnW31?vbdEm@-G+Awwf}9A*$(|N(rVh5u`K1% zIydX-DLt-rS}k4rDj`_Yiqc|nDZ6C%V7t|*1sY0_SYMg3bsqz@;dQf8T?I5LX=h0s zY^T>gG9*yT+k#E bm_R)j_Mo=~OmKkic3XPrwBg?QGjk zYhiRU4}n_S#xgebR-o_}sgo^-{om?(){}P?ZImE^tw}L{PZhQwd~ReNXcFupP^;($ z##ZzV6n--A51+N#w71pyKlQXxf&`9W`pQ^}{&w}sW2}~!hUqx&^1fxP&(ic-+=n|t zaCDIu(zS3q$(9{#MUI>dB}gp4!&v8*LBjv4UCWX7?uq5CtgUZ)2-GTfj $*kieNwQN|7FU?2Lug7&W4TMG%)^3El 4v9O-Ew*WWdhPopcc|q1OZKp5Z91fns94lP zpcc-@ mEMrpzd%4QA*=vh=dOH$W>pbp9SG!M&I98tgH!RExwQw|3-+k4? z4jEC}DzP-mLJ1Psr|Da2_4?XDrP^D~_RsYYsD-nVqGT%4+kSN7sC9C76NVBbyuCep zrQUYyS6i**|CaU4SEz-n56!z}d)S?dU$*`kk(;3eiE@J&>oGE|)^$q>>Lr7pHnwZN zO>Pf)ao0 ~pgf1Y-HQp+A1sD4fm?f9hTD>hQyUGlW>NjPCGl6-xu~**ZqFlS;M_H(tkJF2;CY-x6YDJ>Yqc@TWL=@yP_0F zhNy?CopO9qtDPI7HduU0_@quq^Q&I@bO+;L?c5gTg*LE!bUK*t7kzu1jz+(mRV A_4<{XXJtJjCHbUc{b0Qn zf6!BHGd5c6$kKKgY-BytSkE|?d{Uw0SlV<8hpNYdPKn*?s{Zwjgf(01i^wMxB}lv& zKTIvZfJV0ClbYv6Z6jWTo_ZegNksy+iuWC^md sFipB2sL4jQ^F^8qk2d0mZG};9r>gl&Ob`6k>`~2 zTL!gCe;lDsUvWz8MSnm0UT>RA*AJ3UDoT(*d-NNp%mw|=)xYZ2tU4Y7wYt3=roPR5 zTCBALYQE3|@;}o1RjO*E1c|BFhpN}pofbZ+LCaGZiI%<6(`G1XqXY@8H~Ow+q9Ef% z`QP Enl(W~ A7xp$*X4 S5_nJxhV3j!!B|keHETggQ9y zY2lN4bNC7^PU0ZrAo-*sfm%4`X@^{QjsC~mU}M+qY@S&Z37jkGyL|z<^e1`S8L39S zvM?{y^3EmQiY(MGoathW+_lC+2@*J0D$1Ek3H5||M;ZkN7WNRRg)0M{=~vK=N7M2f z@j_Br*tR$iV((FuWi=}ppW_xXYTPzFy#xuIQ7INu;mpR>fM6q(d{Qwl)WSYZuZfJz zWOR*7u^=Dq_w;roaGqC`f~}wGW8alEuJuc5V_v9*qnUm|zI&m6i3&El#7X2CwMbx1 zlV6{S %*MCyLYJ%3k@|^O)W tn#yQNnO8=D%})Vo*6>-Y|$1c~P- zN~ mJ@M@2wqnxLE^@|BcTI6ED|>Am7T9$4jo|~i$S1P z@~Txrd#_$7Y!o4491+n(pahBIU8{u-&$m$6NEUKdJ+NS0ECRI>MIO#OE2*^cZ-uk! z03vw5LJ1O^Rv*rr=Z6Kt#v &HetT@=1^&dr|&!WGg$LjrW(_ zN1ztfdX&FCS`l%92+ ;-ozqk7&NKijE{o`W+X^--cC?A1ZG&W8DIG;yPRM0Lz)kf3?q`MbL# z`@1K7@BYkmwuQWqaK*v3#0(#(cCNKktWgPjl{5m0SV;s*kib=fzALk^knu&SZ!L>K zpw{Ewoz-IDn}v<}M7$+pH4!L50@oFK>$gHy }9^x@kC{#K>CmkySbdfm+qB7E?P7TPbY(OT-8wKG0L41PNRv$Y-MDBmMLF zBz7FKfdp!uY@I|MxGYlG7)V5t3rXxZWCJBg;JQNR)Pd{uF%`1f{Hc&Yts9{%wEi)Q znc=*Hb&!Y&M7$#cB}m}9Lh;Cy`g*m6g&Z45pw{z0Du$+wyGYoGB%&=5+&>W|NZ`6c zUrdjluAS^z((zA30<|(MJe)UW&xOLqej>&ak%wv*B}m}9LhoQjPiN!4L7*1dj`Ek| z4G|~&Pvw&!;azdoQ%`T>FS(CEEvmyPe|wB4qPo9!eG(+RD^3*kbZ9{zfm+lTOn<-H zN5oivFY!r`@UA#RsHZ3P_e39oTGXda|M+N0#20^W_eqfOt~l{1|Gxea X;X5(X3?p=c_YB{7QtFeS8umyerN;YQ6XV z8O}$b7R|1vf8M28)c!<-m_>aOB)lsQ&D3^c|4i*8P>be#XEkugIjshEQvYh;lOW+; zaY_{&Y~1Q_h%F?)CH}ic{wl(?ByN)d>g9$zg`Z4*BK8sShzOJ*f$IwWu07e)$k>0T zRhc}UkU*_5jXSA_W^5KVvJz2{h{t3DB}m}9Lf@Qh*W3uN_smkr1`?<>YhE37MCdwU zBZ7!mL?j?zHIyKM>k7S{xlS|UuE}gqA-`87Q0v)0Mb-KdD}{|`Yc*rj>dbZ#dMcD4 zfvW_4^=)-#2U*w{$~{iw2UQeB}030x)Udo1;y>CM_Tx9`Uw zQ0rhLGj#Mbige@n4$dN?BoV*RQ=tS2TqP)ORR5X!n-e|lFEI$z3XNAWv{(K`!UiY4 zJK58|O6`FXByg3WH>5ip(i#*TY@d%opjM9ghx6u`wNTiIB4Q{J*Qo_jf&{KB QO#k@UK*Upj zZ}&-%@UA#lN&5&<#i$&Z7i!ViH2vee>^jYULBuq7)cPby;3`3WGF0m0RQmYt%-|zX zi{=>9KVLN 7U_z1ZvS-Y5M2g)Pkr)B}WMo-W7*tYWtFZ zruOB9S~TZ7tAsnwX*IA9`Bwv<1PSkoL#KnzS7`X@Ag(O 6iP91qqaJTAn~- zPIS?5KZDKVQi;<+=c)L)Arf?|=FslhE1eG7@^ldMLM?AO=;Y3^Ax`cb8+=WTNyt+? z@+8;Y@7D11M9hn)rIxpLkw8gIg41q$e7O;7y`9}a9ZNo`bQW&PQ*t{0Hsw7Yoz|N2 z9#>K7Q+q_4c4%MnNyXYl8taX|F2A9zwITl{?Hu`}q67)AjewOI>|L$9u&(5jiUew5 zy-^gXf0NjUYMxLBkxwd0kf1Yb(|;TO+^%l-*qlzgem%Q~KrO5{MVZpMv7IG%w3&o_ zQc;2goxPj>Tm4L*2ih$IlIfF1&30N)wi;^jcJjAJ-39&aEC1xy?@e07cS}AA5`}UO zH9Mp`C45pVTn@9lJS?vrPXC1=fm(FyU`p=`^4>|+&06reit) Gv E$sP p2bil4UVSI8$7B}kw> zI$ Clw_~U~AI1;v?eO!=m5oKax)>5~xMD%ckE? zW=7KT){DCP^mXKuiV`Gn1k*b|HHzDd Q*VEX;9{?3ut-fC4c^j0@L1Zt(b(a(JH%W2`0`g^Z2R$#u#Zu4 z?GQA|yp)7|Rmdk5XS;4ihM3)FoEAQ*19z0M4$LlNj3b{^lpujKpQ6lddd?b|s-_Xp z U~TK|&0~7t@vb(uE!G?M1$rxfa~rG1e`$; %zKaCbA^A*vN@>r?P|m26=LYu{@r@kR!m&v+^+kHu zpg kzh7u&aefP(^ zmFye$a~Pvj1$$;6)WWrdyc3qyw-@(FXQVHio1p}Ww}S_n1xlP29;Tb)b+(VDd8D)G zyB-3yaP^_uEj-*__5CO-d5+#?8@*<%ZK({5M?DqZ%8W-n72eUzje44@du@9{pS$cK zMLjK((qhy5q+>klX@;B@YdtI-<55p@Jz%U}qCn gm&SCL59_knyOe*V8k$pi>}oqn Be(RxcAgh)VEGiK$efXOl6`YoUW$5(5+sDbFmt1x_WyB=o#A3vEjmGji3Dm1 ze|qLdJ^i{i*k)%BTPfZJ*;qeVZ^`JLpUrF2GdJpKon!^ 1XbHG@%+JWNr7gm}M!xgMtbwr8+k*9$a4$iox~)DrKWFgNPypk`mJM2#Qm z<;lYoB}hD}N^dJ13t+B?X{RcGS>u1cr0*vWQzTH!qBjnUqzYhe)Kjb8F)RDW8TvHx zFcojtFdp?3wZuCV%#C{b!-2Eb+###=`A1vXC_w`4DN4q6LH5{?czXZYbvy)W39ozR zMm>FNWwB?sDyvtgsHZ4FVp0TS+g1lMH|puf-9_yZe~;ELQ`A$GAc6Hpp5*;X*puv; z`a_C(iUev2-+JaoJ&jwin!Rkp1^w%jPtxn&ksyKXPjNXPSGD_&zoO?K^OuJ}t)}!o z7QLIrTo2PB(`wsKH-FUMH;$4X@s0!u9FK~U;c`Vg{6S75?57GI0<~^*Wvq77w9Jiq z+R$if-Mg2EmCo*a2aECF`T@BZ+d3o-<55pv9%roFoB-xVJ v;&&!ZEKXiLL7PjLOSc!H3yAvnUecofc=VRFtvd-`gz{FSH(w zd1YZ hENokx2fh7j>w|vwh~MYwAMP5SUV;S9s1!lDN-sM>hobrs@-W4`P|G_$=HKmU z8#xN=m+tQO^mZh0o>!EK1)JH8dL`GIkcTPeg<3c^6{V`y!hU+8h}MieOi_Xa)-;_) zMOCqrR-ej>P}EZ-Pz&c6id0y @obyatZ8~3xC!gEN|f AqzC_VTuwY#GAT;cy&LXJ@-sKqv)Op`7Sc!Cv>>Bi?^DY zdlNVLeh%AiYZ&e8wwCWZI}#*t)mD@oM>bk56P7jNFU>CBsdfm|67O>}_ms0!!pGLN zMJ0{q Y)xNW11E+lwxEb>;Iske EXUF^f#s8}|nyRuciS^c)EiB1)d=p6M5&czszYrX|Gd za|qNDv6qC6%0yHr0%8KjB1E)5VdFE!9n40tIU(+#L!g$3Ath{_BZ6WZ>O4jxN{|py z3x$mp6hHCWsIfZ4PjvD^EfEV#*tkc;J0c)PV=O{MUlca7QXI$+hX%zWP)o%05`FhR z#hTnr1jL$jBuI!TlEOwL#j{i><}1XrbO_WEvB`vuUPPFM+vpH8GZrDDVTw8ND8=Qx zNzra0E~i7FmWZ(?Y #EKI(;!?EU z2qGYcX)HoSClxmSs?bOO_tSL^;-oqRYKfS4!bV?;#hUQTbq%7o#v(+NRbk@<_4HG- zddDJAOT_LIHu_LZ*@ClsYYoiB*VO>kz0VVh{=&JT~s{L_loZ zScHgrD{S!iyZY{e4C3!P1Zs&`ioynu@jH?Ti18bX5Yc;ujnfoI`0VI?4B`ko1Zs(x zkiy1tBGwQAv5I36A_}pvv4F-#{Ao!XPjbu)wM1-7VWR*MJEkVFAWE|%K|(}R7B(7D zT<5Y$OT{8kOT_3DHWt#@=$53Eb(_WqN{|pyp@ofKsHeBw)!2gg)J|TgC1Q;V8wn`} z_9`ME26ik$M7I_;Qd69}Hxvu9JNfnD8inhih*@O1d!MruOK%bpSBXFg65bW(h#RlZ zfOvgQUZ^EvF9{n_ZcIP}Vgkk@yem#>id0B(2aOBdKhcdy=n$wSVn_)a&nZ$N#Wpk` zwqYy+*A v$v;HQB4Qhr93@D2SDYOb&vHD)e1&+HPF|=bVv`9QuZdVs1jNjYMR-@7|0ph} zL9uHgE~i7FmWZ(?Y?wskCIVuA#v*WCQIvKRU(}!&ybxd1Ay7-iiW4>l6Va3ih+!Iw z@UA%TsHexz|Fh1=2j+!ZBIcd2k)DVV`F_@`k$)meknpZJmnhzA<5xL#i1+H`g<2wZ zpRl1s7B#vP!M!F?f`oU)*-3G0zuS0F{VoQ9S|SFau)$;F7FvH$okS%^2@>8Fr#g*| zR*ipSKgJ+XOT rXjEAcbJ>v~;azbOQBNOj{%Jv6XNN#7 z5u;Ps;A4Zvh{eYTN|3;HMN# Hx){7^}%&TQKnJ6z9$p~6XNwbd7+kw6)0>>AmU#l zASPfe0#^w)QX$11G$8JvL!g$3U?^ !n@)G-=r9+6f3n8dADI+s3l@hI_*T?47;&ef48)Y(TF_HP=W-mD~hs? z;#pRrn6D7e(#Z?8L@Z5VV>S`Rh=7=xu?X*qGl$}G-br2BnCy?T=@6(TVuA`AkBCS@ z(QbKcT$CW;U2*=V_@b#O1~0@Hb@D vI`^TTPGdyp;{)?T zEfJ$t*l0im#hcV27ONvc0@oF~)u(u`b8oiQA>OM)pq7X=D{Q=^v9W}R!Bkf$K?2tm z`Z5sp^h5m>twIa}wM5KZVdE^t#=SK_(f*{8qXY?DR}^I)#otYPC%d&g27y{4_OGz< ziikr*6rtXZ5+rb4p%@S}HbQT1wjhqMlNV}<7{ 5x7c_FAnweT{Gj@ zujr{TFVqsTn1zkSL|h{RVlF!pB)lt53F_%d_vN=CuCqg+mWU}WYy=W &hH(}$@fhpn|~7tB}j;G35l~;@l7O~e-jA_)bf@?e6Prc?-e;K zClbfqFK3ChR(wUtiF%58p%&I5-5a>yU2+JNAR)e}B-%r(vPM%%6|}~YhpG4im{V8c zt6xr9e51;_$5oU8k3MPjr*^WskcTPOJJMKhG-@-hRoiACVjU+BQ ;_c(5tV+8u=0-i8cJ8?ze?bSkQnoJ)^Fl50tu@E{g1#YrJ-K} uVJ#qD#Q6WiOf{U^V8>qwADP2YVT z+cJ!~QBVIVUW0vYHrL`&Pq8meN*Kxh?mC9?sHft)eZmhw>#N$e+ZD05E||&0HyItj zmA6Nhv#0UG7>{}?zS}5#SO$!EXFYD--fs1J7efgW;tPqw_oL^Ely=7q_3f`pMfp`- zCoj|z-#c{tSty=mi`@Eyzxvq`KSj!KH9Gg_K_4R7mlt7-M?J-wRurqrG=1^IA@-pO z3pA7 &h<{I^!7$@wHXqU-I_13);$sN$n5ozxNQRg*~56Kc=gC?z2_wPZaeO zB}nY4AIXk=3S+K^>AiEM^a{7?+x-`(^bn|pJzr5;%`2=Yec9ih(Po~7b%k2u`<%i9 zqQ-?8X7?8P?B3*IiV`Hy9(_%)M$XU*>3Z0PdBxM_sP*sFNOnDYICDKr*A?% {DkIiH6dRtL`(bJJ2fvriN z95-`Vx$_jaPmqTx=7n0~`<%j0CS-UAYeut8)>-l}MF|o(f)(ZS%yHJUv;FKe2ZrgM zakp$a8(%Dp#i6LDIJy)ibNicCy0hKv@M1X`N~!}PzMU%kuTl)%Xr&~7gC(7AdI;2N za(NjmaVm_tQBS+x`#*G@2ecJ6_x6Y0L_vy(bOe+RQZFYHdhgOfiU=YKf>i0CQWXK| zy(qo+awntG5$vddB8mbw^p&Op`aPMu&-l#o|GjIm-n-oUclM-Cl1ZMNG#9>3>wkzH zrp=#O>Wx8 @-!g>7{ z#+Hioa7=LTik-5#pErBo+;6^thAEdV=Ns1roR1oO*qplaKhq66OxeN&=Lo(DAKGCq zy-~qGh#jU(uou@*^rEZ2HRb=z=`XJ;g5rcDO;G}8tORTCcS3*J>A!@v2RXI K(Z#&%o`=82@-iN*TU4mU 9{p~hVS4%d zacbV}(f)(yzlsp-#c!WL!_+{-)E5oYWN4TMJ4|J_a`2{>9nJD~hK8wuhN&+arpeGS z4R)A9qca&Aroj$V==dc=!&G*dLc`QR!_*fIQ+tjj7-h(g-{6fLjR6f)9~!1cG)(O& znqZ6rHN<3Sm pkeAm!_ 5M$wlD#O$7E=j$_`U#n0nAK^+m%p?EBb@ z+kBv5YM^22i-u{~8!#a!RAjCO4O0URQ(rVpLxR1ceF-#74Kz%B(J)QMIl-WpVItb^ zLc`RaWAR19G$h!I-wc6 O;fS7Y);}mN3CRYM^22L&MY; z4bzZduW0*#hN%w?Q(rVp!`jXS_w#{ TS4O3q WhYHNU&G5_ko6~frhCs8m3|I!vxouK*Q8P!_ V118& zw|dI?^PtDTx1vT94Kz$W(J&1NyNiv9XbfnWdeAUEAR4A2!CrD&T4F%M)PsiU0nsqE z=eGaTU&+Z(A)sOEL&MY)4bvco{Te1GOM_93oNAWUL1>uz&@e^68)%pYgx!C^M05lI z4O1T)rb;wSLxR2JbhfN=Lc`RDhN&kSrU7C1o-z>~0YJmlhlXjgXqbisd&!w`*^vSb zQy&_po@kf`gx!b81iz^R4O0UR(`3;w4GH$*(hL+yLzM!q4fby+-UMY3eJWNdU`rxl z>6BfQi7Ey0nrP{`S2TA;rQm>Qn1*@9ge`MRr|hf|1%Yv*VH#L$Es>Mu!Ajx(pI}QO zVV^c7hA1J7BPE2u!nH4&4rrJfXqd)C!!%4S=ancBNnTlHJZPB4M8ni7;{_HbMDtGC zhgIK$hN%(_(~w{ Ou9 zD$y{t+J=FJ3DF>w7|<{^&@gpH!!#t=OO&l71~g0!G)#kimTX}{v=k) Ou9x}srfl_LWS6QT(zF`!}ULBrG)4bzZdFHstk7|<~FpkeBgW@cbv zLbNR<1~g1PXqdX9VQMuq1A@IoF->AX!_ |`}glKe13}~1pL&Nkx1bYqY zyU%KvN(^Y2T1C=eA2M5*s54-n)i9M9&@i>Cr~e_?3+bp4e_F?ZhG`5Mrtzl=ElePu z)nb(x&@ffdF#Qj~UMP *qLFoB%5nz9lD8m8*pza O#XbUfV+p6R5{l<5yxp z!_ +1bd;K$KtISU$F2*&@hd++R(xT+N0GfmKe}5b)jLZM8h;B*bDttEZ!^O zBr6DLn8tgb(82`z6|1={F|0~6G)(_PuowE>SiE<29IFHk4bylp8d{h@|7f+NB?fwG z7aFGVo;oDh3-7B~{0$dqn7Ys~jlT^-3lr$)ga4j#dcdmILBmvuhH3Eru O;fSB^AMdU@uXGk{Hl1^`T+viiWAxHvA6}ed9pG)Q5(tD;lOD!CsO;fS z6%A9XxENTN;I~AeVQQdZszt*zB-l$7x+DfPObs+lwP=`H<;cLoMD&dV4O0URQ!N^% zA;DgvG$t{iVQLjHwP=`H1y0}WFb8m94D5?YvuzHy*o>O#XbUK2xtz0f{l@m2ukND$C4jo0?j!bJ3q0}WFR z4bymw3JLZ?JCDU%GxTKe`_M2AcH^>ziRc>#8m1Z=rmkq1hQGyL=&xe&UJ2SFAfRCy z?|niG6VW#gG)y%#OyfOVNU#_B-B`SLO;Lh|hH1PP4J}MW-#Aun8XBhYo;oDh3p0!0 zZICkmu!`2uFpa+rLJJeoH;z@UgNCUR4b$NLVP{1=-x0;UV20#4Rv8Z(rb;wStuo$! z=1$Q!4m3=CXqdX9VHy(bC7OT|0~)42G)!I5FtrMQfrW|a8wVPuJ~T{S(J&1O_7ZJF zi2)5$9~!2vXqZ~1!ob2r^o;`zQy&_pS~N^Ug1tmnQDQ*D)Q5(t77bIY(HK~mh`w>4 zVd_J}REvgbNU)b^O-c-CnEKE#)uLf)l_LWS6VW#gG)xUNOtom3h6H
g4ygZnQzHy*o>O#X*i-u`Pu$L&{N(^Y2 zy3jC<*OFMgUNI4U<3PhyL&G#)6GMW%M9EiTK*Ll+!!%yoWAXOEMD&dV4O0ybQ!N^% zA;DgvFDx;jVXC2Fszt*z7H{WF@OvfDFxAj7bw$H8B-l%Ik|hQ-Of@u2UC}UrrEJ zqHi2%m}+R4#(TJsU@y^omKe}54G7UNjm7(2CZcZ~t2PY{(|AuE66}Swtl%w?a(cij zT0_G${x%3LOhn%}e8UmHS$LLW|F&ynDKi!(*kWl~_X}c&tAmjnj^gtrCa|g&(4mH@ zz2PWW9ptBCuV^~{kK2cW@n9nH?^++ ikQIKyS ur_Q9X@8^)%R%3Jud3R8NCFsrZ^@@3ochoKQVgP(AfU^)$3Ff$yBL_}5H) zD|+i07pkX5R8Pa&2VK1wR8NCFsrcpH)DwNtFdh8tTq^^8 zQ4M`jBl@CYTVn!y0_^>@viAe}q8j?5M)XBPg1xv_2Ku5J`l3ekMZ (a^#K#|!jDHS|S| z=!=E~dqIyd27OW4{Rw?h4Si7~`l6wQ3C@K;UsOY1)QG-lNU#^aRLA1`H5>=}qAv7B zjp&Pp7ACkf1AS2qeNiL&q9MUv_=+5h?^JOd=!?407d4_U8d{j(wt~AepB?K$$dgPx3uv!C^i z9m8IVl-uP~uTSe9C@{j$f!pQzx7Z7NChU#i!EQRof#$Lc&1GLSmqQDbTw~B&4tB)z zFF`x{)CcZ_4A1zzd#tgV%i;4f0VUTMv|qi{*qMvFg#O8?Pd?bve{<}nWG2{)d+ Wk`W*rJ$-) =o@xpn9sIdg_bnY1lI`5iJj>o@%I``l5Oo66_W26QO#lp?d0z>S@@+ zF%c~fsGe%5p8BGC8WQZqZ@579R73UD7uD17ZOH`mOk+?zl|89YJ=IV>HKKYN670qA zM8|0|zM?)cwyHmH#=1RS&M#NRz8)3qNyYwVHE-3(pcP?vw3?q|w2U&+cf9RxZ&}3u z2dbyt4lGkghmQ&Nq-H<9OwF4;CfJku#KNU2Z ccjp zgS{AU FIRW} z8RdOe+SncOYUq2TWxwcS)05na<@))x-dO9hg$Yg{dbqJ!b*0rU{83OnWrDr1i&+&) zJx0#4j5?fIU#jxBU#w+OyOTV$FcHnG9Sw` *>LW1j^dn#S~6m^jCYSb)ZN@D+rmE# zom93kffEsGd)YBElG$;ksk#1bGd~$RsZ6jJPOGRT*d3jslX_=eR@3G7!+t~Pq_TyH zM&*~P-Y+2KZw)~&x_0~z-n@(j{S`0Pj}Yv&Z|4&Ab@?%}i*@3&+FLf}H&X>VsW_>l z_P#tOnEkNVwL++4Z;z2(tV^3L_i7(b<#&6xv(FYLIG*GDnxlrhan=3)hp#t{5bTBB z_^Q_NF|v#GivjuEW_=6zG3cbSg^8Vema01w$H*?$_uD$Ie{U6k33O7~!UX3Vz7N*< zM13 Q#zPYPH4ptN9bV`CTvnVR!b27ACm-9Vh>=pJJ+ZcYo%X zn-PM&up3|H{b#i7VlCHqOLF`2{r!=x4%l7yp@j)<^N!Q?p>ihEFT?y@v#Li3_BwoZ zsharhXxYU&=Hq+auYP{m)GHXA+EVArj}2zO&%L%p?Kw9l*v0x>=cP*b87sS3t9F>= z)%m`tzyFsyK3kYLcmGm#e~z)Ti}m+IE8OaPFM8delgb2pMSHkfeFwY6-rOGSVr2^x z@2yy>x@I3MyI6N@`qlmL@4e>Pfz5p;*o)gdMz7U>bkAfg>UaFQK&0PgBHEX%{JXSn z@Yel)_E&x}{9Ei5?MwFVDWtnst?ZB8|CV736Wn(NXJvH!tPB(E#qScw$@fzOH`9dS ze%dPc87^Dy=ehRa&aiHsTyNMAUw^A3wS)=o!SS`P{Brl5zCHXK&`IUrVlQq5j#K{7 za<|Hf?tb<2dn2`-3GVZ8Z}^R)?(F@ppSpi$d%7lUQS8NS({UP4I^v$2Qp mJ?%<-iHaUG03ZuP29ESPcvji z#|Xh*+*jhvPvd^>vi_f${D-?o`a~wU<~z<`IVUG?>$}?=fKDp^7JG3Ijy>DYtc>-( zw#YmKom93k!7bQvhSh55{rcualWF5nd)`?+_vh$fcMH=vYpu?HK1Nm`Z(gt9`BkTz zh0sZ53lq^8`%XOKEpM^VyO4EkgkUe6$X4ysr}Ro_9~}#Oi^{*{JrA8!wlIOyr(r(^ zJ%DE4nzt8r^bhZzWlt}wT=$O-Rss3lj+4_W14dCPU;EC@TW`)g&-#a3cd;j=Lkko9 z)<$hF`JMT0@WXz##Rcst?2uqDoaa_AEXMg-tk2;*=hAmf$0;@Z`Orya3lsdF#}4e{ zubTWHX7K-lPAU`Z#pUEU&2~;QgL>TOpS{{JQi4qIn;LcZayN7SyA!4hbW-`Z*o#XO zeaWg+=J>z524QW05`r4{#PdPT;9o+ETA9jZ12F}+bFqa9s28a0WBbc)s;lScn^Qg0 z21*D_uovfu<3I_)Y-^Y|P(ok}6HqTuo6hu;GKWfm8Pu~)T%|xAnAb0;C0t|v{{&l@ z;JN_KbV>7AA5W9Ip!A*IZ&u!hIG=TPJ$IClKs4?&ERl zi?VejM!_~C&AVGBdYSQ5Y+)ipn{n!e&UGZlqYKBIVbASKP9)gtOowsm=T_Au#siDS zo7NzH!c(z@iE~@W21LrYqM=WpG&^r(_m_Nt8= awlKl<4X4lY zmG=7&t7e``AlPea`SEH?);bd7G>CH`7UHSc!UWehywAs1@PB@BxVJ8WV6XOjQ|eX9 zd+_wQ3V!zy!@atADz-4e^$lyUyYBJ5>ka*rZDtv0y@b6e*Rc%erm6Y^pO!Ci8F$~~ ze*)sW$7dO~Fv0cBaY_y^ }FS|*M58!S8O>Q^Ku!RY(J=p7v zCpv?)oJ=6t3%XcpPmcByV;_iLErF+E3lm)5py|}EtDmLw2PR$HD8XK}_f1egc5Wsy z)`EB#METaU3|pAs`sO%iZ$9Ve{cE(zlt8do#&+Y?P^XT>*ao5)h;b_RCb+&~B=h4g_f+c=?xMxd`tzUOtnO5G zyb^m~PMWfJvs$*#@m^drC27#S%_>KmRNl)OU&8omz}9s7&Zai{zDo7XUt>0_pPHri z#?GjlG-29ib>^ki-n^$CN_uniCN-&EDrr%x&p5jM^fvl zJ&2L1%untY)!XatCuT(m_IiBDCe?mQD#_hh^Km=Hu5^0Cm8QP?&L*|xj^iEqp?lK( zXE&*Vi=3c8-%)e3+IhzDOr|l2vHX#j-C>)yxl=#t?X!i6azAWRwYocAzlx(l97%Ii z-F-Hfd+N!N5rVx&=G?5F?)Q% a&G&nqxzK@5nT_#)x~|iti4J z#9$&?9_`B>aKGw0%l+xyCnE%VagHDz?TwqW*HQPC{p}-p#l$nyH>+mI-Bv%_l$Xzc z!fnwclP-1J_1WT0*sPjdOy#v**EcB|qx45#x-)0y)4!d3G!lb}xuDN}m&)5zvoB(d z`tv*2FIh}ipHm=0uou@JDA45n-u $Ky{yVFZ|cyCROYv(SQOUYZ5TO_SF Bil*n>vqeQGd5i<7FB;B8i`!(}X<}?Mv&I zn?9i3$rmF8dvR>cKkAp&UnFPIujl>Cu!RZEX~&uTNlBfz`tNSbIyoZgU@uOS pF zpm%ht6=Q J#4vd?>k?njcMnW!6shf8nyY`?tj2$z%Ip5@G!VCs zUU2{FmB#&Obx)ryOhn6k?UN7bcXOw93!H8kA=s-y%`NJQS*g8ct>+=ei6@I{=et~P zzfrY(wlMKl=PfFI@zh? =b`S~Lq^twt PiZo$}VkYk{JtH4G#U#*_Wsd8*p z@6Sx{-FfoMB(53H?b)KPu1xElsr(l5>gOdxb^7T~x^>z=WZ05t_ZD^TskGkx&u&iQ zUviu@dj{yfe;ikToLFtx!bHXNTh&*0(|M`Q7l`rb4 tNLhN z2F!8N)Nq_?O*-hQeN*eJ_m?pI>|ERVX&vYJ>rd$M+1__^Jv%p&4kn^yUV7gX`f8W= z-0R&JMF{rdG(pRvNGF}U=bA({8_p)qN4|?gm*#o{od35=El%Bln>jM>9 z %U~? j=SKS=Ve<2hycdXB$ldk*VEhZtT=OYFO(&K3kZWc5<_7f6h_up0WMz)_K00d0>BU z*VX4D1bfMQSJ{y)T5a~0+R2#LbjX!0-ZKPwBE3P7SDYrOS#2n<^Z7?r`q|JuPwA0^ z{9)qej4f*AnbfNM@3t3B+cBoAZT!c}`%K9Q!Cssu% zz2=EQ=9}b4 0AEn}EqFBx|!J8yHGgS`gn!oBaPEVH3un(}4| zYR0<{ZdC=QrB}ZHTN3Ap 6TIELOh0l{8eW5RKXp>au2N15REkGfl;xE^rq zL(~76hvQ?PfM74KW6*BPTU<}ga?I>6QNm{n6Ee~d`eVl#e&-+e?B4eNZ)=(wnf i_EK55@QmwT>s}+`bIzDuo0M6qvU6FPO)5LncbvOx3c7pWY;1CxVevJ9 zz`}&gQdP>_d0nO@ZkOHfc;g1Y;B)`Vzso(i<5aG(#(nSQFTL(h4v6&BOhjWG@3YOl zRb_(dUF_)y!CujK)Sy(Kx}^>#n>Vtyjl6M~h~{qn>c6=674G7HIjpmh^#o;CQaGol ztlp#=^h%{N9jT1G`sv|6+#L6H_UG-WZrH*^v^>hH-`rAnYx%KKS0V&^$?R37tPaX7 z)u&l%U}1vC5{`5K8|U4r1xxsAKPV8N2?qpw$^2Z|RT0b$cK_^7nODXyQ1|}$Y&) vXtk;M-LLws09lpX$?ed)!^6R+&E!bdNk06I_~@-KDJi__Xd5 zJQaJ%ijGP-n<48y#;*IYg$b_t(Cpv&s;WGsyy-iAq|X*v(Fs~t#>Hz@hMhNqzwxf! zUcpV>^_Z#F`RNG3UK|_W)zU6>-zikx&swrzqy#yC4h&nX4le&AmXeNp1}3{F*FEho zHk~4MmuqEmm$j
Q$vrd%AtTyw^{^CR`&6@`|4%8sohW-&O}c7-+7{9p ~i)uu rxpGq)ri4_7+v^*GtjBqb2+HT37#Rky0CrS9gbeA;tQ z^)n?wu!V`gH@vP?$5eQ0+tu2dOCK~3zSP>3N+8&)%9^Qa#+6JGBQ1zeCbSMx&K4%} zwwkKal*}YC`u<+a?7FY4se~9zu-EJ+6P33#hs4+f;tGheAlMQiF217f%a}uAocOGV z$(}j&e~8)S^-$)Q)ZSkTNR0PE =sNt^^kQfaw4>R5OEceRbshD7|`!bAI zQ`?u47_%=8Gg&~`5@ZV#{ilpmwThII81K&=Z`^@rk`oE`k}p3JW6Heo<`ocy5rZvE z$TvudaXrI2_nq61`< X+SzrWf<~9;)iIg$Zu|j`L*GOm55X%K8fu z2=>ZgR;q1p-H_g=4~U*1CV^lJ6WsnCr`*8;2L`vT=oeleCD?0ilf`Ovay-U15W_*_ z1Hl$1xc%eQ)-$=y NJ0d%UDnje-*6TM!lh+GegJciF-Ow`Rxb@YbXLxSO5L`2>Q!UVLi2 zdSq-ViSf^ykNQ aTs(mND-$Ag2i9J)stLxKC1+?S5(EAy`ddqnx zUEV0cUYzUDi0}1`UmirR{J3|CN{WfnFTbRUbt)(^(kyS|uln-3`7K|RU@xvcC_xaX zKqTX-*usR_Gf@qykyB!Px1fsu$AzN) -!(zso28AOXX&$-UZS~j6DaAnWryy^QR>c?8Utj zZg2tNg7^tf#TF)X=DDi9cRQBy75UU}&CSlwp7&QI5bVXhtK)nF!UNF-1Y4MRx5Z+W zwarb5(Wzgj15-K;@uwsZ?8R>h%xed9I`9UF#vs_jMEU(IRV5XVarth{ZRic~tJH}S z?8R?8ybVCq1!yTbTH>)ml}3#b1(+NxOHsEid-;D<=@_#WPFv)Yzqm8;*ke&t;EK z@TQl2WWhUJ_IS$s95);p+;HT|4M%n-U|^9QdjZYA6x?uR_w{MH;mGc83%r<+{ctK} z*QD(0({jU6NU)de9FhJ?_S|W?;mGc}3oJ~?{yQOLC!ntR#Vo_W#a^ U@y+M;D#fE8;)GL;mGc94N8g$*=?#)&avQz zBZC``wA^qM670qK7Tj=TaKn+78; J3r4M$3DII?G#RLw`$gTM_(8aEtix#1|Z;D)1+kTU`*yx~aUh9g&QII_E- zgPMUmG!$+)QgXwQJ;9?|T^@%RxZz0Sh9fOE9N9B!DpoaZ4cwceaKn+38; |zM+P?>X}RIZ zo_tZy?`WHZn G%WyRrj6$WgBO!3{?qZaC6%!;w8v6|`q2 gY;9Ll9I8wObNXrdJA;Dg9_C%$e^TG{BE^au|a>J25l@eH(;L;3kIC62r zk(L{dLV~^IjEOoLeC 4;vL`)**2#pN|4{=A*l&=y;mE}eM_O(;3JLbYZ7vEo z9I5bzBNsOuX}RG@;f5n6Hynk%9q!6exZy~JHyml)aHQpiqtJpIjzU6C+DM;>8;)Gu zaHQpiqmW>)XkUUGjx=sK(sIL*J!Km7GE78!QQUB(al?_88;(MPz2rQW^oh9P$e!BL za>G&B!!aSJwu0U@xZwz2Gxoc3!%^5f 75-Za8w~hNG~SFcHmN+;HUL zh9fOE9EAjXMQb~5IC62rk(L{d!n(^uG )GMY(?Mm&Ze=@tye`=%p z^6eJhu2$`1ow0NEzP8Q0YUw+~I;`BNP7H40xmP;Ius7 +MCr^m79C_{oW>a?>(E;sq!to z`SaT%hF((AZIu76*P{Oj%@!u+WZA6BUTo$))!Pz34*9}$$89&2A8r>R*o)JL-O**< zcE4IW&0IeEWF+NGRR3a=Dn6%~H)C)+#PCaI)Tw^CVDhx79wFF^bHQ=??{1_wXMW%G zT6)zj;BHkNw$~2wg!89(m#u2Sq1s-W932p&&4cyy{_4k!&XY>Bg^6g4rFkFG{eN0- zvJ@^8AtGK=wyHuGYI}9Y*>v2>TTt(5x!m;qtg3d%!UU(uaaz~C?&f=8s43R7Lxf ~ijJ-MPy5;WM=RI0+gk}p9Tw}1ydv7a!^48a0ngZGM%yipSsq|HY^5C*L z=x$S2QdJFFf#Zz7ue*MC_}^aV_P@GpVS>xaagve>>5;?McyCUxubE)4GQGE{KmV@c zjca4e *rpm@uM)IoJk>LE+ _R&k_0Yi6o$j~5Dl>(67at6U!x3;u3UV1_zWvACq8LkVq4 zOsl7QfVk0ly4wF^slcny%de@)11ko9zxDlVs?5xaLhLPA*No}2E7=n7G<;3vD^)%4 zI=A69)#WQ4{5|!a>FU5v9glIktXb1*k2e}b&h^vPbIt1qUT2bKsJH4j4gP-jwHd1H zxh6vF+WwijGIO6hA!l3dJUv7ClZprR=ewn|)%8R9g1=k$ovk|5$|r
a>KOYG0ExDf` zv2%?&wywPpw?Hfckq!h~n5emMjmlKFeGnV>n0!9S?R%`TpD}@8uR9Z0s8!uNON_1{ z8iA+*f-OvZIBtbHeYKOs=TYSDQSGRI%QjB*x*2h5Vm~X4dyyh~^cS z;Is2*sIl)9ml!P`E95sFmRaXU47M=AbpdC|8aD6`7JuEnjS^&ny&4Xju11@R660FV z=I*d3o9UlGaM^O1zxT^>m#)l8!GxGyqW%PsJ7{e!s9<4cm}MVr2dPntSg H>%0o3QCOEK#T`5+tyvOFmWN*M)hK x?!0mrOuAfcBkyyrl{wC>Q4@3rX;DK!bOBKi1Y4Nk8tORPo+|3T@=XT+5?U=2 z?3I1S3iVLNE)ru{ucB_oZ!`E)L9m4huAz?8uS{vL;K;20$^?SFwx(XB{+F?{#OMR! zs}WiK_d&3QiD=!;v~Q4k^kK)Jmq4)B&>VAAsi)dXi~_&? @*o$kZ<9yU_6?O<+ zcC(-a*}}xdht{aN>mQI94IaqsZd#T}-$V>1*o)f@_K|_O4&n$1wlGm8dAV9QET_cC ziMs2e?xsci;QGqFHs>L}N1<<@fxi7d5Nu&0+PAOnpIN_} |W5EK^=cp5CN^83TeXOmN%8UgzACy|!(t zn*kUzFu`7J{CTR_kd6|g&0_5p9(CON^TjcmElfmP?Y#?*dr!UdsOg6oOt4q~GqY8$ zwCyCu<>IN$f 5%q147S8jEbca)1U!%G-5Y{ff@EllwE0eWQXW2V#QKAs&}@@SIBjM0(h zklOEi-{veClsQ|N;2gm!PMI|R-gX_#B&3`P_8Rc%3^j9X6UnP>$lU@>51R2H*un(o zh~rFK{-9rXUv|Gc@`?%en%;YksyMcd ;3C=^zqY$GSVhm3phNqpW zTGVP1{4U4F%EY^M{MOH{F#QvriitnEPFHzmX-WB*(rNsuZ915Ccz^J3u@~ndz5;xa z)&KHZtK@DV*uq3~HnBX**WRG)#SYv;ZD)eLc$R^2`^~zhN0*MV#Q6skJbS@C4Hqk# zahcWxvm%}e@q8ybD_Z);M_##4b1T~h*}??J!)$wUI$wRE-TX*76YO=o+I02E#)^`= zz0YLzkKb&SoD~FHnBaVKoMPJ^_X})XoV*1siV60*J$JgAK0-^q%6+hozXfIfH3+sa z!R3#+Gh%$VVR7=I1cJxW92+N#F$zC}QTXnJr(%Lf 3aN;>~X @J zen|TE961+w@7<~F_60Gq%0l&4_T0f3=j}WTm1>(S@alDUuB!R_143MAf7E>bQIfui zHpnwbo;611J5GVwub9`m{pB7&%GtsM$Htc*5LZFWP9WHe)8sg-GPU-me||{WHpmtx zqUqRw{~53G4-dP;k#Z*3E1FlMpL^dMirMxZ)DoUA^O%v-1hwf_Q@tUd-lH?1eXxaz z=*V(l>#5$yAnYid3HIVN;RMgvj>$a-eifvgElgbKxkSBmDTkEcsgFx|zyDa%eKw)Y z*^A2`r&63c?x%gqsi7GA@OY3{ba=#xISz;?K-f_qTbOuj)K*ph+@tbTu` P-9uM9C zKOFsje+%!ptXY0_WxaRwd@Da~#_amir3?F)cRe2T;Y@t7qg9oz`&0fq&Svyk;q~nL zgum$4U6(CPaBS=yJhoG1EB}OF`dE};FT_rY$3~3QUmdvA fRyk5 zH{}lgx8?kC@9f)SG+Pn~$}39@9 Xq&rXzH{9zR&{=jFH#+o zHaLIlLU-b|y8f9w+4PBiGip3j>1a?B`FEpFb jq6rTzp&y1a{z>{lqU912@}L9^5f? (JS){x_QobN>HqEK!vf(sgw6tZR+vWGV{t*ytVIo?BGYYkE{c~yj z;dm-0*ejY>k0 @fZlUFcB@m9amDj9}mcF$|n%)6>Wou#<$c5(W0`V1i9sKTj3hx zIN8yna-&7{1;G|3xZU6#g_`&cYT_l7ITP%~Pv|(V|Z7KW)AS!4@XCF5vbEr2HwQ zyc$x@1banOUgE?|_4(530l^j~qP1i|kISmyJIhS_F#|Od?8QAF)|Q6e^wu|9>OF?H z+Qz 0bO>`uznrc}rWjl=u0sf8Xyn+cVxw$NOA=xY?`wb)(>Y-k{4? zZ`^Zrf*xo0_^n?1SL(?7d`thDew(j0nk<>J>+8j~dP5r433@dqj&0xURrVSM|J`w_ zpKRn8d2YX1`Nv(CElhB1q@z|PKYhv6eu?8zg1zwF$oqG%!7Z#`9d0|(tALc>&9u!s z^mUz}R&y?NJ+#%EwXKe%eD%khy^QA@d0*mv&K4%3d6oT@+2+KUQl@2 XhSn>4!-Oq5k#Yd*ewt;3e-seoPSF}9xw*JT**fG$Y z+SEg{g^77T;%?p>E#hC13)S*FIA5D|FWfdvuovev?x|jy%76DXWWZWRYY7whdV;)6 z*%N}>nw`@AwSm{oksEjqQoUlYXbJY%x7+J{?R)Pvyw5p*xbALydaajvYJ3fO|66JN zJR6Job#r9X`>wC?@_pAXsB!$e91psK!&~Y>^|G5C_h-`+|9;K0x|Q}F{%+Oj!Qb{B z-aq5(-csyoxBngUC=kzr_z47Cm}ug@?)~sUU8(Keu2j`?I(}r{O(59olk~H^RR^0( zj8{PH0x=N;TbRHtfZnkY%_T;gO__B19fkZs2?TrfSvJ?(ysDkV7zLsfh$0}^!o-T? zxnAvBDS3! wPJIFKx5Z8&ER-y|z#CB-6BiLq7uuwlI+|+gfi~!}wR^hKDMf){mw4pRd|B zLa 8s$xw0)JMiCG%f;fg4Y+-`yg5#|0ve&&;{&RCAfncxR zgXelLSBj^6>Jxk23l%;$9YL^#39bv!@fz01?b<)B-z9-yuh*+C_7=>Ie}nuH#841T zK(K|0Xe}xBVu@J0by@wc2?Tph?XlAP{=;~T*{CHuP)quuCUVW-HqYgc?*^;W_#4qP z)C0j5CZavV`o>#LwsT*Z!FVbr*ehDEw)A<=r2qXdlV)js%@!uOe}r1-mO19(ZpkLY zpFJW3dvUMrI2ADJ%l%tMZ$_SxdR&8)x@*UYT#w6lneIKkzpjko9szMbh?yYR!UWf8 zs5*8o 9$xG%>=6Gx*z%*- zRGooI#-^MtOmLmXcju$e);RHe12ZRqV6W{1R(d67$72*f@@$P4K`a2l7ABee3tQ z-QsG@EKDHSEBYR6iJp2adg>PFMY(t8KA2k ak3mn}3Ito2;CACUmyq%!NclXZoC)@drhH5JKfLm#@|pP{*uq4# zMU{J@lQ~&&f_Zt=zzD%!Jo<2)43DNZLmN$0Nf=r7er}6*Xj)@s*T`g)scd_c@uNyv zBRjY@mH%V1=QeK9Kwti7vp3~TBW2gfq-RieWFc){rR?kLpS_fy2eXy}7*osWMcJ_k z6VL73>`mU&DEROA8osQu?>^$_))-T>g$a)BIJM3;_Qzz|?cRqmH52S5<9Ug(aLi5b zdYz@JBvLM;upqUZ3zAoo@ $CVB$L~~rr?$Gl+--J@8|2BwS}A|qn#eT1c^z!&KYuyBd$N8u%@!us zWK5w`R=h@l=mDZ#gDAmX2~YJ`0l!zVb1HVEek2B`oSznV4;1;u