From 18b4d7547abceed6048e33d0e36aaa8ba9b2aaab Mon Sep 17 00:00:00 2001 From: tk Date: Fri, 25 Aug 2023 15:33:42 +0800 Subject: [PATCH] =?UTF-8?q?wip:=20=F0=9F=A7=A0=20=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E7=9A=84=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 79 + .gitattributes | 63 + .gitignore | 405 + .template.config/template.json | 30 + Build.cake | 198 + CodeQuality.props | 41 + CopyPackageXmlCommentFiles.targets | 10 + Directory.Build.props | 26 + LICENSE | 2 +- NetAdmin.sln | 176 + NetAdmin.sln.DotSettings | 105 + NuGet.Config | 8 + PreBuild.targets | 24 + README.md | 87 +- StyleCop.json | 9 + StyleCopAnalyzers.ruleset | 243 + assets/README.md | 1 + assets/captcha/background/1.jpg | Bin 0 -> 4007 bytes assets/captcha/background/10.jpg | Bin 0 -> 2401 bytes assets/captcha/background/100.jpg | Bin 0 -> 11587 bytes assets/captcha/background/11.jpg | Bin 0 -> 11897 bytes assets/captcha/background/12.jpg | Bin 0 -> 11229 bytes assets/captcha/background/13.jpg | Bin 0 -> 8517 bytes assets/captcha/background/14.jpg | Bin 0 -> 4666 bytes assets/captcha/background/15.jpg | Bin 0 -> 8567 bytes assets/captcha/background/16.jpg | Bin 0 -> 6894 bytes assets/captcha/background/17.jpg | Bin 0 -> 8198 bytes assets/captcha/background/18.jpg | Bin 0 -> 1863 bytes assets/captcha/background/19.jpg | Bin 0 -> 8657 bytes assets/captcha/background/2.jpg | Bin 0 -> 8105 bytes assets/captcha/background/20.jpg | Bin 0 -> 3649 bytes assets/captcha/background/21.jpg | Bin 0 -> 8756 bytes assets/captcha/background/22.jpg | Bin 0 -> 7889 bytes assets/captcha/background/23.jpg | Bin 0 -> 11849 bytes assets/captcha/background/24.jpg | Bin 0 -> 5649 bytes assets/captcha/background/25.jpg | Bin 0 -> 11587 bytes assets/captcha/background/26.jpg | Bin 0 -> 16208 bytes assets/captcha/background/27.jpg | Bin 0 -> 11229 bytes assets/captcha/background/28.jpg | Bin 0 -> 8863 bytes assets/captcha/background/29.jpg | Bin 0 -> 7800 bytes assets/captcha/background/3.jpg | Bin 0 -> 14204 bytes assets/captcha/background/30.jpg | Bin 0 -> 9887 bytes assets/captcha/background/31.jpg | Bin 0 -> 7141 bytes assets/captcha/background/32.jpg | Bin 0 -> 5257 bytes assets/captcha/background/33.jpg | Bin 0 -> 13056 bytes assets/captcha/background/34.jpg | Bin 0 -> 10519 bytes assets/captcha/background/35.jpg | Bin 0 -> 4812 bytes assets/captcha/background/36.jpg | Bin 0 -> 8339 bytes assets/captcha/background/37.jpg | Bin 0 -> 11514 bytes assets/captcha/background/38.jpg | Bin 0 -> 6146 bytes assets/captcha/background/39.jpg | Bin 0 -> 8555 bytes assets/captcha/background/4.jpg | Bin 0 -> 10462 bytes assets/captcha/background/40.jpg | Bin 0 -> 3934 bytes assets/captcha/background/41.jpg | Bin 0 -> 3308 bytes assets/captcha/background/42.jpg | Bin 0 -> 14210 bytes assets/captcha/background/43.jpg | Bin 0 -> 6296 bytes assets/captcha/background/44.jpg | Bin 0 -> 9508 bytes assets/captcha/background/45.jpg | Bin 0 -> 12444 bytes assets/captcha/background/46.jpg | Bin 0 -> 6157 bytes assets/captcha/background/47.jpg | Bin 0 -> 6203 bytes assets/captcha/background/48.jpg | Bin 0 -> 8542 bytes assets/captcha/background/49.jpg | Bin 0 -> 6344 bytes assets/captcha/background/5.jpg | Bin 0 -> 3522 bytes assets/captcha/background/50.jpg | Bin 0 -> 14204 bytes assets/captcha/background/51.jpg | Bin 0 -> 3953 bytes assets/captcha/background/52.jpg | Bin 0 -> 4250 bytes assets/captcha/background/53.jpg | Bin 0 -> 9865 bytes assets/captcha/background/54.jpg | Bin 0 -> 4221 bytes assets/captcha/background/55.jpg | Bin 0 -> 10895 bytes assets/captcha/background/56.jpg | Bin 0 -> 9706 bytes assets/captcha/background/57.jpg | Bin 0 -> 12347 bytes assets/captcha/background/58.jpg | Bin 0 -> 13960 bytes assets/captcha/background/59.jpg | Bin 0 -> 6643 bytes assets/captcha/background/6.jpg | Bin 0 -> 10307 bytes assets/captcha/background/60.jpg | Bin 0 -> 10722 bytes assets/captcha/background/61.jpg | Bin 0 -> 10985 bytes assets/captcha/background/62.jpg | Bin 0 -> 10585 bytes assets/captcha/background/63.jpg | Bin 0 -> 5176 bytes assets/captcha/background/64.jpg | Bin 0 -> 10440 bytes assets/captcha/background/65.jpg | Bin 0 -> 8105 bytes assets/captcha/background/66.jpg | Bin 0 -> 10044 bytes assets/captcha/background/67.jpg | Bin 0 -> 6914 bytes assets/captcha/background/68.jpg | Bin 0 -> 4790 bytes assets/captcha/background/69.jpg | Bin 0 -> 9887 bytes assets/captcha/background/7.jpg | Bin 0 -> 2789 bytes assets/captcha/background/70.jpg | Bin 0 -> 7316 bytes assets/captcha/background/71.jpg | Bin 0 -> 10273 bytes assets/captcha/background/72.jpg | Bin 0 -> 7154 bytes assets/captcha/background/73.jpg | Bin 0 -> 12799 bytes assets/captcha/background/74.jpg | Bin 0 -> 7583 bytes assets/captcha/background/75.jpg | Bin 0 -> 10164 bytes assets/captcha/background/76.jpg | Bin 0 -> 10880 bytes assets/captcha/background/77.jpg | Bin 0 -> 12877 bytes assets/captcha/background/78.jpg | Bin 0 -> 9030 bytes assets/captcha/background/79.jpg | Bin 0 -> 6993 bytes assets/captcha/background/8.jpg | Bin 0 -> 13316 bytes assets/captcha/background/80.jpg | Bin 0 -> 7316 bytes assets/captcha/background/81.jpg | Bin 0 -> 12412 bytes assets/captcha/background/82.jpg | Bin 0 -> 5562 bytes assets/captcha/background/83.jpg | Bin 0 -> 9808 bytes assets/captcha/background/84.jpg | Bin 0 -> 8033 bytes assets/captcha/background/85.jpg | Bin 0 -> 9513 bytes assets/captcha/background/86.jpg | Bin 0 -> 13397 bytes assets/captcha/background/87.jpg | Bin 0 -> 10850 bytes assets/captcha/background/88.jpg | Bin 0 -> 11514 bytes assets/captcha/background/89.jpg | Bin 0 -> 9808 bytes assets/captcha/background/9.jpg | Bin 0 -> 13668 bytes assets/captcha/background/90.jpg | Bin 0 -> 8863 bytes assets/captcha/background/91.jpg | Bin 0 -> 2789 bytes assets/captcha/background/92.jpg | Bin 0 -> 8011 bytes assets/captcha/background/93.jpg | Bin 0 -> 6939 bytes assets/captcha/background/94.jpg | Bin 0 -> 14640 bytes assets/captcha/background/95.jpg | Bin 0 -> 12131 bytes assets/captcha/background/96.jpg | Bin 0 -> 2533 bytes assets/captcha/background/97.jpg | Bin 0 -> 7061 bytes assets/captcha/background/98.jpg | Bin 0 -> 6549 bytes assets/captcha/background/99.jpg | Bin 0 -> 6950 bytes assets/captcha/template/1/dark.png | Bin 0 -> 1291 bytes assets/captcha/template/1/transparent.png | Bin 0 -> 2468 bytes assets/captcha/template/2/dark.png | Bin 0 -> 1118 bytes assets/captcha/template/2/transparent.png | Bin 0 -> 1822 bytes assets/captcha/template/3/dark.png | Bin 0 -> 1434 bytes assets/captcha/template/3/transparent.png | Bin 0 -> 2706 bytes assets/captcha/template/4/dark.png | Bin 0 -> 1386 bytes assets/captcha/template/4/transparent.png | Bin 0 -> 2737 bytes assets/captcha/template/5/dark.png | Bin 0 -> 1224 bytes assets/captcha/template/5/transparent.png | Bin 0 -> 2119 bytes assets/captcha/template/6/dark.png | Bin 0 -> 3090 bytes assets/captcha/template/6/transparent.png | Bin 0 -> 6192 bytes assets/logo/drone.png | Bin 0 -> 3560 bytes assets/logo/drone_red.png | Bin 0 -> 3532 bytes assets/logo/gitea.png | Bin 0 -> 4033 bytes assets/logo/grafana.png | Bin 0 -> 3065 bytes assets/logo/line.png | Bin 0 -> 3993 bytes assets/minio/docker-compose-minio.yml | 15 + assets/resx/Ln.resx | 216 + assets/resx/Ln.txt | 191 + assets/seed-data/Sys_Config.json | 8 + assets/seed-data/Sys_Dept.json | 8 + assets/seed-data/Sys_DicCatalog.json | 13 + assets/seed-data/Sys_DicContent.json | 19250 ++++++++++++++++ assets/seed-data/Sys_Menu.json | 192 + assets/seed-data/Sys_Role.json | 18 + assets/seed-data/Sys_RoleApi.json | 22 + assets/seed-data/Sys_RoleMenu.json | 12 + assets/seed-data/Sys_User.json | 10 + assets/seed-data/Sys_UserProfile.json | 5 + assets/seed-data/Sys_UserRole.json | 6 + dotnet-tools.json | 36 + global.json | 10 + package.json | 12 + src/backend/GlobalUsings.cs | 69 + .../Modules/ICrudModule.cs | 64 + .../NetAdmin.Application.csproj | 6 + .../Repositories/IRepository.cs | 39 + .../Repositories/Repository.cs | 82 + .../NetAdmin.Application/Services/IService.cs | 19 + .../Services/RepositoryService.cs | 34 + .../Services/ServiceBase.cs | 45 + .../NetAdmin.BizServer.Application.csproj | 6 + .../NetAdmin.BizServer.Cache.csproj | 7 + .../Extensions/ServiceCollectionExtensions.cs | 39 + .../Filters/JwtHandler.cs | 48 + .../NetAdmin.BizServer.Host.csproj | 15 + .../Properties/launchSettings.json | 15 + .../NetAdmin.BizServer.Host/Startup.cs | 67 + .../settings.Development.json | 1 + .../settings.Test.json | 1 + .../NetAdmin.BizServer.Host/settings.json | 47 + .../NetAdmin.BizServer.Tests.csproj | 21 + .../UsedNumberTests.cs | 18 + src/backend/NetAdmin.Cache/CacheBase.cs | 29 + .../NetAdmin.Cache/DistributedCache.cs | 95 + src/backend/NetAdmin.Cache/ICache.cs | 20 + src/backend/NetAdmin.Cache/MemoryCache.cs | 16 + .../NetAdmin.Cache/NetAdmin.Cache.csproj | 6 + .../DataValidation/AlipayAttribute.cs | 23 + .../DataValidation/CertificateAttribute.cs | 18 + .../DataValidation/ChineseNameAttribute.cs | 18 + .../DataValidation/CulturePhoneAttribute.cs | 23 + .../DataValidation/CultureRangeAttribute.cs | 26 + .../CultureRequiredAttribute.cs | 17 + .../DataValidation/CultureUrlAttribute.cs | 21 + .../DataValidation/EmailAttribute.cs | 18 + .../DataValidation/InviteCodeAttribute.cs | 18 + .../DataValidation/MobileAttribute.cs | 18 + .../DataValidation/PasswordAttribute.cs | 18 + .../DataValidation/PayPasswordAttribute.cs | 18 + .../DataValidation/RegexAttribute.cs | 16 + .../DataValidation/SpecificDeptAttribute.cs | 27 + .../DataValidation/TelephoneAttribute.cs | 18 + .../DataValidation/UserNameAttribute.cs | 34 + .../DataValidation/VerifyCodeAttribute.cs | 18 + .../Attributes/ServerTimeAttribute.cs | 7 + .../Attributes/SnowflakeAttribute.cs | 12 + .../NetAdmin.Domain/Contexts/ContextApp.cs | 113 + .../Contexts/ContextUserInfo.cs | 26 + .../Contexts/ContextUserToken.cs | 41 + .../NetAdmin.Domain/DataAbstraction.cs | 36 + .../DbMaps/Dependency/EntityBase.cs | 6 + .../Dependency/Fields/IFieldCreatedClient.cs | 22 + .../Dependency/Fields/IFieldCreatedTime.cs | 12 + .../Dependency/Fields/IFieldCreatedUser.cs | 17 + .../DbMaps/Dependency/Fields/IFieldEnabled.cs | 12 + .../Dependency/Fields/IFieldModifiedClient.cs | 17 + .../Dependency/Fields/IFieldModifiedTime.cs | 12 + .../Dependency/Fields/IFieldModifiedUser.cs | 17 + .../DbMaps/Dependency/Fields/IFieldOwner.cs | 17 + .../DbMaps/Dependency/Fields/IFieldPrimary.cs | 12 + .../DbMaps/Dependency/Fields/IFieldSort.cs | 12 + .../DbMaps/Dependency/Fields/IFieldSummary.cs | 12 + .../DbMaps/Dependency/Fields/IFieldVersion.cs | 12 + .../DbMaps/Dependency/ImmutableEntity.cs | 44 + .../DbMaps/Dependency/LiteImmutableEntity.cs | 38 + .../DbMaps/Dependency/LiteMutableEntity.cs | 36 + .../DbMaps/Dependency/LiteVersionEntity.cs | 36 + .../DbMaps/Dependency/MutableEntity.cs | 43 + .../DbMaps/Dependency/SimpleEntity.cs | 6 + .../DbMaps/Dependency/VersionEntity.cs | 43 + .../NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs | 67 + .../NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs | 53 + .../NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs | 60 + .../DbMaps/Sys/Sys_DicCatalog.cs | 46 + .../DbMaps/Sys/Sys_DicContent.cs | 40 + .../NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs | 132 + .../DbMaps/Sys/Sys_RequestLog.cs | 151 + .../NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs | 115 + .../NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs | 36 + .../DbMaps/Sys/Sys_RoleDept.cs | 37 + .../DbMaps/Sys/Sys_RoleMenu.cs | 37 + .../NetAdmin.Domain/DbMaps/Sys/Sys_User.cs | 120 + .../DbMaps/Sys/Sys_UserProfile.cs | 198 + .../DbMaps/Sys/Sys_UserRole.cs | 36 + .../DbMaps/Sys/Sys_VerifyCode.cs | 53 + .../NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs | 9 + .../NetAdmin.Domain/Dto/Dependency/BulkReq.cs | 18 + .../NetAdmin.Domain/Dto/Dependency/DelReq.cs | 16 + .../Dto/Dependency/IPagedInfo.cs | 17 + .../NetAdmin.Domain/Dto/Dependency/NopReq.cs | 6 + .../Dto/Dependency/PagedQueryReq.cs | 16 + .../Dto/Dependency/PagedQueryRsp.cs | 24 + .../Dto/Dependency/QueryReq.cs | 39 + .../NetAdmin.Domain/Dto/RestfulInfo.cs | 23 + .../Dto/Sys/Api/CreateApiReq.cs | 8 + .../Dto/Sys/Api/QueryApiReq.cs | 8 + .../Dto/Sys/Api/QueryApiRsp.cs | 38 + .../Dto/Sys/Cache/CacheStatisticsRsp.cs | 71 + .../Dto/Sys/Cache/GetAllEntriesReq.cs | 12 + .../Dto/Sys/Cache/GetAllEntriesRsp.cs | 43 + .../Dto/Sys/Captcha/GetCaptchaRsp.cs | 28 + .../Dto/Sys/Captcha/VerifyCaptchaReq.cs | 27 + .../Dto/Sys/Config/CreateConfigReq.cs | 26 + .../Dto/Sys/Config/QueryConfigReq.cs | 20 + .../Dto/Sys/Config/QueryConfigRsp.cs | 44 + .../Dto/Sys/Config/UpdateConfigReq.cs | 13 + .../Dto/Sys/Dept/CreateDeptReq.cs | 32 + .../Dto/Sys/Dept/QueryDeptReq.cs | 14 + .../Dto/Sys/Dept/QueryDeptRsp.cs | 47 + .../Dto/Sys/Dept/UpdateDeptReq.cs | 17 + .../Dto/Sys/Dev/GenerateCsCodeReq.cs | 22 + .../Dto/Sys/Dev/GenerateIconCodeReq.cs | 21 + .../Dto/Sys/Dev/IconExportJsInfo.cs | 39 + .../Sys/Dic/Catalog/CreateDicCatalogReq.cs | 24 + .../Dto/Sys/Dic/Catalog/QueryDicCatalogReq.cs | 8 + .../Dto/Sys/Dic/Catalog/QueryDicCatalogRsp.cs | 35 + .../Sys/Dic/Catalog/UpdateDicCatalogReq.cs | 13 + .../Sys/Dic/Content/CreateDicContentReq.cs | 25 + .../Dto/Sys/Dic/Content/QueryDicContentReq.cs | 8 + .../Dto/Sys/Dic/Content/QueryDicContentRsp.cs | 30 + .../Sys/Dic/Content/UpdateDicContentReq.cs | 13 + .../Dto/Sys/Menu/CreateMenuReq.cs | 72 + .../NetAdmin.Domain/Dto/Sys/Menu/MetaInfo.cs | 71 + .../Dto/Sys/Menu/QueryMenuReq.cs | 14 + .../Dto/Sys/Menu/QueryMenuRsp.cs | 78 + .../Dto/Sys/Menu/UpdateMenuReq.cs | 17 + .../Dto/Sys/RequestLog/CreateRequestLogReq.cs | 8 + .../Dto/Sys/RequestLog/QueryRequestLogReq.cs | 8 + .../Dto/Sys/RequestLog/QueryRequestLogRsp.cs | 106 + .../Dto/Sys/Role/CreateRoleReq.cs | 57 + .../Dto/Sys/Role/GetMenusRsp.cs | 17 + .../Dto/Sys/Role/MapMenusReq.cs | 21 + .../Dto/Sys/Role/QueryRoleReq.cs | 14 + .../Dto/Sys/Role/QueryRoleRsp.cs | 84 + .../Dto/Sys/Role/UpdateRoleReq.cs | 20 + .../Dto/Sys/User/CheckMobileAvailableReq.cs | 20 + .../Dto/Sys/User/CheckUserNameAvailableReq.cs | 21 + .../Dto/Sys/User/CreateUpdateUserReq.cs | 58 + .../Dto/Sys/User/CreateUserReq.cs | 29 + .../Dto/Sys/User/LoginByPwdReq.cs | 20 + .../Dto/Sys/User/LoginBySmsReq.cs | 8 + .../NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs | 27 + .../Dto/Sys/User/QueryUserReq.cs | 26 + .../Dto/Sys/User/QueryUserRsp.cs | 58 + .../Dto/Sys/User/RegisterUserReq.cs | 39 + .../Dto/Sys/User/ResetPasswordReq.cs | 23 + .../Dto/Sys/User/SetAvatarReq.cs | 16 + .../Dto/Sys/User/SetEmailReq.cs | 14 + .../Dto/Sys/User/SetMobileReq.cs | 21 + .../Dto/Sys/User/SetPasswordReq.cs | 23 + .../Dto/Sys/User/UpdateUserReq.cs | 24 + .../Dto/Sys/User/UserInfoRsp.cs | 28 + .../Sys/UserProfile/CreateUserProfileReq.cs | 122 + .../Sys/UserProfile/QueryUserProfileReq.cs | 14 + .../Sys/UserProfile/QueryUserProfileRsp.cs | 119 + .../Sys/UserProfile/UpdateUserProfileReq.cs | 13 + .../Dto/Sys/VerifyCode/CreateVerifyCodeReq.cs | 8 + .../Dto/Sys/VerifyCode/QueryVerifyCodeReq.cs | 14 + .../Dto/Sys/VerifyCode/QueryVerifyCodeRsp.cs | 18 + .../Dto/Sys/VerifyCode/SendVerifyCodeReq.cs | 64 + .../Dto/Sys/VerifyCode/SendVerifyCodeRsp.cs | 15 + .../Dto/Sys/VerifyCode/UpdateVerifyCodeReq.cs | 13 + .../Dto/Sys/VerifyCode/VerifyCodeReq.cs | 21 + .../Dto/Sys/VerifyCode/VerifyEmailCodeReq.cs | 18 + .../Dto/Sys/VerifyCode/VerifySmsCodeReq.cs | 18 + .../Dto/Tpl/Example/CreateExampleReq.cs | 8 + .../Dto/Tpl/Example/QueryExampleReq.cs | 14 + .../Dto/Tpl/Example/QueryExampleRsp.cs | 18 + .../Dto/Tpl/Example/UpdateExampleReq.cs | 13 + .../NetAdmin.Domain/Enums/Sys/DataScopes.cs | 46 + .../NetAdmin.Domain/Enums/Sys/MenuTypes.cs | 38 + .../Enums/Sys/VerifyCodeDeviceTypes.cs | 21 + .../Enums/Sys/VerifyCodeStatues.cs | 37 + .../Enums/Sys/VerifyCodeTypes.cs | 46 + .../Events/IEventSourceGeneric.cs | 12 + .../Events/SqlCommandAfterEvent.cs | 28 + .../Events/SqlCommandBeforeEvent.cs | 24 + .../NetAdmin.Domain/Events/SqlCommandEvent.cs | 45 + .../Events/SyncStructureAfterEvent.cs | 23 + .../Events/SyncStructureBeforeEvent.cs | 29 + .../Events/Sys/RequestLogEvent.cs | 45 + .../Events/Sys/UserUpdatedEvent.cs | 45 + .../Events/Sys/VerifyCodeCreatedEvent.cs | 45 + .../NetAdmin.Domain/NetAdmin.Domain.csproj | 9 + .../Attributes/RemoveNullNodeAttribute.cs | 7 + .../Attributes/TransactionAttribute.cs | 41 + .../BackgroundRunning/WorkBase.cs | 72 + .../Controllers/ControllerBase.cs | 25 + .../Controllers/HealthController.cs | 29 + .../Extensions/HttpContextExtensions.cs | 34 + .../IApplicationBuilderExtensions.cs | 54 + .../Extensions/IMvcBuilderExtensions.cs | 115 + .../ResourceExecutingContextExtensions.cs | 19 + .../Extensions/ServiceCollectionExtensions.cs | 269 + .../Extensions/UnitOfWorkManagerExtensions.cs | 30 + .../NetAdmin.Host/Filters/ApiResultHandler.cs | 99 + .../Filters/DefaultApiResultHandler.cs | 19 + .../Filters/GlobalExceptionHandler.cs | 33 + .../Filters/TransactionInterceptor.cs | 41 + .../Middlewares/RemoveNullNodeMiddleware.cs | 34 + .../Middlewares/RequestAuditMiddleware.cs | 72 + .../NetAdmin.Host/NetAdmin.Host.csproj | 11 + src/backend/NetAdmin.Host/Startup.cs | 34 + .../NetAdmin.Host/Subscribers/SqlProfiler.cs | 63 + .../Utils/CollectionJsonTypeInfoResolver.cs | 92 + .../NetAdmin.Host/Utils/RequestLogger.cs | 95 + src/backend/NetAdmin.Host/Utils/SqlAuditor.cs | 181 + .../Utils/SwaggerEnumSchemaFixer.cs | 40 + .../Utils/ToNullIfEmptyStringConverter.cs | 25 + .../Attributes/ExportAttribute.cs | 7 + .../Configuration/Options/CaptchaOptions.cs | 28 + .../Configuration/Options/DatabaseOptions.cs | 24 + .../Options/OptionAbstraction.cs | 6 + .../Configuration/Options/RedisOptions.cs | 12 + .../Options/SubNodes/Redis/InstanceNode.cs | 22 + .../Options/SubNodes/Upload/MinioNode.cs | 37 + .../Configuration/Options/UploadOptions.cs | 22 + .../NetAdmin.Infrastructure/Constant/Chars.cs | 91 + .../Constant/Numbers.cs | 25 + .../Enums/CertificateTypes.cs | 46 + .../Enums/Educations.cs | 78 + .../Enums/ErrorCodes.cs | 46 + .../Enums/FreeSqlInitOptions.cs | 34 + .../Enums/LogLevels.cs | 53 + .../Enums/MarriageStatues.cs | 38 + .../Enums/ModuleTypes.cs | 22 + .../NetAdmin.Infrastructure/Enums/Nations.cs | 456 + .../NetAdmin.Infrastructure/Enums/Orders.cs | 22 + .../Enums/PoliticalStatues.cs | 30 + .../NetAdmin.Infrastructure/Enums/Sexes.cs | 30 + .../NetAdminInvalidInputException.cs | 18 + .../NetAdminInvalidOperationException.cs | 18 + .../Exceptions/NetAdminException.cs | 23 + .../Unexpected/NetAdminGetLockerException.cs | 9 + .../Unexpected/NetAdminUnexpectedException.cs | 18 + .../HttpRequestMessageExtensions.cs | 25 + .../Extensions/HttpRequestPartExtensions.cs | 35 + .../HttpResponseMessageExtensions.cs | 35 + .../Extensions/ObjectExtensions.cs | 15 + .../Extensions/StringExtensions.cs | 31 + src/backend/NetAdmin.Infrastructure/Global.cs | 23 + .../NetAdmin.Infrastructure.csproj | 26 + .../Utils/ApplicationHelper.cs | 20 + .../Utils/CaptchaImageHelper.cs | 176 + .../Utils/FreeSqlBuilder.cs | 145 + .../Utils/LogHelper.cs | 15 + .../Utils/MinioHelper.cs | 52 + .../Utils/RedLocker.cs | 98 + .../Utils/UserAgentParser.cs | 347 + .../Utils/XmlCommentReader.cs | 95 + .../commonSettings.Development.json | 25 + .../commonSettings.Test.json | 25 + .../commonSettings.json | 332 + .../Extensions/ServiceCollectionExtensions.cs | 50 + .../Jobs/ExampleJob.cs | 34 + .../NetAdmin.ScheduledService.csproj | 15 + .../Properties/launchSettings.json | 14 + .../NetAdmin.ScheduledService/Startup.cs | 68 + .../settings.Development.json | 1 + .../settings.Test.json | 1 + .../NetAdmin.ScheduledService/settings.json | 16 + .../Modules/Sys/IApiModule.cs | 20 + .../Modules/Sys/ICacheModule.cs | 20 + .../Modules/Sys/ICaptchaModule.cs | 19 + .../Modules/Sys/IConfigModule.cs | 20 + .../Modules/Sys/IConstantModule.cs | 27 + .../Modules/Sys/IDeptModule.cs | 14 + .../Modules/Sys/IDevModule.cs | 24 + .../Modules/Sys/IDicCatalogModule.cs | 14 + .../Modules/Sys/IDicContentModule.cs | 14 + .../Modules/Sys/IDicModule.cs | 71 + .../Modules/Sys/IFileModule.cs | 12 + .../Modules/Sys/IMenuModule.cs | 20 + .../Modules/Sys/IRequestLogModule.cs | 14 + .../Modules/Sys/IRoleModule.cs | 14 + .../Modules/Sys/IToolsModule.cs | 17 + .../Modules/Sys/IUserModule.cs | 76 + .../Modules/Sys/IUserProfileModule.cs | 14 + .../Modules/Sys/IVerifyCodeModule.cs | 28 + .../Modules/Tpl/IExampleModule.cs | 14 + .../NetAdmin.SysComponent.Application.csproj | 6 + .../Services/Sys/ApiService.cs | 160 + .../Services/Sys/CacheService.cs | 49 + .../Services/Sys/CaptchaService.cs | 58 + .../Services/Sys/ConfigService.cs | 132 + .../Services/Sys/ConstantService.cs | 58 + .../Services/Sys/Dependency/IApiService.cs | 16 + .../Services/Sys/Dependency/ICacheService.cs | 9 + .../Sys/Dependency/ICaptchaService.cs | 9 + .../Services/Sys/Dependency/IConfigService.cs | 9 + .../Sys/Dependency/IConstantService.cs | 9 + .../Services/Sys/Dependency/IDeptService.cs | 9 + .../Services/Sys/Dependency/IDevService.cs | 9 + .../Sys/Dependency/IDicCatalogService.cs | 9 + .../Sys/Dependency/IDicContentService.cs | 9 + .../Services/Sys/Dependency/IDicService.cs | 9 + .../Services/Sys/Dependency/IFileService.cs | 9 + .../Services/Sys/Dependency/IMenuService.cs | 9 + .../Sys/Dependency/IRequestLogService.cs | 9 + .../Services/Sys/Dependency/IRoleService.cs | 9 + .../Services/Sys/Dependency/IToolsService.cs | 9 + .../Sys/Dependency/IUserProfileService.cs | 9 + .../Services/Sys/Dependency/IUserService.cs | 21 + .../Sys/Dependency/IVerifyCodeService.cs | 9 + .../Services/Sys/DeptService.cs | 139 + .../Services/Sys/DevService.cs | 215 + .../Services/Sys/DicCatalogService.cs | 119 + .../Services/Sys/DicContentService.cs | 122 + .../Services/Sys/DicService.cs | 119 + .../Services/Sys/FileService.cs | 47 + .../Services/Sys/MenuService.cs | 144 + .../Services/Sys/RequestLogService.cs | 125 + .../Services/Sys/RoleService.cs | 133 + .../Services/Sys/ToolsService.cs | 24 + .../Services/Sys/UserProfileService.cs | 171 + .../Services/Sys/UserService.cs | 487 + .../Services/Sys/VerifyCodeService.cs | 194 + .../Tpl/Dependency/IExampleService.cs | 9 + .../Services/Tpl/ExampleService.cs | 117 + .../NetAdmin.SysComponent.Cache.csproj | 7 + .../Sys/ApiCache.cs | 73 + .../Sys/CacheCache.cs | 32 + .../Sys/CaptchaCache.cs | 52 + .../Sys/ConfigCache.cs | 73 + .../Sys/ConstantCache.cs | 41 + .../Sys/Dependency/IApiCache.cs | 10 + .../Sys/Dependency/ICacheCache.cs | 10 + .../Sys/Dependency/ICaptchaCache.cs | 17 + .../Sys/Dependency/IConfigCache.cs | 10 + .../Sys/Dependency/IConstantCache.cs | 10 + .../Sys/Dependency/IDeptCache.cs | 10 + .../Sys/Dependency/IDevCache.cs | 10 + .../Sys/Dependency/IDicCache.cs | 10 + .../Sys/Dependency/IDicCatalogCache.cs | 10 + .../Sys/Dependency/IDicContentCache.cs | 10 + .../Sys/Dependency/IFileCache.cs | 10 + .../Sys/Dependency/IMenuCache.cs | 10 + .../Sys/Dependency/IRequestLogCache.cs | 10 + .../Sys/Dependency/IRoleCache.cs | 10 + .../Sys/Dependency/IToolsCache.cs | 10 + .../Sys/Dependency/IUserCache.cs | 54 + .../Sys/Dependency/IUserProfileCache.cs | 10 + .../Sys/Dependency/IVerifyCodeCache.cs | 10 + .../Sys/DeptCache.cs | 67 + .../Sys/DevCache.cs | 36 + .../Sys/DicCache.cs | 92 + .../Sys/DicCatalogCache.cs | 67 + .../Sys/DicContentCache.cs | 67 + .../Sys/FileCache.cs | 23 + .../Sys/MenuCache.cs | 73 + .../Sys/RequestLogCache.cs | 67 + .../Sys/RoleCache.cs | 67 + .../Sys/ToolsCache.cs | 29 + .../Sys/UserCache.cs | 196 + .../Sys/UserProfileCache.cs | 67 + .../Sys/VerifyCodeCache.cs | 78 + .../Tpl/Dependency/IExampleCache.cs | 10 + .../Tpl/ExampleCache.cs | 65 + .../Controllers/Sys/ApiController.cs | 105 + .../Controllers/Sys/CacheController.cs | 37 + .../Controllers/Sys/CaptchaController.cs | 38 + .../Controllers/Sys/ConfigController.cs | 100 + .../Controllers/Sys/ConstantController.cs | 87 + .../Controllers/Sys/DeptController.cs | 93 + .../Controllers/Sys/DevController.cs | 44 + .../Controllers/Sys/DicController.cs | 127 + .../Controllers/Sys/FileController.cs | 27 + .../Controllers/Sys/LogController.cs | 96 + .../Controllers/Sys/MenuController.cs | 101 + .../Controllers/Sys/RoleController.cs | 92 + .../Controllers/Sys/ToolsController.cs | 37 + .../Controllers/Sys/UserController.cs | 221 + .../Controllers/Sys/VerifyCodeController.cs | 104 + .../Controllers/Tpl/ExampleController.cs | 92 + .../NetAdmin.SysComponent.Host.csproj | 7 + .../Subscribers/ApiSynchronizer.cs | 31 + .../Subscribers/CacheCleaner.cs | 31 + .../Subscribers/EmailCodeSender.cs | 40 + .../Subscribers/OperationLogger.cs | 46 + .../Subscribers/SmsCodeSender.cs | 40 + src/frontend/admin/.editorconfig | 11 + src/frontend/admin/.eslintrc.js | 47 + src/frontend/admin/.gitignore | 23 + src/frontend/admin/.prettierignore | 3 + src/frontend/admin/.prettierrc | 10 + src/frontend/admin/LICENSE | 21 + src/frontend/admin/README.md | 30 + src/frontend/admin/babel.config.js | 3 + src/frontend/admin/index.html | 191 + src/frontend/admin/jsconfig.json | 19 + src/frontend/admin/package.json | 53 + src/frontend/admin/public/code/list/index.vue | 185 + src/frontend/admin/public/code/list/save.vue | 87 + src/frontend/admin/public/config.js | 9 + src/frontend/admin/public/favicon.ico | Bin 0 -> 4286 bytes .../admin/public/tinymce/langs/zh_CN.js | 426 + .../tinymce/skins/content/dark/content.css | 79 + .../skins/content/dark/content.min.css | 60 + .../tinymce/skins/content/default/content.css | 73 + .../skins/content/default/content.min.css | 55 + .../skins/content/document/content.css | 78 + .../skins/content/document/content.min.css | 60 + .../skins/content/tinymce-5-dark/content.css | 79 + .../content/tinymce-5-dark/content.min.css | 60 + .../skins/content/tinymce-5/content.css | 73 + .../skins/content/tinymce-5/content.min.css | 55 + .../tinymce/skins/content/writer/content.css | 74 + .../skins/content/writer/content.min.css | 56 + .../tinymce/skins/ui/oxide-dark/content.css | 848 + .../skins/ui/oxide-dark/content.inline.css | 861 + .../ui/oxide-dark/content.inline.min.css | 720 + .../skins/ui/oxide-dark/content.min.css | 707 + .../tinymce/skins/ui/oxide-dark/skin.css | 3664 +++ .../tinymce/skins/ui/oxide-dark/skin.min.css | 3043 +++ .../skins/ui/oxide-dark/skin.shadowdom.css | 35 + .../ui/oxide-dark/skin.shadowdom.min.css | 30 + .../public/tinymce/skins/ui/oxide/content.css | 869 + .../tinymce/skins/ui/oxide/content.inline.css | 861 + .../skins/ui/oxide/content.inline.min.css | 720 + .../tinymce/skins/ui/oxide/content.min.css | 726 + .../public/tinymce/skins/ui/oxide/skin.css | 3660 +++ .../tinymce/skins/ui/oxide/skin.min.css | 3040 +++ .../tinymce/skins/ui/oxide/skin.shadowdom.css | 35 + .../skins/ui/oxide/skin.shadowdom.min.css | 30 + .../skins/ui/tinymce-5-dark/content.css | 848 + .../ui/tinymce-5-dark/content.inline.css | 861 + .../ui/tinymce-5-dark/content.inline.min.css | 720 + .../skins/ui/tinymce-5-dark/content.min.css | 707 + .../tinymce/skins/ui/tinymce-5-dark/skin.css | 3764 +++ .../skins/ui/tinymce-5-dark/skin.min.css | 3125 +++ .../ui/tinymce-5-dark/skin.shadowdom.css | 35 + .../ui/tinymce-5-dark/skin.shadowdom.min.css | 30 + .../tinymce/skins/ui/tinymce-5/content.css | 869 + .../skins/ui/tinymce-5/content.inline.css | 861 + .../skins/ui/tinymce-5/content.inline.min.css | 720 + .../skins/ui/tinymce-5/content.min.css | 726 + .../tinymce/skins/ui/tinymce-5/skin.css | 3764 +++ .../tinymce/skins/ui/tinymce-5/skin.min.css | 3125 +++ .../skins/ui/tinymce-5/skin.shadowdom.css | 35 + .../skins/ui/tinymce-5/skin.shadowdom.min.css | 30 + src/frontend/admin/src/App.vue | 46 + src/frontend/admin/src/api/index.js | 11 + src/frontend/admin/src/api/sys/api.js | 33 + src/frontend/admin/src/api/sys/cache.js | 33 + src/frontend/admin/src/api/sys/captcha.js | 33 + src/frontend/admin/src/api/sys/config.js | 88 + src/frontend/admin/src/api/sys/constant.js | 55 + src/frontend/admin/src/api/sys/dept.js | 66 + src/frontend/admin/src/api/sys/dev.js | 44 + src/frontend/admin/src/api/sys/dic.js | 143 + src/frontend/admin/src/api/sys/file.js | 22 + src/frontend/admin/src/api/sys/log.js | 33 + src/frontend/admin/src/api/sys/menu.js | 77 + src/frontend/admin/src/api/sys/position.js | 77 + src/frontend/admin/src/api/sys/role.js | 77 + src/frontend/admin/src/api/sys/tools.js | 33 + src/frontend/admin/src/api/sys/user.js | 198 + src/frontend/admin/src/api/sys/verifycode.js | 33 + src/frontend/admin/src/api/tpl/example.js | 77 + src/frontend/admin/src/api/tpl/inner.js | 10 + src/frontend/admin/src/api/tpl/outer.js | 13 + src/frontend/admin/src/assets/icons/Api.vue | 8 + src/frontend/admin/src/assets/icons/App.vue | 29 + src/frontend/admin/src/assets/icons/App2.vue | 17 + .../admin/src/assets/icons/BugFill.vue | 7 + .../admin/src/assets/icons/BugLine.vue | 7 + .../admin/src/assets/icons/Business.vue | 17 + src/frontend/admin/src/assets/icons/Code.vue | 7 + src/frontend/admin/src/assets/icons/Code2.vue | 17 + .../admin/src/assets/icons/Csharp.vue | 17 + .../admin/src/assets/icons/Dashboard.vue | 8 + src/frontend/admin/src/assets/icons/Demo.vue | 21 + src/frontend/admin/src/assets/icons/Dept.vue | 17 + .../admin/src/assets/icons/Device.vue | 3 + src/frontend/admin/src/assets/icons/Dic.vue | 8 + .../admin/src/assets/icons/Docker.vue | 17 + .../admin/src/assets/icons/Download.vue | 7 + src/frontend/admin/src/assets/icons/Drone.vue | 21 + .../admin/src/assets/icons/Elastic.vue | 17 + .../admin/src/assets/icons/FileExcel.vue | 7 + .../admin/src/assets/icons/FilePpt.vue | 7 + .../admin/src/assets/icons/FileWord.vue | 7 + src/frontend/admin/src/assets/icons/Gitea.vue | 17 + .../admin/src/assets/icons/Grafana.vue | 3 + src/frontend/admin/src/assets/icons/Js.vue | 8 + src/frontend/admin/src/assets/icons/Kafka.vue | 17 + .../admin/src/assets/icons/Kibana.vue | 3 + src/frontend/admin/src/assets/icons/Link.vue | 3 + .../admin/src/assets/icons/Memory.vue | 8 + src/frontend/admin/src/assets/icons/Meter.vue | 3 + .../admin/src/assets/icons/Organization.vue | 7 + .../admin/src/assets/icons/Position.vue | 17 + .../admin/src/assets/icons/Product.vue | 3 + .../src/assets/icons/ProductCategory.vue | 17 + .../admin/src/assets/icons/Resource.vue | 3 + src/frontend/admin/src/assets/icons/Robot.vue | 3 + src/frontend/admin/src/assets/icons/Role.vue | 17 + src/frontend/admin/src/assets/icons/Send.vue | 17 + .../admin/src/assets/icons/SmsCode.vue | 3 + src/frontend/admin/src/assets/icons/Sync.vue | 17 + src/frontend/admin/src/assets/icons/Task.vue | 11 + src/frontend/admin/src/assets/icons/Tpl.vue | 3 + .../admin/src/assets/icons/Unlink.vue | 21 + .../admin/src/assets/icons/Upload.vue | 7 + src/frontend/admin/src/assets/icons/Vue.vue | 7 + .../admin/src/assets/icons/Wechat.vue | 7 + src/frontend/admin/src/assets/icons/index.js | 45 + .../admin/src/assets/icons/tpl/Svg.vue | 3 + .../admin/src/assets/icons/tpl/export.js | 1 + src/frontend/admin/src/assets/img/404.png | Bin 0 -> 99568 bytes .../admin/src/assets/img/auth_banner.jpg | Bin 0 -> 293058 bytes src/frontend/admin/src/assets/img/avatar.jpg | Bin 0 -> 22534 bytes src/frontend/admin/src/assets/img/avatar2.gif | Bin 0 -> 135443 bytes src/frontend/admin/src/assets/img/avatar3.gif | Bin 0 -> 136520 bytes src/frontend/admin/src/assets/img/loginbg.svg | 113 + src/frontend/admin/src/assets/img/logo-r.png | Bin 0 -> 8373 bytes src/frontend/admin/src/assets/img/logo.png | Bin 0 -> 9112 bytes .../admin/src/assets/img/no-widgets.svg | 57 + .../admin/src/assets/img/tasks-example.png | Bin 0 -> 17767 bytes src/frontend/admin/src/assets/img/ver.svg | 238 + .../admin/src/components/naArea/index.vue | 75 + .../src/components/naButtonAdd/index.vue | 25 + .../src/components/naButtonBatchDel/index.vue | 38 + .../src/components/naColAvatar/index.vue | 38 + .../src/components/naColIndicator/index.vue | 39 + .../src/components/naColOperation/index.vue | 47 + .../admin/src/components/naColTags/index.vue | 30 + .../admin/src/components/naDept/index.vue | 44 + .../src/components/naDicCatalog/index.vue | 50 + .../src/components/naFormEmail/index.vue | 117 + .../src/components/naFormPhone/index.vue | 118 + .../admin/src/components/naInfo/index.vue | 36 + .../admin/src/components/naSearch/index.vue | 189 + .../src/components/naVerifition/index.vue | 452 + .../src/components/naVerifition/slide.vue | 422 + .../src/components/scCodeEditor/index.vue | 122 + .../src/components/scContextmenu/index.vue | 157 + .../src/components/scContextmenu/item.vue | 85 + .../admin/src/components/scCron/index.vue | 835 + .../admin/src/components/scCropper/index.vue | 120 + .../admin/src/components/scDialog/index.vue | 120 + .../components/scEcharts/echarts-theme-T.js | 62 + .../admin/src/components/scEcharts/index.vue | 68 + .../admin/src/components/scEditor/index.vue | 150 + .../src/components/scFileExport/column.vue | 58 + .../src/components/scFileExport/index.vue | 219 + .../src/components/scFileImport/index.vue | 138 + .../src/components/scFileSelect/index.vue | 507 + .../src/components/scFilterBar/index.vue | 481 + .../admin/src/components/scFilterBar/my.vue | 176 + .../src/components/scFilterBar/pySelect.vue | 62 + .../admin/src/components/scForm/index.vue | 319 + .../components/scForm/items/tableselect.vue | 48 + .../src/components/scFormTable/index.vue | 156 + .../src/components/scIconSelect/index.vue | 196 + .../components/scMini/scStatusIndicator.vue | 82 + .../admin/src/components/scMini/scTrend.vue | 90 + .../src/components/scPageHeader/index.vue | 94 + .../components/scPasswordStrength/index.vue | 149 + .../admin/src/components/scQrCode/index.vue | 87 + .../admin/src/components/scQrCode/qrcode.js | 1426 ++ .../admin/src/components/scSelect/index.vue | 116 + .../src/components/scSelectFilter/index.vue | 195 + .../src/components/scStatistic/index.vue | 99 + .../admin/src/components/scTable/column.js | 23 + .../src/components/scTable/columnSetting.vue | 200 + .../admin/src/components/scTable/index.vue | 514 + .../src/components/scTableSelect/index.vue | 282 + .../admin/src/components/scTitle/index.vue | 28 + .../admin/src/components/scUpload/file.vue | 214 + .../admin/src/components/scUpload/index.vue | 406 + .../src/components/scUpload/multiple.vue | 340 + .../admin/src/components/scVideo/index.vue | 111 + .../src/components/scWaterMark/index.vue | 71 + .../admin/src/components/scWorkflow/index.vue | 572 + .../src/components/scWorkflow/nodeWrap.vue | 56 + .../components/scWorkflow/nodes/addNode.vue | 104 + .../components/scWorkflow/nodes/approver.vue | 225 + .../components/scWorkflow/nodes/branch.vue | 243 + .../components/scWorkflow/nodes/promoter.vue | 123 + .../src/components/scWorkflow/nodes/send.vue | 136 + .../src/components/scWorkflow/select.vue | 414 + src/frontend/admin/src/config/fileSelect.js | 69 + src/frontend/admin/src/config/filterBar.js | 74 + src/frontend/admin/src/config/iconSelect.js | 309 + src/frontend/admin/src/config/index.js | 81 + src/frontend/admin/src/config/myConfig.js | 10 + .../admin/src/config/naColOperation.js | 24 + src/frontend/admin/src/config/naFormEmail.js | 35 + .../admin/src/config/naFormPassword.js | 22 + src/frontend/admin/src/config/naFormPhone.js | 35 + src/frontend/admin/src/config/route.js | 31 + src/frontend/admin/src/config/select.js | 19 + src/frontend/admin/src/config/table.js | 95 + src/frontend/admin/src/config/tableSelect.js | 23 + src/frontend/admin/src/config/upload.js | 20 + src/frontend/admin/src/config/workflow.js | 69 + src/frontend/admin/src/directives/auth.js | 18 + src/frontend/admin/src/directives/auths.js | 24 + src/frontend/admin/src/directives/authsAll.js | 19 + src/frontend/admin/src/directives/copy.js | 29 + src/frontend/admin/src/directives/role.js | 22 + src/frontend/admin/src/directives/time.js | 79 + .../admin/src/layout/components/NavMenu.vue | 42 + .../src/layout/components/iframeView.vue | 77 + .../admin/src/layout/components/search.vue | 192 + .../admin/src/layout/components/setting.vue | 96 + .../admin/src/layout/components/sideM.vue | 182 + .../admin/src/layout/components/tags.vue | 346 + .../admin/src/layout/components/tasks.vue | 130 + .../admin/src/layout/components/topbar.vue | 73 + .../admin/src/layout/components/userbar.vue | 296 + src/frontend/admin/src/layout/index.vue | 334 + src/frontend/admin/src/layout/other/404.vue | 77 + .../admin/src/layout/other/autoExit.js | 49 + src/frontend/admin/src/layout/other/empty.vue | 3 + src/frontend/admin/src/locales/index.js | 28 + src/frontend/admin/src/locales/lang/en.js | 39 + src/frontend/admin/src/locales/lang/zh-cn.js | 39 + src/frontend/admin/src/main.js | 22 + src/frontend/admin/src/router/index.js | 192 + .../admin/src/router/scrollBehavior.js | 26 + src/frontend/admin/src/router/systemRouter.js | 35 + src/frontend/admin/src/scui.js | 116 + src/frontend/admin/src/store/index.js | 15 + .../admin/src/store/modules/global.js | 33 + .../admin/src/store/modules/iframe.js | 38 + .../admin/src/store/modules/keepAlive.js | 34 + .../admin/src/store/modules/viewTags.js | 46 + src/frontend/admin/src/style/app.scss | 515 + src/frontend/admin/src/style/dark.scss | 95 + src/frontend/admin/src/style/fix.scss | 293 + src/frontend/admin/src/style/media.scss | 141 + src/frontend/admin/src/style/pages.scss | 183 + src/frontend/admin/src/style/style.scss | 5 + src/frontend/admin/src/utils/color.js | 29 + src/frontend/admin/src/utils/db.js | 309 + src/frontend/admin/src/utils/errorHandler.js | 33 + src/frontend/admin/src/utils/load.js | 60 + src/frontend/admin/src/utils/permission.js | 55 + src/frontend/admin/src/utils/preload.js | 50 + src/frontend/admin/src/utils/print.js | 143 + src/frontend/admin/src/utils/request.js | 279 + src/frontend/admin/src/utils/template.js | 337 + src/frontend/admin/src/utils/tool.js | 288 + src/frontend/admin/src/utils/useTabs.js | 61 + src/frontend/admin/src/utils/verificate.js | 17 + .../views/anonymous/components/commonPage.vue | 34 + .../anonymous/components/passwordForm.vue | 72 + .../views/anonymous/components/phoneForm.vue | 53 + .../admin/src/views/anonymous/login.vue | 361 + .../admin/src/views/anonymous/register.vue | 165 + .../src/views/anonymous/resetPassword.vue | 92 + .../admin/src/views/dev/code/index.vue | 175 + .../admin/src/views/dev/code/list.vue | 310 + src/frontend/admin/src/views/home/index.vue | 45 + .../views/home/widgets/components/about.vue | 29 + .../views/home/widgets/components/echarts.vue | 97 + .../views/home/widgets/components/index.js | 16 + .../home/widgets/components/progress.vue | 38 + .../views/home/widgets/components/time.vue | 51 + .../src/views/home/widgets/components/ver.vue | 41 + .../views/home/widgets/components/welcome.vue | 111 + .../admin/src/views/home/widgets/index.vue | 486 + .../src/views/home/work/components/myapp.vue | 226 + .../admin/src/views/home/work/index.vue | 30 + src/frontend/admin/src/views/other/about.vue | 73 + .../admin/src/views/other/directive.vue | 59 + .../admin/src/views/other/fullpage.vue | 27 + src/frontend/admin/src/views/other/loadJS.vue | 56 + .../admin/src/views/other/verificate.vue | 126 + .../admin/src/views/other/viewTags.vue | 83 + .../admin/src/views/profile/index.vue | 107 + .../admin/src/views/profile/user/account.vue | 93 + .../admin/src/views/profile/user/logs.vue | 38 + .../src/views/profile/user/pushSettings.vue | 29 + .../admin/src/views/profile/user/setEmail.vue | 95 + .../src/views/profile/user/setMobile.vue | 107 + .../src/views/profile/user/setPassword.vue | 74 + .../admin/src/views/profile/user/settings.vue | 99 + .../admin/src/views/profile/user/space.vue | 54 + .../admin/src/views/setting/client/index.vue | 126 + .../admin/src/views/setting/client/save.vue | 98 + .../admin/src/views/setting/dept/index.vue | 150 + .../admin/src/views/setting/dept/save.vue | 117 + .../admin/src/views/setting/dic/dic.vue | 98 + .../admin/src/views/setting/dic/index.vue | 383 + .../admin/src/views/setting/dic/list.vue | 104 + .../admin/src/views/setting/log/index.vue | 165 + .../admin/src/views/setting/log/info.vue | 57 + .../admin/src/views/setting/menu/index.vue | 209 + .../admin/src/views/setting/menu/save.vue | 205 + .../admin/src/views/setting/role/index.vue | 179 + .../src/views/setting/role/permission.vue | 200 + .../admin/src/views/setting/role/save.vue | 98 + .../admin/src/views/setting/system/index.vue | 177 + .../admin/src/views/setting/table/index.vue | 118 + .../admin/src/views/setting/table/save.vue | 177 + .../admin/src/views/setting/task/index.vue | 229 + .../admin/src/views/setting/task/logs.vue | 111 + .../admin/src/views/setting/task/save.vue | 104 + .../admin/src/views/setting/user/index.vue | 217 + .../admin/src/views/setting/user/save.vue | 159 + .../admin/src/views/sys/api/index.vue | 71 + .../admin/src/views/sys/cache/index.vue | 148 + .../admin/src/views/sys/config/index.vue | 140 + .../admin/src/views/sys/config/save.vue | 108 + .../admin/src/views/sys/dept/index.vue | 167 + .../admin/src/views/sys/dept/save.vue | 121 + .../admin/src/views/sys/dic/index.vue | 158 + .../admin/src/views/sys/dic/list/index.vue | 145 + .../admin/src/views/sys/dic/list/save.vue | 88 + src/frontend/admin/src/views/sys/dic/save.vue | 74 + .../admin/src/views/sys/log/index.vue | 172 + .../admin/src/views/sys/menu/index.vue | 194 + .../admin/src/views/sys/menu/save.vue | 163 + .../admin/src/views/sys/role/index.vue | 221 + .../admin/src/views/sys/role/save.vue | 177 + .../admin/src/views/sys/user/index.vue | 162 + .../admin/src/views/sys/user/save.vue | 344 + .../admin/src/views/template/layout/blank.vue | 16 + .../src/views/template/layout/layoutLCR.vue | 39 + .../src/views/template/layout/layoutTCB.vue | 23 + .../src/views/template/list/crud/detail.vue | 43 + .../src/views/template/list/crud/index.vue | 153 + .../src/views/template/list/crud/info.vue | 30 + .../src/views/template/list/crud/save.vue | 109 + .../admin/src/views/template/list/son.vue | 73 + .../admin/src/views/template/list/tab.vue | 166 + .../admin/src/views/template/list/tree.vue | 136 + .../admin/src/views/template/list/width.vue | 76 + .../src/views/template/other/stepform.vue | 150 + .../admin/src/views/test/autocode/index.vue | 106 + .../admin/src/views/test/autocode/list.vue | 232 + .../admin/src/views/test/codebug/index.vue | 94 + src/frontend/admin/src/views/vab/chart.vue | 246 + .../admin/src/views/vab/codeeditor.vue | 85 + .../admin/src/views/vab/contextmenu.vue | 117 + src/frontend/admin/src/views/vab/cron.vue | 45 + src/frontend/admin/src/views/vab/cropper.vue | 102 + .../admin/src/views/vab/dialog/dialog1.vue | 25 + .../admin/src/views/vab/dialog/dialog2.vue | 25 + .../admin/src/views/vab/dialog/index.vue | 97 + src/frontend/admin/src/views/vab/drag.vue | 135 + src/frontend/admin/src/views/vab/editor.vue | 54 + .../admin/src/views/vab/fileselect.vue | 54 + .../admin/src/views/vab/filterBar.vue | 187 + src/frontend/admin/src/views/vab/form.vue | 410 + .../admin/src/views/vab/formtable.vue | 132 + src/frontend/admin/src/views/vab/iconfont.vue | 77 + .../admin/src/views/vab/iconselect.vue | 71 + .../admin/src/views/vab/importexport.vue | 213 + src/frontend/admin/src/views/vab/mini.vue | 76 + src/frontend/admin/src/views/vab/print.vue | 68 + src/frontend/admin/src/views/vab/qrcode.vue | 49 + src/frontend/admin/src/views/vab/select.vue | 63 + .../admin/src/views/vab/selectFilter.vue | 89 + .../admin/src/views/vab/statistic.vue | 70 + .../admin/src/views/vab/table/base.vue | 55 + .../admin/src/views/vab/table/column.vue | 76 + .../admin/src/views/vab/table/remote.vue | 44 + .../admin/src/views/vab/table/thead.vue | 37 + .../admin/src/views/vab/tableselect.vue | 104 + src/frontend/admin/src/views/vab/upload.vue | 175 + src/frontend/admin/src/views/vab/video.vue | 60 + .../admin/src/views/vab/watermark.vue | 60 + src/frontend/admin/src/views/vab/workflow.vue | 119 + src/frontend/admin/vite.config.js | 79 + src/frontend/h5/.editorconfig | 11 + src/frontend/h5/.eslintrc.cjs | 14 + src/frontend/h5/.gitignore | 28 + src/frontend/h5/.prettierrc.json | 8 + src/frontend/h5/README.md | 35 + src/frontend/h5/index.html | 13 + src/frontend/h5/package.json | 36 + src/frontend/h5/postcss.config.js | 10 + src/frontend/h5/public/favicon.ico | Bin 0 -> 4286 bytes src/frontend/h5/src/App.vue | 28 + src/frontend/h5/src/NetAdmin.js | 25 + src/frontend/h5/src/api/biz/artcategory.js | 77 + src/frontend/h5/src/api/biz/article.js | 77 + .../h5/src/api/biz/articlecategory.js | 77 + src/frontend/h5/src/api/biz/articledetail.js | 77 + src/frontend/h5/src/api/biz/member.js | 99 + src/frontend/h5/src/api/biz/product.js | 88 + .../h5/src/api/biz/productcategory.js | 77 + src/frontend/h5/src/api/biz/urlmap.js | 77 + src/frontend/h5/src/api/controllers/health.js | 22 + src/frontend/h5/src/api/index.js | 13 + src/frontend/h5/src/api/model/auth.js | 12 + src/frontend/h5/src/api/model/common.js | 49 + src/frontend/h5/src/api/model/demo.js | 55 + src/frontend/h5/src/api/model/system.js | 114 + src/frontend/h5/src/api/sys/api.js | 33 + src/frontend/h5/src/api/sys/cache.js | 33 + src/frontend/h5/src/api/sys/captcha.js | 33 + src/frontend/h5/src/api/sys/config.js | 88 + src/frontend/h5/src/api/sys/constant.js | 55 + src/frontend/h5/src/api/sys/dept.js | 66 + src/frontend/h5/src/api/sys/dev.js | 44 + src/frontend/h5/src/api/sys/dic.js | 143 + src/frontend/h5/src/api/sys/file.js | 22 + src/frontend/h5/src/api/sys/log.js | 33 + src/frontend/h5/src/api/sys/menu.js | 77 + src/frontend/h5/src/api/sys/position.js | 77 + src/frontend/h5/src/api/sys/role.js | 77 + src/frontend/h5/src/api/sys/sms.js | 55 + src/frontend/h5/src/api/sys/tools.js | 33 + src/frontend/h5/src/api/sys/user.js | 154 + src/frontend/h5/src/api/tpl/example.js | 77 + src/frontend/h5/src/api/tpl/inner.js | 10 + src/frontend/h5/src/api/tpl/outer.js | 13 + src/frontend/h5/src/assets/base.css | 3 + src/frontend/h5/src/assets/logo.svg | 1 + src/frontend/h5/src/assets/main.css | 11 + src/frontend/h5/src/components/Avatar.vue | 33 + src/frontend/h5/src/components/HelloWorld.vue | 43 + .../h5/src/components/InfinityScroll.vue | 33 + src/frontend/h5/src/components/TheWelcome.vue | 86 + .../h5/src/components/WelcomeItem.vue | 85 + .../h5/src/components/icons/IconCommunity.vue | 7 + .../components/icons/IconDocumentation.vue | 7 + .../h5/src/components/icons/IconEcosystem.vue | 7 + .../h5/src/components/icons/IconSupport.vue | 7 + .../h5/src/components/icons/IconTooling.vue | 19 + .../h5/src/components/verifition/Verify.vue | 449 + .../verifition/Verify/VerifySlide.vue | 466 + .../h5/src/components/verifition/utils/ase.js | 15 + .../src/components/verifition/utils/util.js | 109 + src/frontend/h5/src/config/index.js | 34 + src/frontend/h5/src/main.js | 15 + src/frontend/h5/src/router/index.js | 58 + src/frontend/h5/src/stores/counter.js | 12 + src/frontend/h5/src/utils/request.js | 263 + src/frontend/h5/src/utils/tool.js | 284 + src/frontend/h5/src/van.js | 74 + src/frontend/h5/src/views/AboutView.vue | 15 + src/frontend/h5/src/views/CategoryView.vue | 30 + src/frontend/h5/src/views/HomeView.vue | 175 + src/frontend/h5/src/views/ProductView.vue | 35 + .../h5/src/views/account/LoginByPwdView.vue | 70 + .../h5/src/views/account/LoginBySmsView.vue | 191 + .../h5/src/views/account/RegisterView.vue | 220 + .../h5/src/views/account/ResetPwdView.vue | 211 + .../h5/src/views/member/IndexView.vue | 33 + src/frontend/h5/tailwind.config.js | 991 + src/frontend/h5/vite.config.js | 22 + tools/CloneProjectRefs.ps1 | 6 + tools/CodeCleanup.csx | 44 + tools/CodeCleanup.ps1 | 7 + tools/CodeCleanupFull.ps1 | 1 + tools/DotClean.cmd | 3 + tools/GenerateLn.cmd | 2 + tools/GenerateLnCs.tt | 78 + tools/GenerateLnResx.tt | 36 + tools/GitPR.ps1 | 26 + tools/GitRecreate.ps1 | 6 + tools/IdGenerator.linq | 37 + tools/ImageOptimize.csx | 65 + tools/InstallAsTpl.ps1 | 2 + tools/Switcher.FreeSql.json | 22 + tools/Switcher.Furion.json | 17 + tools/Switcher.NSExt.json | 17 + tools/Switcher.ps1 | 27 + tools/SyncMetaFiles.csx | 33 + 1014 files changed, 122380 insertions(+), 2 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .template.config/template.json create mode 100644 Build.cake create mode 100644 CodeQuality.props create mode 100644 CopyPackageXmlCommentFiles.targets create mode 100644 Directory.Build.props create mode 100644 NetAdmin.sln create mode 100644 NetAdmin.sln.DotSettings create mode 100644 NuGet.Config create mode 100644 PreBuild.targets create mode 100644 StyleCop.json create mode 100644 StyleCopAnalyzers.ruleset create mode 100644 assets/README.md create mode 100644 assets/captcha/background/1.jpg create mode 100644 assets/captcha/background/10.jpg create mode 100644 assets/captcha/background/100.jpg create mode 100644 assets/captcha/background/11.jpg create mode 100644 assets/captcha/background/12.jpg create mode 100644 assets/captcha/background/13.jpg create mode 100644 assets/captcha/background/14.jpg create mode 100644 assets/captcha/background/15.jpg create mode 100644 assets/captcha/background/16.jpg create mode 100644 assets/captcha/background/17.jpg create mode 100644 assets/captcha/background/18.jpg create mode 100644 assets/captcha/background/19.jpg create mode 100644 assets/captcha/background/2.jpg create mode 100644 assets/captcha/background/20.jpg create mode 100644 assets/captcha/background/21.jpg create mode 100644 assets/captcha/background/22.jpg create mode 100644 assets/captcha/background/23.jpg create mode 100644 assets/captcha/background/24.jpg create mode 100644 assets/captcha/background/25.jpg create mode 100644 assets/captcha/background/26.jpg create mode 100644 assets/captcha/background/27.jpg create mode 100644 assets/captcha/background/28.jpg create mode 100644 assets/captcha/background/29.jpg create mode 100644 assets/captcha/background/3.jpg create mode 100644 assets/captcha/background/30.jpg create mode 100644 assets/captcha/background/31.jpg create mode 100644 assets/captcha/background/32.jpg create mode 100644 assets/captcha/background/33.jpg create mode 100644 assets/captcha/background/34.jpg create mode 100644 assets/captcha/background/35.jpg create mode 100644 assets/captcha/background/36.jpg create mode 100644 assets/captcha/background/37.jpg create mode 100644 assets/captcha/background/38.jpg create mode 100644 assets/captcha/background/39.jpg create mode 100644 assets/captcha/background/4.jpg create mode 100644 assets/captcha/background/40.jpg create mode 100644 assets/captcha/background/41.jpg create mode 100644 assets/captcha/background/42.jpg create mode 100644 assets/captcha/background/43.jpg create mode 100644 assets/captcha/background/44.jpg create mode 100644 assets/captcha/background/45.jpg create mode 100644 assets/captcha/background/46.jpg create mode 100644 assets/captcha/background/47.jpg create mode 100644 assets/captcha/background/48.jpg create mode 100644 assets/captcha/background/49.jpg create mode 100644 assets/captcha/background/5.jpg create mode 100644 assets/captcha/background/50.jpg create mode 100644 assets/captcha/background/51.jpg create mode 100644 assets/captcha/background/52.jpg create mode 100644 assets/captcha/background/53.jpg create mode 100644 assets/captcha/background/54.jpg create mode 100644 assets/captcha/background/55.jpg create mode 100644 assets/captcha/background/56.jpg create mode 100644 assets/captcha/background/57.jpg create mode 100644 assets/captcha/background/58.jpg create mode 100644 assets/captcha/background/59.jpg create mode 100644 assets/captcha/background/6.jpg create mode 100644 assets/captcha/background/60.jpg create mode 100644 assets/captcha/background/61.jpg create mode 100644 assets/captcha/background/62.jpg create mode 100644 assets/captcha/background/63.jpg create mode 100644 assets/captcha/background/64.jpg create mode 100644 assets/captcha/background/65.jpg create mode 100644 assets/captcha/background/66.jpg create mode 100644 assets/captcha/background/67.jpg create mode 100644 assets/captcha/background/68.jpg create mode 100644 assets/captcha/background/69.jpg create mode 100644 assets/captcha/background/7.jpg create mode 100644 assets/captcha/background/70.jpg create mode 100644 assets/captcha/background/71.jpg create mode 100644 assets/captcha/background/72.jpg create mode 100644 assets/captcha/background/73.jpg create mode 100644 assets/captcha/background/74.jpg create mode 100644 assets/captcha/background/75.jpg create mode 100644 assets/captcha/background/76.jpg create mode 100644 assets/captcha/background/77.jpg create mode 100644 assets/captcha/background/78.jpg create mode 100644 assets/captcha/background/79.jpg create mode 100644 assets/captcha/background/8.jpg create mode 100644 assets/captcha/background/80.jpg create mode 100644 assets/captcha/background/81.jpg create mode 100644 assets/captcha/background/82.jpg create mode 100644 assets/captcha/background/83.jpg create mode 100644 assets/captcha/background/84.jpg create mode 100644 assets/captcha/background/85.jpg create mode 100644 assets/captcha/background/86.jpg create mode 100644 assets/captcha/background/87.jpg create mode 100644 assets/captcha/background/88.jpg create mode 100644 assets/captcha/background/89.jpg create mode 100644 assets/captcha/background/9.jpg create mode 100644 assets/captcha/background/90.jpg create mode 100644 assets/captcha/background/91.jpg create mode 100644 assets/captcha/background/92.jpg create mode 100644 assets/captcha/background/93.jpg create mode 100644 assets/captcha/background/94.jpg create mode 100644 assets/captcha/background/95.jpg create mode 100644 assets/captcha/background/96.jpg create mode 100644 assets/captcha/background/97.jpg create mode 100644 assets/captcha/background/98.jpg create mode 100644 assets/captcha/background/99.jpg create mode 100644 assets/captcha/template/1/dark.png create mode 100644 assets/captcha/template/1/transparent.png create mode 100644 assets/captcha/template/2/dark.png create mode 100644 assets/captcha/template/2/transparent.png create mode 100644 assets/captcha/template/3/dark.png create mode 100644 assets/captcha/template/3/transparent.png create mode 100644 assets/captcha/template/4/dark.png create mode 100644 assets/captcha/template/4/transparent.png create mode 100644 assets/captcha/template/5/dark.png create mode 100644 assets/captcha/template/5/transparent.png create mode 100644 assets/captcha/template/6/dark.png create mode 100644 assets/captcha/template/6/transparent.png create mode 100644 assets/logo/drone.png create mode 100644 assets/logo/drone_red.png create mode 100644 assets/logo/gitea.png create mode 100644 assets/logo/grafana.png create mode 100644 assets/logo/line.png create mode 100644 assets/minio/docker-compose-minio.yml create mode 100644 assets/resx/Ln.resx create mode 100644 assets/resx/Ln.txt create mode 100644 assets/seed-data/Sys_Config.json create mode 100644 assets/seed-data/Sys_Dept.json create mode 100644 assets/seed-data/Sys_DicCatalog.json create mode 100644 assets/seed-data/Sys_DicContent.json create mode 100644 assets/seed-data/Sys_Menu.json create mode 100644 assets/seed-data/Sys_Role.json create mode 100644 assets/seed-data/Sys_RoleApi.json create mode 100644 assets/seed-data/Sys_RoleMenu.json create mode 100644 assets/seed-data/Sys_User.json create mode 100644 assets/seed-data/Sys_UserProfile.json create mode 100644 assets/seed-data/Sys_UserRole.json create mode 100644 dotnet-tools.json create mode 100644 global.json create mode 100644 package.json create mode 100644 src/backend/GlobalUsings.cs create mode 100644 src/backend/NetAdmin.Application/Modules/ICrudModule.cs create mode 100644 src/backend/NetAdmin.Application/NetAdmin.Application.csproj create mode 100644 src/backend/NetAdmin.Application/Repositories/IRepository.cs create mode 100644 src/backend/NetAdmin.Application/Repositories/Repository.cs create mode 100644 src/backend/NetAdmin.Application/Services/IService.cs create mode 100644 src/backend/NetAdmin.Application/Services/RepositoryService.cs create mode 100644 src/backend/NetAdmin.Application/Services/ServiceBase.cs create mode 100644 src/backend/NetAdmin.BizServer.Application/NetAdmin.BizServer.Application.csproj create mode 100644 src/backend/NetAdmin.BizServer.Cache/NetAdmin.BizServer.Cache.csproj create mode 100644 src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/backend/NetAdmin.BizServer.Host/Filters/JwtHandler.cs create mode 100644 src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj create mode 100644 src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json create mode 100644 src/backend/NetAdmin.BizServer.Host/Startup.cs create mode 100644 src/backend/NetAdmin.BizServer.Host/settings.Development.json create mode 100644 src/backend/NetAdmin.BizServer.Host/settings.Test.json create mode 100644 src/backend/NetAdmin.BizServer.Host/settings.json create mode 100644 src/backend/NetAdmin.BizServer.Tests/NetAdmin.BizServer.Tests.csproj create mode 100644 src/backend/NetAdmin.BizServer.Tests/UsedNumberTests.cs create mode 100644 src/backend/NetAdmin.Cache/CacheBase.cs create mode 100644 src/backend/NetAdmin.Cache/DistributedCache.cs create mode 100644 src/backend/NetAdmin.Cache/ICache.cs create mode 100644 src/backend/NetAdmin.Cache/MemoryCache.cs create mode 100644 src/backend/NetAdmin.Cache/NetAdmin.Cache.csproj create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/AlipayAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/CertificateAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/CulturePhoneAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRangeAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRequiredAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureUrlAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/InviteCodeAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/PasswordAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/PayPasswordAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/RegexAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/SpecificDeptAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/TelephoneAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/UserNameAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/DataValidation/VerifyCodeAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/ServerTimeAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Attributes/SnowflakeAttribute.cs create mode 100644 src/backend/NetAdmin.Domain/Contexts/ContextApp.cs create mode 100644 src/backend/NetAdmin.Domain/Contexts/ContextUserInfo.cs create mode 100644 src/backend/NetAdmin.Domain/Contexts/ContextUserToken.cs create mode 100644 src/backend/NetAdmin.Domain/DataAbstraction.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/EntityBase.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedClient.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedTime.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedUser.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldEnabled.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedClient.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedTime.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedUser.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldOwner.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldPrimary.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSort.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldVersion.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteImmutableEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteMutableEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteVersionEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/MutableEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/SimpleEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Dependency/VersionEntity.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs create mode 100644 src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/DelReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/IPagedInfo.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/NopReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/RestfulInfo.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Api/CreateApiReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Cache/CacheStatisticsRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Captcha/GetCaptchaRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Captcha/VerifyCaptchaReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Config/CreateConfigReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Config/UpdateConfigReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dept/UpdateDeptReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateIconCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dev/IconExportJsInfo.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/CreateDicCatalogReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/UpdateDicCatalogReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/UpdateDicContentReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Menu/CreateMenuReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Menu/MetaInfo.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Menu/UpdateMenuReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/CreateRequestLogReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Role/GetMenusRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Role/MapMenusReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/Role/UpdateRoleReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/CheckUserNameAvailableReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/LoginByPwdReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/LoginBySmsReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/RegisterUserReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/ResetPasswordReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/SetEmailReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/SetMobileReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/SetPasswordReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/UpdateUserReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/User/UserInfoRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/CreateUserProfileReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/UpdateUserProfileReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/CreateVerifyCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/UpdateVerifyCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyEmailCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifySmsCodeReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Tpl/Example/CreateExampleReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleReq.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleRsp.cs create mode 100644 src/backend/NetAdmin.Domain/Dto/Tpl/Example/UpdateExampleReq.cs create mode 100644 src/backend/NetAdmin.Domain/Enums/Sys/DataScopes.cs create mode 100644 src/backend/NetAdmin.Domain/Enums/Sys/MenuTypes.cs create mode 100644 src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeDeviceTypes.cs create mode 100644 src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeStatues.cs create mode 100644 src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeTypes.cs create mode 100644 src/backend/NetAdmin.Domain/Events/IEventSourceGeneric.cs create mode 100644 src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/SqlCommandBeforeEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/SqlCommandEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/SyncStructureAfterEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/SyncStructureBeforeEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/Sys/RequestLogEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/Sys/UserUpdatedEvent.cs create mode 100644 src/backend/NetAdmin.Domain/Events/Sys/VerifyCodeCreatedEvent.cs create mode 100644 src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj create mode 100644 src/backend/NetAdmin.Host/Attributes/RemoveNullNodeAttribute.cs create mode 100644 src/backend/NetAdmin.Host/Attributes/TransactionAttribute.cs create mode 100644 src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs create mode 100644 src/backend/NetAdmin.Host/Controllers/ControllerBase.cs create mode 100644 src/backend/NetAdmin.Host/Controllers/HealthController.cs create mode 100644 src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs create mode 100644 src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs create mode 100644 src/backend/NetAdmin.Host/Extensions/IMvcBuilderExtensions.cs create mode 100644 src/backend/NetAdmin.Host/Extensions/ResourceExecutingContextExtensions.cs create mode 100644 src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/backend/NetAdmin.Host/Extensions/UnitOfWorkManagerExtensions.cs create mode 100644 src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs create mode 100644 src/backend/NetAdmin.Host/Filters/DefaultApiResultHandler.cs create mode 100644 src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs create mode 100644 src/backend/NetAdmin.Host/Filters/TransactionInterceptor.cs create mode 100644 src/backend/NetAdmin.Host/Middlewares/RemoveNullNodeMiddleware.cs create mode 100644 src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs create mode 100644 src/backend/NetAdmin.Host/NetAdmin.Host.csproj create mode 100644 src/backend/NetAdmin.Host/Startup.cs create mode 100644 src/backend/NetAdmin.Host/Subscribers/SqlProfiler.cs create mode 100644 src/backend/NetAdmin.Host/Utils/CollectionJsonTypeInfoResolver.cs create mode 100644 src/backend/NetAdmin.Host/Utils/RequestLogger.cs create mode 100644 src/backend/NetAdmin.Host/Utils/SqlAuditor.cs create mode 100644 src/backend/NetAdmin.Host/Utils/SwaggerEnumSchemaFixer.cs create mode 100644 src/backend/NetAdmin.Host/Utils/ToNullIfEmptyStringConverter.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Attributes/ExportAttribute.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/DatabaseOptions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/OptionAbstraction.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/RedisOptions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Redis/InstanceNode.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Upload/MinioNode.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Configuration/Options/UploadOptions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Constant/Chars.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/CertificateTypes.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/Educations.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/ErrorCodes.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/FreeSqlInitOptions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/LogLevels.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/MarriageStatues.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/ModuleTypes.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/Nations.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/Orders.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/PoliticalStatues.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Enums/Sexes.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Exceptions/InvalidInput/NetAdminInvalidInputException.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Exceptions/InvalidOperation/NetAdminInvalidOperationException.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminException.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminGetLockerException.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminUnexpectedException.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestPartExtensions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Extensions/ObjectExtensions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Extensions/StringExtensions.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Global.cs create mode 100644 src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/ApplicationHelper.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/CaptchaImageHelper.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/FreeSqlBuilder.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/LogHelper.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/MinioHelper.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/RedLocker.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs create mode 100644 src/backend/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs create mode 100644 src/backend/NetAdmin.Infrastructure/commonSettings.Development.json create mode 100644 src/backend/NetAdmin.Infrastructure/commonSettings.Test.json create mode 100644 src/backend/NetAdmin.Infrastructure/commonSettings.json create mode 100644 src/backend/NetAdmin.ScheduledService/Extensions/ServiceCollectionExtensions.cs create mode 100644 src/backend/NetAdmin.ScheduledService/Jobs/ExampleJob.cs create mode 100644 src/backend/NetAdmin.ScheduledService/NetAdmin.ScheduledService.csproj create mode 100644 src/backend/NetAdmin.ScheduledService/Properties/launchSettings.json create mode 100644 src/backend/NetAdmin.ScheduledService/Startup.cs create mode 100644 src/backend/NetAdmin.ScheduledService/settings.Development.json create mode 100644 src/backend/NetAdmin.ScheduledService/settings.Test.json create mode 100644 src/backend/NetAdmin.ScheduledService/settings.json create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICacheModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICaptchaModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConfigModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConstantModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDeptModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDevModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicCatalogModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicContentModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IMenuModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRequestLogModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRoleModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IToolsModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserProfileModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IVerifyCodeModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Modules/Tpl/IExampleModule.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/CaptchaService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IApiService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICacheService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICaptchaService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConfigService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConstantService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDeptService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDevService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicCatalogService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicContentService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IFileService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IMenuService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRequestLogService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRoleService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IToolsService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserProfileService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IVerifyCodeService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/ToolsService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Tpl/Dependency/IExampleService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/NetAdmin.SysComponent.Cache.csproj create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/ConstantCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IApiCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICacheCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICaptchaCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConfigCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConstantCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDeptCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDevCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCatalogCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicContentCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IFileCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IMenuCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRequestLogCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRoleCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IToolsCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserProfileCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IVerifyCodeCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/DevCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/FileCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/ToolsCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Tpl/Dependency/IExampleCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CacheController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CaptchaController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConstantController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DevController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ToolsController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/NetAdmin.SysComponent.Host.csproj create mode 100644 src/backend/NetAdmin.SysComponent.Host/Subscribers/ApiSynchronizer.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Subscribers/CacheCleaner.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Subscribers/EmailCodeSender.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs create mode 100644 src/backend/NetAdmin.SysComponent.Host/Subscribers/SmsCodeSender.cs create mode 100644 src/frontend/admin/.editorconfig create mode 100644 src/frontend/admin/.eslintrc.js create mode 100644 src/frontend/admin/.gitignore create mode 100644 src/frontend/admin/.prettierignore create mode 100644 src/frontend/admin/.prettierrc create mode 100644 src/frontend/admin/LICENSE create mode 100644 src/frontend/admin/README.md create mode 100644 src/frontend/admin/babel.config.js create mode 100644 src/frontend/admin/index.html create mode 100644 src/frontend/admin/jsconfig.json create mode 100644 src/frontend/admin/package.json create mode 100644 src/frontend/admin/public/code/list/index.vue create mode 100644 src/frontend/admin/public/code/list/save.vue create mode 100644 src/frontend/admin/public/config.js create mode 100644 src/frontend/admin/public/favicon.ico create mode 100644 src/frontend/admin/public/tinymce/langs/zh_CN.js create mode 100644 src/frontend/admin/public/tinymce/skins/content/dark/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/dark/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/default/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/default/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/document/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/document/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/writer/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/content/writer/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/skin.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/skin.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.min.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css create mode 100644 src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css create mode 100644 src/frontend/admin/src/App.vue create mode 100644 src/frontend/admin/src/api/index.js create mode 100644 src/frontend/admin/src/api/sys/api.js create mode 100644 src/frontend/admin/src/api/sys/cache.js create mode 100644 src/frontend/admin/src/api/sys/captcha.js create mode 100644 src/frontend/admin/src/api/sys/config.js create mode 100644 src/frontend/admin/src/api/sys/constant.js create mode 100644 src/frontend/admin/src/api/sys/dept.js create mode 100644 src/frontend/admin/src/api/sys/dev.js create mode 100644 src/frontend/admin/src/api/sys/dic.js create mode 100644 src/frontend/admin/src/api/sys/file.js create mode 100644 src/frontend/admin/src/api/sys/log.js create mode 100644 src/frontend/admin/src/api/sys/menu.js create mode 100644 src/frontend/admin/src/api/sys/position.js create mode 100644 src/frontend/admin/src/api/sys/role.js create mode 100644 src/frontend/admin/src/api/sys/tools.js create mode 100644 src/frontend/admin/src/api/sys/user.js create mode 100644 src/frontend/admin/src/api/sys/verifycode.js create mode 100644 src/frontend/admin/src/api/tpl/example.js create mode 100644 src/frontend/admin/src/api/tpl/inner.js create mode 100644 src/frontend/admin/src/api/tpl/outer.js create mode 100644 src/frontend/admin/src/assets/icons/Api.vue create mode 100644 src/frontend/admin/src/assets/icons/App.vue create mode 100644 src/frontend/admin/src/assets/icons/App2.vue create mode 100644 src/frontend/admin/src/assets/icons/BugFill.vue create mode 100644 src/frontend/admin/src/assets/icons/BugLine.vue create mode 100644 src/frontend/admin/src/assets/icons/Business.vue create mode 100644 src/frontend/admin/src/assets/icons/Code.vue create mode 100644 src/frontend/admin/src/assets/icons/Code2.vue create mode 100644 src/frontend/admin/src/assets/icons/Csharp.vue create mode 100644 src/frontend/admin/src/assets/icons/Dashboard.vue create mode 100644 src/frontend/admin/src/assets/icons/Demo.vue create mode 100644 src/frontend/admin/src/assets/icons/Dept.vue create mode 100644 src/frontend/admin/src/assets/icons/Device.vue create mode 100644 src/frontend/admin/src/assets/icons/Dic.vue create mode 100644 src/frontend/admin/src/assets/icons/Docker.vue create mode 100644 src/frontend/admin/src/assets/icons/Download.vue create mode 100644 src/frontend/admin/src/assets/icons/Drone.vue create mode 100644 src/frontend/admin/src/assets/icons/Elastic.vue create mode 100644 src/frontend/admin/src/assets/icons/FileExcel.vue create mode 100644 src/frontend/admin/src/assets/icons/FilePpt.vue create mode 100644 src/frontend/admin/src/assets/icons/FileWord.vue create mode 100644 src/frontend/admin/src/assets/icons/Gitea.vue create mode 100644 src/frontend/admin/src/assets/icons/Grafana.vue create mode 100644 src/frontend/admin/src/assets/icons/Js.vue create mode 100644 src/frontend/admin/src/assets/icons/Kafka.vue create mode 100644 src/frontend/admin/src/assets/icons/Kibana.vue create mode 100644 src/frontend/admin/src/assets/icons/Link.vue create mode 100644 src/frontend/admin/src/assets/icons/Memory.vue create mode 100644 src/frontend/admin/src/assets/icons/Meter.vue create mode 100644 src/frontend/admin/src/assets/icons/Organization.vue create mode 100644 src/frontend/admin/src/assets/icons/Position.vue create mode 100644 src/frontend/admin/src/assets/icons/Product.vue create mode 100644 src/frontend/admin/src/assets/icons/ProductCategory.vue create mode 100644 src/frontend/admin/src/assets/icons/Resource.vue create mode 100644 src/frontend/admin/src/assets/icons/Robot.vue create mode 100644 src/frontend/admin/src/assets/icons/Role.vue create mode 100644 src/frontend/admin/src/assets/icons/Send.vue create mode 100644 src/frontend/admin/src/assets/icons/SmsCode.vue create mode 100644 src/frontend/admin/src/assets/icons/Sync.vue create mode 100644 src/frontend/admin/src/assets/icons/Task.vue create mode 100644 src/frontend/admin/src/assets/icons/Tpl.vue create mode 100644 src/frontend/admin/src/assets/icons/Unlink.vue create mode 100644 src/frontend/admin/src/assets/icons/Upload.vue create mode 100644 src/frontend/admin/src/assets/icons/Vue.vue create mode 100644 src/frontend/admin/src/assets/icons/Wechat.vue create mode 100644 src/frontend/admin/src/assets/icons/index.js create mode 100644 src/frontend/admin/src/assets/icons/tpl/Svg.vue create mode 100644 src/frontend/admin/src/assets/icons/tpl/export.js create mode 100644 src/frontend/admin/src/assets/img/404.png create mode 100644 src/frontend/admin/src/assets/img/auth_banner.jpg create mode 100644 src/frontend/admin/src/assets/img/avatar.jpg create mode 100644 src/frontend/admin/src/assets/img/avatar2.gif create mode 100644 src/frontend/admin/src/assets/img/avatar3.gif create mode 100644 src/frontend/admin/src/assets/img/loginbg.svg create mode 100644 src/frontend/admin/src/assets/img/logo-r.png create mode 100644 src/frontend/admin/src/assets/img/logo.png create mode 100644 src/frontend/admin/src/assets/img/no-widgets.svg create mode 100644 src/frontend/admin/src/assets/img/tasks-example.png create mode 100644 src/frontend/admin/src/assets/img/ver.svg create mode 100644 src/frontend/admin/src/components/naArea/index.vue create mode 100644 src/frontend/admin/src/components/naButtonAdd/index.vue create mode 100644 src/frontend/admin/src/components/naButtonBatchDel/index.vue create mode 100644 src/frontend/admin/src/components/naColAvatar/index.vue create mode 100644 src/frontend/admin/src/components/naColIndicator/index.vue create mode 100644 src/frontend/admin/src/components/naColOperation/index.vue create mode 100644 src/frontend/admin/src/components/naColTags/index.vue create mode 100644 src/frontend/admin/src/components/naDept/index.vue create mode 100644 src/frontend/admin/src/components/naDicCatalog/index.vue create mode 100644 src/frontend/admin/src/components/naFormEmail/index.vue create mode 100644 src/frontend/admin/src/components/naFormPhone/index.vue create mode 100644 src/frontend/admin/src/components/naInfo/index.vue create mode 100644 src/frontend/admin/src/components/naSearch/index.vue create mode 100644 src/frontend/admin/src/components/naVerifition/index.vue create mode 100644 src/frontend/admin/src/components/naVerifition/slide.vue create mode 100644 src/frontend/admin/src/components/scCodeEditor/index.vue create mode 100644 src/frontend/admin/src/components/scContextmenu/index.vue create mode 100644 src/frontend/admin/src/components/scContextmenu/item.vue create mode 100644 src/frontend/admin/src/components/scCron/index.vue create mode 100644 src/frontend/admin/src/components/scCropper/index.vue create mode 100644 src/frontend/admin/src/components/scDialog/index.vue create mode 100644 src/frontend/admin/src/components/scEcharts/echarts-theme-T.js create mode 100644 src/frontend/admin/src/components/scEcharts/index.vue create mode 100644 src/frontend/admin/src/components/scEditor/index.vue create mode 100644 src/frontend/admin/src/components/scFileExport/column.vue create mode 100644 src/frontend/admin/src/components/scFileExport/index.vue create mode 100644 src/frontend/admin/src/components/scFileImport/index.vue create mode 100644 src/frontend/admin/src/components/scFileSelect/index.vue create mode 100644 src/frontend/admin/src/components/scFilterBar/index.vue create mode 100644 src/frontend/admin/src/components/scFilterBar/my.vue create mode 100644 src/frontend/admin/src/components/scFilterBar/pySelect.vue create mode 100644 src/frontend/admin/src/components/scForm/index.vue create mode 100644 src/frontend/admin/src/components/scForm/items/tableselect.vue create mode 100644 src/frontend/admin/src/components/scFormTable/index.vue create mode 100644 src/frontend/admin/src/components/scIconSelect/index.vue create mode 100644 src/frontend/admin/src/components/scMini/scStatusIndicator.vue create mode 100644 src/frontend/admin/src/components/scMini/scTrend.vue create mode 100644 src/frontend/admin/src/components/scPageHeader/index.vue create mode 100644 src/frontend/admin/src/components/scPasswordStrength/index.vue create mode 100644 src/frontend/admin/src/components/scQrCode/index.vue create mode 100644 src/frontend/admin/src/components/scQrCode/qrcode.js create mode 100644 src/frontend/admin/src/components/scSelect/index.vue create mode 100644 src/frontend/admin/src/components/scSelectFilter/index.vue create mode 100644 src/frontend/admin/src/components/scStatistic/index.vue create mode 100644 src/frontend/admin/src/components/scTable/column.js create mode 100644 src/frontend/admin/src/components/scTable/columnSetting.vue create mode 100644 src/frontend/admin/src/components/scTable/index.vue create mode 100644 src/frontend/admin/src/components/scTableSelect/index.vue create mode 100644 src/frontend/admin/src/components/scTitle/index.vue create mode 100644 src/frontend/admin/src/components/scUpload/file.vue create mode 100644 src/frontend/admin/src/components/scUpload/index.vue create mode 100644 src/frontend/admin/src/components/scUpload/multiple.vue create mode 100644 src/frontend/admin/src/components/scVideo/index.vue create mode 100644 src/frontend/admin/src/components/scWaterMark/index.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/index.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/nodeWrap.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/nodes/addNode.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/nodes/approver.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/nodes/branch.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/nodes/promoter.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/nodes/send.vue create mode 100644 src/frontend/admin/src/components/scWorkflow/select.vue create mode 100644 src/frontend/admin/src/config/fileSelect.js create mode 100644 src/frontend/admin/src/config/filterBar.js create mode 100644 src/frontend/admin/src/config/iconSelect.js create mode 100644 src/frontend/admin/src/config/index.js create mode 100644 src/frontend/admin/src/config/myConfig.js create mode 100644 src/frontend/admin/src/config/naColOperation.js create mode 100644 src/frontend/admin/src/config/naFormEmail.js create mode 100644 src/frontend/admin/src/config/naFormPassword.js create mode 100644 src/frontend/admin/src/config/naFormPhone.js create mode 100644 src/frontend/admin/src/config/route.js create mode 100644 src/frontend/admin/src/config/select.js create mode 100644 src/frontend/admin/src/config/table.js create mode 100644 src/frontend/admin/src/config/tableSelect.js create mode 100644 src/frontend/admin/src/config/upload.js create mode 100644 src/frontend/admin/src/config/workflow.js create mode 100644 src/frontend/admin/src/directives/auth.js create mode 100644 src/frontend/admin/src/directives/auths.js create mode 100644 src/frontend/admin/src/directives/authsAll.js create mode 100644 src/frontend/admin/src/directives/copy.js create mode 100644 src/frontend/admin/src/directives/role.js create mode 100644 src/frontend/admin/src/directives/time.js create mode 100644 src/frontend/admin/src/layout/components/NavMenu.vue create mode 100644 src/frontend/admin/src/layout/components/iframeView.vue create mode 100644 src/frontend/admin/src/layout/components/search.vue create mode 100644 src/frontend/admin/src/layout/components/setting.vue create mode 100644 src/frontend/admin/src/layout/components/sideM.vue create mode 100644 src/frontend/admin/src/layout/components/tags.vue create mode 100644 src/frontend/admin/src/layout/components/tasks.vue create mode 100644 src/frontend/admin/src/layout/components/topbar.vue create mode 100644 src/frontend/admin/src/layout/components/userbar.vue create mode 100644 src/frontend/admin/src/layout/index.vue create mode 100644 src/frontend/admin/src/layout/other/404.vue create mode 100644 src/frontend/admin/src/layout/other/autoExit.js create mode 100644 src/frontend/admin/src/layout/other/empty.vue create mode 100644 src/frontend/admin/src/locales/index.js create mode 100644 src/frontend/admin/src/locales/lang/en.js create mode 100644 src/frontend/admin/src/locales/lang/zh-cn.js create mode 100644 src/frontend/admin/src/main.js create mode 100644 src/frontend/admin/src/router/index.js create mode 100644 src/frontend/admin/src/router/scrollBehavior.js create mode 100644 src/frontend/admin/src/router/systemRouter.js create mode 100644 src/frontend/admin/src/scui.js create mode 100644 src/frontend/admin/src/store/index.js create mode 100644 src/frontend/admin/src/store/modules/global.js create mode 100644 src/frontend/admin/src/store/modules/iframe.js create mode 100644 src/frontend/admin/src/store/modules/keepAlive.js create mode 100644 src/frontend/admin/src/store/modules/viewTags.js create mode 100644 src/frontend/admin/src/style/app.scss create mode 100644 src/frontend/admin/src/style/dark.scss create mode 100644 src/frontend/admin/src/style/fix.scss create mode 100644 src/frontend/admin/src/style/media.scss create mode 100644 src/frontend/admin/src/style/pages.scss create mode 100644 src/frontend/admin/src/style/style.scss create mode 100644 src/frontend/admin/src/utils/color.js create mode 100644 src/frontend/admin/src/utils/db.js create mode 100644 src/frontend/admin/src/utils/errorHandler.js create mode 100644 src/frontend/admin/src/utils/load.js create mode 100644 src/frontend/admin/src/utils/permission.js create mode 100644 src/frontend/admin/src/utils/preload.js create mode 100644 src/frontend/admin/src/utils/print.js create mode 100644 src/frontend/admin/src/utils/request.js create mode 100644 src/frontend/admin/src/utils/template.js create mode 100644 src/frontend/admin/src/utils/tool.js create mode 100644 src/frontend/admin/src/utils/useTabs.js create mode 100644 src/frontend/admin/src/utils/verificate.js create mode 100644 src/frontend/admin/src/views/anonymous/components/commonPage.vue create mode 100644 src/frontend/admin/src/views/anonymous/components/passwordForm.vue create mode 100644 src/frontend/admin/src/views/anonymous/components/phoneForm.vue create mode 100644 src/frontend/admin/src/views/anonymous/login.vue create mode 100644 src/frontend/admin/src/views/anonymous/register.vue create mode 100644 src/frontend/admin/src/views/anonymous/resetPassword.vue create mode 100644 src/frontend/admin/src/views/dev/code/index.vue create mode 100644 src/frontend/admin/src/views/dev/code/list.vue create mode 100644 src/frontend/admin/src/views/home/index.vue create mode 100644 src/frontend/admin/src/views/home/widgets/components/about.vue create mode 100644 src/frontend/admin/src/views/home/widgets/components/echarts.vue create mode 100644 src/frontend/admin/src/views/home/widgets/components/index.js create mode 100644 src/frontend/admin/src/views/home/widgets/components/progress.vue create mode 100644 src/frontend/admin/src/views/home/widgets/components/time.vue create mode 100644 src/frontend/admin/src/views/home/widgets/components/ver.vue create mode 100644 src/frontend/admin/src/views/home/widgets/components/welcome.vue create mode 100644 src/frontend/admin/src/views/home/widgets/index.vue create mode 100644 src/frontend/admin/src/views/home/work/components/myapp.vue create mode 100644 src/frontend/admin/src/views/home/work/index.vue create mode 100644 src/frontend/admin/src/views/other/about.vue create mode 100644 src/frontend/admin/src/views/other/directive.vue create mode 100644 src/frontend/admin/src/views/other/fullpage.vue create mode 100644 src/frontend/admin/src/views/other/loadJS.vue create mode 100644 src/frontend/admin/src/views/other/verificate.vue create mode 100644 src/frontend/admin/src/views/other/viewTags.vue create mode 100644 src/frontend/admin/src/views/profile/index.vue create mode 100644 src/frontend/admin/src/views/profile/user/account.vue create mode 100644 src/frontend/admin/src/views/profile/user/logs.vue create mode 100644 src/frontend/admin/src/views/profile/user/pushSettings.vue create mode 100644 src/frontend/admin/src/views/profile/user/setEmail.vue create mode 100644 src/frontend/admin/src/views/profile/user/setMobile.vue create mode 100644 src/frontend/admin/src/views/profile/user/setPassword.vue create mode 100644 src/frontend/admin/src/views/profile/user/settings.vue create mode 100644 src/frontend/admin/src/views/profile/user/space.vue create mode 100644 src/frontend/admin/src/views/setting/client/index.vue create mode 100644 src/frontend/admin/src/views/setting/client/save.vue create mode 100644 src/frontend/admin/src/views/setting/dept/index.vue create mode 100644 src/frontend/admin/src/views/setting/dept/save.vue create mode 100644 src/frontend/admin/src/views/setting/dic/dic.vue create mode 100644 src/frontend/admin/src/views/setting/dic/index.vue create mode 100644 src/frontend/admin/src/views/setting/dic/list.vue create mode 100644 src/frontend/admin/src/views/setting/log/index.vue create mode 100644 src/frontend/admin/src/views/setting/log/info.vue create mode 100644 src/frontend/admin/src/views/setting/menu/index.vue create mode 100644 src/frontend/admin/src/views/setting/menu/save.vue create mode 100644 src/frontend/admin/src/views/setting/role/index.vue create mode 100644 src/frontend/admin/src/views/setting/role/permission.vue create mode 100644 src/frontend/admin/src/views/setting/role/save.vue create mode 100644 src/frontend/admin/src/views/setting/system/index.vue create mode 100644 src/frontend/admin/src/views/setting/table/index.vue create mode 100644 src/frontend/admin/src/views/setting/table/save.vue create mode 100644 src/frontend/admin/src/views/setting/task/index.vue create mode 100644 src/frontend/admin/src/views/setting/task/logs.vue create mode 100644 src/frontend/admin/src/views/setting/task/save.vue create mode 100644 src/frontend/admin/src/views/setting/user/index.vue create mode 100644 src/frontend/admin/src/views/setting/user/save.vue create mode 100644 src/frontend/admin/src/views/sys/api/index.vue create mode 100644 src/frontend/admin/src/views/sys/cache/index.vue create mode 100644 src/frontend/admin/src/views/sys/config/index.vue create mode 100644 src/frontend/admin/src/views/sys/config/save.vue create mode 100644 src/frontend/admin/src/views/sys/dept/index.vue create mode 100644 src/frontend/admin/src/views/sys/dept/save.vue create mode 100644 src/frontend/admin/src/views/sys/dic/index.vue create mode 100644 src/frontend/admin/src/views/sys/dic/list/index.vue create mode 100644 src/frontend/admin/src/views/sys/dic/list/save.vue create mode 100644 src/frontend/admin/src/views/sys/dic/save.vue create mode 100644 src/frontend/admin/src/views/sys/log/index.vue create mode 100644 src/frontend/admin/src/views/sys/menu/index.vue create mode 100644 src/frontend/admin/src/views/sys/menu/save.vue create mode 100644 src/frontend/admin/src/views/sys/role/index.vue create mode 100644 src/frontend/admin/src/views/sys/role/save.vue create mode 100644 src/frontend/admin/src/views/sys/user/index.vue create mode 100644 src/frontend/admin/src/views/sys/user/save.vue create mode 100644 src/frontend/admin/src/views/template/layout/blank.vue create mode 100644 src/frontend/admin/src/views/template/layout/layoutLCR.vue create mode 100644 src/frontend/admin/src/views/template/layout/layoutTCB.vue create mode 100644 src/frontend/admin/src/views/template/list/crud/detail.vue create mode 100644 src/frontend/admin/src/views/template/list/crud/index.vue create mode 100644 src/frontend/admin/src/views/template/list/crud/info.vue create mode 100644 src/frontend/admin/src/views/template/list/crud/save.vue create mode 100644 src/frontend/admin/src/views/template/list/son.vue create mode 100644 src/frontend/admin/src/views/template/list/tab.vue create mode 100644 src/frontend/admin/src/views/template/list/tree.vue create mode 100644 src/frontend/admin/src/views/template/list/width.vue create mode 100644 src/frontend/admin/src/views/template/other/stepform.vue create mode 100644 src/frontend/admin/src/views/test/autocode/index.vue create mode 100644 src/frontend/admin/src/views/test/autocode/list.vue create mode 100644 src/frontend/admin/src/views/test/codebug/index.vue create mode 100644 src/frontend/admin/src/views/vab/chart.vue create mode 100644 src/frontend/admin/src/views/vab/codeeditor.vue create mode 100644 src/frontend/admin/src/views/vab/contextmenu.vue create mode 100644 src/frontend/admin/src/views/vab/cron.vue create mode 100644 src/frontend/admin/src/views/vab/cropper.vue create mode 100644 src/frontend/admin/src/views/vab/dialog/dialog1.vue create mode 100644 src/frontend/admin/src/views/vab/dialog/dialog2.vue create mode 100644 src/frontend/admin/src/views/vab/dialog/index.vue create mode 100644 src/frontend/admin/src/views/vab/drag.vue create mode 100644 src/frontend/admin/src/views/vab/editor.vue create mode 100644 src/frontend/admin/src/views/vab/fileselect.vue create mode 100644 src/frontend/admin/src/views/vab/filterBar.vue create mode 100644 src/frontend/admin/src/views/vab/form.vue create mode 100644 src/frontend/admin/src/views/vab/formtable.vue create mode 100644 src/frontend/admin/src/views/vab/iconfont.vue create mode 100644 src/frontend/admin/src/views/vab/iconselect.vue create mode 100644 src/frontend/admin/src/views/vab/importexport.vue create mode 100644 src/frontend/admin/src/views/vab/mini.vue create mode 100644 src/frontend/admin/src/views/vab/print.vue create mode 100644 src/frontend/admin/src/views/vab/qrcode.vue create mode 100644 src/frontend/admin/src/views/vab/select.vue create mode 100644 src/frontend/admin/src/views/vab/selectFilter.vue create mode 100644 src/frontend/admin/src/views/vab/statistic.vue create mode 100644 src/frontend/admin/src/views/vab/table/base.vue create mode 100644 src/frontend/admin/src/views/vab/table/column.vue create mode 100644 src/frontend/admin/src/views/vab/table/remote.vue create mode 100644 src/frontend/admin/src/views/vab/table/thead.vue create mode 100644 src/frontend/admin/src/views/vab/tableselect.vue create mode 100644 src/frontend/admin/src/views/vab/upload.vue create mode 100644 src/frontend/admin/src/views/vab/video.vue create mode 100644 src/frontend/admin/src/views/vab/watermark.vue create mode 100644 src/frontend/admin/src/views/vab/workflow.vue create mode 100644 src/frontend/admin/vite.config.js create mode 100644 src/frontend/h5/.editorconfig create mode 100644 src/frontend/h5/.eslintrc.cjs create mode 100644 src/frontend/h5/.gitignore create mode 100644 src/frontend/h5/.prettierrc.json create mode 100644 src/frontend/h5/README.md create mode 100644 src/frontend/h5/index.html create mode 100644 src/frontend/h5/package.json create mode 100644 src/frontend/h5/postcss.config.js create mode 100644 src/frontend/h5/public/favicon.ico create mode 100644 src/frontend/h5/src/App.vue create mode 100644 src/frontend/h5/src/NetAdmin.js create mode 100644 src/frontend/h5/src/api/biz/artcategory.js create mode 100644 src/frontend/h5/src/api/biz/article.js create mode 100644 src/frontend/h5/src/api/biz/articlecategory.js create mode 100644 src/frontend/h5/src/api/biz/articledetail.js create mode 100644 src/frontend/h5/src/api/biz/member.js create mode 100644 src/frontend/h5/src/api/biz/product.js create mode 100644 src/frontend/h5/src/api/biz/productcategory.js create mode 100644 src/frontend/h5/src/api/biz/urlmap.js create mode 100644 src/frontend/h5/src/api/controllers/health.js create mode 100644 src/frontend/h5/src/api/index.js create mode 100644 src/frontend/h5/src/api/model/auth.js create mode 100644 src/frontend/h5/src/api/model/common.js create mode 100644 src/frontend/h5/src/api/model/demo.js create mode 100644 src/frontend/h5/src/api/model/system.js create mode 100644 src/frontend/h5/src/api/sys/api.js create mode 100644 src/frontend/h5/src/api/sys/cache.js create mode 100644 src/frontend/h5/src/api/sys/captcha.js create mode 100644 src/frontend/h5/src/api/sys/config.js create mode 100644 src/frontend/h5/src/api/sys/constant.js create mode 100644 src/frontend/h5/src/api/sys/dept.js create mode 100644 src/frontend/h5/src/api/sys/dev.js create mode 100644 src/frontend/h5/src/api/sys/dic.js create mode 100644 src/frontend/h5/src/api/sys/file.js create mode 100644 src/frontend/h5/src/api/sys/log.js create mode 100644 src/frontend/h5/src/api/sys/menu.js create mode 100644 src/frontend/h5/src/api/sys/position.js create mode 100644 src/frontend/h5/src/api/sys/role.js create mode 100644 src/frontend/h5/src/api/sys/sms.js create mode 100644 src/frontend/h5/src/api/sys/tools.js create mode 100644 src/frontend/h5/src/api/sys/user.js create mode 100644 src/frontend/h5/src/api/tpl/example.js create mode 100644 src/frontend/h5/src/api/tpl/inner.js create mode 100644 src/frontend/h5/src/api/tpl/outer.js create mode 100644 src/frontend/h5/src/assets/base.css create mode 100644 src/frontend/h5/src/assets/logo.svg create mode 100644 src/frontend/h5/src/assets/main.css create mode 100644 src/frontend/h5/src/components/Avatar.vue create mode 100644 src/frontend/h5/src/components/HelloWorld.vue create mode 100644 src/frontend/h5/src/components/InfinityScroll.vue create mode 100644 src/frontend/h5/src/components/TheWelcome.vue create mode 100644 src/frontend/h5/src/components/WelcomeItem.vue create mode 100644 src/frontend/h5/src/components/icons/IconCommunity.vue create mode 100644 src/frontend/h5/src/components/icons/IconDocumentation.vue create mode 100644 src/frontend/h5/src/components/icons/IconEcosystem.vue create mode 100644 src/frontend/h5/src/components/icons/IconSupport.vue create mode 100644 src/frontend/h5/src/components/icons/IconTooling.vue create mode 100644 src/frontend/h5/src/components/verifition/Verify.vue create mode 100644 src/frontend/h5/src/components/verifition/Verify/VerifySlide.vue create mode 100644 src/frontend/h5/src/components/verifition/utils/ase.js create mode 100644 src/frontend/h5/src/components/verifition/utils/util.js create mode 100644 src/frontend/h5/src/config/index.js create mode 100644 src/frontend/h5/src/main.js create mode 100644 src/frontend/h5/src/router/index.js create mode 100644 src/frontend/h5/src/stores/counter.js create mode 100644 src/frontend/h5/src/utils/request.js create mode 100644 src/frontend/h5/src/utils/tool.js create mode 100644 src/frontend/h5/src/van.js create mode 100644 src/frontend/h5/src/views/AboutView.vue create mode 100644 src/frontend/h5/src/views/CategoryView.vue create mode 100644 src/frontend/h5/src/views/HomeView.vue create mode 100644 src/frontend/h5/src/views/ProductView.vue create mode 100644 src/frontend/h5/src/views/account/LoginByPwdView.vue create mode 100644 src/frontend/h5/src/views/account/LoginBySmsView.vue create mode 100644 src/frontend/h5/src/views/account/RegisterView.vue create mode 100644 src/frontend/h5/src/views/account/ResetPwdView.vue create mode 100644 src/frontend/h5/src/views/member/IndexView.vue create mode 100644 src/frontend/h5/tailwind.config.js create mode 100644 src/frontend/h5/vite.config.js create mode 100644 tools/CloneProjectRefs.ps1 create mode 100644 tools/CodeCleanup.csx create mode 100644 tools/CodeCleanup.ps1 create mode 100644 tools/CodeCleanupFull.ps1 create mode 100644 tools/DotClean.cmd create mode 100644 tools/GenerateLn.cmd create mode 100644 tools/GenerateLnCs.tt create mode 100644 tools/GenerateLnResx.tt create mode 100644 tools/GitPR.ps1 create mode 100644 tools/GitRecreate.ps1 create mode 100644 tools/IdGenerator.linq create mode 100644 tools/ImageOptimize.csx create mode 100644 tools/InstallAsTpl.ps1 create mode 100644 tools/Switcher.FreeSql.json create mode 100644 tools/Switcher.Furion.json create mode 100644 tools/Switcher.NSExt.json create mode 100644 tools/Switcher.ps1 create mode 100644 tools/SyncMetaFiles.csx diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..8f642dac --- /dev/null +++ b/.editorconfig @@ -0,0 +1,79 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +ij_xml_attribute_wrap = off +ij_xml_text_wrap = off +indent_size = 4 +indent_style = space +insert_final_newline = false +trim_trailing_whitespace = true + +[{*.json,*.yml}] +indent_size = 2 + +[*.cs] +dotnet_analyzer_diagnostic.severity = warning +dotnet_diagnostic.CA1200.severity = none +dotnet_diagnostic.CA1707.severity = none +dotnet_diagnostic.CA1716.severity = none +dotnet_diagnostic.IDE0005.severity = none +dotnet_diagnostic.IDE0008.severity = none +dotnet_diagnostic.IDE0010.severity = none +dotnet_diagnostic.IDE0055.severity = none +dotnet_diagnostic.IDE0160.severity = none +dotnet_diagnostic.IDE0270.severity = none +dotnet_diagnostic.RCS1141.severity = none +dotnet_diagnostic.RCS1142.severity = none +dotnet_diagnostic.RCS1181.severity = none +dotnet_diagnostic.RCS1186.severity = none +dotnet_diagnostic.S101.severity = none +dotnet_diagnostic.S1121.severity = none +dotnet_diagnostic.S1199.severity = none +dotnet_diagnostic.S125.severity = none +dotnet_diagnostic.S2094.severity = none +dotnet_diagnostic.S3925.severity = none +dotnet_diagnostic.S4663.severity = none +dotnet_diagnostic.SYSLIB1045.severity = none + + +# ReSharper properties +resharper_align_linq_query = true +resharper_align_multiline_argument = true +resharper_align_multiline_array_and_object_initializer = true +resharper_align_multiline_binary_patterns = true +resharper_align_multiline_calls_chain = true +resharper_align_multiline_extends_list = true +resharper_align_multiline_parameter = true +resharper_align_multiline_property_pattern = true +resharper_align_multiline_switch_expression = true +resharper_align_multiple_declaration = true +resharper_align_multline_type_parameter_constrains = true +resharper_align_multline_type_parameter_list = true +resharper_align_tuple_components = true +resharper_allow_comment_after_lbrace = true +resharper_blank_lines_before_single_line_comment = 1 +resharper_csharp_empty_block_style = together_same_line +resharper_csharp_outdent_commas = true +resharper_csharp_place_type_constraints_on_same_line = false +resharper_csharp_stick_comment = false +resharper_csharp_wrap_before_comma = true +resharper_indent_nested_for_stmt = true +resharper_indent_nested_foreach_stmt = true +resharper_indent_nested_while_stmt = true +resharper_indent_preprocessor_if = usual_indent +resharper_indent_preprocessor_other = usual_indent +resharper_int_align = true +resharper_keep_existing_arrangement = false +resharper_place_linq_into_on_new_line = false +resharper_place_simple_embedded_statement_on_same_line = false +resharper_place_simple_switch_expression_on_single_line = true +resharper_wrap_before_eq = true +resharper_wrap_chained_method_calls = chop_if_long +resharper_wrap_switch_expression = chop_if_long + + +# Microsoft .NET properties +csharp_indent_braces = false +csharp_new_line_before_open_brace = local_functions, methods, types \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..a1e1e97a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..acde096a --- /dev/null +++ b/.gitignore @@ -0,0 +1,405 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +# [Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml +.idea/ + +# User Define +dist/ +refs/ +*.[Dd]esigner.cs +*.db diff --git a/.template.config/template.json b/.template.config/template.json new file mode 100644 index 00000000..987ece6f --- /dev/null +++ b/.template.config/template.json @@ -0,0 +1,30 @@ +{ + "author": "nsnail", //必须 + "classifications": [ + "Web/WebAPI" + ], //必须,这个对应模板的Tags + "name": "NetAdmin", //必须,这个对应模板的Templates + "identity": "NetAdmin", //可选,模板的唯一名称 + "shortName": "lop", //必须,这个对应模板的Short Name + "tags": { + "language": "C#", + "type": "project" + }, + "sourceName": "NetAdmin", // 可选,要替换的名字 + "preferNameDirectory": true, // 可选,添加目录 + "sources": [ + { + "modifiers": [ + { + "exclude": [ + "**/.vs/**", + "**/.idea/**", + "**/.git/**", + "**/dist/**", + "**/node_modules/**" + ] + } + ] + } + ], +} \ No newline at end of file diff --git a/Build.cake b/Build.cake new file mode 100644 index 00000000..c2878115 --- /dev/null +++ b/Build.cake @@ -0,0 +1,198 @@ +var target = Argument("target", "Default"); +var configuration = Argument("configuration", "Release"); +var outputDirectory = Argument("output-directory", "./dist/Server/publish"); + +//////////////////////////////////////////////////////////////// +// Tasks + +Task("Clean") + .Does(context => +{ + context.CleanDirectory("./dist"); +}); + +Task("Build") + .IsDependentOn("Clean") + .Does(context => +{ + DotNetBuild("./NetAdmin.sln", new DotNetBuildSettings { + Configuration = configuration + }); +}); + +Task("Publish-BizServer") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + +Task("Publish-SdkServer") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.SdkServer.Host/NetAdmin.SdkServer.Host.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + +Task("Publish-ManServer") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.ManServer.Host/NetAdmin.ManServer.Host.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + +Task("Publish-SdkService") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.SdkService/NetAdmin.SdkService.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + +Task("Publish-ManService") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.ManService/NetAdmin.ManService.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + +Task("Publish-CallbackService") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.CallbackService/NetAdmin.CallbackService.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + + +Task("Publish-ScheduledService") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.ScheduledService/NetAdmin.ScheduledService.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + + +Task("Publish-PushService") + .Does(context => +{ + DotNetPublish("./src/Server/NetAdmin.PushService/NetAdmin.PushService.csproj", new DotNetPublishSettings { + NoBuild = true, + Configuration = configuration, + OutputDirectory = new DirectoryPath(outputDirectory) + }); +}); + + +// Task("Test") +// .IsDependentOn("Build") +// .Does(context => +// { +// DotNetTest("./test/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings { +// Configuration = configuration, +// NoRestore = true, +// NoBuild = true, +// }); +// +// DotNetTest("./test/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings { +// Configuration = configuration, +// NoRestore = true, +// NoBuild = true, +// }); +// +// DotNetTest("./test/Spectre.Console.Analyzer.Tests/Spectre.Console.Analyzer.Tests.csproj", new DotNetTestSettings { +// Configuration = configuration, +// NoRestore = true, +// NoBuild = true, +// }); +// }); + + +// Task("Publish-GitHub") +// .WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") +// //.IsDependentOn("Package") +// .Does(context => +// { +// var apiKey = Argument("github-key", null); +// if(string.IsNullOrWhiteSpace(apiKey)) { +// throw new CakeException("No GitHub API key was provided."); +// } +// +// // Publish to GitHub Packages +// var exitCode = 0; +// foreach(var file in context.GetFiles("./.artifacts/*.nupkg")) +// { +// context.Information("Publishing {0}...", file.GetFilename().FullPath); +// exitCode += StartProcess("dotnet", +// new ProcessSettings { +// Arguments = new ProcessArgumentBuilder() +// .Append("gpr") +// .Append("push") +// .AppendQuoted(file.FullPath) +// .AppendSwitchSecret("-k", " ", apiKey) +// } +// ); +// } +// +// if(exitCode != 0) +// { +// throw new CakeException("Could not push GitHub packages."); +// } +// }); + +// Task("Publish-NuGet") +// //.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") +// //.IsDependentOn("Package") +// .Does(context => +// { +// var apiKey = Argument("nuget-key", null); +// if(string.IsNullOrWhiteSpace(apiKey)) { +// throw new CakeException("No NuGet API key was provided."); +// } +// +// // Publish to GitHub Packages +// foreach(var file in context.GetFiles("./.artifacts/*.nupkg")) +// { +// context.Information("Publishing {0}...", file.GetFilename().FullPath); +// DotNetNuGetPush(file.FullPath, new DotNetNuGetPushSettings +// { +// Source = "https://api.nuget.org/v3/index.json", +// ApiKey = apiKey, +// SkipDuplicate = true +// }); +// } +// }); + +//////////////////////////////////////////////////////////////// +// Targets + +// Task("Publish") +// .IsDependentOn("Publish-GitHub") +// .IsDependentOn("Publish-NuGet"); + +Task("Default") + .IsDependentOn("Build"); + +//////////////////////////////////////////////////////////////// +// Execution + +RunTarget(target) \ No newline at end of file diff --git a/CodeQuality.props b/CodeQuality.props new file mode 100644 index 00000000..45b284f6 --- /dev/null +++ b/CodeQuality.props @@ -0,0 +1,41 @@ + + + $(SolutionDir)/StyleCopAnalyzers.ruleset + true + true + true + true + true + true + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + \ No newline at end of file diff --git a/CopyPackageXmlCommentFiles.targets b/CopyPackageXmlCommentFiles.targets new file mode 100644 index 00000000..5f7a4f5d --- /dev/null +++ b/CopyPackageXmlCommentFiles.targets @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 00000000..47281162 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,26 @@ + + + + $(MSBuildThisFileDirectory) + $(SolutionDir)/dist/Server/$(MSBuildProjectName)/obj + $(SolutionDir)/dist/Server/$(MSBuildProjectName)/bin + false + true + enable + beta + NetAdmin + git + http://git.shequnpay.com/lingyun/NetAdmin.git + net7.0 + $(AssemblyName) + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + \ No newline at end of file diff --git a/LICENSE b/LICENSE index d289d820..25c689db 100644 --- a/LICENSE +++ b/LICENSE @@ -18,4 +18,4 @@ 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. +SOFTWARE. \ No newline at end of file diff --git a/NetAdmin.sln b/NetAdmin.sln new file mode 100644 index 00000000..4bb45988 --- /dev/null +++ b/NetAdmin.sln @@ -0,0 +1,176 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C84EB5A0-37AD-4B17-A51E-E36888C4441E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "backend", "backend", "{4DAF9366-855F-46BB-AE4C-660C92FA0697}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "meta", "meta", "{5198A03D-0CAC-4828-A807-34A693F73859}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore + Build.cake = Build.cake + CodeQuality.props = CodeQuality.props + CopyPackageXmlCommentFiles.targets = CopyPackageXmlCommentFiles.targets + Directory.Build.props = Directory.Build.props + dotnet-tools.json = dotnet-tools.json + global.json = global.json + LICENSE = LICENSE + NetAdmin.sln.DotSettings = NetAdmin.sln.DotSettings + NuGet.Config = NuGet.Config + package.json = package.json + PreBuild.targets = PreBuild.targets + README.md = README.md + StyleCop.json = StyleCop.json + StyleCopAnalyzers.ruleset = StyleCopAnalyzers.ruleset + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Infrastructure", "src\backend\NetAdmin.Infrastructure\NetAdmin.Infrastructure.csproj", "{1E62C322-EE42-4699-A6F1-791C53EFA62D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.BizServer.Application", "src\backend\NetAdmin.BizServer.Application\NetAdmin.BizServer.Application.csproj", "{E38B2EB4-D7A5-4777-9236-3B348919DF23}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.BizServer.Host", "src\backend\NetAdmin.BizServer.Host\NetAdmin.BizServer.Host.csproj", "{CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03.HostedServers", "03.HostedServers", "{12AE5B4B-CB1A-498E-83B8-04E201E31D86}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Domain", "src\backend\NetAdmin.Domain\NetAdmin.Domain.csproj", "{58509C57-09FA-4E3C-BC07-78E786A2A326}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Application", "src\backend\NetAdmin.Application\NetAdmin.Application.csproj", "{70C54E1B-2083-4196-AB68-34CAF0075D82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Host", "src\backend\NetAdmin.Host\NetAdmin.Host.csproj", "{91839A15-D08F-4848-A301-F793412BC688}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.Cache", "src\backend\NetAdmin.Cache\NetAdmin.Cache.csproj", "{91452C22-4B57-4F16-9AF6-42C7BF830504}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.BizServer.Cache", "src\backend\NetAdmin.BizServer.Cache\NetAdmin.BizServer.Cache.csproj", "{7CB632D3-3635-4F8D-AFE7-F496D37D422B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Host", "src\backend\NetAdmin.SysComponent.Host\NetAdmin.SysComponent.Host.csproj", "{C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Cache", "src\backend\NetAdmin.SysComponent.Cache\NetAdmin.SysComponent.Cache.csproj", "{19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.SysComponent.Application", "src\backend\NetAdmin.SysComponent.Application\NetAdmin.SysComponent.Application.csproj", "{34650E82-D257-46DA-BD6B-DE307113347B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02.Components", "02.Components", "{3F23258D-8299-4992-9F51-2EE9B52CF9D2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "21.System", "21.System", "{E146D707-4D44-47B3-A8F9-D51EC5E1D047}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04.BackgroundServices", "04.BackgroundServices", "{CBFBF29B-27E8-4DB1-ADD6-4B750897ACD3}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "01.Frameworks", "01.Frameworks", "{D9C3EF66-2757-473D-A26B-54FD08DA203F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.ScheduledService", "src\backend\NetAdmin.ScheduledService\NetAdmin.ScheduledService.csproj", "{96668960-310F-4682-B3F9-1E8F1EED8C90}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "06.Tests", "06.Tests", "{89260294-80FC-49F1-8D73-AECD39AFF2B7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NetAdmin.BizServer.Tests", "src\backend\NetAdmin.BizServer.Tests\NetAdmin.BizServer.Tests.csproj", "{C7F27698-DA05-4ACD-B0D7-4791B3972002}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{2D81D62C-1B2E-4758-84C6-728343CB734F}" + ProjectSection(SolutionItems) = preProject + CloneProjectRefs.ps1 = tools/CloneProjectRefs.ps1 + CodeCleanup.csx = tools/CodeCleanup.csx + CodeCleanup.ps1 = tools/CodeCleanup.ps1 + CodeCleanupFull.ps1 = tools/CodeCleanupFull.ps1 + DotClean.cmd = tools/DotClean.cmd + GenerateLn.cmd = tools/GenerateLn.cmd + GenerateLnCs.tt = tools/GenerateLnCs.tt + GenerateLnResx.tt = tools/GenerateLnResx.tt + GitPR.ps1 = tools/GitPR.ps1 + GitRecreate.ps1 = tools/GitRecreate.ps1 + IdGenerator.linq = tools/IdGenerator.linq + ImageOptimize.csx = tools/ImageOptimize.csx + InstallAsTpl.ps1 = tools/InstallAsTpl.ps1 + Switcher.FreeSql.json = tools/Switcher.FreeSql.json + Switcher.Furion.json = tools/Switcher.Furion.json + Switcher.NSExt.json = tools/Switcher.NSExt.json + Switcher.ps1 = tools/Switcher.ps1 + SyncMetaFiles.csx = tools/SyncMetaFiles.csx + EndProjectSection +EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1E62C322-EE42-4699-A6F1-791C53EFA62D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E62C322-EE42-4699-A6F1-791C53EFA62D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E62C322-EE42-4699-A6F1-791C53EFA62D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1E62C322-EE42-4699-A6F1-791C53EFA62D}.Release|Any CPU.Build.0 = Release|Any CPU + {E38B2EB4-D7A5-4777-9236-3B348919DF23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E38B2EB4-D7A5-4777-9236-3B348919DF23}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E38B2EB4-D7A5-4777-9236-3B348919DF23}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E38B2EB4-D7A5-4777-9236-3B348919DF23}.Release|Any CPU.Build.0 = Release|Any CPU + {CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE895E44-EEC3-4ECE-A56A-8A82E7D863E3}.Release|Any CPU.Build.0 = Release|Any CPU + {58509C57-09FA-4E3C-BC07-78E786A2A326}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58509C57-09FA-4E3C-BC07-78E786A2A326}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58509C57-09FA-4E3C-BC07-78E786A2A326}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58509C57-09FA-4E3C-BC07-78E786A2A326}.Release|Any CPU.Build.0 = Release|Any CPU + {70C54E1B-2083-4196-AB68-34CAF0075D82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70C54E1B-2083-4196-AB68-34CAF0075D82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70C54E1B-2083-4196-AB68-34CAF0075D82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70C54E1B-2083-4196-AB68-34CAF0075D82}.Release|Any CPU.Build.0 = Release|Any CPU + {91839A15-D08F-4848-A301-F793412BC688}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91839A15-D08F-4848-A301-F793412BC688}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91839A15-D08F-4848-A301-F793412BC688}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91839A15-D08F-4848-A301-F793412BC688}.Release|Any CPU.Build.0 = Release|Any CPU + {91452C22-4B57-4F16-9AF6-42C7BF830504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91452C22-4B57-4F16-9AF6-42C7BF830504}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91452C22-4B57-4F16-9AF6-42C7BF830504}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91452C22-4B57-4F16-9AF6-42C7BF830504}.Release|Any CPU.Build.0 = Release|Any CPU + {7CB632D3-3635-4F8D-AFE7-F496D37D422B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7CB632D3-3635-4F8D-AFE7-F496D37D422B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7CB632D3-3635-4F8D-AFE7-F496D37D422B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7CB632D3-3635-4F8D-AFE7-F496D37D422B}.Release|Any CPU.Build.0 = Release|Any CPU + {C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C2CC1596-3BEE-43EA-A9BE-4EDE5716296C}.Release|Any CPU.Build.0 = Release|Any CPU + {19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {19872A4C-3C9A-4C62-A33B-74F5B8D6F77C}.Release|Any CPU.Build.0 = Release|Any CPU + {34650E82-D257-46DA-BD6B-DE307113347B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34650E82-D257-46DA-BD6B-DE307113347B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34650E82-D257-46DA-BD6B-DE307113347B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34650E82-D257-46DA-BD6B-DE307113347B}.Release|Any CPU.Build.0 = Release|Any CPU + {96668960-310F-4682-B3F9-1E8F1EED8C90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {96668960-310F-4682-B3F9-1E8F1EED8C90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {96668960-310F-4682-B3F9-1E8F1EED8C90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {96668960-310F-4682-B3F9-1E8F1EED8C90}.Release|Any CPU.Build.0 = Release|Any CPU + {C7F27698-DA05-4ACD-B0D7-4791B3972002}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7F27698-DA05-4ACD-B0D7-4791B3972002}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7F27698-DA05-4ACD-B0D7-4791B3972002}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7F27698-DA05-4ACD-B0D7-4791B3972002}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {4DAF9366-855F-46BB-AE4C-660C92FA0697} = {C84EB5A0-37AD-4B17-A51E-E36888C4441E} + {12AE5B4B-CB1A-498E-83B8-04E201E31D86} = {4DAF9366-855F-46BB-AE4C-660C92FA0697} + {3F23258D-8299-4992-9F51-2EE9B52CF9D2} = {4DAF9366-855F-46BB-AE4C-660C92FA0697} + {E146D707-4D44-47B3-A8F9-D51EC5E1D047} = {3F23258D-8299-4992-9F51-2EE9B52CF9D2} + {34650E82-D257-46DA-BD6B-DE307113347B} = {E146D707-4D44-47B3-A8F9-D51EC5E1D047} + {19872A4C-3C9A-4C62-A33B-74F5B8D6F77C} = {E146D707-4D44-47B3-A8F9-D51EC5E1D047} + {C2CC1596-3BEE-43EA-A9BE-4EDE5716296C} = {E146D707-4D44-47B3-A8F9-D51EC5E1D047} + {CBFBF29B-27E8-4DB1-ADD6-4B750897ACD3} = {4DAF9366-855F-46BB-AE4C-660C92FA0697} + {D9C3EF66-2757-473D-A26B-54FD08DA203F} = {4DAF9366-855F-46BB-AE4C-660C92FA0697} + {70C54E1B-2083-4196-AB68-34CAF0075D82} = {D9C3EF66-2757-473D-A26B-54FD08DA203F} + {91452C22-4B57-4F16-9AF6-42C7BF830504} = {D9C3EF66-2757-473D-A26B-54FD08DA203F} + {58509C57-09FA-4E3C-BC07-78E786A2A326} = {D9C3EF66-2757-473D-A26B-54FD08DA203F} + {91839A15-D08F-4848-A301-F793412BC688} = {D9C3EF66-2757-473D-A26B-54FD08DA203F} + {1E62C322-EE42-4699-A6F1-791C53EFA62D} = {D9C3EF66-2757-473D-A26B-54FD08DA203F} + {96668960-310F-4682-B3F9-1E8F1EED8C90} = {CBFBF29B-27E8-4DB1-ADD6-4B750897ACD3} + {E38B2EB4-D7A5-4777-9236-3B348919DF23} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86} + {7CB632D3-3635-4F8D-AFE7-F496D37D422B} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86} + {CE895E44-EEC3-4ECE-A56A-8A82E7D863E3} = {12AE5B4B-CB1A-498E-83B8-04E201E31D86} + {89260294-80FC-49F1-8D73-AECD39AFF2B7} = {4DAF9366-855F-46BB-AE4C-660C92FA0697} + {C7F27698-DA05-4ACD-B0D7-4791B3972002} = {89260294-80FC-49F1-8D73-AECD39AFF2B7} + EndGlobalSection +EndGlobal \ No newline at end of file diff --git a/NetAdmin.sln.DotSettings b/NetAdmin.sln.DotSettings new file mode 100644 index 00000000..a09783ab --- /dev/null +++ b/NetAdmin.sln.DotSettings @@ -0,0 +1,105 @@ + + Inherit + True + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + NEVER + NEVER + NEVER + NEVER + ID + IOS + IP + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /> + + True + True + True + True + True + 1 + 1 + OFF + HINT + Required + Required + Required + Required + <Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /> + <Policy Inspect="True" Prefix="_" Suffix="" Style="AA_BB" /> + <Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /> + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + <?xml version="1.0" encoding="utf-16"?> +<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> + <TypePattern> + <Entry> + <Entry.SortBy> + <Kind> + <Kind.Order> + <DeclarationKind>Constant</DeclarationKind> + <DeclarationKind>Field</DeclarationKind> + <DeclarationKind>Constructor</DeclarationKind> + <DeclarationKind>Destructor</DeclarationKind> + <DeclarationKind>Delegate</DeclarationKind> + <DeclarationKind>Event</DeclarationKind> + <DeclarationKind>Enum</DeclarationKind> + <DeclarationKind>Interface</DeclarationKind> + <DeclarationKind>Property</DeclarationKind> + <DeclarationKind>Indexer</DeclarationKind> + <DeclarationKind>Method</DeclarationKind> + <DeclarationKind>Struct</DeclarationKind> + <DeclarationKind>Record</DeclarationKind> + <DeclarationKind>Class</DeclarationKind> + </Kind.Order> + </Kind> + <Access> + <Access.Order> + <AccessModifier>Public</AccessModifier> + <AccessModifier>Internal</AccessModifier> + <AccessModifier>ProtectedInternal</AccessModifier> + <AccessModifier>Protected</AccessModifier> + <AccessModifier>PrivateProtected</AccessModifier> + <AccessModifier>Private</AccessModifier> + </Access.Order> + </Access> + <Static /> + <Readonly /> + <Name /> + </Entry.SortBy> + </Entry> + </TypePattern> +</Patterns> + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + True + + \ No newline at end of file diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 00000000..eb8bbcaf --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/PreBuild.targets b/PreBuild.targets new file mode 100644 index 00000000..fb39f8ba --- /dev/null +++ b/PreBuild.targets @@ -0,0 +1,24 @@ + + + + + + + + + Languages/Ln.txt + + + Languages/Ln.resx + PublicResXFileCodeGenerator + + + Languages/Ln.Designer.cs + + + \ No newline at end of file diff --git a/README.md b/README.md index 27ebd0e5..6aff29a0 100644 --- a/README.md +++ b/README.md @@ -1 +1,86 @@ -# NetAdmin \ No newline at end of file +# NetAdmin + +## Git Commits 语义 + +- `FEA` 新增特性 +- `REF` 项目重构 +- `FIX` 缺陷修复 +- `PER` 性能优化 +- `RVT` 还原变更 +- `FMT` 格式整理 +- `DOC` 文档变更 +- `TST` 单元测试 +- `BLD` 工程构建 + + +## 构建指南 +1. 后端 + 1. 检查dotnet-sdk版本>=7.0.0 + ``` + dotnet --list-sdks + ``` + 2. 克隆代码仓库 + ``` + git clone https://github.com/nsnail/NetAdmin.git + cd ./NetAdmin + ``` + 3. 确保本机redis处于运行状态 + ``` + redis-cli + ``` + 4. 运行后端WebApi + ``` + dotnet run --project ./src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj --urls http://[::]:65010 + ``` + 5. 体验WebApi程序 + ``` + 浏览器打开 http://localhost:65010 ,将看到Swagger(Knife4jUI)界面 + ``` +2. 前端 + 1. 检查nodejs版本>=20 + ``` + node -v + ``` + 2. 安装npm依赖包 + ``` + cd ./src/frontend/admin + npm install + ``` + 3. 运行前端项目 + ``` + npm run dev + ``` + 4. 体验前端程序 + ``` + 浏览器打开 http://localhost:65020 ,将看到管理界面(默认用户名:root,密码:1234qwer) + ``` + +## 项目文件目录树描述 +``` ++---.template.config dotnet 项目模板配置目录 ++---assets 程序运行需要的资源文件目录 ++---dist 项目编译与分发的二进制文件目录 ++---refs 引用的第三方项目源文件目录 ++---src 项目源文件目录 +| +---backend 后端程序源文件目录 +| \---frontend 前端程序源文件目录 +\---tools 构建相关的工具目录 +``` + +## 后端项目架构 +```mermaid +flowchart TD +H["NetAdmin.Host\n公共主机层\n(.Net自托管主机程序)\n(输入输出格式化)\n(数据校验、鉴权)\n(...所有HTTP管道过滤器中间件)"] --> C["NetAdmin.Cache\n公共缓存层\n(基于Redis或MemoryCache的缓存策略实现)"] +C --> A["NetAdmin.Application\n公共业务逻辑层\n(内部服务增删改查)\n(外部服务增删改查)\n(...所有业务用例的计算与组合逻辑的模块化)"] +A --> D["NetAdmin.Domain\n数据实体层\n(数据库关系实体映射)\n(DTO数据传输对象)\n(...所有数据模型的抽象与封装)"] +D --> I["NetAdmin.Infrastructure\n基础设施层\n(第三方组件和Nuget包引用)\n(公共构建和程序运行配置)\n(公共常量枚举异常定义)\n(全球化化和多语言)\n(...所有公共Utility工具)"] + +XH["NetAdmin.XXX.Host\n(WebApi)"]-->H +XS["NetAdmin.XXXService\n(常驻内存服务)"]-->H +XS["NetAdmin.XXXService\n(常驻内存服务)"]-->XC +XC["NetAdmin.XXX.Cache\n(缓存层实例)"]-->C +XA["NetAdmin.XXX.Application\n(业务逻辑层实例)"]-->A + +XH-->XC +XC-->XA +``` \ No newline at end of file diff --git a/StyleCop.json b/StyleCop.json new file mode 100644 index 00000000..9251b508 --- /dev/null +++ b/StyleCop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "indentation": { + "useTabs": false, + "indentationSize": 4 + } + } +} \ No newline at end of file diff --git a/StyleCopAnalyzers.ruleset b/StyleCopAnalyzers.ruleset new file mode 100644 index 00000000..b8faaff9 --- /dev/null +++ b/StyleCopAnalyzers.ruleset @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 00000000..c613f732 --- /dev/null +++ b/assets/README.md @@ -0,0 +1 @@ +# 资源文件目录 \ No newline at end of file diff --git a/assets/captcha/background/1.jpg b/assets/captcha/background/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..067358ea47c3509e08ced2302a513d093d097fad GIT binary patch literal 4007 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 APXGV_ literal 0 HcmV?d00001 diff --git a/assets/captcha/background/100.jpg b/assets/captcha/background/100.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c11a16306803f53c34a56fa7a9e38b385b8fc8ba GIT binary patch literal 11587 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/11.jpg b/assets/captcha/background/11.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf37f0ccb98c6c944e896f25fe6a300373bead23 GIT binary patch literal 11897 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/17.jpg b/assets/captcha/background/17.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3037e8298f8ed3b3ab807006e655df228d22cb3a GIT binary patch literal 8198 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/18.jpg b/assets/captcha/background/18.jpg new file mode 100644 index 0000000000000000000000000000000000000000..94d416331d7e9d2eb76df16665782a56a14db3ca GIT binary patch literal 1863 zcmc(dX;9PG8ph8*AqgR&vdd-!O@stN2%8O9QECKanJh?+$kKvQDJ>9UF5<1w+EH1G zBB=sWB>`g$X)d{j#mE(CwSXcb0VEik4XjkKSP)QY3iU(B_TD?wPkqju59dAa`^@t@ zb4>S5T3{7Ljidqy0svZCz%&ZNfjJV1LL$sjC=?oPZh^J4#9}a5CmY)pcB`CM<5oGl zy1LlY9Zu-fD8O&iIfKK=pZWfKUEMq@EpM@vgbvb(E0`7g`V z4y?^VH53Gg)&Q6_1hX&a2v^tB7=hog!!C_@AhzL7@_t0P#p9R_vy7Jz@VJU-mmVflqx>v z-09*+j!HfeELb8yv0&df8LNTv8c(M=`d0F+!eetD)sdsREE4z;|` z)J^5B>%X3!$+tN=M)H1Ddqg|4=ii5F&r@wn2G!%J%#ewQTJ*ZF!a#w1d8U2(;?ZcHCQ|8-F|5qa1aXV2+7Odt#kyrJ=r=d@k!8mEBZ;7;jrQli8 z=vUF%(*YQQ~$vJW~FseruI@B3HCQlNm=C<)J4RaDteQ#qxu%;=XfSL(@(nW!0_3(F0u4&08c zbDOFf+S!lec;xMoBzN=1pUy~VGaAR;7kfQ&vowhj85UM?w-Qn~;(kf|D|g}sVpfoY zS$S-I#CIbHdieh7-nR0eifm*aHwt$$_YD-&1{e0qqbzPy%1)rX3eQLgF6*`^iwpl% z-+o4j{<-n%I%a$;L`+pFbkCj#jyY|O^^e(%9sMGl+Sx6llk8KSWZd?*_S{SV?#d)T ztK*MY_rh3KxURJCWv07uU zGyy_K@d@mqgI~z15AV7yRBG=DS0s=tR-L&?S80S-b*dL>TfTo_ITJ}PA>9;QW0gNo zk8ejiMHd}h2}>!$zwy38mOz9YO+G=7?P^wv0`-&jlyr8`g@PvKXDwq%SHv{FSW!36=ftAo#W5)(!!i3J`kS;?4|u$h!LNrcOiOUS}T7ibJ+hq zsF^`j)em^H1~=aom$eQFU5Fw72tX9H_=S{t-~<(HZ_Gg26l-^>IL?sp(!Xb_w;{CB zFjN{5Dc)8%nb7KWP9xmJo>XOUvWI^j&rPr*pAfiqC$&fXjsag$U{#quH@M@2{$nqz z8}lON-#%?xWNn^4(&ga)(s#Ah>sF-qrG2-wsnGHVgR%g)?M8lIT?w!qYAV2$jySz@ rkq|{bLap-AcRbl^0uqVK39f}gafh<~ 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 SByg$svdhU7!zz8=mG5`R9008jc0$eWu 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 Ab^rhX literal 0 HcmV?d00001 diff --git a/assets/captcha/background/22.jpg b/assets/captcha/background/22.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd4415c73f95f534a4e6f6d63d71c2590781311d GIT binary patch literal 7889 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 UYC>K!k6S{wVr2Rc@NfP90ATgrBme*a literal 0 HcmV?d00001 diff --git a/assets/captcha/background/24.jpg b/assets/captcha/background/24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eac721bd749366d569807ecdf0bf9bd194c4d9da GIT binary patch literal 5649 zcmb7|XEfVw;P-z?kl33b_SRB+&nhamv_{Ypd(WaqYqmzL+Ju@hV-%rkk8q=^gw`&q zMs=uGZ>`qjexB$2-~T_?%kSrW&vm|Uu5+%7w-@gKCZwUUApima0O;}n7ps6i0HdOU zQc=R7P$)GujE0Vlo{pB5j*Eqrk&Ty|pO2Rtfe;Xp5f>1;DvUr#s7PLwl~Ytyv8&$`b6v0~S=mUE$GW2F$nT&w_ekV}af!VKsDBu+E;bP`3Yy~~Te+8x9-_*g&0G%{rf zw#qD^6|ki0xXM-1;ya}jU{f?rmGXR(yBjE;4p$4v46fD-m=GQE2zqYp8$F=tO`Er2 z*OyoG>QmcBm=kmT+^1Xq6533ZeZm^S+zgzu8`kY&;KCbGj?LhYdDFJQCn#TwTv|d; z$8}-rWxnY!drQ#4DbnK#1?V;IvpX5J@h~yGL!jOqW&Z zN9?g#L&JtW%QxS1)BQyhcKqMOSveV&h=jND8l_ndda#fp-TL zH$@r}wq}{DGJUB{@a}|PaO=AiFmB1P5yHBH+%?$sb*gMdgIOUZnH_-BfFicz4wItw zK7}icJ8j5HmT==Bq_4t@_7P4r{jKR{ia=2Au{4RQjl8=f+T~GXT0q|7SZSX{q4zA+ z#)-`g3jEu&pHxkP6|si7KEJmeP^kEL0udvZjBca6g2gwfsqRR)_PH`OB@CCn3`%*N zz!_?+Z^`Kjkw&HBWU3sgcu_$(mF0@qR*+->_lOsECX%#DfelWvMIo{_rRWSSds6o+ zd`~QN&k;^?P0?`h8rueX{Y&vZFT#u~<*-7*4?0g@J8sZ~+Wg`Um=mhz)Cq3VD4~-n zK~j`eFv(b3K4;Eb;L?*#WaJFSa#HWG5bbjG_!{%&80aID=_)zZAd|8|&c2rLy=Ej$TN= zNq29=zJRirB1zvTb=#A@>=jq@x+v3;Xa$25G%*Z=q-Jz4aG{gnrFGofW1I`m)H{#$3u+F)j)yT0VPwC6s1r|I(zkK3rE%>%Jigac6T#3le8M`f~7{06=jZhjQXFH6lHAzu}BlW}~q(@yr}&(5*j2mTU&?&5@&3YHZq7DilF zKH|74!+R%ra-e3bu^Oh@Xi^MSVVbpv!$+GTa5d@PueLyscYI=Q2Q^{ps7F9ZP5%5U z@m-U%Dzm)IJ=?q6H~3m6BI*oLI?e0c z!*4TJ*H@npQGXq@QrbMuG_O(3{em@%UGH~qpFAU#S<7e3XPzA^|9aN2d7RXWhF~#g zVZUs8ippj(=ljH@2U?o7nq8;~Dh%{jq}@I78)srCiPzhF177t{=}Qavg~C4}XWnlI z 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 Cb1=LB literal 0 HcmV?d00001 diff --git a/assets/captcha/background/25.jpg b/assets/captcha/background/25.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c11a16306803f53c34a56fa7a9e38b385b8fc8ba GIT binary patch literal 11587 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/26.jpg b/assets/captcha/background/26.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d98e9378c6a36942b9bbfb675a952fb93d48af70 GIT binary patch literal 16208 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 Wmz~vseU--}_*t4)Tn^=Z>;C~CA5s(m literal 0 HcmV?d00001 diff --git a/assets/captcha/background/27.jpg b/assets/captcha/background/27.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf22215289f8b660cd22f7aa85575e370a507e73 GIT binary patch literal 11229 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/29.jpg b/assets/captcha/background/29.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c377a17877b80b94ea87a8c535488b55506936bc GIT binary patch literal 7800 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 W*$CqEDpP0_^hkU0Dy-__#e9e*FGR2 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/31.jpg b/assets/captcha/background/31.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f165abf5a118a81a61cbf0972fe8121c36c3196b GIT binary patch literal 7141 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/32.jpg b/assets/captcha/background/32.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d9cbd6043f554cca77b1b8858126217da21d7d7 GIT binary patch literal 5257 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/34.jpg b/assets/captcha/background/34.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13d4adb1b08a95624d7737d5b5b7b7fd69c35713 GIT binary patch literal 10519 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/35.jpg b/assets/captcha/background/35.jpg new file mode 100644 index 0000000000000000000000000000000000000000..769a403e18b1fd3d6865475f1909731b6c6dcce6 GIT binary patch literal 4812 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/36.jpg b/assets/captcha/background/36.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c8f6cc436e27da5bf08b030dd27887c500b4592 GIT binary patch literal 8339 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/37.jpg b/assets/captcha/background/37.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d05d76d497df4dbd3ea46953f39e718393aa80c GIT binary patch literal 11514 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 A;Q#;t literal 0 HcmV?d00001 diff --git a/assets/captcha/background/4.jpg b/assets/captcha/background/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9db2cfe8f6575f13c75f3cc02a8d01072e3deb0d GIT binary patch literal 10462 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/40.jpg b/assets/captcha/background/40.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d79f89409c70597e1e3ef27afa1e743fc3f6e245 GIT binary patch literal 3934 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/42.jpg b/assets/captcha/background/42.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4b3295acf965c8dcf709b6eb5e3cbe48bfa98109 GIT binary patch literal 14210 zcmb7}Wm6nXu(lU>hu{vu-2%bgeQ^oy?hrJ=-Sxp?7k3tScXyW%+}%#jTXlZG+w*B^ zrlxyp?4GMXS3Y+DnDWwc(f}wZ008P=0er3lBmju;@Cfj5hzJM>NJxmtsJLjTC@83e z*f;YgQ001^NI8XD$*!~H*lheLpcfrbJg z{%e)Q1VBTgfl(Tu^t#DX!kTiwDm&drkAX20;DS6&ec$3m^g@!ZL85 zdJ;afVnLa2)gqg56gK0WSCs<_I*SqdnDeT_>k9!*~K*$4S3yqTZ^ZVjmI4@t>d%3Y@%L2LBVSb1vnZu+>N9dysxnG87_- z^UwmNhNcn$apH|SMIU#I{mYXgr0?5)MoTWCaDU14A2xG2OiU>C; z<%8UJJfF?am19}>r#=BS%W@hD`)GPsCXmzhN=admq@dceXA(h9)t-j zKc7804+jN}!lJ^3BhFckK+IGTd~63(8GSF*UUf#s6C#_<;)Hw86E|Q{B4wHzA%|p` zj8G5SH*P6^`Wu~#Fx0$I~us6fwy-40V{OC5D*4QHUI9Fbj z46978RtN@}^&Y8V(4elRtKxl=#$n;ocT|Ns4d)VR7s~{EVO_xw@&}?M*0C8)&CGpp zMZ_fC??dL|4QT0imfI1}tk@<}qoiPjmsKrtO8<}5yG`CAJRU3rWp4(v7<9E-yU;Ix z`I>^Z*XOBDSR1OW2*X!`H5qV}MC#qMez3qcDERSRo3nZzcZqk$kVZL>s~K9RQ83t% zM1J8gA<6p$bn5_NP8AJP=R=G|>I8(dNS63K= zB)kxKjxke!P! zt(YXD&d=#D<|t8?l~oieD+m~%)26@#s-&?l+!bh)E~^QdH;ngZG4Mf!?fks%a6Z06 zBW~R2uI0{|tg#FJAQMz|p|hvJ4AHeABLnNvoCu3sRmj59w9(-UpP=pAuAy>XqN zJCgj`+=s|iD#9*%eFY(n2Jd=)5SxHV4`R6P>O*$v)xd{&E2d^BP(&w*-)R04ys&#J zhOk)srigW~Fe~$rS)RpvEzTsX?K&a$0Qc_NtXsq!w^S$5-S`QJDKN^|ArxwoO#14hR-lz87aqA`#Hr&8 z5I_ZS0hOqRnUlz_SXw9Cv}NDrOan7Bk~kqTk1aGf3)??=7=G~mYDhbtGxExXMfwET zcZ#X9Zkb!v>3^ZKTNjGKjr-%pvNB2};O3!qfc=i|Dp>m;e5wpcx|VJc$ljWo94&Lv zrG?vmH;$>QAedtkxf#@%Vz4d<2SFhH;mcj0Bp;K^pjBjx_q9-VmLv#K&7>AG%^oWx z`rab#ZnF#0wPeDl+aJ7O$+T%a(V|gNr*`&);x8lnvG-vY(G&Iwh^rqucvop=%by3+ zlnM(dOrWi*$|5v?$L~5b=D&tUEh6c}wiIX?zbJc@6(rT+>G8k?T~oCMUv48aG`{!{ zmL$AOd;<35O#4S-@Gf0FInM?3T6R+$;I-?0rI>EYD{Q{M3B#$Zcf*Qc*@3yIhNsc+ z=;LgMFqyMIwkqLX&zOJS7|Jpnr;P-W-FVSW9Kb!TR%La~%-dKa4@zM&cOQ3s0zN2Z zApF31iy)4$=89+8Y-V&_SMD!eUZDoVg%A4H21 z9>&fhw?Dn!ai>uu%lai~SbNF~vxB!=$=c6jEFC24^nCWHUK)7#N1H`yduBQ^fSh^m&b|C;_n;XKML_3p37C4}a`D26JZguW4kO9`B0vI7SAWzGBQB&XfVt z7@0(>g%J#@t3C0Y7?)6^tc}SrDYn5@shL+*xgsPLt39yyNAQ_+BOJ2yPVAz|esWv& z-TW>NUizIdKMBOrDbCO-{_(MU>?$nkyNmi?$?S2fgf@5@NDpV+-;N|S007*)U8DME zCl$IW@D{>Ffuj=zk;ETr*M9(R`$*Xu^k_+HH9N-XSNA0B>Y8dk0U5EKDgm}*VDOiw zXtEW8H>*Wk)`ofY9e=Mks=;$};1(Xw*G$0>;#`&=crxND`5XJbq%zuhHU}TfWqXX$ z0G(kbz_8zWx0it%-j{?3)xNq^k^>8&Z@Dpklhev?XEPd+Y60AuDfT4S`ah-jJCZz4 ze+ifVIj?@Ay{8+d3QBf z3q11l1SESt1|B05DJ2DZ$lwEiDZOHb0AV^xa!7&j+3aqZ*&gr&jl&N%4l}<_ z_~X~zKbh122Og`*z{Up}@nyArxB%jF{L@7V)GHXRW!o(4o!f%6HJi-~=MzAUuACG0-(p#Q}ttIft^b=JGs5$?(w=`x-7#&H6xxLes6+GSY?K#VP#sq zq6nP)2?&)n)8A;wPCmPsHq%<7rgiz&!!YFbHS_LIsdMFQ-Q|vx{T=s7eT4`s#V3HF zZdiS;tyQ~o+0LWc=C1XbVF7E&n23Uy@hf9icsVF8mo~j$Y&JWQAILzQj@j(g#T$~k zaU(Y0;qW+d3YyRd8ND8%w7bI-(5t%+G2-5c@1#n4wG>00h5fnuW_@vsVh={3ie|U*xSIcX_l~1A6y3)3n%AQr)y!QM<08h9{7JD zPXSBQB_de&(sO=T;ITMtT~&=Cr_PP_o35XohSCan+JI<>fELRbz(60Px*apD?(i;+ z$9EHGYFU#IC{KWNkXQ1@n>GuVMh6n5y53RLh39>LO}`S;3&^4I&f*}U4xIGPT)2N} zPp!GRe>dKrOg0xV%bm%6P8Ak0YEc?WeRam-%qKh_i+sHzjq7`!34g>#^-7XF%+LPC zR9UfDT{>-?M-Mmi@O;wgvUP@WTi`!CVu8C z&6be9XTaRqo`KmTo#;fTVL^N}H;0*q463<_AvwpeNi(BsyC z0Y=jlCy1w6Zrb{wo#iBtPy0mAD)I-C(1Gu>X;xGd{?*?)-5K*Y>pPcCLu1G zBx!Nfs8{%RElr@QY3}aZ*pFW{t5so%4s4cWTykIg9E0P@!yE@N(tt`UFn(r?O1u>s z^ZS|R3e;^srPt2_4aN~HZ4bcaJeVQ*9A6y69=5j5oHC*lGk)neBVwnzQ4K4?GVe{c zJOt+S;~9|1`tpl5A1a$KQQP9jr6^Y)yAHAfIy-;X`DE$r!OCxG57U|?AcE{U1}KV_ z+*?8-)pb_9oI7uYQ*A%iRaK;EEqwL?jAZ(x=Lf9*8A;{0$9KTkcEAkBW!r`Djk1F)=UK@?#8{Fz5>~`3AW9aUV|tZ9t1k;D->V-Vu%b7WV16Y2U21#7c-=)EDmCkLp#=nYr{s$0LLM>Af@6`Y@3|1P-8Zosz z2Ff|TJADGuhQ4%Zz9SxACM?y+T6@T6IUXbgANqH#s(%mva=IDj9EE0E4pOZQ2Aam| zuyM5@M0QVD@Y?F`fpJ|br5v^U;+@&L-k%&`TLAZ$fCW{!s)6(MO`3P=MqKP;Ts$5< zTag7({;`R)!`bHh19aVrwJ+(@5sy9k8`c!csT+Qr2&%YM!m)}3RyMHZ0uQL z3?IVL9~I?6?+%8EBx~QOk*CjvgrAId!k8?6qm6&}AZP{2TDnV%g95P*va1kBPbNfBG-of{T@>iN!FXm(D>Z-O$wn$=4Fbc>(7dWn%1BX&2?D! znPF$~I{gG~IjvEbg;9rQ+BUkOM@&~C!Vt`jHPQ}Jq^+M*T$Wh3b+LmcEu~PLh z1*QAyPrzpDzpC~C6AbFG@ZYc*Bb5?q;ZkLF&@~2~x=J@ciR?khwqRva7)|nW$6=@) z%KLd^F+QrMw&fU3V@Z#mVz}n7^f=@|Eyl6o*2ROl`j)%65YWsX2@xHJKHU@ zmvVa;P4#NNvDh&koZ$1u^a*IEv|gB0*NxbB?)0nezQ)&aP-$+<8TE|f7bKW21ob~} zABEg4;NeKo?7#tGQWObI$9d>B!PrNp8$T@R`BB2RHa0fuwpN$W~IE~H5J^2 zdrQMeJ@4tNuCJef^@Kq|VO(goBg=La_i1n-hI{>Q>*7y<&Es3dl&wBB z79T@}O1D-hGVkPh4)kg>YLN|l=D1}Il{D)a{=f*hI#5oHNi?V&yQ9r$l`8<}uSQ@$4_1~;%*#;_ z`dZEL%Ih?Ral!OK>>^a40@V`v?^o}lq+FSOySC`Gh4LPZID2L}BHe@0#J8uFW^Kue)@+Kzk28H09g}%aZi05U-tm&;)rd zL4To5V`tJwD2^Pn9gH+ha#`o(^fZ-Ie^h^w=f><98VEzN=M&((8F2bIN;U7{iN13n z@f6A^`yv-7PwVodK&Ey2I0O4vO!fKqm1x*K*`ctSJjoUJ+6gv}?w5k|Z=}A_qHF9k zRUwl4cXsz=l)jO?wMGUA&8y&2*_=-Rv@XBnPu)@c@kv#uS5dOv3_U5kIKDpk(y2sa z7Gn*LagM9L2r~+Ie7e=3?g&jBtp~dkR586I(MOm7mb!Og9miQ$KEwdskQ!yY7k?$< zntnkgvX5)XHlJZH`h15MAt&zHTjN4J%!CXQX+eSqoQ}TBky(oE-7$R6jkth9gCZ2EI{k z4u4ya4?7DD&qd~m&at$glO2g9Bp4xN*pER!HRd(r1oey*-_@hq&JLl^-aRJgB9}h= zPX3ryw3;|_!<+d8Sf?PTn@&>Rt$zZR{D?EmKLLF(A2APJe_*x0erTY~ekH|yMK_2e zoOW4nduo3vPTQ*kVTcEAXHu1ghVzeA#f!T2R2OhD2HK)EnOf~8-A225!9D8YZp$klR<{}-znnK+z0AQ+6U{bteYff{e-}_tPXcqT=5T8 zkd2rL580f&eJTv5oH!A}rbEzK3OAO@=qVjkC9^l{(WQNXbajP}Ryfy5nPn|B4U>x6 zo~;d!ICtc9&adT;T?A_$MxVx7`eCX`3(9ZTb$7jM!tOUHpZ^eXE3B8r?9MdUDD(GE z8FHkl;pLyK16t0*jrV%IEUBa))SG-~4@oawO`!SeKZQVP;mwcb=?b%0bsi}apeVo> zDiLEh+%ikZU7OpgCzNoZ_V0n-cIIdd>WCA!E4D~1`m|cT7LqrRrX@^u%||GaUoVH0SJ+1kW95CaK%-T&g_U3iA=%>q(1de zz`{dCV|^VNc3XjPI^B(0h=#8S6N0M9x3$HafsuB-A|2wj}9L=-cHCw zgKY%05d#Hu4@&H7{S@RXuz&ayaG)u{eFO11qJ*qiILOC+(=~d8C4GMm0BH=T8z?5Y z4)~cOd+XV@MI=YiF2v=w2V^+$Cb@S_KLj?pFS0P$2Jh7X3cr%}ZEiz7??9}6X`FJ& zV{&Pv<{;o7sNO&tVUpar%YdtKiw^-J(Z{7cDS2mn*I%}JogCS;ouCmMx=2MT|NQ6A zpJXT`h|^0lTWg*uQ3g?!8v4h5Kmk)9lyYjAwVbqyo|l&*E=iExkE;94_`+*`?*teW zSK{+mm5~_YHIuXRooAezQ2_-wy<~l_k>Bi|*wTgazGJesrk?<9 zZab>Pzf!|TnUk=^C!j~x0?p|n`hweL+-sr?+J$&WGR|L-Q} zF#+Vj-K(ySupX}T??YSRoXEqE`mhJ*a2&ium9_}CjK5y2!mW?l2AQ%X zF5(W}(qTnT*J=)PV^&q_@vF>#6}0 z;;(t?-R`+G%2!M;9`36*Iz^4>#<_=7oFl8dqBqusLSAItUd)s47C9)BN=phOWxmob z=s>x3)+1Gx6O}gc7*tQp%j^43)WJwsVWzqyUN23@bnRF2<^~G;_?@ ztH{7C1v*Eh{=Z(QK_cj_B9@XR&=q4F_AJi-eiGjd@TvUi460@t1sD-eD2(uhBw^hSX+k<*BU%M~UyF&C#<`E`!c;pERLQ4ACgw==f6@QQiIO62l zay#;3Xr|-2f1k+vnnz$syI@Or&RRs2+iVlq)8k>xUrC?{_hvP^8`8Nsz~e6`y+jy% zPkvr2Tm-vSvdB;CsyI1=zgKiW*1Z7zPutp}ApS*G@XJdBbm5d)%g!%!?n;+bW(jeY zmhL~PalMMJU)o2#k_mS=xf`T?0+gl-Mks?RbcmmGyw=J`(i>_>e1DBBvevyh)RL-* z{pE1ltyGm!D_a!2k_M{dv9RlJoym45jIAlb%z|ohPB>J0NSG7us}yJd-lqyy?TSwb zoHT_bPe=UxPs-^=GYSyowLoj`Wi2vXiQ}c$ z6$+q;-=9S>+g-~50L{-z!A=)1hy3ane^&XHF+yxPxD}ky>}2D4aIXka;Rfp5^>?g^ zwN>9vKE{P#AvEhwJS+X{kMevk9Fd7(^K!e5g_2O5%q7Oyzq z!RSG(Ie^ePBa0%D>JjG1?wpAX$Q_ zZ~N@7qGYaB;v@KO`ul5a9@kY%KLM}set?4cV{`RFB@M?86CwX!LjPbrzU)N+j)>sa z$VBft9HVd$3e>AFN_=;%PDyjug5bmtj^BDRGIZO6g7ac8yvR>3|k7&d!rD}Bmd^Np&% zB*m0U$(T_lmVR^cKHxWDD3^-8>l;BnV&{1`~(OW*s*f0DJgA=AkM2Ds8^p1$V00M^ioU`LFTqd*DWijsTae*1j-3!ymt2N zHEC4=@gJmT$8!ZtaZdzdu_yGnDqz4*obZ4)p%9Q{W6pMT_Edp9vxP<;Zp@&T{P z&vk_$N<%6s=?}jZa;5{UefLF3>eHCP?Z(J#Q+6UV=RPs^HuGW$_AowJ8}v`2u@K%pW+7h5B=xKHG;U8TV|=3PwYktiS(Aiiey zv}{S_MewlUuK82jT*^^ZC|EcT*8Jcjli_;M%56h~BL5)6OH^T!{YvL5Vh!-)avEU4 zS0g%E9^6wv48?7Ud#L-4^$8Gi{shz|if(4khewl4B!p5*kNLANEio=t!@FJnA{uqe zz$%;7(nR*LePzKymX*|v3j6m(!MM%RI8AN5n9co{E-Pr_r*=HA*DepC#yZ01uydhU z*?HBNmlM4i88mPV;DUG=Hh4TGk*|_S0V6aRl?r&kR7C?;RV=@_ z%K!x;b8f6q4h$^q0OTA^087jF#EWK!rqnt1>;lSSXXnm$*Q1ZoGLW(ko;mcFD9i{DZVhNv_pw8AYn)DWb8DKLdNL!W#+aRbh3ruhI6Cwd087Tj}bzZbhijUSQ6SL*K*Z>6FlHmGqw)I5@?} zpv%^uJ-4^FV+_4gx~$c@=jd&ob+qX)J@o>%sBpc?>QO@K^1EQvdcNykRN z8`DyxM#x_W&p#{Li*G7GeWHbYFe9q`OX_0Swf*C$IT|N+Xa|Oy03eNlJ284Dji#+; zoiitoxmCV&Y>xIR@3T&pS#IlFl<3O9H+uy8rTBS_ZK7N$D1{9pb zF1b?V=l9li|`##md%AXO~H@~~dm#0WTz^3#K44xp)s6P2Toga1t%&~DC! z=}lBXH~4LeR5)FO!gVRY5Vr^#V`A^Qu`R=d#444Uxz`5!L}(yynO?i9a^Hk|LD=&v z3X5ZX+{W=U|0SzbmyA%%ppX#9KCb=c+axzH-5SABZG$iQE_qFdSV?;_ZP0@IK;v4X z*%l2LNLXPf;Mo6CMIr8mLOc5KhoGIbXxNcR5n*e`_g|d3xHgVB&tSR%S6o?AQLpk(WeHOplOBl)j5j7k}pw zUGw}UA&;CNLMvv?pXA`SeWEOW&8c3XE2OeRi!NHjtk5uFv!?~l*G_Sor7~XFD~}Bf z$@@U9+)6M!KmVpcOKPEk&f^IA8;Ysp#{plVqygJO!z#DpY}C!^innTj02}Y5GG?b} zXZ9=ReebCWM%$I4+=T8E@P##xE4#ouZBlc9^bESHVWxt%Rj@J;68_r2InL+7nSY-U zKhGZ1+J~{cMdr+lGyA=+MLOU^YWO&lrYtVU^}j*|uR8KHA2XkSXTIvK?u@Gp_p3e@ zzKDWh?Ex}IIrARF;_5xJ#9iV~(wpxYivi+C_n{AfuBuCyEG+~w zU{8F7%mX)ZTG1e8yYI;^$DXwVL{q^f$Bia7+~wW}nzVx&Se6&fe?D%{h6;*fPzO_M zoth~E?G8$08;|J)2`P%_o46{w0eP&5j(0-Hj93kmR*jr_7hOjtvFSpVsK7a z^22k0G9O$6TKr;jxAsT5QqLnj_#UQOZ^=)WmZpwY2+mMH+x<7a@mtU3*#M7=XHmn1 z)%<^kBx~nf0ub+22*PIiv7e2$ni#{97QLZyP*VEde!zo93z-h3!47zOivZ&)CnBjn zD-XD2lGbEPzd1rrMg!1asH$}I-L0Z!*VB~uU6o|0jfJv6Sm6{do8uvyQMga}z!R61 zZ|IY?QtON$_OF+kx%2;a?1CWegXdjqwLz}1Lb5o8CvC+--+wqv zuYg`WM@T;|(fN$5uHdJ$jzkMG%_l^Ty8sy9Ot>;9WMd9Gye?pLHlR4oaik$HXg>tY zguau>@j{{+XuKZKGs~lvl|AmR+bwdVK@Ty@njxj_N)^#PQC8lQF_J4-EiH5l z7K;mW1!ui9`s=$!fg+02#Pb`eab$+uXz}aS&UK`c7aUXqFBX|5U~I-WO0<1min#Ps zNH^m#=M&ag^%!k%1R8`ws6_)j)5)V`NTT395GQIf!@Co&6kCg;5qn%=4oIMZYJPpc zP03>?8vSpXqO$5lppWroP51aLI}a75l_m`0NvQ4#QOQ;=1%u_rGlCsa{9njE0S4hP ziCfO6bv!9fASD$bkr7{us}32y>i z$I^w5Or0R;a!0UR$4|dz0l{s;nZF4!LK>e?XYwi`|J6Oj`(^3f6MyP6bxhmSE+O2bdeY7Z9!eS_-{_= z*apPy;Ju=W3uX4I^H2eedePZFmLE3(m;cydj&fUXDi)=ddDF#_-6z1S<2_7aiP8&} z!>JiQ;Feo+KY$<;D~t34Q%Jv?ope3XlIHSF<@!G#!eBc$r@IDNrMo#BTU8VHwzuO>bH7bJNmcI8TUr>WYr~{o5Fah4%-`Cr&)cK3UXx3Z5>^3l zq*}SAkP~;%OB^4dfd;A{xWPo+(`|<=y3U>8reZ%;F|v%Xm=em;IDW6{?q-#ex@P81 zaleut^$qty;UW&`LC92ZWdy($74c9xn*^# ztt0$PuQm)Vx{y5m)nKM8?9j)pqS4WCMy}5spH}Kt@kt528px{Y#g!WLn?@sj;koWBRqLn zgslbXnf4F|yb~vg6ZCz3-)@}P_CnO{dUn4$rDuhX3wPgx(fO$|_dxSjPDC#9m11WoB-*ut|;% z+bvT9MxG~%md!mIy>Yoab>Ubu0-oSn6KbX8^^;lQNJmP%aBG365bCbmhJ^2^j@TZp zSQzigo1hdq%kW_e5Av*p3W^Nuq77w(Qs8e4CXe2gb_p;88Nrp&rbz?LnUG6vc8$i= z4RS~q2fiKMZ{y7$_5nHvWx*SkRtafjxo*n!YJaar@{J>?c!dX>u9@$xEugy<%jdUU z4H=_q{>veuLMdJt5UVN=F8)x~s=KTG*2=w8#W!!8RH=rNFrwq<`=K+?bMjRO2lnV3 zkA+9!^04B|Ov&F5Y2#je8i2);n;bF2b{qu-weg@?=qg#Q_`T z;y?>2uL7Ie$|SIFL1e-D@5{{`1+yOX`Cp?o3z_WJcpEVNVj-`8vT|PLX5YE9d>PT> zRaBO@-P}^uvvlHM$varKdfP2+;F}du_B3Vd*Cy1m@A%J17>|4-h!c-T^o6pYEh3)N z^CX9&;0AaRUNzYcvnI87ws%2c+Y@t!U7JE6xTY$-PCHAGUYbs-7&3s=H8+|XNYkJ^ zBqIZ*;Ew<3K25|O9?!?QYEPhJcTytKo0b<}CN6i=MSZT7TyeVQ9fwW2->Sw?pMAgL ze)~;9G-?DwSY0k(^SgAU-}(DB-e%wIVGOzbtUW7HVhTFEz zjKMY>su@v0=8XtA5j*2IzpHS)T=^>T+KG+Wu?>g%A{~d|+MtWz(BAKdAv!t9)NT1I zh{i<=Cu_y^8tU^wmV%O#Zv7F>!!u}83R%3FWa*_+GJ8?Qsv?n1)iNG!(K{Jo->e%s zkP&}3T9EfY@uM3)j3P)ClMME4T`2puEw3g&iP0TC%9igk@*DDegtSg({>UpO?I{uhI5d!5Z+ z+pV#TiZnCHy3Zk{prW9nMw_};b{0*P1ZHs*zV<_T$x&JTOW##m3L~eYpsF%JZRQDB z+fNs3s_l}Ue~NWj03*x|?Nd7-Z7J!sX09|)LHiJ2K#6eu)=tyHQhNQJP#9O3J>Yk9 zI1?lXNmogOlLLaawHBmMdMR_YB(Klwp*&m2df+*|`{%u@r>0Hw8$ksj*TXby$sCd zIqSf(bzR~yx8q_2AbmMKjPc81g<7+06!#8hKW_8T`o-w~lf$1!6g9c_h~SpmW%~mi z$5s!>{bH*rr$h`_3ylZ$v)}8(NH-)`ru1tXpA+EB%xu)bZNn*wCUIVA!9?34R+tCK zi|hjhsm+ll>d(1ERBehev)RO#O4eM+W%R(EneiSF60wJIy%?@hbvjNX zc2>;)&JXRY?up$0npVX30_+bz0TRn>r!EzZ%+foUh`a+HGs9|J5}dd35vv__3N6sz zCK(%j8B&YW66B!pb@Tl@Te6Cj>>AYNr_vz!4e@zuXZ#78N~I#?oO5%8l)SM+(-4k#!O*`ysxvYYn(z<8wk|3Za%TWzkC1P=bq<2Kc0K;x!23r8-N=ohHygw5C{MO|0Uph4WI|0BqygJ zC!?gGprE3n1k*6n(oj>=a4<5_GvDOo<+;hp&CMqyEy^b#Dag$&rYtTgD+h%_c|}z; zVDjqH3Q+m~k^rfwsA#BZ*lB6m<@ve!<^SJt-49@(1e5@kNPq$W5Cf2e0eC$O;QFVN z?7wRNH%LHaq(E{2#Xr#E1^`F`A|WLsr=%t)Bm36^1OXUGNcqVa<;Zocn1Te{TL$vv ze+ZIDutkbvFbla${+m4#|{LL{GVC>+&D@VNH&(s*>#$9pvCwTx}g)V#)z@eb|$C~{_{y8Kv02DmuNnvtIIS0`P1 z<4aln3R6B)UC5k0MqDIP!NhmodNB@U%H+pw%kXgt0(qXr0k6#9pY#$JC}U z25Z%7WT*>!RQ`-iOV$3WuP85VAUCbO|5dof-bHtz_>=8xC?3}Tc0A-edd$s&C>^}Q% zEk19PMTK55-Ds9X-Y=GoEto82&Qw~&Qag4dM7$@{&!%9bl(EZrK%vX|pwq}Wm zUVRpVO>Y)0$XLd3Z)}|u2R(beF!RA35!R9>|D}E+9N+8`e$-uH6i53({WAia zw2H*k!%`C@;IP6)Fi7e45OKAy54);YooMVYjb(nODYPAIQeb;f11Yc`<};4Uq# z8mB6uq;d7n;9(g=d{*~mkoo@d8+%iOhYOWfU`$EUz~8}g(%nndbwB}oZp1YpcsjB- zW4aZr;<$^!rxO%ulSuQng6hR2Af3C5H7){a6dY)+Y8T;rmRhgg8*PtOnNoz_)$eNA zog{=eXLxIW$T_8+K_YD(gu-+y^zR4sq=$Zg^+ypmd>3{l{dvzns8r*PHgJK0LVDWA zn{ys+QwMT*-fU1)X0ptf$EW@(hqJ`kt+qlF(Q$Ke2I76n;_sUA z>w|W)2mFjz&$EYoO>cLR7tlBW`k}ddiMFFdy@{u;3R;AP6Y%nK_{+a+Q`Ntd72D?2 z736BGi*)&`Zdv~&fXbnL0vU^`_41{X$lWQFi5AwhL>N)*G ze(Z&!@wkPicb+_xmy2b~wLNRvov7H9u(l#e^}T9?Dt#tpXu-A@B4$kE#ykYcL*;b#?qIw&{NCC4L3RhxF3q29T-C^l%m4lKgIl4!{WN=dJAN^y z6BhkO8@=9VIeoaq-{QYyM2r#ol*q`n{SBp}`upG;9ybMCp#o50eSi8A$#~~Y)z^*O z4&V70c<)Tu!(d8B$R5&3V?S`*hSV%5qK7>tkD!OXlsA28T&~7hTn&Hx+L?oLp6}pE znQ##gmkUyyuU|7(1p_Gbh|G|zEIkx?1d!!bNYP5IdvqY!J?p* z5mRT4!RFTI8tvY0pYMn0Cg79P5MU5{6UH|)f!P|M@!Z~11Yc-_)TYyrBbp{ysK!)g zD$vS=wv3&1q-YoWnp-?oqz~lQlYaQ7P66kSODJZ@h+mD=Qneb$6A^s1qjB>=ZeQ;x z&twHrA-F}5mgnvh&26@j^ z*c_eo+p6QXvrL!v5sS?24|P1!{^|?TD~ixf8(BgPSDWg6y6m?=4m2u&l`#^EoZ5(z ze@B~$fw2zs)+#&6YvpPh2}kyu$mvb}xb@Sz9__M5nu~AC2n$as@$GCOuDOQiZ^O0= z`uk5NU_V2VQbX$j$tjzD^8pSibUn6 zeV2^;oiOLGj~-EUQPiTRz2Uu2w&~>pEoltt%Z#CD_}}xsd-g055bkJA>tO^oU7XJh zq$g!*9Ia`4cneKfUYj>IDKO9w5%DZFHSgGrtP}Umhl31fqy&4%aXt&sJZ*9LBImN2 zQ8g!1v_poYWwbp2$8*Z(I2Uc-3feo=cbm%SrFCnojTVNbkfp=a#2pg2Yu*MJb9R*S zA^~&(b9_AaOmk_vNIUsLQUg6ZO|9|iopWdt@w`sV=BgOGgs7)-wSnyjyJ%af+)gI* zWeRZ7o(j#!LkOC`s+oEkzeO{7(cV9Nb`XTF{@w|=bTmo}Jy(jUd=6URv~3h{Od0p* z&~Oc5ste9rXW4Wrp0jyq^OaMpm@8~=>|=(k7T{S@r&E?Rq2Z8}SDtGS;ajGnxc3GU zqZe7T(psx2b}wD)Wg%q8`VqVGDuBx|b`nE39d$(H;WrxjWN=ebNhs4~2t8SYyin?Y z>{v+&du@A+8WCUV9NBNcTQ}a~jr_1`*;LloVEIzHh-11TFJ}UGu7G01jDsn-Rk}Ly zmqai9GS71raCUYsAR#R7=Xs#|eBXB*&EI9i)pX5Qu?^2X-w1#Dt+21t0TGBW^1W=X z#Ogh={8s*aaH;;d%}+ikq=r@}86s5Jz=<*l@7k{?2M#nv5MN00NTtDDRSG%$NYM_K zY%CFzXsOYsu-8kWNRhNPg7W2W)5)FGZ*!UoF3tSyWyJ+HF87U=?GkfLQ(HL+zki&f zHU>+;*?Dozbt-NXSs?PFAR@}ys%Ol1r9OPZg4Y;gajUh}T!R)G`b(Gcl1U~V&@zU=)=hI5jUC+8DV z+M8)d8vKxnkng>>Ui@>x)uT^L2OZH#q~EvPC$wP7C9a=r4qjBTWJ4u#vh11R*l%0c z00p}>Y1JIJ6z#Pj1Xg@gIU9#U*2?i)`iAe8*Cniz5W63mNFF}I5l$68YrkoHBo>o3 ziN?e=lH|lR*|m>f1LVw+9~wypEf|0KMU1iLm9G*Ukc-CoOMmpmm=9xZdcOYHmpi>% zJ#yJ%>ESUye<9QGvkAV${@zf-|2C~oqJgZMOQ4|;682&NvG7geF0KCFNDIJ zJ+hoOwbIfGF&v+{-Q%UZpq9A93A6)giOc!z(bye6OL`Z{ToaB`O__u{Kq&^&%T=n1%WSO!k~|v^{klGu@RkW z=o=Ys+-5A{9+zA$Dsz@LWytdE^m1vX29t#L0vXCtZj6tLi!PJ=Yx<`H-~*ZZvDyL} zthmr-5O)iW&3+Wl)Ivy(swm+d1qXYJ4wuy8o=}Aa}Gx)O#GUoQTyFDFMv$%$KEHFJMIo=;DpM9 z|EQ?(VgkODZmuyJndPwU5&Q{Lo_$R-lqY^h4-6C%a-tzgxe-H*L{XEj!j~vdSL$X($e+qh(`8(ZG@8R7ibB{z1yueAjB3=Jw||Du-BmvYxaH zagHM#5#@7X4BSq^?+dgo$?v@oJ>`{ubvC(ZYgu)lt}$TItFcyCFEcB{&(V{-Io{0E zy90(pYE%P)X~vp#7*<3Z{XJOsuHdx3ZC1-|Ed`^QKbSF%hUFWagN+5G3-VzbBi|+d zEsdr(bdAN%MYd&yN%(0S9gDD@Oct|Oq6=verEC9`KLikKpSQG8YU^&Owlam^k6%QA zO|%!OkhyxOsLKftH!gO@@)=TYz4j=B5r34YxZ?hppfi3rB6(Kf&#^J zr+e1h?4eSJHEBCWaVBAhw6(p3`TE5PT&S%rNazPqP-M%x%ZXB^b3cP)QUpiPnwnE6xW@ZJzJ>)j%eyzKY-cg~4XvMp)>0{Za7*ewkWI&_j~*r z*fDqTHnJW(EgOGDO=)dcr*FowO{~)}fZe=7Z051uk!}bonSJGA9yTui0sbJ4D{8AZ zL@b)tk7t*Ev@D`Mt3bwteW z|NS$~5-QA84f=e8&g2~%jxJt4!cPi3gRd95>NYyf^j6%gAid$3te2EPDi=2}qB3qh zXs2hauKV=T(+=)PldznT#9{VyFha%F1Yz~I)h5S@`M&utfJCW!pN{~~lVcXP;%TL{ z$it1*3&rQNH@#}=V{;nY3Nx*-+M}*e(;bo4AM!PUfmRS}a|1rC5Xai|7P3l~zPe4d ztX|ZvzGE$z)|+2kh!XwXQhuIpbZ8p)tx`1oxQEJl__t*6x&P)jWy4mrKed>7S7Yr} zrM7VjkgKSz5Sw6nBkr*Ut$sWbpp^31Wc$kMsc^dN-Qc{6+B{M3ilLiTlja7<2{UcM zL=J!Iqr+?zip=XIe}vy=hfanKQl;HeSI2S#ew-p+m%&nDjBtPrL+#`cI_2}atX3&c zLtf$zQps;U>&E{nZ9jcoGgg-!QGRH&;osBb^c^gS{~|1E=QoN|dpD0p;*3#bb9bop3PL1OSACNe?4m z6Scj=CesdbW&#{K@-fa|MS#EE-oDv=m~H#2IM4^YuzMrf68l0)MJJr^v2BG=f)0z$ zk&??NgspX)neGA)T4z>B8~oE>)cWelN2DLF2i1+Y>CiE;fsnT`{Dk?Q6%)xgLkN3n zipZgX-b%MMlrfjJQUA(eVYM9g4oJV1JGZ&OasAtT1Dwj*%*59Cr|(&2k{yc4BFBr$ zUNt>8EJ9%iel=JZ!wU-v6jp{lp|A1D-?k&%bvsfKlxjjzxtN^H6;NgP@X#S9? zLdW0`Q9q356Ff_(lQrL$3b{qsXlD83TTna&TgkKq|L#5qJaX!Tk8fw<{I^GNaulD8%L@5-OZh-Sg-UZZs$#CD0TROS zG>CXs*v5fm39)|GVJ-FP>)P*YK9j(|!Nq@0*VR-I*MLJC_J->31lz@YNk%nA?LgKH zUigx|;H==?A+9|S;FI{@BdTl*Q-4+|Q2(BlQ%llr)0kdt~yr_xfR&4mOR@v%HTVDG)&z3^gin%QY-9q|w`5T$vI(6I) zAhcIn6hK_s)^*5Cl05(8xBTqoR)F1~#_qk?0l9tur{C8?!^I+$o$y{^ELXd@-;9JE zA0=WvSN99~O?oi?C+*1+{C#d)K`_P5JXa#ftAUQ6UA4xhO`n`~G6~Y;A>nG*s%`W}7%e$K(@ZJQ;#Nnw)I0o9MWPj8o)? z(IzG-JUes?+Cw(3x2t||M=lj4U^esBKRR`%i%j!t;}DL9Nc?nUcPOn8_Q$4OZI+@!nM(@X#i6GNY1u;T3~|`lV_n zDGIhVlGZ}puNb%#qpNA&8ow0>=0RExq!qjz^IDKXgof1)Vj*}8OTh!HU8|&HQ;y0haWA0X}+Hp z%^_dW=vdI+mJ83xtQ`o;n{YE=X|f#qjJ0%X^kIPEa^2?J%Prm=o0o4+t2C$e3s*v9 zBs#4|feZ`Pe_Zbrd3_+sSsv);mW@5zxQ9mx15NeW10uL$^~0*L34now5U4p9L>|^UwW7)SM2z gENoK$WGqEjOh+v|yF4#^(j)M~RW)Yt(e=uI0OQDCbN~PV literal 0 HcmV?d00001 diff --git a/assets/captcha/background/44.jpg b/assets/captcha/background/44.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85958ccd07450cbe3d475999b9788f472c9212af GIT binary patch literal 9508 zcmb7pRZtuZ5AEVm+->p2p%g9d?(XjHg++=Mr@$`m?(SM#i^Jkl+@(N~0)_ki5BK3d z-jm5pCdr)SEt%wf^?e6`qbRE&3xIL;x-g5+0`nKC%X_1%XE>gsTvRPO@=+fRKAv z^Eb$f$kH=R%8Qs+3p#l79|tKM0O9{B@IOibBGP{$5H0{79sv&UKmCvUKm2Fo(jee* z;!DsXY7lT)c)YIzF#eZ;i+~Fd15D6|*(ZP^Wki)r^y|+j+8jx5K_wA)Zy@A_GhxC8 zZM*JP&E$)C^wgB6H{!zp?N!@L*ALtwZYTBsdVVj9J!J*I1IR(9h`(R4$VBRp=qijz z4G0xvLF8UtpD~JH`(9<=UXe~TE_iSfW!S_62#g~NLQ%>)oAZu}4`NG|DA{2BMf=@lR52DCyN13|f^nqSH2xX9mGl z3P(&Rl4c`?$lQ4)4#FV(Uj5aS!Tr3?TisRyg85utUkPs4Ea`z#x*W{6Wa!CczfWQt z6aOOj8Fl+38zuGWq%^93AxeSKepfBusQpFSC%F}I%(MG>lVPHC%gT>1lMX7Q)=`v( zupg%+HQ*G$Mg@ELdS^v8A@cdhBKBk9y?LNE#QyBBt*opr0>2w;W~(cE%Qa6xSo}-N z&kNy|Wb6!vyR@+Uk8-J-cE&P4j8;uLb!X?*Q}_pRKAm=SdJV zB{BLSZ|~Rczr%(@8Ui1Uly<8^S?07Bnz_UHuyET| zmpU436QM{=t%{F44g-)l!5HX!aLX5}A!fMstn{ts{BpUABuxass}hWDncDje;+33# z$wNWz=&ko{A!$AEXIg94y)E5Lu>l-2TS?hBB$KcsxR_)+naz_C-A4g4fZ#I&f;OA`sizc@zD(V%Ll<&tx!RcEKGA%Nu3BD22 z{R6e^6gWP7A4kkN`_edlJ&VshK?oAZ+eC;78OvvdHSGt{6gjdF=*PQve(y`)V`p!K zZJdv$aKaGSluc~ox%x8S0fHNF)@&hp)=oF=G!K!@u{y%aeXu~0Cf9;w9@LF53g;=y zTtQ61=uQ~uUYDWOZI_D~J}W#k7!G`YRT_w=uYw^5*~v z{n)le{j*My03^`c*dL?h4lys!kQsc&=H~qFn z*CD+~Q`715N#*5I{q&ABrG>Wc85UvC|q-=vhhLR41m6-BF;cP z8^P^%&!4(&Vn@9{eZ^3-PFA=t>wl3PSqbt#o4?jxq$r5##2!4t!GIYQr9sl`_BOQxjrI zh^=>bPw{S69eW4VdW!bc&bJ4dx_;sJKP@bgnwC2g+b!R7d6Cf~=+@>X(BN>CU)q-* zjK`h)`Rw2br$AXHX#bl(B}6rdVH{DpQn}!_=$ORd!mwk>0a;-a+5-oxL1Yme0y_}s zL<*3N>xcV$S~`fFWeY7!%Pr3Z;!s2nJlK_`Gqqf*zCE&OSMH08cM zcATE3lc@LBWntefuMbM6dEhCi&n-q+ZK`{sj^#^vOp9glA0mk#&NJk&Hs?aDd>OY(w3fNm(p4oCT9!J1UBXw zH+m?~$*I$a+9dbobO>nFF8h{4i#sXsVdMQc#}{K6Ghss-*JvETRu2h)xsK!x8N z1y4J7kMxWw=Vv3M^C1!UV(nooB;ZHjd}2!;?-SMa4@X1!;R6X3&@|ITN}D)J-VdIh z<6&%#LY< zU_Y+qTEV1eW309gLO}6e8v=*ROWDJW9%YcS6f(%a42=S!s5XsSuNI(G=#QvLK=f^R)ZgB+leL1i+CAuboW>49Yvfmw(nl*JNM96w< zqR{zCNjhaBqzEb?2J)w~pSkJ4Y6D7G#jcL)^GIyw+(4^>u4^H&KPUUL398o&mOMWw zF$=U7NiEB{dcomLumBfZld8lotHz(viAb8Ke*;D`ocr6g#5yHE4qJNB`0F#KP$gP#DwMhY`tpu6UbL7~IY0j3+C1a4ClH}b)&Q0GsmmvNk$pJ_Apr5I~A|q68ZjyQzG4OgV z+-JP5T0R_iu+d(E?C$*EO4@em0b7tpzc`_`c(I7G&3{V;V{jX7vqw ztWGfSn!mNuHvSz@Rj=qxN6X)jlGgRt{!5!#EHv$hHBX(jt|=w0K*RavfoNN0=M_5j zh58~sne`(BqV;LP?BHCfpK*(qe2$%Z^_-sp+@GnOnsDxh0e%q=$2`iaiYRwZ&=d_s zNzhJGjxJHeZ#=J=!kge&8JmhiUO&c$2uH>}JLfpRYS# zE~&FxmSsaqq7mY~+};5hZ44XwmNgQ|@q2%!y9#YecLKQ@U{<+*_oS1Fm)8L1pra+D zug*={K1oPa4xOO}5B~lvv9^0!H5rZImYw(kgLHL#r^v>H6}d&XkHo$!?lQ7OWF$kFNzz4k?yW zJdIS+P-c)};Ek>dFzELyE}gyCqhX13Wy~(c*eE(BxO2{IBJEV|b5{v&+Xo6yjyfIV zx2v-c5g=)5Oe7Q1#M>FXAA&u&;DJo zvqGD{$o3};nC8R5nEtOPKGCunegUf{J|NVZ10MjxK;Ps@?2dl%lK}PB|gN z+z*9}YS>gH*-dOxWvJc2sHJnh4>l-vThb1izF#T;&$=%wpko` z;depOlAe3vSP}b&`S99hb6vu=6&Mb6T^PSz!GrQjweWN(+jWc~BFysLGMKA%YmC6-K2FY_ zuv57gmZTIy3#WPnYp8$s`tKMp+kwM?HC~Bp{EVwE_{Jw5ueH}*E>k|Y2@z72>e!rz z&ZR26M?7NWIT3s-Y?^(ot`f1yd3*LNxp%-6%?wT7v4rPUcqJQquU2Ef5lc<^b{ z*W{tvMM~pOtz99VIv9zriB5KWyigbdq7EEk=XSAD``Hh}KK+Jie;tWZ6LP=UpcmnT z6*Yd#0Lo++{=h)|J~{H)9ZGiD^D+$Li7SRYtRo?bb;_(KczwowY0e|}aMeN6QgyJ5 zSfItS9=mGWn97y`)v6JBuCi@8vz~CTsuHd`1}sX)SJEO>el|E)yz0^TJw`xBFaApz4(QbmTB?$r504ZSo8zHTVmvb=K-0%F@ zPGu1M2SaV}n5iYca&9MAoU&T0e3RC!Gt!OK<+coQ>RZJfANEtEZoff7n{d9ATGH3< zK%Is*5i2v7j3wH)xgHbWAA^W^G3ZR^d3v*Z&!^NrS3oQ|B0UhsePX*E;XEcfI`t;C zMlx;ak;;xcxZJ(sBPg}gU%X*@kEJrbm0me~6*CE6dWJB{dh^vz3XSKFC)+)OGV@&E z73KLz&yx?>rrf|#KT|PsMPn-P{;w&wQnx}ok-cOy{_?K?;<&jUTRC+jM2uTLZoHVL zMTP%{BHnQWx6c!hl1G?5&yV=COTA0Jf8l02f22C-p>VzrJ$)~_pzOv*qKvLl8*wrr z-Y>DXv@1%oykg{jR2L2#dEAQ*?`p|OO&E9ToGrQphgQs849luE6ivp0g2!E29cMb^ z=a(6YzlJEGk6vcG;5|QV|BNhO5$}Vbj83j;RZ4mKw4yexVp-&HDskR!jGiNH146B_ zBG@di0;nD@3kS`_>&L`vVR6YhE!lo}1JAWFHqYrllZczD z6ZG1RpJbJP$0u~OMf6sdI;JYHT4%2PV$z-1@ixQS*X5=|q>FxL;2q#v*(|@6DtJ3Gv1Ljz+LZ>C`9tf`(cnz|(slF6 zD#2&9N{82nj3-rYs9P3whPuD6I`gZR5%LPiUA(G6p-iM>`QKWF&Z`K& zo-dcYe#41y9nn%_z~sx(J~QNR$e1({OFf=K+tSN-yihe@$oT3@h~VB}C;<*&jB(_e z?^LQyQwG!{ve3hl0eh|OWVqANGlYx?@{lg+l{am?(cQ3-AMGM~Yvdu4B|8u-w*4|L z5hF{U6#kyhAUV%fEH(1atV0!2U_Y171v`=pxmWs=AR`6{n zdNWif=vc0{W7^i@N#3apR6F20%DDlXJs%D4H+(YEaL358wf2oSBwdzRnBzb_Y{>BB z5juM;SwHH?1OTRs)(ybRF`X2faC_G3BvljR!x{PM`;zh9&0Ng;KhYMccp&aU~{5`%9QefLq8T;+W(Tb#{d z0*~oS+J9Q)%JjX*L}h2V5lbwkd?Nx_Bk!$1`qGE8oIyNge7o$~beak4lOwZb&J7|u z`1=Q`c-0r|SRS&Nr6!9SlX-CUk%|ewq@YL?2m2F|6Z;RX^ui&nvmV-*xtf-&a{TiE0O&%EyY+eb*A3m1L<7eZTgnW2GU0A(h$MZmt;l!OFBPmu*o% z|F~Wr-Ct4?Mc6O991vRyb`VBo>=Z+*^v6&e*bc+1f)cGNx`; z4Mf|@4MfsxvA)_DcBM&TM*}FSL1XkP@P)TQ48JKhw;yl}&+k1uGu%?e^#^8QVy3_d z!V|s}h;IZXKhl;~z_(PkY}Qmtxk+f+Hr1h>r=by%HHOPW z8%dztW6*hc$H3M7EkK0hoN8u(pbTw4Rkf=B^lht8@A6_B=I)|OVMeKGXoL3pTZE?N+TfD3OCRAxI{;4R{)*Quxff{6ro%h#|5o94_|?)D{!M@w8**3y zDe-l%cI(VI$j`mq!StpbZX(I}CTM~NI>;`R$ui|L(-YGE{Wd0guRo!}i0Du~zL^qC z?ndE`A{4ZM-v-9|xKemlI@EET$T2twMmwhJV5<2K+rG3m73p(0qS$yDUm z@%s5%R%+1C0ymOn(rz3vGTI-o|J-qNaHGOA7TFep{TI5#baL{@bEPp;7nS2OWfWx6 zfl$%WdnrN}!@LEFqU|zFv0`gZKZB$$YBek_<_YMWJ)Q+d$z=h*CvVbhfeGqYmhK3!dCx=_hhX-ZO)=Cn6mjWru9 zg`~k@+v(0gnl6IUw3wLyl~k(RY^Sa+ZaLai2uXG2iEQMxlr}6N#S0#6Lr1o!+n*(2Z=L3u!;}eEV zV?ILdGdbh!^XEjK8qh*28;xSH{0HNM*Ec-}OHAb^)dg)F)tEA`3kr6Tb(SzP9SptH z>996l@sc`}j~VTbMOk?Y0To1uVMrvf!(RAV5kV#Dr0!!XH==wc#hUFCW|T8+YO!6i z{DKyiU&N1=V24VB@E};!w;;0ZhFv`Mr-U3jG?X{KfiXx6IlYdHiHFE3q4wLbQ>f)k zI`{b^NfOryRr*Ulrf|y4aFgd#aE{TCZ;{Z|BD)~Jg0_eB^klTR=uq}V54XWp_LM=t z0XEv~!u_)-Z3h{J1(%E7TA=SVe`gh>c)jS)N=FjjKg#BZGV<(_TRS`=C8Q>E; ze1avGoM^!JP8&0Bu;*ht=G4!@to15z+uqzRjrOuW`n5srwn=)|_!?|Rik z|6Yp9bqrIvFZgivP$S>lYGWRCj1X5yW)joS@C3iFbmo^eI$&&VXXLNDg#6oZ@puWC z<0z6gZV{gU(dTZ>JRQ8A#&6-EkA>Xdn4}LP$1q9v+%+dj@VSXasfj01?-T*FY(?EJ z_bj1RZ&`i=e$#@wDV1*Q6h>HveX2qcZD*F9JahP0jH*Fu5Vw1_EWmSon5qC1pjgfp7+g1p8_RFXvyUpV%$C% z?Fk-nx$hk|CRj5wklw=SvJqT55Q)RTj%-+w=>1y^e^Mu0e*;7c>C&vR~j{myB1i>alE9k&aM))|Uw z<6Ar`mD3PA4xJUhj}-ak#adcQJ#@l?$;0_>Ck<^FnHe|BQ;W2h5qNS?K8*125k|)`<9$y6tLLL^m$rBZN!VOHym*-O~mdGsi^KMt6}(yFE5! zGk?BEi=2_Xd8t+r4}p)iN+^vlRdQYd|MS!&~7-t?Ifq+hrEd zOvLM>yGnW*0wNO`#|8Yvq^AF-kJZ2G=m_*rKdmyHDfA&Y)s}=ionIsh3480{g%07O zzcJ34f{^A#X>>Uo+`pK}T)yBdF#JN0|1?Y19O&T}xzQ}$RMUzX>QHtis_$_o8e>;s!5(QL~$o6ME=rc_UyI6|8a{CQlJJ zN><5SG&!}vPr^2qd#l|u7LzS-*P_V29b39YX@hu6bY8MS7?$KMc>42awB&PORCL_A zer$w}$7_APji@nYwq<4Qy6qNmR5R{?@wxlD3=?gbn8Bh%vRfj$mW&8ceLP2luO^e9 z@2+t5p~L1%PU=I4AWr){sp52zIj3sCZa%z{scx~S7Et)fKYOu)ndu?R0u#hahE3yn ztlqFI4#4EJpSg^@r}W`sNREcn<}J^3is9R@<8Qp{K-!4PY*{1CGEsGAFXZW@uBX6q zQ4~y}Gd8kJz9K59*)+boi7w;H=Bh&wtHQ+2X#3}S$hSJS4GeVYZxS4JUtPF+2M{TN za%@&}DA<&_qtME$Z=gKRg_o%vZrC7b^Z|{v01H-TOJ{C(l$OWrrt>gqrjc)E#$6Yl z!bBg(fNi+*>6hu7;~-Nnr}L}y-Jaw5(wFQqw`RWyxNZ+SC9~#ZYQdPH@%o7A99Y@rN6~JRb#HQ&HflLyIz4wS8tR{@neTU1Er) zsLjh<)p~jp;tH^?j^(U)EEfjv6LX&&I%Yywx)##K@)YGWQ#-$yc<0ay>O*81T3He zMq2o73$r7*yQ2l+{=wmaiiwITt=Q=*Ty7uZAvr+9$a%U_@UA7B?WY~Hf}%VD{1|;4 Wx7yNXZAJ3|uXrh}4kKq&ETSlF&h_iuB$gROz9E7^(<}^eO@gRRpOD zf^-A~z2AS=`XBD&-Sc?X>^)~5W}VsR{9F3>4M3+0L%;w81ONcRe+%&M3qTVQ|Ji>|( z6l7E+?n7n%hlGHfoScf13Peo}lHudzlllL~zmEWVGC&c593cTe07y?jNKf!@2*3dV z5EA?k0RIajLLdQvn1uAdpgbJ_NI(cA1`-hy5fK01oPdP%03rrHX>~?pM}9wICYi|0 zW2`{`Y`Mn9$$ckg6MwMge;ZljUnn9hP(AZHX zlJVaPfQpddzw`a4^AK=bVW92wGd`TViap}UQ%7dBQa#o5Z&9SN@rTtzg|mc-p{8LJ zpp1F#XB}k3+)OnCK6B3BdlW-J&6_T^H*fG$bMJkwj=9mqRB?l@#Z(;l2d$CQgzWsg zm8ixZwJd|25$d4Zv)%^&RCqP$ZGDALyCSX^O+}W*jbKnDgW6neIIA~>VnwPFsO(j#?N7A98ZM4%w)Tfo5WgZG-?uUby9b&I9vLt(PvjZ4itdhHIB2g zOJ(a0=tk%m)V`RR8)D-Uk1s6Gj2kjzQ2qyajGmFxEO!Ud+L4^g9z0TRl4|q8k?PS~ z222;to!7$GUW!}7MZRbL{orjp@3)QAub*mfc3#WnvwnDPqfl(l9AZ)bNP6>(Uce7B zX;{gOdslX;dfp2!lxyfQ+!t#wAZQjqh9JC9XjyPAKYCYfS2S#&LZ0CPqg0@d)u#sr z7bW=by$>n(gxE3ELdExLbt)Y_#jygP*(~lE%`4+F)^PNa895Q=Fud$j`;P%#x!bIB z;_(T5=x8y#$l>lXZz*4#4nn`mou)}pUOBYs45F9CuPu$ekhYzw;6I=te^Q zUtSeWzE!&}U~oLIpaC^m-xP(zn{ubV3WK3WEo8XQcVAAMQsek1uVNC;vt-2fIcm9Y z4^pmNvcTH4UeL8jkblj}RwDeZy;>ncAf(0s!Cg|&wOBjzp4uXhGy&wi?9eJVZv(c9?qxAJ;%Ja6KfZ(?ICq47=ngZSH(7Jpa8%mhp8C1XVS zD(<=~tlNen;8xCJx&WiZZzIcGkNjwH(NZ4CF5-;YLPeW)@;~=&^&jug0t!7XxUi5y z5eGFq$@nqiYAMoho1tEF*=u}y=T0LvJ+Rf>n{*juRKcjwTRH3#vJGb!WmJL~@b%!;+GbBr1RuCXSL9CT zm9bc7L+7pa+!l6NksdyT{0buMQ)bZ#8cd9W`dY+$6_&28T}wavMxtiiA;!bQ+-nm? z1by(reYXIPtB;E}#?D(yb9>jvg1vgJ7GrN_pT77YoooOmyqsk3?2U7k7LPKou7Kl) z)BRSyi@||Kbd4t$=*m!4G^w|Ww<=${ia!RS_{?jJH@NkwwQI6z5|a&Z)$$|OMkm;u zf;&fPPuJw8dQDAvOPk4b$ZRyi%dBkCqk0*xk6_=ov?vb784QOkA?93X zTV>^-Yv-@)_z;|!1B)^ri>iwzj_O0$`9ef-^Bc_{L}Xi;+`828K+qVV^m)!WQa~ny zpcx}2RJnFcUpvNFZTZS#n|o15v;e)Cs3zb`GT2)dm6-aqihVd}j+R!=aegvApEwrFifQXB9xKb63!&$5U$H?pVm6cr48hI@&mUWC3;VmP*A7 zoh_5Cp09Zh(BwC6;|&W#zstP+vNioodMM^5^;rgl*7?fbE}S9?R68_NHX^#`5CmTG zBbS;e&(uUJ6{3MX4L+0Cxte%tcEWCgkAAhR5s56UDO?hNW+(uXV#K0fA?i=Q2*sd< zs@n;N4+ea*3>ozl=UB?{K{XsL>wTgYd}MQ0X-*p{T9u*{riF#Y_8y&-<7|GfqnO}E zKLnnbUi%zB{B7K&2)l1*LOB7cg~Y&>IMeB^aY=~*u=E0u1RY}|xdyo^e8C-80!-ihN*9SD6Xpei;&{7uo^apuo_Q8CD}u1} zC%;JzeqWOl{eg=wN1TFFrZ8HUXnlI&7VU}GnnOHwO)1gr>?_JnJKYLAS&PLpuvbKc ze^^k_mTtv=&`*U())FnHds{j+%Px^-li0e>-q!_Y>Bu^6-K-erDuzXHy+B(!hJUae zD$nM&GJj%<=PqAH96Wps6fEL;Y+@!-C)-?NiCc7A&~I(wmJtX5Nko+$^Q3M}#lf8r z0v0*G4#XbUYm0fAL?^Ihyiu_15^X2@QpRRt3HCj2)dN^u&*g`V!m$UWV+vM7(Rt-5-TK@wGvwu_S`IbbHOZ2k&lg#-K2VsOzeF$~O?=E->(Ag4RqS34a z-X{&{`~4y9J`a9cM66{wWZBCi<{qcSK!j27+Y)Q64C$}dQJej$kiU6BD-LxeUAk|S zvxxQB&He#c7ndc$8#b^9JjW*e9=kW^7&hVR2S#tdfAsB;H1``A1%>GOxslYYoGQ2= zLHwyt3po3lW>O2-$;_jFO;)`NZW`Gl(blS0XE@ZbNT7c7r*+PeNUzz}&nyncBpyod zMCOqe)_R{?oP48~^maLAPXek%B4{NBxp@~PpWFp}%*FP>5fAF%tGBfLvUa03r=MCT zUb&5 zpm8J;NNkn?Zx^>tG(iT?n(rXkWexb!a>{uE+z~B|+?p~iz`wD^#+qZ7J$)4%oL=mC zxo9_Gi{1E@&TL+jwowG=7uy%Z%&orXKlp+pmFkm!E{Hur)RhTcfDv@V{e8s!;Iyka;lOQ6Rt=!)Q>>s>|q+7;~jcq7W8y**E zy>p6=P>PNNL{54;->m7{XsM?tx1yo!`Shb1hk>U!@UIrgSds>pWG}5M$BO05nk#h5TYs>Q0Le@CCSBB68-hrgL;gFc?) zc*Pmon^eo~RSq9aneN>q-%Ov|D^JGD zj2*OeeQ{fgzOlCMMPw4Pq=}fZgv&aP@px!jT0q>KTt6p6J(S7$GHcyY!PQ&G@2}zr zcMMzAO|r~#0}M;f!N;|iSO@o=d=_G+w=Uisr@!Cl3ClC-#XmF}*=`SH)Dn(3@tb>) zZ5O!|f*mK=*FQCGi?fTUQ9bW_fK7SWRby+?DvHAr`8VD88So5ll*eWkH?WlNm2WCv zckK=4F(N4E9LV=Xm`Fb-iz#&~@j{Ka$D(W4;Z91ggPOB9zv22%dpM( z;a#G1@fPj-55VR1nOD!PrJdv?Obw@+K+w7K4TJj7Bae5!{{Rt;jNGs+r;K3;V{7&< zn(IiF*Lkj{IvMg3WrwT)wRWf;7<$T?~PgN-US~l`D zOeEj`)SSrbpsLN!*@V>b%iWUIul}&i0m23|tP^efO)68!*xXHd)_c}}fH#3vwUe9` zFcgEluz^^Zfg2saybRZUwVTppCC0k+J)e*Y_!&4mxL^sWEwR2Gfjroq0vD7)aP>oWC{$plHCe_cjdvGWkZu$2T-jq z_fV1&y+7%EW)e5JQ^p$=TN7@nOmCv#uD|6%9Uiv|)L9^j5l@YWksWKl>3`}Y-LCyv8yXO# zc}mveN3l$AhqiQwD6=&zdU}!>R1#Y%0;z(OYUQ2;c-4u#$QD0^@ME3Y0UdLp&AgHU zes~C|xLpJ~Kk#~Z%2#X7fWN_0fl=4XL|fd}JyUK!j z&HHI7MM>;5EHEm)c*4nyesDC7KB)F=G++MS^=F45PrK0ht<0O4sM5=;y6>piGdKHc zg?o>_xIxR_3@sl2z3k~ZgA!~d2-;)lw2@Om9h+>`nOmb6F^qie0R*MS8f$5@T@JER zNT|>L1j;v4BJ5SJ!=47rsGm-xj3vO@9N%pRpN2ef*5+np^H+04x9xN4g>ZIRBeT;< zgp~3{ru#9}`}WF(ej5gF9!yU_p>&%AOvt%*>PiQak>Y;oL=0el{4qP`1yHv$QI#}t0<#d{@ zfuaOux+dLA#*jf!%1bXhae0dx$dkHKP~Ijbp9@aKao8D5FqxhV+GPAGM1x5&XTnqW zO%D4sd8IwVk`U5PaOQ7IyNH%2cJ7|}?`SquY||59+~5%)IyQVgj~ z&Xg2=puBvPRPgTG5dA!D`Epv}8S~MRqog+EQ1k|6ZW(_MdMnRbFY5~6YoT)0ig?Fy z(47XX7)c?2DoPgw<47AE$FB2X@+`F{Xe(nO`<#7FU(@eNOv60 zoh)@+T`Oj2o9ZTTG0x7A$*OapZ3e4BXxi>3vh_Yz37)K_T1{iYP+&WM+%LqgB4DJJlNKXV%XHIib#>)2bDdZ%Mqiz< z&?YolDo^eN0jG>Hp@H4Of4CQO@f&cJ1cz~Jsk>HN&v;PcV289OD; zB*;&5a~`9mw7?oMQ~uX(_C+M(58wvG7ZwLmPZ%o!cr~Jfz+c`^7=_F6=;drD(bdb2 zHu`N|zNwTpQ;ZiXzpT+ucP9!@s{FFKhM#~raVgiorjLF7ab+5peSI7-#-wxcjapbl zSu20Eoy{m+_@BpaZW(~j+(RT!Z-d)mcW~(aAF|b}S0yZ0yX56)w%U&<7-?7l>v$!9 zi(qC!Ki{BFolQ(oO*qS~;pMF60zw>fJHhE~aNXZ7@cn5;N^BpP=NUeAS zV9w^i?&sE3bfhjX1}FIU1V)&QNH%smv92&qEq<$E5#8d%lifd-lQ&8S(KVWN?hxgm zBfozDwMZF>_+{N}6CLG50>4jG8sV5MmH-1K6lrfaw*qrMkyF;*YLcix*wMgf2!4W+ zfx`$tWVEbpq6;5(S)WsTv-+#8Y&OdCNrBXDx3p0G>a(lMjuh#%xe;2UDUDP~gNKWs zqI1gq?J68=BMe|!Dp!3*J+X zn0L{bufEmU2+r9A6x(D(I0v~XiP^mRYI=3(`l0RW*;5HuiSnGJ6T-ftGt3klXpmEf zFU9*awrtDhchd(^8!809bJZn<%T}M`Q;Uz^A*B?l7&1*@0(lw0m;0{|mT#gU3<*!s z(-dm1?)kjovgI~NI7qY)tlx9Xl`_|+79mwGIQ|}?v?Xl~1wNC=`1v{U@0w3h$NmH< z7|i&g9ADAOe$yD!KdzWPO9a^#uP8GLD8KW}_piM61C2^0^g7Q`zPz>DBFyA(RdP`P z>Y^%UXu`dfmziF_9)1x#m}DE54SG|^Q$@;6*!R25MS1(pLsMflvZuZtwIzX_{Y;Ku zM0Lt-F)2kQDmsz=R}gz7ja9CoV};BggQbL`2 z9$sm@5AY2Ct>{73?>aK-nj+bV;+6F3D^liKLY@umsQ67${r z_uwYXIX7{I%f9+=otdK^gvsZ~?bgI!zU6{W{$WCu8f|Ef7XLQ%9iqt%h3fDTm?JUO z1CPc!922UFw_FGw)r$TDaI3u1TTaLVrHGkVH%Z>mEWYjW)e%s6`NWcMGwOINg_rV# zA<8rbeJ%wl?|RkXh9W%PP6gx3q5?(E{{dEL&zw8J*CJ;%h}E0Kbz`|(&e$Xp-~-KS zL%i%C`*Lt)1wqf9JiS(pwunWW?4R{OLD`ftWA*w7FT=}`Tp0cK4hcM#QP&vhudBZc z$Md7hXS*Jzo*OV|ZMR{GO)2)m=q84E-gW0{U`IaTT$F)D*>@6uIi0KvFlguC^CLTr z*Z%-|;V^woQp}Ib4miDvgFijFB?`cG%S4c#@& z&R@#4WGdU%A@muppX2W*Cu!qEZ1g?1)r3_rqYVF89&TRP)PYC;mN_)^t^SSrbDvL< ze$4)DgECzpAOi5PNVu^@UE{rs5q`$|IeYSyHF>bx^eg=wa)DX2|Cw?R5Cv(+RS zLjAe-bX{9^J_mXRoED)*4xUOlGPdnO{gJ7)2R#1ai`dWLYdb}g2a*>ArpCe9Zxn|_ zFfg5}ynsQ+;2#udfr(I}lubLWI8ItrBg9}VmI^1rdCuP>lF&4Xz;(^rCE9!Gngnc(c^{QcdSJO zu!e1qf2K184xk32;w=RNvKtYcd-a7$dfMg6mtCck1P|$DhSOZUU)N7oNWqs(Q%475 zp@b4y1SFVf-7uZry+HMq@BA3|BoZWBa+CwSOQAiH@v$@Q%m%W%}9G z!IO$+PP|t-ZhfV1IAMS>p|i$it6ZiRFjS{{b@6l7RII5V{&tW9)iC zyNlxmyolK~gPp~Vi9OwMX{B|-+9k*~n`}$w5r;Pa-U6c=e;f2@_YBB3^PZedfJqWF zbEWFJc=bZ^cs#lbM=uM&RTFH=uOB&;TZkvkww;v$x+K*H&^!T~r%kd*LS~22#5t?g zL_PQXq^us;-8d`A0J5R~mS3Uf*Uu$j2>oFo|LCm3TeLG5S>{VU`@!~l#q!aVftd?e zPC`L#(X|`!S6`xSt)&e|K}$7e*(Tcb-uBA-e1$OkiUtDg`hFBd6EtD%N-U3)=8Gqi=Jwq_=DsfadiO|6KZrvTtTzT$TL`Kcml0+bGi)^E0 z&d4@NlxWqxlpeoRc>|p)FX9`ZXEuZE&;J9=a*`I!7q-Mv1j462JAAvAqV#j zt%t0o<+7wZ>b)NMO<#&Pnk7CP8k>%{rVuzL;cXF9@@IiO`mb47nF<8FNn_a_*D{+ncb&~#G)V<#IUnv1vF*8VP@PlaUp zE3KD`!o59B_!1q}HTN0$<%p|2s-59I4l^|W}MUgYS`^%9x^6`nkCn@CfG z1o~CtBNR<;ZXmk3Y5`0cnq~C+z&7^Cv)>=C1GDud0%gf(sv}Cwm zi?_34(|9#+zBr`Y`0O5+I=D#k#h3_-!=eSDah%9LcH60ml%(kiXFCiB*EM4>9%gjl zlE%l!z=!e~A=J$tyepc>ok+5laT;@GbqE3pziQgp=W(>%vFIW&`CU)91FnE}PRWD#;+f294tS z5Q}*vT-Hx8k6lKdI18 z5XESxM<=9HXf}RrGp9N><~OT|!;m8DJ7)F0-7y#GPh>Vy;J3mHm41VL9@k^@3qheT z#X$=d-6ws{q}+ZfShbHN{{Sps@CI_Xo`JaJOd-VvZWMHEmQ+;mBsrr^vCwe=QS~xJdVgu!!H!Gw8v?2>^aDdspnsvHV_4TljtA+ z0Cs9P!v*tZ&L5E>bNPXUNvsxGtdrHd-Ci4q5EjG}}CL&#l*g-EN&Lu$ z{Cj4u)sQI!u1+v4qFDMnKu#sH!X;W0iQjIA?{sbiX6BrY%=Wa$akb;-HQOO_w0J`F28xyN1kcmcs6Oh^Q(+HSoqxUjvr@G25AZihirE!Rzh6%He04r5 zPFcl-I8zQKg%_DWnLZvC$g#~~oU14&bLH&knVZi!#JSJk8ETAG)sl0Za5hIIsB`{g zZ=Gpn7-_5imi(sqEi%nqrcE%5)roDMOgatUUXKuukT)-h5vx*HeeuN)$N+|a9S6fF z`Kk7 zN`I6ih{?q;(Mwnz{-aJu4`4{Z>yxb{h-hiRg##+{QY2jv> zL9DteGcYxug{SIbWK7hsAQMcrAwo8%kes+XH=>#y_h1-K`1Z&LtqDtUmXZ0T+le1~ z<)I;+tFhuCTHh|uv^BaiKAz33@HN=jSPg;)`)vdh&0SdPtD_Nuc?CPyEGlz|`E-Ph zPYupapg1=hD$Y!pWm9j(C9BfE?fLOX3;&q)UkCS~4RVsAvj>;A_xzm^&1Sw8^>r0_ zOKF@wh1&NaAo}mFTnW@q?j*?-3k&6$KB$^t2^ik9nFj(NHZ52h zJmrzxi~ZU7zL+<-=J~;TenOf1GBK=}_h`DKY9iN6=KLe%Tf6+c{pdwEV+Kktjzjg26*j4=~Ng$>B1tCe}(ZYociQ3>#1y^=$-zTB{Z!tZ9v@+21Z zIXBdYIP}k&c(GN%XVa(r{kb*`ZT4u(AlbDuA^McJNiv2u@kY>^ zGtWXYo{jqVTQpOM8m@FYNqaH7EW^<(^OQ$aPy;ZsT$yp=j5}m2lns!6ImT=fC|~N) zs0dG!a-(Kb0!gjXXp99VvDr(FF*tT{&|-IbM{dY=LjwFZ?)4<8xv95lb`}*>rf*#P zRvOKvkbSZ2o%t9=ESS-vOmQ}EsPS5|{J(i8yP6_%(&Pn2}}F zDwn^1V_m0o`k(11S~}K&{sy=37VIFl+%4 zRmp&;d|YzqsIQoHc{mf=CxiIl>YT(&lv7FPZd>ZJ=Y~+x2g{1F5vA&l%%{c+R5B6P zlg&(o*#Bf6r|BPZ-{wP`M_yQF{E`&n3RSbP{O=$CCj0jhvP5Mt%Teb)e`ju0r>LJs z%jg{wum4tOGTzXIB9FzrM&yV?7GmJjT*!8x)a;#bq)>I|Vmo~Xhk{Egjq1maRN=h` zi682jL-6@?7&^slgDWeAfUyejQzIh=LT?J3H>c+~s0G|VI2Lc8xmV-WoTK#ZBkyST zE-29Iz4s8sS#RbVcF5UH0A*I>P$29q9)rSF5eBGS*@98mi2{lt{lp~(eYCxMFC(vc zVfrT{E45q%J~ek=H}Y4YPZQb0vc45cbKmwJsLv@jy6j7@hCM8Dl%z_ARFZtFe5dm9 zvb9-T{T!W=fwwFk6G$s7{au8!=wC*4SZ^i4d4 z<#2C_N`?#E23uXoZc_1DCEbHVaCa&Y&6~hvgRFu)V$|ER_Tg0$2TetWJLd0|3&xG6 zUY~6<*06mXO`2eV+*2a^|e#|XJZO0 zuEG9Ab(N5)17pSwCcSarQU31-GKB{{ zMa@YK+qU7iMT|5Cv?2t9EwLFjcr|F#CfD1wB-4rePgBWeuqa_CSm6QrLvL0dFm7sR z2@;{2Y18bu@|8n8O8|bLO%eGK*Y4${uxp7Zs7Tc_%H7z!5vC*}{WN-Q&BY9?16X1? zC8al!vz%xFE43a%nqcD+?7a*z_9jBbI;PuX4qF-Zax{97S_$@d_qAljEFt9p+lfm~ z1kcRA2li}jEwP!6iEg?GB|P7EKRifUd&IwvW26aoubY0=`jtc}e^=BK#8Q37{v(RC z-{NQk-sqGJG1wtzVzX0|?s4sdyQWVunJB3-CoiZ2u^i!9@AZre))5pN=*QK2kQUP< z5C?|2kN5G&PtPNFq5z|@)(eWZra{z?e4d}bm64tVn+$;o@tCB}ZqwqJw+P6%mLCon z{Rkg=*EFv^Uyzp0!D!)DyD{nYd&B=%GoU%aaNdG=L;(eB)R{N<2M`)f7cjOcZV)sq z8_Lw2qMRRLkkI_hL2jo`kos(~;Lzho{u^2a8m`N=G$BIrBFk-Q;_5 z%n~|}2_j&3C(g*FvchxB>2 zd8a@l5MNeq4_+HH#^mZ^&m+jnS>F#1@=bIpQX|-t#Hw$`a~`ELIhISnt1CqHe){)m zkysgTdwE9YFjgU&BP4PSyT|ssUuALCz6kE=7sRf1Y-e}H|qaVd~8VcdgXqb3?bd7xbROK8FWEp>XOne$~#wnM)Du0gyqV^zt25k}Q z4)UFH*}yorP`IpM@PEc=WuXoqTcQyN@Pe`@);zklj1(W-eJ|38EyjtW#j8%eie};4 zRO2i;Q!(HHNpb2r3EiT>58;BSj^z}dO0UKe(KLD93S(3mpxrM5Euc^b#r?><%$(ko9HxnHYRC(1<^zW7JS2{D!S zhZjB{*B)dutR+Pl3yw~wMleijs)f8d^BzMCbZE{g$z>VgQsp|GMv@^BZ8IyDAMy8E zYwt0zqy5=pLkiEjK4 zf}@kO}Ly^R4L5_ppcwcek05SV@3(7>~2)I)-$Q7i0jW?%WbNr1+U?W7_WxVY# zKT}e$oh}3?)j@SJ44;e$E?aY9$s0;Dd#)yg1bvhz*q3UILxLW=os)~UiUc@Sn8ah| zn`e7&RhnL%y?NZ?PlOuyO!>Z63hO5M7;om<>(g@zo>Q;!Jqla66+d;nO3{!}`%;=6 z7>c2>{dW4py?D!QDVCEI7`||B!Ej%_C$JKT8vOJSiaq73M4OA$BaKMI#mjD`N%iQ&~8*7k@J4x~q lEo%cm(~&imF^hEBm$2-m#g!X8Q=sdT=SbcnZ~VXI{{w*D1;zjX literal 0 HcmV?d00001 diff --git a/assets/captcha/background/46.jpg b/assets/captcha/background/46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..739073be54a283c25099acecd54e6e1d250e0f56 GIT binary patch literal 6157 zcmb7lbyO5y(Dou-OLyl|f*`Pxl1oY~4T5w_H&O!9or01J?6QEQupps?lyrB;3Me35 zAHVNA=R4>9^PTx;&Yd~W^V~Ue?>x*stN}>XA!-l+1_l6t@#uhuMSvmz4+jSq2OAF; z7Z)ENkAR4hn23;&h>o0sgp!G#g_((-k&%^C5X8zZz`@AK1LhTYCM+r{$^w#*c_AV# z_*_)vKM)Lje0(B8B3fc%S`juzHj)3eJ#+!c@BsN3;+PohfG1=am}D3aJpjf>o!A)v z$^HNK1Opor3kMhPF{?!iz`%ThiHSu>K#cVS^RWcu2>=s|44X|Dhg{y%N|%DNE@C|G z{dW;+c3iLYVg)^_dJfU&;`&M%>s*S~oMJZK(8v<*AAfCqCN>`NXdjvWC)pz)Ce~wy zo$SB!CyyNem*zh)7-Ub#*@Q(f0EjRjE66a(051W582EolCoS?1hk{jb zzxJF{-fs?W%M^tBIj(Nc7Dn{E?VJZ)$m;C07p7cxUJsp!UeavGRVJEKP6|GMGL5qG zFymkj|BV&y6+;&b<0pkf<1ho9dTS&(xt=KaN6^r$U29P=-k58EXv&SM$aomn;Wm^u zn}WCd9$u>Hsx+Jd^l6r5RNd{8&J{?nLcOCJx7XsCOc3Yr6e=^oEg7%cy?(r$DU^!1M4 zAq5>^bT3@G*Va98N}D}8LHj-xk?QW6y>2@X6S&TehH47~z1k>bl3^vYpjgkJq;TGq zdR3hH7$J$4scV!;9iyLf6P-$mAxEYZS>$G23i79a*OjXLX0SnyJZrC!h|-T_uxdFKYdN4EKGHmth8WsKkR~-lFH-aBmK)($hvsBC6cQiK zKR9H&&kcF8Y(3nPV?%o$k@Sjh`h#=cbr5Z0lL215D7uU>Jn+NI53~~X24W`Cxr{cC5&Q7L5_AU z`B(Q}_gmb8_3aqp^>%yz5p2JS>ZtBPnx498TGwZ~KeSz`t@P!`EhUkZ}-btdj# zW$M;BzJk-7e5&N4IEPMgChX0RGxgx@eBkH?WLiV?9z*la>SgR9sY;U!RoP?{qSG?VAP5aYAJ|>)K)z>HxRQ(oq z%96IcE9DawmD79JQD}wz)s+9X>T~VY+twS=Z|g$HIjgtXA8u_k_N8R;L≪VTUp3 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
l|I$Nd8;G8Z_UxMJ2U59> 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 UoGia@if8~_0{cP`5~maY2hZzk!~g&Q literal 0 HcmV?d00001 diff --git a/assets/captcha/background/48.jpg b/assets/captcha/background/48.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f4f381d7d63d9514ff819c85226f208bf801cdeb GIT binary patch literal 8542 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/49.jpg b/assets/captcha/background/49.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ea8d1c1172e2e22c6dd4a8959d06c06ca35190e GIT binary patch literal 6344 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 V$JmZlrS?}C{`C@pQs2}0{{g=VOpO2l literal 0 HcmV?d00001 diff --git a/assets/captcha/background/5.jpg b/assets/captcha/background/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4fec1bd19afd3b2e74d9ec9f701c0da75d4290b9 GIT binary patch literal 3522 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 AuK)l5 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/53.jpg b/assets/captcha/background/53.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcdd8348594ebd2f4561cf460a39ce6690635672 GIT binary patch literal 9865 zcmb8VRag|>7d1R|NVjxJOE*YLcQ*(FKY^i5#_P z|Hb!w@9n$K-C5^ZYu~JWYX4pS`vX9tsj8t0Ktlrn(Ebg;-!*_T02dn@2OA3)2L}fa z4;P<+f{@_F3xbzqEtbdEqF-QTJEJ9?8SO)gwtlrpB!W0>2 zN~O);4B2pI9k!Hx&PCXbGDY74qsv+4s;?)ABv~G~>!HtQkEa6fYBn4g zN(G`0UuGqX2)-S`M_#tQE0X$rW1p3?yNz2iYD#E=yJJlM5Y9R~_e0w}urf2$g3fT5 zCwp%!*J%FIioqVk>_5w#`-x_<=3C~{UqCI zdwPUCjF!h#eV(i;qjWuB=23u$gJ%1nk5M?0qE$zk4xyJ%_dK`mEAxN`Ym|AL2qwpK z%7%m{@K~6ZCp3NOi$`jCY5KHq96y}+{@pQ+#@XxnXoi&dKg_W<7VljfUaMrsW)QLOHc-r^xiFHyg% z7Xr!zNg1P12F$cYf6f)9@O%%hAAT;*9IG@HdEq=3Z~U3!wAiGRgKT7Nm`}zZvpSd-xT`X`*OVY7l*Y?wuLf`L&9)67Ot= zvg(LnaB{F9lzznL$GcXgtsPF+D4kGA=Yiv`qs4h|Z&zFgziPVUj=1@!@>t!EYunN! zMAyfE9>^c+3;x)CDxx+zINMj$&uj?PJq)Tj$1WQQ9IE49jwU<{-}4iRhb#+|y(?Vs zyK~&TP8+d{u)Rqh_OMB%ZunsC%M!?umdHDTNP-QP3n^goR>6VBX-j`r)9Cb58|8N-hZkzYy< zU~--S>_c_3QOg=z?MnQch3r&hfbD8S_E{$2r)3-lqMv>^2&A`G9?E$4bo8f}O&wg7vdbmHecBpqqF(04IdVIXVhHjWfF}kS|%cEmT#-{PYX_ zMh^Yd{CSF>2ZE&lH0omVOT@72{u=CuI&5Jh!3xYLHNaEF00Wiu*e(Y(?$(Uu#*^wG zJVEFEyk{^v5j?eXz~*F{o_6^3v=W;t19NK7Ozqq+iyif)e50zGE`PZ-@plQ4jIlj{(>?DE1K%gsy~nVwjSG zmLo=!N!7SsU2%v7nf7VXTwwEMtV1zDbI`unQnC&)@Xj(*giF2m5}`-M|AC*!986`Q zBTg4J(EeS0ZzR8Bcq^t_p;s7*5#%*VBHgNKSx@W@%Q0FI6q4?j9D%E(zH_C(BGv*1Tml(ujl zr;E>-=O=l_JF>8E(+>R^)M_%u9>CKcSH(t-x)`wvrQ;D(iRs9(JzDfhZaaMw4kM!J zUBJ6a{Bp5|Ew72gduE*lne_g-duI%RY-Xuf5bx&W}mkSJELBW;Y8W zf@4u~9-(6ZazgPPtFTa+m@-?U?ES3-(Pse2$!LU1 zf?1cw%ukwb$x|?;Y;vCM1u2T_5u#uGpcEb6vxM~@->ctjN+(5&VrwFyE2lb=ach)I~4qNtneav_dx)qNOq`!g8J`gDuTDYzE)jMklv<|a7<(A!P~ zQmQM?vrH;V)E-M7*}geRG?I=h^a^4_S-ueec>JD2_^Ovt%By9E2OzARp)fhF34Vfn z=$N2obWDg_Cz1o@0-ac{e@JGjD|YCtsQ;5WdhaRV>% zxh5hHLsj$!ofpRGZwBncQnk_g(@4ZVy9NXa^UCWIXY?M5e;jv z^1;z**P11}{}#I#enj4F7#zNIhfm59fM3d_52c@VCu9Ss(=poYREF%XsYe6Ya#Z(1 zxf`YlzL{$9bXfr7Skhr6!=tx|dFYZ){l~DEHVC5Ej1l}M`8GGSVt6NNArVn?3F_3; zY|P#h3eE&1fA;&K(<=e`k36NUnKUsfbTmz~Pp&Ap3-1Qp7oD8&75rXSDYk5~lnw0* z!G*to`MeRiU($e~qIhx>?P>yR11ut{IQp>o8oA5R?$pJ5MhQ`q?W;O2830dnX7{XG z&0$X(9aaUXtlo_jl1!IGrF@7MH~cv&FGjzAjhnGoWi6?jOl{Kk$Egi5UMWVb;^L~N zaIqPspKH`%10Ekv7+x({(yV9zizXT#)x^GZ4o&>2nN>CJkKz684#xiZzwX-`=?6cV zXudSQR(yfA<3D?@NU$@20+sWxgujpzdrR-(oZQu?o;ZZeuS}ApPUbL07h1lNLw^!y z-exD0Addw!?Ys1$9{NypWNi7F*<*RmRZpV3<(Cq{0>z+lLkGgNjMP>_72*(%A4%(G zB1Lm1L*>PO~tGL*G*?2z}fe%=1Lcv_&1?S%6rLtPqmnJyh2V`-lf#42^;Uh{ zm(B|8v`61h=E&EdyC6X4rh-?Nc^j^(%|(Z`*H@W3W-*Ysi&`||JPu;qEF~ZBdAvxb zVDt8r5FVXScX#ap7WPk5UW!ALlq2>J4({bf8v{kxcj5cPs55HLIzO87i)H%25+mL^ z!a#$H8E)x}A+7y)aJW6+-6?ysXx!U4i!iLT4KA*M_;y5{&#nfeb^Zp|edBA)Ssl*8 zE?VbOHd~TD@CR|(DLF{%H%6uNOkdW#1hx{oGo)#Wv{^oC>X5;T7Hw}ZT5?7o_p5^F z-rA17#Cnpiksrk9QPf~asoS|K3u{lW8#~6gVZSXx;)`-oddoPzLTRTZz5U<|+Ouk) zoxw~&l!B`}>D7d6;6i^IUG$ade_}Z|xX{`h+BjGITN^7s*_JUgmf0Ll6E0jFZ-W|+ zf-L({*-Vm&V|X{OX*NS!@2_8#6T^hkTDdd;L;p0TA#eInN(vmM51WU0_wyVa*>(LI zwlwKwZGk(3Fz7r_D1TvX?0XkLx=|E?!c*{qAE$TLmA+Is5q&kd_LMhNb^b{_Uq8+Kt|32@AoqKJY{p+efXcyz*$t5Ms^dPK-ke5odyp%G*kSp@xQT&V*?BpSG! z8M0zc#dm(Ex}sg=LqsxDJ8>NG)g){T)jI~^(>|}c&gM?!?GP84y2-ihLZ-?p(LnZ` z<@B#}MTwlMhn*v;dYV%TJCh?O$b8I?46O9BN-=#8*FV&y$=>9C2t8Q`u}A@e)XZ+c_BZ$4gJK6t53LRQlv_a#dZ=IzozUl^_}3Ak z_z_yJz`+=yN@ZHmp_n|_?~gC^n93Nt?MwXepW6_DrT=c!zTb5mnE!tMYIMPhklXpd zvmjKN_LL>@+p0Tn%WJ-si+bsy2NmZyo-Z7+qqI3_bh93I`fl%iRX2mQ&|sz`AfOK8 z-sZ}Hos`|6+E{_o*bNKnpj;LMS^}(ZSb~(u&&0A2riNt;{CF@W!s}?W=>Ekgw;}=C(Ze0`bx1~CPF}6d+lu0P)REBB(I9s=Osy)s~OCSx0ceyM(|%xa@y-1FUWlMe`co9 znTCf8Xny-7A#6Y;s|7!aU|Ih&fOAv6u?`Jx)$T@qj7wJ{8bZPkjC?483r{2 zt+B=>A33k?2v}#&>Gdm`yEJoR^ zorz|69F1N+haOtBO(fLyh}*_3=*y+yD^fKYu%v5rEI0r-@%+i0RL0TC0dI~`(wliJ z<%|}6*TdCy%Gost-|cn6`Cb;SbyIcIpfQ;_y2dhEm+T`}tMb5tm&ypk=tS{rdyNXd z^eRj(1$1a6Q?bnACkX4Cx=NAZg$Veew0FsOSs14+SqU6oaD%{weaDMG-dd$fz4@oPX$)f(a(M1KK8apZYmdx^c=^^q@(6No zolY5$?e|`tiVgx56=xmYn0a@_?2bAhw8A6AiqO^%$`aJ@7J$-F!OA-X(5}UC?SbF& zEU1s`PAO1A1qgd}+f~J7p|UgI(#zOhl23>#GJaev>zOg~amM~L--WGCPKj&nyx!!= zADcLr*tHnxVo79u%H!%52can?MPv+HQd&~6&qHLVcg33zKum(wqCa*0GyN)Og*6?2 z(DO)|ee`OO-@V<)9j_)`a@UY4eqmPdmV?q{p)+xd-pWTmU0)(X(-{T^k z1yKrta;cKZf!^&oJ&Db~FVxeKNWMf`!j(y!MUO9@LEVOAtRwfz7@7)_@k<>$;d0XB z@3rluEjYa9FNNu0#K7S)rdYydByT1j@L(nt_;pF;F^zZraPsKt<(pqFco+7@wkPXq zXQ(v>TZ^=s>7~#VBbZJ=<66N}m*;Uy=~#nUgFl-m^!VPk&%xaNe-zj2as3JHJum{05eQ7tP-5-=h12Xa zcvnq`)Z4qIiGs7gp!hv6#P#51SHdiTw!&y!Rq{L+s^ip?;R7Ao#y8e6H-C{-c2*%> z5t^Nn(?6A|0Y5b_J1dnby7-&mFY6ir97R)wJu5F;c82f<;TK;N)^)N;;<9ugJzR2Q zC+;<0J}OcKp38brBvuF;kLWRrqZiiOOopsqlnHOeGpeL=!{GuAbGwaKMqL1X&{X@I z27Q{9m0^&I<)L0{2e^{7BApe#m63$MjHnQ5bvB(b*W&o&qW7Dz2fGILJqpG|8hjb> zXv<_rc%llwpxaFMW7|W!4F+}A)xLtYnO>q>? zS39*gA;rcwbKf_T4e}S>kr7{&$pIg@VEtP1cbzHtSK%3aIje5%7fV0N?GTRztQmkW zEGZ{+Q3*InaUU12DyRf^6JM&}?{e{8pXzz;eOR)X54*jIuN|AwS(u=-ObKP#GxpzJ z{|s!$q=0`hICon2zBuV0rUJ zMNL(94a>zS8&mRa`YmD|89R-NVH4?fs}IvP&FDI2eL_5M`5Q6x%V}GXCNg`C+tL!o z$MyaNv^^50w=y!T=;%I8M?Nra#m;^x3`mg~M{scQG)m?hL;$0q?1)RA3cR z$;?9pa@il2*xT(a?0;?ZMReh3Xrs7}I%UrUH$f}ki%X9U^nbqXruT*OI$|VrAElLsSf>Q$vZAOsJWb1cGMU$0{B*}n2HerdX5ONq z`8(L@r`%-(A42zSR~V7{4u4=Od%^3VGYJ8E)FZO`YP~-<)4R3V37Hdql&tw6^C<9Z zS|X{hUamAge*QdF&O_9Kl&OcgK~~K(cETof+Z8*PRh8~EJZmWe!tAXx>mwTuPT%|s z5O@mjxtus6Xe>(izVzNj=7k|GnVe7F!D6IALDf>xIZ(#Tuc)9Ac%u!3SraRwn% z8io=kg0YE+!?=%5`(Z6{YYL*Ywp~2Dji1*Rsrm0DQTb?><XmH9J=~y-AVPs?e|5|V=&h? zFTsAKWA!sd$%S{*<4L6qX3LJWLqZ^Juf|8mtBxDs=*VAyJ?e;MTw`IqyNOW4V(ufG ze@1}n^Ok!qavF!4gSn-@K2uD2uF!pRrMkHaF#>lg`s~7{s4@l)`~nV9A2_Vq(VDMs z#EjK=J^ZjNc+EIm(|Pn88p84(y`li$q+RCnSdX;o1pVOM_+LPc)wrFAxwhvcx2!`% z=jL)iOIf;cjw=tD`CNP?c%1*&{Jy9>T{nau``xgz2&!V1x~pne;^z;~-kbM?b5)Jn zU+-E|Uk4Fi_T53d^L#=UPFXW6-Z`Xl(02wAgBWxkq$Aq^`b1`*RvP=fU{t?WXRxZ> z13z%lebSk9d`Lx#Vglv;THs%V?^~>2&qzw@~&h>Ct}lNwRS@ zE1H?OKMqcr?_H;)n$w$Fap7_HZ(mMYgmq6PUDnlzQHgsnQX3=h<^B`35G=~nK_Zsia+|SGIuGOjgg<>9!up8HkeKn8(n+fMnm>r+{z!Tf0AY+vRL! z({+35la>Dhs81$kgrmQr+QK{+t5u^k)zjqd94XiX$Rij|r3PQ9kc!2a! z+b9>i7fA+aU7?=V_~c41!GjCJq%BS#*`Z|f(Fcb==$8qxKV5XNAdso58J59bpDB|* z&1o*>xVR5VkKv`7s&4TF(t-z7aQ`qaMyj$CD36@b>jNYuT^fR7ECX%+qh!>!_z=&c z)VUjSOP6zb)~~$(ZKu?(W5H{b%KF_1zLaIO3ZYEu4r0}!MR0`7WP5kW+c{5I99g8@ z?2V^h*5pdDSTP5j4ioDNFcV6-Qm#}qodIc*$r-xb9ysKc7v3#H2cPMfJV8G6Etx!f z%tRH!5Pjp%mJGyuetHA+`U9xJ@iaJ=#5+Qls#u9X7J_x~G;x{wyh5gH>{so8NWV>+ zqYrAsX^B=~Ecv)qeErP8#FD*Au?|RPZ@&43v?hru85bTvUr@B9vWyAtL9@{9M@w2a z#O5k>U{liphBB%+zx1l(GpXoof#Juj_Lz@n5P2xLXzlDF3Rwbc493HTgREkQ+NH0t z?`7}vHaIseY5zchemKAhC>@`IUeXt6(tf6Dkk@nc@ws#|d-(gj6~P8Iru(M3aG|bq znN2xVlXI$X5Luj@^|>Hg&k`)u?IT2GRIfr})~8ld7)YsRi@c|6#?irbK*+PR|6C}Q zTv2N!?tEq|YMtkBHkA8Bld+%9<#mi0BOWJlpOkgqN|$yco0?7dDIMheXfSe5GJn>y zx#!vAJ|A3BlWrsVMBDTR#oR{k{=HC4+WV6Oo)gbi-)-4R&SR z`O}9`fO4i8Hd$f4I0*8!c`epwh1YO+yQXE~j=K3)cHo0VzK|3%z*T>h8bY=?a;`R=wrEcS* zHxn7rGg7lXfpnz=y2a+FPXbj-GJ-xGc~}ziX|1pk=_VY{BBTJ?pFhhZ^V_e!emP$I zY8CBQkfcBmZm_fS93eB3NH19RBFO!sL|*75e1l`yAA*;thHXo$?_5nR-~Pu0&)={_ zQ?I%>J5+Arr<;@VPY3lx-nSLx2yTRq7*ELUk(9d?PdslOa5OX6%@?<|5G1VvCv9Ua zAu1+pgT@OLMV=$_+yP@jpAs)M=V|Bf3By}G_dnG4;=kKQm~bdvzVE_F44QdbpdX!I zUd|`uNeLwZ$J21A<*N~N>u1Ux9xoSM_AY7MmKRsXjX0liNTHclX&PSw{+x?;58@Y) zC?0v%<)3$__zchGd;48O@qVNSk~W=n*Z;y)^fDzj7klqiDmOKFQR}~?wfOw@1w|n* zv#aM9Bc>OY?{)EN+3Km%Z0MFk!1EMNI0F?!a?9LcN%NtonS+H9Cpc1S6Pe z@QQrwXl9Z;v(_T1M((rYZQwdrQ7e0<%MO^nEq06qHjhdYt(k*$QOxc(pl!L5DmXg_ zP;H`hAe_AUd1szi=jp72NcGHpfIqU_BXpMv2_y$1Gn*;+EWX*mPz9i=#aU!#brxcj zjoA-6p}3s7ee{K*F5{zQ)@{?JEeP}@S+p?4;;|-{*XEh+-pcv?!8vbhP_t=vX>FQ2 zbR=H5iw1>TNjo3jp>KSc73_;0-Ai6w32?=>uhGopwvn;4*^6eO`VgUkkkQc0`IGEH z|0hW${tY^93|z(Fy1IH9{03qPKU0O0V=#&O9@wk$ty>8&Q+))Dp~}1;N7xc}$UnUh zLl?rVMrCt``!(c5Hs_5XiyVhNUVY})8{r=Ns!s5q*$_5;x?-SX?Tld??^rj;_3)(- zA`@t=CK@RkOI1=N$_dF?8oVlwFS)$GF^j3%QiC(Vz3@YO&?ATfuFT#Zm_LzM06#o> zNjlh=hwblgl81*pR^HhCx@}l$$+~Tc&fAI`pB&I@d{XfAF6&xtkPz#vG`*pGjnyc5 zM9*%iWw^G}mfPgjS2F6}df?uQI^if5@M45;f9l)fYG|6RU4WS)z`q;%X-K_wF?^?H zXiVn`Kk8uy3HFLG2d*1rUk=Fp{?6f%A%;`OFkNQ*{_AZT@zfJN9Y}zT;K&R)qAR(s zp9+Kre*d3|xznY#^wD;E(6+-@L);RK;)J!lqBKVaD;S54k6WZW)UwK)S~M3D?jd$h ziZ*@aXH7-DQ;cs!E4=?uqWW=u%R|bGI)$Z-OGE_D0szH%zDpgxQv=pxKO#sEjhWsW z&uvRo#s6+PVSM?UtA4LvGqeIs+%fd*eup!wz76CsU_Ps<);n}Lnrmvlk}y0-ceK|o zQjs0y1mMOMG9*^X4IMUqxozy26)7ze46PVG7>hQ`FJ$E3oAwGn`3{}ItWBCwWAvDB z2m~$ra-N@2wu^Y5pL;X3W(fOKVusNw!iir;2z>MSufFrb%wFi8Q_t=PH@(NI=x5HR zJ^@2nAk$w!X1Nkb`N(MXo~Y-f!{FeFpZeb($`@1^udvaifr9OA)zF_7C^rD8)x59NZBy*&g$*~m|k~?3%|vfu+U<_MihyxK6G;2@~TOy-Dp^%1X6 zi4g1D_MkFw*heHN^F-pICo|v0QeA?f0GP4v_0kQBF_P8} zlI^XY#=FzKVrt0D6C7nOrd3U|Toe?$r86oU>m@49UQ+hFHV1wk8>UHMA=6;()ZyXb zzWZbad0TiabTwkD2A?pjg9lm+OUAQ?Fgay_V>v_yGSV%@dDy@QgBsGA3s*@X8~@df zF=U)u(4zVfrjps$RVR71o9Iw==e%vMJk@dqO>WWSzQc2G>C3a47W;VW1GjAZ;XUXH zuvF}4)2(IL+%GA{%LgQt04dKTQnWBfwPM-EEvty$@tzV51AgN9?@2w2W(KM}0(2b4bbM`uinVWA7kv`P>1hl7^0%^a?jg3azro1!i4tO;x$=jsqf?*7YCPQS3YL zZ>Ik=#~OM{x8ckdf|GCqs}bE;c8<@|a@wtu(ct*Bd`X548Pak&m|ByfkXdd-_BC15 z^))R_$*Hr0{Bf`8Hl|B<#{FzyQ&Gd%nW|R|* zmomfTXv0kN(lSu5Mv~`V(|8jpNCAvs*qaQex*<-Lqs-R_6|Ou?CfkwMRPlmHt7)K zy(1+0@!8SUBh2;eLNdotcOU*_Rh7c|(lG8X<{{eM`0^Sw{BVq-1^= zQzVT{gG^@75RrY!=RM!~{qgy%BmMM zw6(RR;rd1wH4W9Zv^Dqp(i9@5hKB);X0eFmgvUASY#=QCa+9k*BS>LZPKBSIs@l& z%P)cgj6g|~8&;hE04BMg8NIXP1oTTa`9lUYksA0c{B`;35VDlfO>+hGEo92wzw}Ar zJX2n?zS@~%%PV#FtNq!}qe`R};-66R>F9A6{}hzc4bin?1z1A5^FXxznAsimP^=MBku8JXa0zuA8ID@y3*H_1DlB*(rHlEBU z-pK#xM8QhMWoRZ8MPy%~2YeWC1?I1(4t$MrL<-3d`BT1kuWm|IZP12Go*hm%eSAU@ z%s2vg904B8_15jtLwdG#-EQ;a_|-HFa{f&9p0dx&-cK)^%_wP6!!gP{w?huEE@>5R zd3VGa0zv2JEp5sUt=Mhu3O!=?*?tlWgg|2^{Y#Vs7&#FKnY?#RViF}qi78`1CJ5XvJxz0LP+jPJxE z??pXHWbI-uDXFv}k!|cilVCw$z+VlBsyi)8mKLnvMQ^(8vQ~brj)sS?#YQ%?Y#+LH zub)M;EB=Icp57losq6HwQrzkk>*Um45q)Q38N zbQOURq(q<#%c?g|X%eG)-y&-0=CbzC>+2CKa|Wa;EoO`}t^7~t9`Xx2urhPB)7U|( zVzZPU5UeWD?>*6R^`IRs@E^(7$bDAf`?Bv#4Ch@$OV{4cprY{5fqT)Pp7#Cc;B>9^ zgT)}Y8eh&&rq;GtL|yOd$3M08)2&w)>M!-+4l%7+gI&_p9km#n;d5*C_dke6)h}8h zmfu_pi9IQ4jHFI%O<0s+4K5lvEm`+|Isyb~#TsEgM-QO}rwiCMT{CX?UXv#;BVK)7 z%ZQ%n?QW(p#N|WDmp>y2Q$f8Y`&SZKTLSirJBWg&p6VcmN2ELjc7wKb+WgLmE$R^D z^92F&%KgV@{xptz#5M&O>@2|b;mo#VMdt`CCfhsN+?cH_QDM>eCD(S>T51?3)l?m` zu(4EIQss15SDEYqyWWlxNQ@8b<{U`xXl@K^H~yY9F>2PLIXJb--j9+gq(O3Z4ozE& zFQ2x^Fgu_x@lUsHTGfikk!CZ>oJQ^6OqqDOsK%<4RYfh76}Tg)0@b?XWf@QI`p-Dr zVP&50uV$Y~S$My&76V5vIeoc%uPUpo!1}&JDdi3sfv7uW{zW#u!KqO}nXiLD7!NqG zctF+PY@w&G1tN4H374L-NC~FCnDEQJZ-xy2S&n21a28t0FF^*-1BRNw=G2v+VxKS- zjJ+3!bcLN>0>MfLCOyA%NZU^t`CDc44y#uxgE=nFO1p12aSZdQ(8y{h2bNfF1Gky2RTHnb2p>%4V{ zsn1i*!MnD+7al@>H7R8i?M*~PUGE8^UnbqOaM-zc*We!E^!#;Wz(GY+p}tn|mWLi~ z@ikz@My`8`gL^3Bu-7TH^HM7QMRfOcfXg+Nw5g}xWu)VFf55DG{Ne3IQ|=J%#B7A! zpjV>wu-#wYr{VJ6hFs;IlKIzZ)w6454<6ah1s! z*8<*}y& z1bVb}7${GC_`Ud+($o<^v)Lgz1*S;9Qy0%Y)VZ1S%)J_awsGSc&JF))%EL7(?*$)u zeZxv}+WK_`kXXk*?zZ;h);Ekb_6gEFu)YDVM@zkNTG?t_scE$7z7+>I zSV)VN)}TxGQ5WeHU8;-ZhnpW>HLl5`z!?_dBRvX?D}3kD@5$QOyn*-RKmBRY`!w*z za9i|UpnUJ%#+rBO3WGOI2Aa{DGgTJ1&^wu?U8vR! z{sx(|3qJIFnMK?~4F3xKnF+>#gAZ2kjFWrcJmQIzA$jj!AtY=Hi;q;{|`Yze6zov!sPu_(#5 zy|~4ZgKN95+vmUrTF38mW7z&SjJ`I{RQqrQ2%&!HJ_0xfo!?Kd$9+*AQ{-$v7%b4; z*R+b9x>V!gS4(o;#V$-E9D@qfV?K@8PY6XTF04N&SoQXr=&X8JpM2DY1o^lgB~VWBF_yUPoq`I(GdliSk7 zI30znR|>3N_77v9h{wk-TGol`wEy_j?4vs=^INFq@8(N^B@r*7jdLscRe$nq=4f)H zaR0(9%;KS%x(6j6+g)T`RKz9}zBxqLGPe0KxZ36mNfQ|!xZVj-rY}+F0Hv~F=Z9Zh zG_OiIrHv()QLO&cFaW6aU3#|RTq{NUd~12MN&p5N#JT*$-<5OxEfD8JCh?g0qKZM& zn;v@X-N5$Pk@*yxVEtNLvDY@YQJKomCyLcPOVdss;g^biTBB;{xS;Z&)!Q!xj*4OR%-g^#(NwxbDA6}I_KfoSNW9*R&}<` zro`pZa}yX|wuE`RiISV@HU{_DJ_|PycJibB(>kVzGeHl1(macrO#YIu5N9|N^3KFY zFx~Ey2jNLXw%hZRpfvF{7VU?bC;SMYS~f@2Vxal0HC6??hCMElPwGBO6qEYFaE`rM&`;Hubiqg(#whKrHT zv@3(*P8svRA%|w=#!({!if&&`jsRiyuSu|~!xxWgovqOr&0*&cFy#V<4w<;ae-r*d8ysli)Lw<=eohd0ukm z&D6|?C7n*q1369Lj%(z1)X<>~6o2 zZQ?9lgzO2HMGx2w#mhW1YtLQzoDCv4`OF7YN@9PckjznPk6!((?8twBvMdCh5l)S} zdy8neb)(*Uu3E|0bN}tbNLR6kd6hY0R=*S9jU^E7^`%htLH;g3RP#zpA{y>n^eT!5 zmKNTe@Y~io0xU}+I9({G(WeIaE7WjKTJJ~a3ZBOj`h1ywwP+f<3d-m#t)}JV9t3P! zorLYsYH!iv(mrEbIiF%jL#b$2`qUe{yJ@Kkt!Lylbs3-$`)kk>U*eZ$}V zVUAXtXBbPgZai1BNxxd{&zX{B1q61&-dumL3eY;=pnM~{tX59Gu{k>%O3o=2v~;mS zhIPpige;?)B2)(;*1!s9>h#T8d@HVlPd2N;%=48bG12yMy6w<|Wa=`ON3Okw^RLy8 zvkta9&faHHV7-zm^SB0Q#K&DuAKZ{5oMv5~);s&Qp+7v+-Ict41bCP{V%}uNRt}~S zaCr6cZtCxko%nxR9A}yO)8dh+=MpVR*;8G%#L{mcmK(n0-ouc~_aCe$QOMj58X@p} zC{ygitw2{tU*V#gmx-`BlI7pe6fEu68a!Ekff}AOKT3TK7tP z38|d25D8LDg{Y-^4d9!GO|?Ofx;C%kPijZ6s4!dL=Ug;a@?VZ#vtX2GQM?WwYWgd; zYK=kjqZ>#qd6kB(`4-qu7KwT9Efp2ABCYx6zrIfqi(I(I^t;`h4IO%2;MbUusUS;^ z6e+PCwq9mFQ#NsZQJFpXC|~uQ!&Q~&sJRtD13y=)M4-C#8_Yr zmft92B;HurB0cilmKM@kS*3NCPnmhp5sxr;@Uk}b9;t+O7D_r8W{@LzN6+>3f9#Q@ zOZ?Ilo$L3y%yM?tQ!yIiy(e}0`i;;y!TcK^R*=4NS z+|_4Dyx4E{IlC=43yl3NEmGX>fAdBHLm2BI=6AKaG?Ff16sQh>2$m_~V8c=gT i)w=cO5v8!%_s=r4MTr2uL8HU_g3r0YeArO4EeUdzId6=)Fm35_$&_klv&Okorm& z5TvOz<@$Z++#mPno&C47^UUly`)rxnyDxWN0koQGa5VrB2mk>8HNf2pKp8+rLPAPH zOh!sdN={BjLCHWxdG8)2GyQ!U26h%s4t5qcHZHL6BQ6k>hmDQ@83g)71O|g~K9ZD` z5S0;r3KRVw5Fj}@IpsY{CMqf>QEoPF(f@C`>jlt}0rG(2gg_90fDTAV2fP~qumS)C zguwp^_x}nJF(Cm707&{zDMZ%zb+bO0i5dJ#q9`+6X2H-=CW z(GpA_k5YsF%v10QJ?z0hQ)VFG|AqY@Qveb1KNTMxfZ%`SA0XlXdIkQAhg*b@ zUXe%-BzoUk>8V@E-7!;oSP zj2Y=wR)%SIB=?dGzcD!Iyo@JA2d5(oj2K6uU6qjE4Ld2%!Wcu}QM@Q`gV7fea4Wti zRDiw~cp#;pcPS41l)OEjtCBM@R5qg^ZY7f^a2H|nGylT6~(%&4|vq> zb|USLd(INSg9c1I)&CgdSt=%eD_`S)LC!Bj{@(D5u17 zSy|cG7B{}UoMT^!U?>dwF;QAqSVIL|Gt2C`LS6_MlqJ-vyblrb9jBpOn$3ECq_iXZWSyD3gl7elL4zkz}5@t1m%o@!Ip23i7M_?%tB!GQWdz zg(b|AlUnVuAkogn>>G#nZ+uzZ*dsvmmgyUY8M}LB%sl_Y^Q7 zvCIKA`zPUe&0z6mfR`zEf$?h{k|!0KhkA9&R!*z%uUntEQ)i6wX74Q5i0}g}Km2U&XX_S)MRK2M zPNQ}y3Xst-%MN>6qpJR8IWkm@^YvN>a|rnUkIA0r$_1A%LEJwR8ekCunnap??<;XS z@(r zvC_!Jxmd+BHjoix&+!WYhkKL2Nx~DIO^~)F(^+~Ill|)0<<4u*vyXbsW($R&Q#&H7 z2flN}6LoSQyxLBrr|8(ez5SgP5iYA%Sc-CX6CH5J`Vz7F<~MD}NLr7(muf7|b6y74 zNu~e_s<2)k#62s|GJ)PH{vLk$;qXyiz?PP&T{$SnhC#z&!0_?!CXw+VixpoiB8=ZQ z;;{no3RjT)Z*$HzE=+S!B`MyiKv(<;*Ux`xm+~}H?ANok)^N%FL8*&{8}R+Yz}9a% z22L9~P+xKul-i#=d3HcwmNgjb%&k%n!h=awEb{+^|HNnu6+Q3*sAaYl9af=bD$!mqV6`? zP#hylmNH!u$@f;;VM;+rViiCG`W#*|iBT;rg!i=0Ad(TnZxsoVtA3ZQRG@rHj5nGcTTldtWDj-vPn5rpa>Z z54(3^WK?2L65{czdz^ERrLe7dEv5Y@-0q1JqrxZ6+tayta$>{pyrb)6EEluaX2-Hf z$u4`q(-Ay+;ZOt^^Q%6^Tmi*hi4#Da67`mODXBVRU5(gQ8Mb~}xC@|e{(EtuxGi3vJ_ zRx$wksJh#Q!^=0kPtF4(>S*Rm?fEZSm+$L!VQ$dQBORpBoITg~1d5Dx49NoUcEW0hUoIP)4a%t*t~7i@3OEj#y^{1{ISV@Sj7;9iNo z>pY=N_mZZe6l*+GSFMQZ-B*G_$oYEICUhV0XHVnlu1y>TXl@T}Qnkb!?8MkAyWZ8|6qYEb{=2C`!Dj?2 zsHmsygj@h$J@`b6k?A##^r{#PFE8FXUQwTu`czF^D-LE1BArp@TV-~*vnI-3%dkc^paIWe=c%DJAdESKhxeUj3Uh& zv*?L7<#A{0b4dYces~R2FY%9Mfbldf3;NdCVX6v%Bu6v$R>v#$ zI)OlJ25&~1b!8QICu)#*@kB)w#y`DupsqOS=t{`LQJpcjyRbmH=fUMJXv89%>7iMqjFUA3_~H8M6C?`LNm_Vn z+kECBMpAe~H$QH6-ZdftAQX*_8%!T5)5T#3I%_P+q)g7$LB7X7IU38~{jgbGVmfvX z7Q3_~){*&7*;oKj^@iu7QKWu16K<_*7;0R7>YJ0voYAi{fL3l@~Yiw-FXgFhr zIeSrG6*@J!Q`#Zqego#U-PK zA!F-{p41kZ!p;>o-3KVe9rfi?uBe%1IdVcsEJ=ics|-3QT_=g*R9p2I^GcRL28`e% z?k3gevo2Zb5}A@H-F?WR*^&rt6iBCH&dh>}0hKf{)%Ww2_}~6fM5zWrhyVlr#D(BH z*0!<7AmR~fRS_4Np!PjOtad}|5%b9F6jXbQoN#s?r5|N^0!MD5 zeir9fnh;N2anNZQmlOc4l2x-9Xt$D+waN^Y!nNTmZd+>4i7UNBZ(SzFE_vJN(f{s| zUAFJ?l^7%$w%sOEQ9z<(-ODDnWFqG|o%Md{h!EPqnyPH3eI*oDN9$D-RE&z}#rV|q zcCW(D!3NnsN`;v=oFx1Oe9>&fR!ySc3@?u!^~l6;WbdAAJ1i6z!Li8Lq8`)==FSFRHxG@Yq<}{IMv}q*q!*&i2f= z(yz5tOn_qhJa`v%;_oTlV6NxL&qSpyi&tM%Ujt_)A{{r_Cve)p&NM^V$1 z)Q$2X&lG86`F$5x=LY{f0Lgn&QT|j_O8PSPcbZoY&i@U<`@JG2X9knlJE-^WP()~KQ>N@~>e^7rWYy79&A*u7N-hHj4bxyYgO0T?hV zdAcpP^+Y*Xc?4vt9_{>u?R)%v;QGck~eXGP&0*Eixeq26|6^TjKJWc8E+JUKa) zqpBB&<~4{x&5F6l1D#emmw4FQ|?rwY-YQM&Wf4oO`0rD3JI7! z772vPPSV6^63}Ibz&D2-i9$01OWO~|1n@Fc0Qu_%w=KFi$KL8B0*$p@=;@o4rPJgY zh4%sxuorxtsJW>D_U_FbHo*pr4}m1%`bb8kqorU2=tVTRHBZ0OT>knSD-AWgpnAt) znf+aXkn^KBp3&vR*4)3XhHA#)OrP^0#|^+|P`kz-@?hf&i9c5BWmwA>6GwSIzgE_y&e{$(kr?GCL?~PQ%o|48R#np$p4l4z7uemMm5qi~V%f`1H+tK24S;EVgHb7^3H=(sORa^c zaeu6?i}h9IMNgOd^QndQ>9Rh?Ms_Qnj#z^##?8%P9rc4odHEf0xPb z_U=`}yx2vu|BK`g5y?GfHWI>;#!f()(4D}yPC4{0D{gkf%in}LrPeIk+a7im9 zE+!E?K?Zga!{55Sg+qPaFY9|YYk0f~N(*~`exQngKRi|RJrU`0P(!iA!a?b;Ee$!E z&wIw>_dk+uDAeAFJ|!eF#?N@ojjR@FuJvv`r?d|N&W~D=gjJ;Np*`MslihniN`BE_ zG1tt3IS=A{Y0vA~cqGBoS8NtFuVJh2_+k2#MG;MZ&Viot``*j26fB;8`JxIar*myRDXAupCyRqf1C*o= z-82U6DlgjPUafux+l98o73voRRe8rTc$EJ;DM*u#-iB@^)N`1eG5v{S%4nl046F;j zbm?HrCvV8fLnc68NmT8g;W!xXb=oce_qFoT#fOI*o<)6Q>7vTNe zp`U+Hu!DiDf>o&+sN{{eC4i09bj`#`35M047I5~NL>Bex>+r@U39}7cw_}VI#Lonk z1L^u&|HM8n_&k@GP}W5CDeVY-y3CtoVi`}u6(aZRg=2v-^V(w_jT^OZRJ{ zXN@%Hes&%(AyS20C}-3Yse5mXg3Q>3p;zYL;P1Mc2#;E?&Pu@90Ah73L|@J-i>m71 z(%$I;;xW*8Y+F}Eu}$130Yk&%U+mB-kvHremi8$9xD|CCZ7AFA=u_{ix8#6}CUAZq z%Mg3p5rY6k>(MC%GtXq&lQ@Z(8lV@?R{g_Pl!rfu8I{wq)HOYW>504!WoWqV^*|NJ*-h#9 zeRxwOZMU_s&hu1vAzy#_m08)`v8~NGWsNab_XxH*XIm|^-l39ZTE z_R2O_yLkHWgt%LTKD_x)O83S9FJb%kX2bcxt54SA!&mx){5ko|UjI zb76}SY*51(VLc@__|wkK(oR?XR~Z=$o5X{sYyswY#_DCDPdour*03p$MkGajdWdYu zp~v$tdIP1V_oPz9-yc9GD<&r}tifS{V!99|1_B7S`~_dQu&Zlu8V|omPlcub!lyNH z!TA^;o(15eJAl#-TvOoTsxse>;3UfP#VJ-KhtW#JQdNv?aUzc^GoatoPY7(s^y@4!J;zD0ALLe6snlJKfY)}epV$9plcwvhVbBOeJkqOCm-ZpsYdHAVoCRF)#)@L|ha=hj@nz#O=9;if+?`t3ydN;j4M^=jV- z6F$xvD+Cf_Ebm#AxuoPZ%3^qL;A%b9Dsj|E1dsrF;e_g^)Hfaq*4{M8sDbcnZ5iw5I1ryQ3fUT`IX;`nWzhn?ri3S<%D{HuvW*{S#NS z_*yP|I_(EQ)d z$)^^s(PU(Wt`wXNG^%g*=>v6i*Z~c*+&@Jx4+;f_YQY zRpE^~pJGowd>0}zrP>%IcNW(;YESXQWuy_ zW_G*DUlP%<=A$p8gK#}Al64y3A*vd?-#mA0&_GT`CI3<0&3)TmRVKAQ_VfFYzzeE# z)Md?^hjO#Nrj4-~9QRd?oSNAT7eDX*NI2OT=NYhu+1$iE6{At`tuueb!uDb!htEES zu)UO?KWGwKxzS741l515E7(&SJ`&98Hx}2Qp&R>XEIlV*Jh5H)EBX0ZD}vgbpU>*M@6PpY!w&F+%hQ65qnwe~oLhyIOqvFN6N_ z`pGKMTNN*co7tgc>KCJ_iuV{D#NZ|JoN_@<2LrL`OZN;ZvEFXR<;`8AiCh?aQSl$- z&xFtl{xtE<6I+kd*QVSyb8Q(GykFbJ+8+QPX?a_p633rV~@!j+k02ulH)&-uG zv@}~qpNa|AY>n#tYk<2wKh6Ih@Xg>4oe*%}tZ2*Ur~D3aQIp)Xh#?$OwGcfv{%R|^3aP$+optoHzcA#wlQmt^Jc5O_LCO+@O4vf_X`{8_ABr|Ch9{3E zSadm=E|tybqxEiG2rbe6FZ&`_ozqY(Q+<436RS^B{-j|(1RTTG| z1Vd=(P@yNgp zblzc!r5(bpK2@$hUQmLAUD3DDf80aaM_Fjxszw+(mMGDTHeWStmQ@qAWCt5?kY1Vk zF$WEi!?;^C=_&5z5c zLoxNm{#5W1(oMWl^N=myw>EdcmNr>?AVi<5&uz_co;<=Zw7h)kUgUx$T@eQyL>WVu z2;534`bUAoQ{7iFRuj&mf+AvUD7vDHJxh>=T+H;*?JW58Ojt{wrI@Pv)g768^f+|Ayh4E znCx1SQ>SOg7vj;_Ou}oFky#!Zm49Pl10;Zz2GhERq~W^rIH|&lu7CT+V)czH<$lq) zU4w^Ih7vd51ogt!xd2|9`)uiS4&L-t$a#3xT0J$a;@RS(c#3-Asrc4h$ZpT#;=))w zwKiw$Jx%OKF^cfwt37ifo6#f~V?u7!N~QSru#6j%4003EHNu0G|M>EU1D>Xa3pNMf z_s&J{)n%L$9F#YVKRQouOeNzgsj}UB*>>Q#YJ-Uu5|?flE6y@Nf7MR~rI!%I8&wn? zJKGPDc&oVD5EN^mDvFB4^%Z&Xzp9?VS$8y#mk||Vq%u4pJl5MC%27-aqHtD)!^qiq ze>X@bbrFPyz(Rx+ieXhUxrrzT_lcp;{cY?6Ip>HhNZ~shVlZkFAsZ?mV9W6`Hnsg^ zVl0mmJxT1(DR}<`FCyLJ;|5P{siZJD-b)H`^Y2a&o)acrNSUNhQI8^fB@pbN>tUm| zlerq`E-B!i#-}!DN5D&2$oj8jYtFq#uVE*M_~b!1=~vttO4*_+)EZhUAW#yDg;+U1 zT@e+D&B^I2xD`uM;-@LhjKaAray^OVv$Ts*@e=A%t_@#bsxeujhh@)73OCykU2s;2 z7s|~&!Vj?9*(7-Bnf+ZgC-3r5m$5 z(fqe(PXsYsCa+Decy{5o+yqKIc%D+0ODjh5K^^un|LxN_jbPewwy;P&)V8W**Y(HT z?(iKYv95hh3+_akmK6_LiJlW>h}ueSoz}scgMa-;jo;!<3^xmZ7{neT0w=HZ$?)s+ ziivGsSr`5ispfQr<;aNBl~7Z6V{Tp8w4>AfKli!Zr=0L1f)%pU)Z3b8L9Q9U%1zC& zH;VMph-y5$uLizG4PGuq{!)j+4`54mSF0lS0y;3F!K=!9$#ciTBx#Q6iIG-inJjVc zkEc+edXU7ndt(Ha|9#cgf7mM$ecI4J&uidBXhqwtKae3wDxueyNSk4fBfo+ZEU5MW=xJ?xm`V{(%CbPU1lOR;VB6?t?2|bM9T%Y&z)y z7>KT}^uLb!{ms}>Ai!YdpVY~N`i7>);ssJ2RXMY1POg@K%!08`HgZ7-(mNQM_Wd0VTT+{!k1%}J$!V=T=}G==sKD|wqj50_IT1Fu(I zOI-mc56`PylT`yW?QpnNfm4(>hK0%MJ#-YR7G+$50e;akNYmMHID1LBfaxWODpByB zPSReXwovk6ew`nNv{$qoUhWCTUdiZ2sER6`L3j?tL-y_f4ToB?!Byat;YTjR*~d{Y zL<*4ay#I6f&qP#}Tak!btzQdh#z{4@|DqyNfkM~ ztTUm#zggy4IqiU$yf_WgO@75c#uSc2K-p%V#}b=`dj4c}bxPJ94NuWm>H%ecVefCg zF+BAe$@V>hn*1bH+HHLB`*3{d)5%sa|O_yDsyyjhm76<);@&F)u_GkPN`!xul#k0+#rA@ za4myjuR4ue4_i_%U7P6Pk8y#ynGxnPBNg27^n@y>6b&SZ6^)kyfzv@XmyO-LI%SE5 zb-PN@XIFn)dmaeIvL!g|>M_fqYctW(%(}<&1yM!kU(B*)8&VEf$sa&8N2ysgtUiw7 z3}2YdX+ud0^;XOOtyo~Xeyy^H*}qi1t=&Ynjz9+uC~Uw>y6W{7NK5~KrMR`ntA&;o zsoUjp;~1T4GJt`=zRW)w`-o11DQ7&jgR?aZ0Frx?b;%eR|9u-1t&|

m`mP2@65l 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 NtUAGE!TbB^{{f#c#Nhw{ literal 0 HcmV?d00001 diff --git a/assets/captcha/background/57.jpg b/assets/captcha/background/57.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13d7a21cf6ec691992bc061afc39d6ceb43d2f02 GIT binary patch literal 12347 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 Incvp`AE4R`rvLx| literal 0 HcmV?d00001 diff --git a/assets/captcha/background/58.jpg b/assets/captcha/background/58.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9549352c299f8595fbb389417fdfb7724a0e12e GIT binary patch literal 13960 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 A@Bjb+ literal 0 HcmV?d00001 diff --git a/assets/captcha/background/59.jpg b/assets/captcha/background/59.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0c55f67e5a2fea24ee849924b61402f8d1a91349 GIT binary patch literal 6643 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 Hy8ZlL32HE? literal 0 HcmV?d00001 diff --git a/assets/captcha/background/6.jpg b/assets/captcha/background/6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d8febd91342a97f1536e96927047b15c74a7c2a GIT binary patch literal 10307 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/61.jpg b/assets/captcha/background/61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b5ebdd0b6a5236da87b4d0f213182f9467c61d0 GIT binary patch literal 10985 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/62.jpg b/assets/captcha/background/62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0667299c9439dd54909c694d7d5ec8c4d9178f24 GIT binary patch literal 10585 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

  • 09{JMg4vG29? z0_aVq`1o3ojH+fX6Z|+esw2bLQRrn6)JwXL7*3aG#7Se^O+GO7Lu7eccjKU3eV!_7 za0hj15NFp>n3|t3^Oe}F-5IEPJ(S99YEWrtrL_Jw;mzPOVG5}MsqkPfURH!7 zqYpMsojxN++wN!z&1(nLTF>SAu=}<&&pfb&bnS6=ZhzbzfbK(u_rGcu>O)Jf)DN@U z_)fp!U-H?M*4`2t2LUU@-Kor#1WaT)DT>%islmw|AH!PCek>9fVArpsRl~?7k|L}A z+k4Nu%Z_1xLGX#htT#x2qB4ZfzN0Mt^~YbmfmD!e4qqViJTGe}OXQ8;mNSh;ovi*U z4Q14Vut;rmM@pHPY%_r()MU-N%1wS25Y?a&5<|yFbHen|FIClUsN;hALu74^dS=Y` zH6h6tdnK&-RdWY=-NoxM1bNA$JN+M}Y$KAQaKuvaW99{AI*<6p-URL-bSja%O+qH5 zxwkc2b3dBN>7^tAY|f`|fwItpE#K8jhtI;DxU9g*%6o=ueD}fJ zBR=8?17TI7EHKeuM?IZaTBit@o&bBlCI=73hSv!H!O(6Z8PjP*VatoaQJ1=n)k`}aC>F-Fu@TOz5m3oZRnf@APisuGsBVtH{r z=RJ5P4(L6gvN)k&GdVGeVHcVzm)r#R!|}qA32@{51Wuyg=XU(H7Kk+=7osj8GfyHy zk0x+7;J7D0Qx?ydQ_(;y_ed;UQG^Vf1+J+G4UXiMDhwDJsil^U##L6?T$QHpen03P z%D%pkYf+d_i5_8`rW}rCA@hu#71{psCLz$# zi;0h^PB0{!H*W8~S&$@Z9h1F(-%R3V#jmsVFjVgNgMvJ^PA6OHgSLCAisqTmJGRRw qg^7t@$&J&wPwXe!`W*7r5v2g|wEo4(UfFtr`hx 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/64.jpg b/assets/captcha/background/64.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8b38837175fdb3c8c13b452c59702d99314ebec2 GIT binary patch literal 10440 zcmb7oWl$SXw{3z$i(8SPL4reZcS(u`3KVH+k>U=;wRmxY6bllhK#^jhMse5Rlooe) zzy02uxpVK&yU)LUX4aOOv(H}ZVdmj4fDEdxr49fB0RZ5?19+GRr~nA?@bK|)3Gngp z2?+^^9#auNe)Q-u9R(#R6^Ndh2}IAx$O0DNVqxQBXJq7-fbaeYfgN=uSi-m)W`>!Z0Y#abNE~_veg_8bjN_RG@Ft~^^ zeo7(x8|u2TUr#*_X}|_cD&eW3Vny}iNB=OW{ulcH3-cc@`Tvah|Gjg7$JoGssbP}? z6adR(1t$jm)ie@Eg)}=_+sfhSv7$)g*Q3XTjp_1*N`^*}9Nm-s%i6!Fmb$IUrHYZT z-s`dXp7CU;S5aV(m3;PN2FWChk0_}~dLBtp!6o0{fzD@A@9Fqi60N?*ZUzNRi-$>7 z97U9msi+ly(k8W^rgIk%t&c4E&4brT4`kH;b)fMvw}~9;Uo>krxqrm3FTI<-fJ66B%5u zBOySG`{*-uRBT7%8x~9~DI(e#O-tb$SV!Rl+TbgF8+1kD_f#sK&0U=gacQT5r-Z3X zfw!o?>E&1IWHo+0MdyCSUq1wHvcG&)f$un%m+RdA>}ZjiZoz;_=Xqftn{@Nfe%)8t z82<@&=8OO_@_eR2*;UznDWk4oc$`tHxIOgG=&g*Ni~{Mg@CjY%YR~JI+9G66rk(4+h<&=r1|~qI``?ndfah#eS-R`gce@1 zy6g=k8uTx$?rUOidctm`dEGxpE_Gy=N*2ek_B#{W%8Fg-xyL@oWb%7|+XzM1Jpeev z_PVgFyUF9@>N}2ezV#`0{4P$aoST7|hAj;S=-oc8(0wd=F3rt{gZEc7s6d!qwfwe1 z<^j-bF~ol4F#+L?+4-Rk$`NF{t13JH0yzkh`a#I>(M`1C0nj_PDwM$`n@sQgW?96a znxupzPbZHX=(eg)%W?~r*=QO6cAH+WfC+lDguP_t+Q`aY&79@=yIy;UkYx4cw`ZP2 zvw-bJrVbq&reBaVuE^A0_-uGlm6uI99g%E*#+CeB4F>n+#=cR6l3rhR_le!(^crD) zc{7Rg6cS14s$1`Ul!+5JZK;~gf^f{ul0H1A&)pi(Q1;x@2j6oEh1I5I*khdP&I7fk zhB*HZz#*ligN2R-jZ9#8KS#F_%d@q$m^tNa zDCHU0F5mESt6z?rq7IhA^upifXO0bRF+}2VLzr7=upzdGf5l6-=p!6s5&mMTKO$B? ztGddRO}A%`UUr`9O1Nv0F$N2$LNh2lrPzBhUO6$l;Dyo$0FUb+%3B{0)bJ(S_Swt| zGu>MKtMgZ>c~tXngI_Hhb<~3Qae-NW#cVJAatO4!>&M6W5EatgWtU2fMe{SKRM_CA zqg3!lDTj`{Vm$HtJ0qTRGtH~1uM`1hMRp61b~Rrl0UIRZ!X5xRb7`k74V&fITqtYprlx!hi<0mMTPWWw4*m-tRh`rjY3&!Vd@;q|5{7cll3-5E|;IZ|(5?>?S z`rpCcF{E5Dt)4bYJRP6x*g6*8dX~>N_|=O#0XGzP^4z)35^oOpeG@cJXT?sg|Hz(? zL+g>9lb@4vkod%Sw${h03nqN>2f&ycOb9**<}eH`}O^8ziiI~U`?o{is#woH{uA56lw^xKB>7Zy$>TwI#@koq2Z}Cx}q7M z^?n$ZjmJ%7rc((o$ zNdxxc0hLR;Q0SgiJ#$L^2&d$bw_<(MPh3!v-x<%~JFU?ES(ogd6S`bR7LwkkytI5! zf6YJkSNm+I%pt()c&y&@ReKNc`{plNdi8p`%4(;(a*#(y%<}o9OQE@rT2fkZ ztrP8;-%Rj*M>4jTW(Sk2`!Ou%}`*logU-w5m~#lXi$)uupf5Zt*a@lRY?{(Ynbs zioJgT5aE3ojOiat4Mm#8Em@nrLE=knJ0F&2Qnx;d!B~@zuv+>aC+J=lev?M1cfJ3n z`?1KV{&UH;JuPRN1kWm>z(%2IJODVoY==#utY!*1n{69icr=NGmM7Xy(Ij-Qe1}$- z<2E(4hL#jWJ9HJrI9)leGm|ey#zR;V5&-H20U&P8w^l`CV=9fZtS|>Juhy|vot1LA z1TiMfHTE9}0s~MN^u(<7qw!SyzQT9xR+tW1w25g>^4Pj_=YHA)03t(}@) z5oR#Q+%hw(vaaiX2LZ+s!xA$;>cMG5O9D&Yz6e6sPL-C3`=vJIDIs^CETpxdi&U(# z!5%FU7iG=moBn#A1^+VYf|PWi*s%#IY@5j`Xl93=5YSd+hq>OAP3pvyi=)*A`AG;x zpiE-=LHF9)n?-?cR?9nW?i+zXf2JN3zU1Ivk*64UwB7wd=jdo)BXenh%BSa(Drcol zTrnP!vIBku{d_}q$2D0dlF}%v>IcBl;&%~)@RdO!eIkxBem6g`ikI&`g0wgB?*w-2 zPom!gtxHaYQu1a+%9OTiz!R|3kCo#VBzfYp&d_L7B!6!Renk>BixLe^O5v=~hXq=>tIBMfLXp@#qJG~j?f|X9zT=%`%q00Vrrgva#Zg#(}j=QyASgTE4zl7j5uGxc?%L4#5?H%paVcEvRPP1 ze0hQy8)SaGXmmmyq$i#3>GJNyxq9Z;Fb|{LH#Slrn*odRDWK~7EOUFnZSnZWv^@90 zRgKani)8AdgwBS-8=r|`uRS;U0~GDKi+7o9gcKRJ69hG6Qs=HEZ}zrgZDAg{Gu0kO z%ETC-W9Dee@wOBxpgeJ(s}4NZ2nWu%G@5UB;|hBTVK)iG9cG=M+rue84zvW# zkvEuZ=?WY4C@KeUkn}Ozp|`bh+P*dad1IthOpGGS4Hg1W0d5ws_W{oJc-MQrpUs`T zvQ7#TzeVYENzM@OQ~evnl(#ydsE9h?t>n&HoeaOVH7E0Y47EF`?u%7x^(Vx_yd{J( zo=YM$xq?sQ;-0|8Yt*#lHE%x!iv?D*eL zPR(>a`a?MDmQFyuP32;kEi0MkdSWnZ=#*Cm=y+U=nQtLoqNVQ<6=pg)$j*e@j08_( zwgx}<%|bv?;h5;|16XLmm1h(^m#}PRDfG|p(c({2HF*}&p`u%=_aK;qY>%5sBTwM* zPX+$87p=-o&El)4nrB>Auw3`2>?A}-fr8{ZwwwVvebAt+O_^%g)o`0DY7dEAB+SOA zVLS8zL#7MG)}Oh{i0hzW3exFbIu8H@Ll4^eFat<_c%*{P-ZpTXaRzE+Z8vM~I4*8f z(C%pGKMocIUdc+o=W!*swjgpRkT6a6FTX3tTHml3^4g7favSI;Axec%jeY(-(gru(r3{!c3&zm0atwCc!$ak_r)#^e6F*(%Ijj;I zx?q(z!73xf=}rYoMhTBm4WW6TMzOVi+?-eFTTPpO)D^oX|Bg3SEw#28 zoTfI{i~>ZK@JyW*8AUWUR67qVV>J~cteT3#C9j5;|EvQ(OD8oYF0$o8`TH#Si5@9O zju+NZO&Gi@^qu__zQGnNjB$a>cPxZBU~Q-eQ#B04pjg*OL=5vz%cdV6J$;cO+bm_4 z5w=%c6g?;_D-CCif}a@E=s{Z8a%#GR8PlP0MH8D6(6rJ95HBk`M|f^N%P)cPWGU-f zwK3MZF_r38P!DvAk*nKxU$Fb8Q!S&U*;QTyag)INGiJB&&g-*rN3QCWEl;)=9;!*f zyBPBhyEz)FJfK?8L6`nkD6u-4qB36>Lylo8iuh*B&|&lKn*wE*jkBg~opqH53bvW= zS~vWgdcuM?=ZN`lS`{s07nDc4PdS(V0npf{aNE;KJP;q%@{{s1Ix++#7d6JOecTuI zubScb)13td|IsH4j_J3u1MI||Q2$_J+c6QEuhm@jKLUb-Y8vt7Vm~e)bd(L!r7So{ zgh0^T8}>X30dFmx=T$Jq&;F9|wp+*VX#_bBxY1vQTt`jOLDQT{yt9I|;91zDG`H8D`5&&!SJA`Wbf2*YSiS^Y@wk!e5UArE7uNx)3wZKmFkW}ps;>5C*1$=ikF#IV>S)cy;ba7x01MRRbg__T)im8 zG!`073|Iz1ceQG_6j8Bo=KM0N>UH)$lM@dSjXT3LFXGZ^s0@Rhe6mCtEu~gWw-`Ct zZ>@~dy6pp@zwTiU!}|*fY;*||nRA!??FN;3+Q3^TKc!i4U|HsjjY7NFf#!m7XP^6q zNfM+J%V}A-)3fT_L+hMOmeO-Yad~N$C?yppV&>FmNyyM zVHK`xxM{0rL6kt z1Axpo0WBEt1+_)YvY?@LVHbL#FF*eid5H8s6n)>D$)iHbn4ap#Y0Jo1%{edHyDP(` zQ<7$|;#AUGSMZYG{Vy&6ylztt2pc2j@~&)F8c%rukfyK3*df^SM&}f4c!A}6BtxQd zs0Tnx*phZg7h~K5APcNz&*QDI6(Zyn0623I2`;!0G*Dc>70*D`{|$ZS^x7+%PD8VZtxyUV zE6eg_5W?z^PillG07+ZIy9UBa>Ph#VhA;d1iMv0tiYknyqg8^r@`X+?cNYa0&p3WQ z>uwPs(GW|Aq5Bm2gr4PF5h7@?zo&}*6!g$(T;N<~zE`B}(6`d^)>`{uSerp6v)}-i z;qoUj4v&3w_`?jH&-pQ1D!Uo@%Ip(*Iz=X@pk>DEbKSm5%;DJZOHv-jwSeEutmfYh zhVkAf?3Lq>pY^^u47e0vV|>wl#mOO^8Q4~4NbyH*^duGp%o=h!hkf{0`XtE{Fs8h+SLMc9C+l{?%?WR6IQ_Gv}O>H9gP zi!IlFochT1T$cENW1Wvb|7sJ%wp!+X{Eb&vI(inKl^RYpKg0mxVIWte7l*|tJo1Fu zu)>9tcy?Zooc;zKoPYYQ(S6G4;rCM3qRsQAWx>6wAp`#xG&HS_IZGzNem*gqIhN&v zF1biQDuE$*vEu=7|LJgNqEW*3kVyqwc2&~<1vF|GU9NYf>%OCiE9>#?E4ar%PsDNZ zGSR#vw&uDrbLCpBl z^3iv?vE9nc)Zo?2gw}C9v&b(dHM2v%0!0(Zg&R)ZlXNCb{PhNL)4X=iA#-2GF<;jr zOU+@;CYuYCcmOP<-Pw~E=`dCh1ncNL%U6r2#9Q^DHRdj&{pC0EkDH}XOS5&2-zqHN z{}uZgX%a}6(+92uJ%PF_m}!@DU_#JDb(edJ>jjs2EWe(~8ep-%mi-YBFCeQ?F&YRd zBd7fGLVQIXx|n{nsUduXW_tkSNggRgzUVt9%Z%4I4snh(-{nifg2RJpKmY7lV2Jq} zLlo2vzAAuYR&7_0^Z%k4r;rP_3in1!EWh}Lknt@wezs3I|9I>dhcKj>GsJNS?Q5+G z3H_y}K&kun;cB40hYW*wOWbQ1t;$52>d*_=QxpA&_xdIe08B};0;_r92d1!$Gdq!WsU4U?oO=nlq&UxBSS)`or)Vn87cH-M-Y;(X& z_DRx-meR-UmVvr!8g6*Z3i0it!%!W5;`#HHwgi_~6qPdtO8?f)SQ9QTRlUBW)+2Y4 zv0QHZM*lDy-W7im`|ytC`Q=wZE4w?SEpzC>w_v~A?VpP-UWe41Pt!cq$uv7uohKpK zzdJ7Mzk12M${aP$Z&Av}Sz5TZu|EE=8V|*-nSYf*y|~a?V0!u}yN9_Wwq-Y9e5&Dh z>4Ln5#2aW=+fgGvd;dL?J57MR$T#COig_qH{xOG^GWl`oHHX5H|8|xOYe(z*mAcBr zV(MDim~A3rupO`|qN%aRw}$pIy33E0m+wRfNo`M;8Dh`g8MM(kZSZ%O=4s?1@vrb? z%HX%=;<#OA+g$hjieoDRBtu7u&nZOEsuDm%a3^=4Y&ob;0iG1#55JdwDHF}o*=_MS z-p{E?zHz>G2Qx0naI|_^s3+<8=tN;|9ATFsuE*3jt`&5U2H?1Rc z(A&I={hzSVg;hYiV!j+0&X@-o@v^+{RKH6n+16jEy!I+V{A9+ZW2JEhzi0jWD)$uN zjnd&=e6-A zYqx7eat)`(Xrmy_Szr3!Ct@BBx%AG2ixW(h4lXUN}_CP(Z zP>~8{p{JUD?GAr0& zsThCq3T$0hAHz(qZ0Z+@yYA0$fAnPLuJ515GAg@gNu-^mEI}<^-)A%0Iq4C}!1@4a zxa6%nni+SI;T}8>DzNFi)09ct=YAHYcLR0SBGRI%Lz;2DAx+@xUiKDhQ$4Nd9_QZx zdqUXJAdQ$QbVFcn6+>7Vx*#He*roJNRu(cwV?fD{+T6!ykkh!eS3I}h{6g;ld*qDy zlh;gEIdg&IjXIZ%EqOX1Ck|Ch-_-8TvJ4sO zxOK!AD5?LlKOxRnb*FKu`)WsN;%KaHEW_hTN&S1xbHsk9pRRAR=+Bs`Lf%-Rlns$Z zYc`ym*;vvNyy?H0>Y)z+!n(81HfaeN9kT0YQPvfR@)OP2ue$GKqhS|~3817~^6otHyEzP`QIv-I@)h@e{faB?O-`iKv_!7(5{*=-wsJXf?b>#cIX;C#1(@ zcIVacXO^Ku%qhiVKM6D1OLMMctYi<#e73(8M2HSFAr{dca?W@-RTdtEAcAIg&J2U~ z=r#!xc&08|kYOQI`|`9*R5fH$NqNDR8Iy zkB?r_pH36zsrQE$OJA?339}Mel>rja(QqwhY^yDc%;=nf<=33@Fc!>Vigne~wQ|zI z#ZU+G4q2&~;|T2)R?|*DNA2&LpVhk94@(0P-xi;*_HjM$cAkv5npRyFkVy*FdRm*U zRW?nROl^AHG7Tso0 z_TDY+ubRjg%GII#&EL~RsWZDN&E1%p{(B)S3*R#4$mHW+=jMK|zZNKYLL~(_ht}9D zwuD!@tT)r+tKUvt6X6TEvg6Yd!{7EfXG9xQqj&LEFNrpIR^EEd3VL<)@YjX7sC1b5 za=kt(l*(s}N2J@pd<;gI(LHh1fAN*JR6Dymx=J#x^zu=r!3|h1oh0j<@kJ81_0YFl zyzI&GiHaMnI)a<_>~qHVOro|hc9tfyo+d=q{&sJD5Wc~+frTVm{@l9XG|w%k0xH27 zrVkZ?TKGXWn&#&s`rWgtXpI;9KqIeBZ=;sK41U?fTRo?W+WwORmcFP@IW1m8%0UH~ zyiM05`rO0;%#S0Q9~aPL{3dd(p(R-x1?0EvtooqnRQMgVHgkmXaN7vIh|~orV_#bo2@SdOlulI3|IQ3Hep1=K<5sPIVE7{rqz? zx-kpOP#6#Ok$B3$H|Dw-yf^{th^Rr?v!AXS;f21b$wb9+J+Hl%G9o=JXz`8E>g^R;Rtn@m{4p!Ay~n>9TW`Y!Zw18b@xM8A7or&W zx1);l7P#5BQ`8vl2D2eHj?~{ged%PPZ~H#UzGyke?HZ(UT56b$Rv#Oou)ruB|6$xT zzM{%Xl=tBMVPx>62_wpDW8QX4dVzF9U!nmO`o~#xRjEWq$t9ouU^}Q@BmxI?V87nT z4fQiSHDB+BNDI&2N_E;33N~2CaE!dRytNaNgj4bo9k)-6ek6&EiI0n=%%QQ$NHQ{1 z=z^MGCN#lsb_;P#qG^&94752-5<6a+X^X!$+=IL%I%iyffxPAgy(+%O&!@GI{;UaCpM&3MJr+*~S|>yT%zG$T z`v=_WK3RKtD5B+K>4R;PizKAIkoRgE=4%pA+S*eFBJY|3{*$WEe3W{}SxJ|*d%s)L zd|?m%U7?$t4u%r{<$BogP|pY1bg&$Ik{srAgv*k=&;V6!Uw18=$rBAW_pZRTA%MzVJy`k#up=;%m$Rg1#HMI3V z6&GQ)6`T(0A({?SWFUHMbmjn_M9z&h+L#jKHBg9`Pc4SFDbX9n@lgixSVk-?dG3T|5$h#xy4iizXQo>;>N=P9`J5xy}s{y*=!wGJ;%qjyFaPyaQ8I4bR=s$T?C>5LGvbdcj^Hj;t5i`@C0M zAawR(#{XTp6oG6!f;yx%6cXMZv!&=}Vj8PA73bIBaRS2k=hr!Qz0$M!R)+BK+T;d% z%Tt+lRl2HGypwiTLO6gItAUx7{t2dp&#Umx8t8fb7i;O~2vNqP2WDyqrqs?P7|Kec zYFxBdYly(<8yXtX>()4d+R{}rP4;r6e06!l*Xqo|O@DgPQHl}>(T3g38Hkv`7H%#Z z$5^@RKn0yAlF@^hB3E8ph6|9Kl2?#?DcWxcE{bBccbDz`N8p$mfb)hiyz8&chyEDy zI+*vYWu=xh6|c!0^VSsZXz7r?g|cen+QEsj>&_{*Nue&#@B*Po7ElO}G!yihC0X%$ z<8jrt95IoP3dQrmh&O7x)tiKoJcf?!Lno&6IFhceD&Khm24Gq*IPlBmAR<#T`g<;X zc6j33jFY_3@5J0JxJY6M=+=?KV4cbXeFC1jPtR|zH#x)kBIcm+R`EG@_(g1Sogw?4C#DPEj%9=w_&}9tu47Bi z*mJjwH${b!Z z-BR?{Z&b-8|9mF>SWL89bHaV*v>db@p~ym})}^w4sc$)NI$GyXykkg#u;A=zuQmlj zLbAnQ-cy$(o-#G~+HWbc%8X?kD5-QYZ*%Epg*Z^m$GBPW;P~n}=c!jqY8+PT!__tG z6_eZ3T+!dvp81Zslu+eK>+$_6pwXz09veDNvwD$|oDlI#(ds#wYTU1wtWJIt zQ`SJ?P*l>3J^E?N{yeDDUtfo-dSpY9Vr_Cek$WtQ}QVD%!L+i52^E z+m{yu$HOgn#9WOcT-3W!!_r%Nm5Oc^Kr5y3BE$@cTUTGH0Xj=)ETW}#58~dAYetr* z9^*IKB!LJDxzi(wUD8$*TPKmSDb8J%i>D?pl#sVQ-&L|IJ+yJEO{#ItK6d?k!;ZkIipB7c9gU`C4g`~x JMiCFQ{{`v!u#*4) literal 0 HcmV?d00001 diff --git a/assets/captcha/background/65.jpg b/assets/captcha/background/65.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5f2f2f166cf7935fa557b691daa97eaebbcda20e GIT binary patch literal 8105 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 C@X=HN literal 0 HcmV?d00001 diff --git a/assets/captcha/background/69.jpg b/assets/captcha/background/69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98fa60bc30b598bb64f15ba2c0443c8f708d108b GIT binary patch literal 9887 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/7.jpg b/assets/captcha/background/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc0e2f148ad44b6252efb854b11f02af1e44bc8f GIT binary patch literal 2789 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 If{l@X0XGo5YybcN literal 0 HcmV?d00001 diff --git a/assets/captcha/background/70.jpg b/assets/captcha/background/70.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d3086f86e6cba993e3257a1725c035d0edd5579 GIT binary patch literal 7316 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/71.jpg b/assets/captcha/background/71.jpg new file mode 100644 index 0000000000000000000000000000000000000000..78626e7c2f764d88d80964cad0ec5d584095c3f9 GIT binary patch literal 10273 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/73.jpg b/assets/captcha/background/73.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fb5916a1f4a667edb08a81e84fbdba0f4e16383 GIT binary patch literal 12799 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/74.jpg b/assets/captcha/background/74.jpg new file mode 100644 index 0000000000000000000000000000000000000000..68475ca2231c37be0387edb8950d27b778aa83a2 GIT binary patch literal 7583 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 HJtF@DQv{r6 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/75.jpg b/assets/captcha/background/75.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0db705d818ec836767e600af14f424d608c40149 GIT binary patch literal 10164 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 Ja`V2f{U3g_U4H-o literal 0 HcmV?d00001 diff --git a/assets/captcha/background/78.jpg b/assets/captcha/background/78.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d355de598d66eb2905a3d3ee4e25835d583c8541 GIT binary patch literal 9030 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 JXUOZ?{{fi8?s5PC literal 0 HcmV?d00001 diff --git a/assets/captcha/background/79.jpg b/assets/captcha/background/79.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4aa78d626535fdd70ac383d6cde27ed165d0df7b GIT binary patch literal 6993 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/80.jpg b/assets/captcha/background/80.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1d3086f86e6cba993e3257a1725c035d0edd5579 GIT binary patch literal 7316 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/81.jpg b/assets/captcha/background/81.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6977db676e2a163a097fa943d949e2942c5127bf GIT binary patch literal 12412 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 Iq<{VWKMepjn*aa+ literal 0 HcmV?d00001 diff --git a/assets/captcha/background/82.jpg b/assets/captcha/background/82.jpg new file mode 100644 index 0000000000000000000000000000000000000000..aa0f3cd089bb8e577e3d8ebdb4ce449660a6c093 GIT binary patch literal 5562 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 UnOpI9*iGXKPWA|cOjmRN1<8F3Y5)KL literal 0 HcmV?d00001 diff --git a/assets/captcha/background/83.jpg b/assets/captcha/background/83.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de28472a73d5f0fb813fafec9d7c5c696de22ad8 GIT binary patch literal 9808 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 I@=uHZ16kHoD*ylh literal 0 HcmV?d00001 diff --git a/assets/captcha/background/84.jpg b/assets/captcha/background/84.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bc6ae843a8ad274e9acbfc6bbba8b0552ebfc6d GIT binary patch literal 8033 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/85.jpg b/assets/captcha/background/85.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dbcfc208ee10f6e25206e6ee6e010e147957253d GIT binary patch literal 9513 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 Ydb*yU(l>kqg{42(2m7rOo4u|6ABrj0=l}o! literal 0 HcmV?d00001 diff --git a/assets/captcha/background/86.jpg b/assets/captcha/background/86.jpg new file mode 100644 index 0000000000000000000000000000000000000000..26edc97ff6fb54e0fa0964073a5fae2d09321eac GIT binary patch literal 13397 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 LPMe|xzbyR^*F>{E literal 0 HcmV?d00001 diff --git a/assets/captcha/background/88.jpg b/assets/captcha/background/88.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5d05d76d497df4dbd3ea46953f39e718393aa80c GIT binary patch literal 11514 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 Cd=_B< literal 0 HcmV?d00001 diff --git a/assets/captcha/background/9.jpg b/assets/captcha/background/9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16c0569a203a2f80ca4b69de86aaf4cb1299ad4c GIT binary patch literal 13668 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/91.jpg b/assets/captcha/background/91.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fc0e2f148ad44b6252efb854b11f02af1e44bc8f GIT binary patch literal 2789 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 If{l@X0XGo5YybcN literal 0 HcmV?d00001 diff --git a/assets/captcha/background/92.jpg b/assets/captcha/background/92.jpg new file mode 100644 index 0000000000000000000000000000000000000000..58e49d93729b3d7ae570d2c12da4313e3acabc74 GIT binary patch literal 8011 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/94.jpg b/assets/captcha/background/94.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9f4b08ea53b734214fbc9f254ff7525a794e62c GIT binary patch literal 14640 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 E0ZBw}KL7v# literal 0 HcmV?d00001 diff --git a/assets/captcha/background/95.jpg b/assets/captcha/background/95.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c09506523347746c13fdb578392393b23aa2e38 GIT binary patch literal 12131 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 snyKaBFvf;^>!6N_Zm^_gO)@BS^xk5 literal 0 HcmV?d00001 diff --git a/assets/captcha/background/96.jpg b/assets/captcha/background/96.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee96fb8ba7aea49901e53b89ac99f4b2f0bb3b16 GIT binary patch literal 2533 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 Q*3mLe9sCwv6`g+mUs}N0=>Px# literal 0 HcmV?d00001 diff --git a/assets/captcha/background/99.jpg b/assets/captcha/background/99.jpg new file mode 100644 index 0000000000000000000000000000000000000000..582bc75f5dbaf7aa322852f110f594542389e79d GIT binary patch literal 6950 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 VT{!_$f8pCck4=tVrTp{Ze*g!+l>z_& literal 0 HcmV?d00001 diff --git a/assets/captcha/template/1/dark.png b/assets/captcha/template/1/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8684a67e280ca4a61d3f9e276ad5beb22499db88 GIT binary patch literal 1291 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 A-v9sr literal 0 HcmV?d00001 diff --git a/assets/captcha/template/2/dark.png b/assets/captcha/template/2/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bcc08bddfb0d1edf7aa35dd2444300b09991438d GIT binary patch literal 1118 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 F{R7uE==J~r literal 0 HcmV?d00001 diff --git a/assets/captcha/template/3/transparent.png b/assets/captcha/template/3/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..aa14e19bd07bf5b4637b4b8edd9dc01c01f697ab GIT binary patch literal 2706 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 ZFKGft7~g(1GQYZaN+Rb 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 literal 0 HcmV?d00001 diff --git a/assets/captcha/template/5/transparent.png b/assets/captcha/template/5/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..6edc2b9476d653941e9cb0cc064eddb6229f6564 GIT binary patch literal 2119 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 GQ~nDM;yRuH literal 0 HcmV?d00001 diff --git a/assets/captcha/template/6/dark.png b/assets/captcha/template/6/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1283497adff673ffadac6835cb52ff4447580e GIT binary patch literal 3090 zcmaJ?2UwHm7LKy^M2<~lARpwl@zxt!eB5Z z(gA`C_~fko%S(ZEHh!oZe5gZ2Pso+afWjzzI?S5J^{2y0YzmX^LZ{Fog1hPaVK6DZ z05?y_lk9+_a@k1AN(?fb%>&sm*nZ1!9)%i2hv5EnW&j6|m}zQ5zyoM_goglF@5Y>W)u>1zTKO6@D*mQ^j4`(0e2yo$e#0Oj)uvgqD1pGq?6of~t zlJX=w!EL#GI@|@Eqj>Hi_6b_Y6BH$4K1sM=P!(q&A%+0YxTZ}OVi@^|WtSyYN z1Zx{xG}hRbNHjD4luO`JL)df<^eLD2PcGq$xhvzq=7GutIzJ$kPP5~4+3*i-;{v|S z#rlhQA9HD6=3?{3TofRKTDjcMF8h-UOwfwCHo9Q5HvDuBn0P)I?LRy^z5#Cx%*nxx zXwP%_@Q%QimzP(KFRlIk{huGvXf&{umzQ64g7oh0ZZ4O*7PA_#w*B0Ym6ct~`rHrf zrKP1+&%(mOT1DV||Ni}dMJgyL031C%y;bH%jvU#rVFR!MrNF>IX=!P2ip666{QP8O zWYpEw!3q!-7Z+=4YJdSEfoE=RZsW#{rlzJ~3qcU@OG!xqd-YkXsH39;Jb(rWMxju# zv9Zd^%34}lz1wgBocvgKpAl9EEWsgQE+f@V`C%e3v>ZEfEm!&*LQVw1=9lf zXJusp93Ue=xZxdJ1cR-EK`xH2uS8sI7%J8xZ5tZdm*w{Ng)Z^5(O zsZWzn98Jwus~WtjAS?B7=eBQkpi)!zE-5P=ybI*6oqLrSEqA3dCGPMy7rpQ{bki_& z$;ft%vYJ{?EUvz^vb?H1J;~wOc~*JZjcZps{jO|I+F9(ImyzgKdd}^HXLVkG$LWh_ z;vbd|zVM?4aboQzM?kXt47T)gANNo!jE$0(1kV8e_AqZwac z-R80JKhb7~t9SLi)D4qSn|8UfDQ z<{Uk?mT+1uR~J~Q_^MB+T2T9YwBQiV?LY?oTLX90db9P#>3$k1Z?DLm`r)wry4R0d z4D`i_CdFBm!dmHFqG&v1jib9xA$+HxpNvi!7;msa;qFL&KlRMu z1*80vooIZ+zuTFwyLDw}F7J9+j51pi*Su@S{+J(g>WugFo43gOX9ao_-lfkPQwCZV zH!sy65M^fd-<^q=3~GI?_@qGIakRLkf_o<+ck->MH;=(TON!c$TkDQ*AeIK5d|uW`C}PalJ`$W% zvoz6pq+V8Uox58xhS}Y8sc*P`HY;S*@%Xy$kdZthPaD5Kb%zX@{O+NFhV0jMLY6T7 znA-W;*?O^p$xo=~vR&xBq+yTm$Mhx7#&?Sm%;8&b_!Y4mHcwOVZBn#Mew0-w<@tH2 z`u;jA;o0Cv*J*^yUI&$tzqH2om-$~HnRZv-LBph{RU1wEj~T{$!}=l{H(swO6lll( zG0uzLWM!aBK|I8tjotTRy>-{rq5QNVP|TaR1(~&%uz-mgAn>yGY{1uspbOVQYq{xw2Was$$C>k%e-?v+S~zH0813pN@N-j9|cSR_HIk zIHmmL>tgzET?L*=Vvh{L4!fq<7DDg7;t8d+~=qx4zh67sqqy zBuy>(yo@Gdy4u@sUNv-oe0M1H9SBv?4WFQWZ;WCY7FFm^oZiCI39iX%yLvOJwJ3vH zxhaXktH|`?)u^<9(;IbK;R}nhD`{~a2Y)4thXsQR2bazF^p@qFm3Yi|q)ll(VTZ|` z1I__WBHp+?dBkH2>hzn;oLj@C=b{$V)B=5-TYqJZ`2`=E%QrT8C3=t)ebq8-YxwVx z4A+yh4<4|hWg5;Kw3^HmC>%Ogt0Hl)Ue@<)WK2Al#J`%Hv3#PVIgaq-gNEKVgR@op_H6G7J2yA!+pUp*ow77vo^VD} o(@D!SyDh{By#31BcJEUbrFyYdRV;t%ft4Rx648-RZsQmGH_5;!CIA2c literal 0 HcmV?d00001 diff --git a/assets/captcha/template/6/transparent.png b/assets/captcha/template/6/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..700424ad469d1fc2a28942930d0e38e8a662292a GIT binary patch literal 6192 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 E1GSw~%m4rY literal 0 HcmV?d00001 diff --git a/assets/logo/gitea.png b/assets/logo/gitea.png new file mode 100644 index 0000000000000000000000000000000000000000..fac41d9608c88f93dca80b19010213d8871051ce GIT binary patch literal 4033 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 P$AI*-j5KT19V7n-y3`pL literal 0 HcmV?d00001 diff --git a/assets/logo/grafana.png b/assets/logo/grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..553821a0f155a7e12f612733a52a8c18f87a5ffa GIT binary patch literal 3065 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 literal 0 HcmV?d00001 diff --git a/assets/logo/line.png b/assets/logo/line.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ce860c14f96c2a81be05b08f5ecaeb38a54003 GIT binary patch literal 3993 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 literal 0 HcmV?d00001 diff --git a/assets/minio/docker-compose-minio.yml b/assets/minio/docker-compose-minio.yml new file mode 100644 index 00000000..9ed7b5db --- /dev/null +++ b/assets/minio/docker-compose-minio.yml @@ -0,0 +1,15 @@ +version: "3" +services: + net-admin-minio: + image: minio/minio:latest + command: server /data --console-address ":9001" + ports: + - "9000:9000" + - "9001:9001" + restart: always + container_name: net-admin-minio + environment: + TZ: Asia/Shanghai + volumes: + - /etc/localtime:/etc/localtime + - /etc/timezone:/etc/timezone \ No newline at end of file diff --git a/assets/resx/Ln.resx b/assets/resx/Ln.resx new file mode 100644 index 00000000..8883d0db --- /dev/null +++ b/assets/resx/Ln.resx @@ -0,0 +1,216 @@ + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, + PublicKeyToken=b77a5c561934e089 + + + 1分钟内只能发送1次 + 6位数字 + 8位以上数字字母组合 + Xml注释文件不存在 + 不正确 + 不能为空 + 业务模块 + 东乡族 + 丧偶 + 中专 + 中共党员 + 中文姓名 + 乌孜别克族 + 事务已回滚 + 事务已提交 + 京族 + 人机校验请求 + 人机验证未通过 + 仡佬族 + 仫佬族 + 佤族 + 侗族 + 俄罗斯族 + 保安族 + 保密 + 倒序排序 + 傈僳族 + 傣族 + 允许的文件大小 + 允许的文件格式 + 全部数据 + 共青团员 + 出生证 + 初中 + 初始化完毕 + 区号电话号码分机号 + 博士 + 博士后 + 参数格式不正确 + 发送失败 + 哈尼族 + 哈萨克族 + 唯一编码 + 回族 + 图标代码 + 图标名称 + 土家族 + 土族 + 基诺族 + 塔吉克族 + 塔塔尔族 + 壮族 + 外国人居留证 + 大专 + + 字典名称 + 字典目录不存在 + 字典目录编号 + 字典编码 + 密码 + 小学 + 已发送 + 已婚 + 已完成 + 已校验 + 布依族 + 布朗族 + 开始事务 + 彝族 + 德昂族 + 必须介于 + 怒族 + 意外错误 + 成功 + 手机 + 手机号码 + 手机号码或座机号码 + 护照 + 拉祜族族 + 指定部门数据 + 按钮 + 撒拉族 + 支付宝账号 + 数据库同步开始 + 数据库服务器时钟偏移 + 数据库结构同步完成 + 数据版本 + 文件不能为空 + 新密码 + 新手机号码 + 无效操作 + 无效网络地址 + 无效证件号码 + 无效输入 + 日志长度超过限制 + 旧密码 + 旧手机号码 + 时间戳缺失或误差过大 + 普米族 + 景颇族 + 朝鲜族 + 未婚 + 未指定部门 + 本人数据 + 本科 + 本部门和下级部门数据 + 本部门数据 + 柯尔克孜族 + 框架 + 毛南族 + 水族 + 汉族 + 注册 + 港澳台通行证 + 满族 + 父节点不存在 + 独龙族 + 珞巴族 + 瑶族 + 用户不存在 + 用户名 + 用户名不能是手机号 + 用户名或密码错误 + 用户名长度4位以上 + 用户头像 + 用户档案 + 电子邮箱 + + 畲族 + 登录 + 白族 + 目标手机 + 目标设备 + 短信验证请求 + 硕士 + 离异 + 等待发送 + 签名缺失 + 系统模块 + 纳西族 + 绑定手机号 + 结果非预期 + 维吾尔族 + 羌族 + 群众 + 苗族 + 菜单 + 菜单名称 + 菜单标题 + 菜单编号 + 蒙古族 + 藏族 + 裕固族 + 角色不存在 + 角色名称 + 角色编号 + 角色编号列表 + 解绑手机号 + 设备类型 + 该角色下存在用户 + 该部门下存在子部门 + 该部门下存在用户 + 请求 + 请求对象 + 请联系管理员激活账号 + 读取用户令牌出错 + 账号 + 赫哲族 + 身份证 + 达斡尔族 + 邀请码不正确 + 邮箱验证码不正确 + 部门不存在 + 部门名称 + 鄂伦春族 + 鄂温克族 + 重设密码 + 链接 + 锡伯族 + 键值 + 键名称 + 门巴族 + 阿昌族 + 顺序排序 + 验证数据 + 验证码 + 验证码不正确 + 验证码类型 + 高中 + 高山族 + 黎族 + \ No newline at end of file diff --git a/assets/resx/Ln.txt b/assets/resx/Ln.txt new file mode 100644 index 00000000..31457baf --- /dev/null +++ b/assets/resx/Ln.txt @@ -0,0 +1,191 @@ +1分钟内只能发送1次 +6位数字 +8位以上数字字母组合 +Xml注释文件不存在 +不正确 +不能为空 +业务模块 +东乡族 +丧偶 +中专 +中共党员 +中文姓名 +乌孜别克族 +事务已回滚 +事务已提交 +京族 +人机校验请求 +人机验证未通过 +仡佬族 +仫佬族 +佤族 +侗族 +俄罗斯族 +保安族 +保密 +倒序排序 +傈僳族 +傣族 +允许的文件大小 +允许的文件格式 +全部数据 +共青团员 +出生证 +初中 +初始化完毕 +区号电话号码分机号 +博士 +博士后 +参数格式不正确 +发送失败 +哈尼族 +哈萨克族 +唯一编码 +回族 +图标代码 +图标名称 +土家族 +土族 +基诺族 +塔吉克族 +塔塔尔族 +壮族 +外国人居留证 +大专 +女 +字典名称 +字典目录不存在 +字典目录编号 +字典编码 +密码 +小学 +已发送 +已婚 +已完成 +已校验 +布依族 +布朗族 +开始事务 +彝族 +德昂族 +必须介于 +怒族 +意外错误 +成功 +手机 +手机号码 +手机号码或座机号码 +护照 +拉祜族族 +指定部门数据 +按钮 +撒拉族 +支付宝账号 +数据库同步开始 +数据库服务器时钟偏移 +数据库结构同步完成 +数据版本 +文件不能为空 +新密码 +新手机号码 +无效操作 +无效网络地址 +无效证件号码 +无效输入 +日志长度超过限制 +旧密码 +旧手机号码 +时间戳缺失或误差过大 +普米族 +景颇族 +朝鲜族 +未婚 +未指定部门 +本人数据 +本科 +本部门和下级部门数据 +本部门数据 +柯尔克孜族 +框架 +毛南族 +水族 +汉族 +注册 +港澳台通行证 +满族 +父节点不存在 +独龙族 +珞巴族 +瑶族 +用户不存在 +用户名 +用户名不能是手机号 +用户名或密码错误 +用户名长度4位以上 +用户头像 +用户档案 +电子邮箱 +男 +畲族 +登录 +白族 +目标手机 +目标设备 +短信验证请求 +硕士 +离异 +等待发送 +签名缺失 +系统模块 +纳西族 +绑定手机号 +结果非预期 +维吾尔族 +羌族 +群众 +苗族 +菜单 +菜单名称 +菜单标题 +菜单编号 +蒙古族 +藏族 +裕固族 +角色不存在 +角色名称 +角色编号 +角色编号列表 +解绑手机号 +设备类型 +该角色下存在用户 +该部门下存在子部门 +该部门下存在用户 +请求 +请求对象 +请联系管理员激活账号 +读取用户令牌出错 +账号 +赫哲族 +身份证 +达斡尔族 +邀请码不正确 +邮箱验证码不正确 +部门不存在 +部门名称 +鄂伦春族 +鄂温克族 +重设密码 +链接 +锡伯族 +键值 +键名称 +门巴族 +阿昌族 +顺序排序 +验证数据 +验证码 +验证码不正确 +验证码类型 +高中 +高山族 +黎族 \ No newline at end of file diff --git a/assets/seed-data/Sys_Config.json b/assets/seed-data/Sys_Config.json new file mode 100644 index 00000000..68a2abd8 --- /dev/null +++ b/assets/seed-data/Sys_Config.json @@ -0,0 +1,8 @@ +[ + { + "Enabled": true, + "UserRegisterConfirm": false, + "UserRegisterDeptId": 372119301627909, + "UserRegisterRoleId": 371729946431493 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_Dept.json b/assets/seed-data/Sys_Dept.json new file mode 100644 index 00000000..37ba0225 --- /dev/null +++ b/assets/seed-data/Sys_Dept.json @@ -0,0 +1,8 @@ +[ + { + "Id": 372119301627909, + "Name": "默认部门", + "Enabled": true, + "Sort": 100 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_DicCatalog.json b/assets/seed-data/Sys_DicCatalog.json new file mode 100644 index 00000000..1c47893f --- /dev/null +++ b/assets/seed-data/Sys_DicCatalog.json @@ -0,0 +1,13 @@ +[ + { + "Code": "generic", + "Id": 375317236772869, + "Name": "通用字典" + }, + { + "Code": "geo-area", + "Id": 379794295185413, + "Name": "行政区划代码", + "ParentId": 375317236772869 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_DicContent.json b/assets/seed-data/Sys_DicContent.json new file mode 100644 index 00000000..48ef2913 --- /dev/null +++ b/assets/seed-data/Sys_DicContent.json @@ -0,0 +1,19250 @@ +[ + { + "CatalogId": 379794295185413, + "Id": 396423788572677, + "Key": "北京市", + "Value": "110000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788580869, + "Key": "北京市东城区", + "Value": "110101" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584965, + "Key": "北京市西城区", + "Value": "110102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584966, + "Key": "北京市朝阳区", + "Value": "110105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584967, + "Key": "北京市丰台区", + "Value": "110106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584968, + "Key": "北京市石景山区", + "Value": "110107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584969, + "Key": "北京市海淀区", + "Value": "110108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584970, + "Key": "北京市门头沟区", + "Value": "110109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584971, + "Key": "北京市房山区", + "Value": "110111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584972, + "Key": "北京市通州区", + "Value": "110112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584973, + "Key": "北京市顺义区", + "Value": "110113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584974, + "Key": "北京市昌平区", + "Value": "110114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584975, + "Key": "北京市大兴区", + "Value": "110115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788584976, + "Key": "北京市怀柔区", + "Value": "110116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589061, + "Key": "北京市平谷区", + "Value": "110117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589062, + "Key": "北京市密云区", + "Value": "110118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589063, + "Key": "北京市延庆区", + "Value": "110119" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589064, + "Key": "天津市", + "Value": "120000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589065, + "Key": "天津市和平区", + "Value": "120101" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589066, + "Key": "天津市河东区", + "Value": "120102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589067, + "Key": "天津市河西区", + "Value": "120103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589068, + "Key": "天津市南开区", + "Value": "120104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589069, + "Key": "天津市河北区", + "Value": "120105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589070, + "Key": "天津市红桥区", + "Value": "120106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589071, + "Key": "天津市东丽区", + "Value": "120110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788589072, + "Key": "天津市西青区", + "Value": "120111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593157, + "Key": "天津市津南区", + "Value": "120112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593158, + "Key": "天津市北辰区", + "Value": "120113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593159, + "Key": "天津市武清区", + "Value": "120114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593160, + "Key": "天津市宝坻区", + "Value": "120115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593161, + "Key": "天津市滨海新区", + "Value": "120116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593162, + "Key": "天津市宁河区", + "Value": "120117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593163, + "Key": "天津市静海区", + "Value": "120118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593164, + "Key": "天津市蓟州区", + "Value": "120119" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593165, + "Key": "河北省", + "Value": "130000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593166, + "Key": "河北省石家庄市", + "Value": "130100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788593167, + "Key": "河北省石家庄市长安区", + "Value": "130102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597253, + "Key": "河北省石家庄市桥西区", + "Value": "130104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597254, + "Key": "河北省石家庄市新华区", + "Value": "130105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597255, + "Key": "河北省石家庄市井陉矿区", + "Value": "130107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597256, + "Key": "河北省石家庄市裕华区", + "Value": "130108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597257, + "Key": "河北省石家庄市藁城区", + "Value": "130109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597258, + "Key": "河北省石家庄市鹿泉区", + "Value": "130110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597259, + "Key": "河北省石家庄市栾城区", + "Value": "130111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597260, + "Key": "河北省石家庄市井陉县", + "Value": "130121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597261, + "Key": "河北省石家庄市正定县", + "Value": "130123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597262, + "Key": "河北省石家庄市行唐县", + "Value": "130125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597263, + "Key": "河北省石家庄市灵寿县", + "Value": "130126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788597264, + "Key": "河北省石家庄市高邑县", + "Value": "130127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601349, + "Key": "河北省石家庄市深泽县", + "Value": "130128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601350, + "Key": "河北省石家庄市赞皇县", + "Value": "130129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601351, + "Key": "河北省石家庄市无极县", + "Value": "130130" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601352, + "Key": "河北省石家庄市平山县", + "Value": "130131" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601353, + "Key": "河北省石家庄市元氏县", + "Value": "130132" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601354, + "Key": "河北省石家庄市赵县", + "Value": "130133" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601355, + "Key": "河北省石家庄市辛集市", + "Value": "130181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601356, + "Key": "河北省石家庄市晋州市", + "Value": "130183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601357, + "Key": "河北省石家庄市新乐市", + "Value": "130184" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601358, + "Key": "河北省唐山市", + "Value": "130200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601359, + "Key": "河北省唐山市路南区", + "Value": "130202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788601360, + "Key": "河北省唐山市路北区", + "Value": "130203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605445, + "Key": "河北省唐山市古冶区", + "Value": "130204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605446, + "Key": "河北省唐山市开平区", + "Value": "130205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605447, + "Key": "河北省唐山市丰南区", + "Value": "130207" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605448, + "Key": "河北省唐山市丰润区", + "Value": "130208" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605449, + "Key": "河北省唐山市曹妃甸区", + "Value": "130209" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605450, + "Key": "河北省唐山市滦南县", + "Value": "130224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605451, + "Key": "河北省唐山市乐亭县", + "Value": "130225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605452, + "Key": "河北省唐山市迁西县", + "Value": "130227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605453, + "Key": "河北省唐山市玉田县", + "Value": "130229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605454, + "Key": "河北省唐山市遵化市", + "Value": "130281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605455, + "Key": "河北省唐山市迁安市", + "Value": "130283" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788605456, + "Key": "河北省唐山市滦州市", + "Value": "130284" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609541, + "Key": "河北省秦皇岛市", + "Value": "130300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609542, + "Key": "河北省秦皇岛市海港区", + "Value": "130302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609543, + "Key": "河北省秦皇岛市山海关区", + "Value": "130303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609544, + "Key": "河北省秦皇岛市北戴河区", + "Value": "130304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609545, + "Key": "河北省秦皇岛市抚宁区", + "Value": "130306" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609546, + "Key": "河北省秦皇岛市青龙满族自治县", + "Value": "130321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609547, + "Key": "河北省秦皇岛市昌黎县", + "Value": "130322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609548, + "Key": "河北省秦皇岛市卢龙县", + "Value": "130324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609549, + "Key": "河北省邯郸市", + "Value": "130400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609550, + "Key": "河北省邯郸市邯山区", + "Value": "130402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609551, + "Key": "河北省邯郸市丛台区", + "Value": "130403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788609552, + "Key": "河北省邯郸市复兴区", + "Value": "130404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613637, + "Key": "河北省邯郸市峰峰矿区", + "Value": "130406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613638, + "Key": "河北省邯郸市肥乡区", + "Value": "130407" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613639, + "Key": "河北省邯郸市永年区", + "Value": "130408" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613640, + "Key": "河北省邯郸市临漳县", + "Value": "130423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613641, + "Key": "河北省邯郸市成安县", + "Value": "130424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613642, + "Key": "河北省邯郸市大名县", + "Value": "130425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613643, + "Key": "河北省邯郸市涉县", + "Value": "130426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613644, + "Key": "河北省邯郸市磁县", + "Value": "130427" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613645, + "Key": "河北省邯郸市邱县", + "Value": "130430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613646, + "Key": "河北省邯郸市鸡泽县", + "Value": "130431" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613647, + "Key": "河北省邯郸市广平县", + "Value": "130432" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788613648, + "Key": "河北省邯郸市馆陶县", + "Value": "130433" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617733, + "Key": "河北省邯郸市魏县", + "Value": "130434" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617734, + "Key": "河北省邯郸市曲周县", + "Value": "130435" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617735, + "Key": "河北省邯郸市武安市", + "Value": "130481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617736, + "Key": "河北省邢台市", + "Value": "130500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617737, + "Key": "河北省邢台市襄都区", + "Value": "130502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617738, + "Key": "河北省邢台市信都区", + "Value": "130503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617739, + "Key": "河北省邢台市任泽区", + "Value": "130505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617740, + "Key": "河北省邢台市南和区", + "Value": "130506" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617741, + "Key": "河北省邢台市临城县", + "Value": "130522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617742, + "Key": "河北省邢台市内丘县", + "Value": "130523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617743, + "Key": "河北省邢台市柏乡县", + "Value": "130524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788617744, + "Key": "河北省邢台市隆尧县", + "Value": "130525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621829, + "Key": "河北省邢台市宁晋县", + "Value": "130528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621830, + "Key": "河北省邢台市巨鹿县", + "Value": "130529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621831, + "Key": "河北省邢台市新河县", + "Value": "130530" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621832, + "Key": "河北省邢台市广宗县", + "Value": "130531" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621833, + "Key": "河北省邢台市平乡县", + "Value": "130532" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621834, + "Key": "河北省邢台市威县", + "Value": "130533" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621835, + "Key": "河北省邢台市清河县", + "Value": "130534" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621836, + "Key": "河北省邢台市临西县", + "Value": "130535" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621837, + "Key": "河北省邢台市南宫市", + "Value": "130581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621838, + "Key": "河北省邢台市沙河市", + "Value": "130582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621839, + "Key": "河北省保定市", + "Value": "130600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788621840, + "Key": "河北省保定市竞秀区", + "Value": "130602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625925, + "Key": "河北省保定市莲池区", + "Value": "130606" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625926, + "Key": "河北省保定市满城区", + "Value": "130607" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625927, + "Key": "河北省保定市清苑区", + "Value": "130608" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625928, + "Key": "河北省保定市徐水区", + "Value": "130609" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625929, + "Key": "河北省保定市涞水县", + "Value": "130623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625930, + "Key": "河北省保定市阜平县", + "Value": "130624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625931, + "Key": "河北省保定市定兴县", + "Value": "130626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625932, + "Key": "河北省保定市唐县", + "Value": "130627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625933, + "Key": "河北省保定市高阳县", + "Value": "130628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625934, + "Key": "河北省保定市容城县", + "Value": "130629" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625935, + "Key": "河北省保定市涞源县", + "Value": "130630" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788625936, + "Key": "河北省保定市望都县", + "Value": "130631" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630021, + "Key": "河北省保定市安新县", + "Value": "130632" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630022, + "Key": "河北省保定市易县", + "Value": "130633" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630023, + "Key": "河北省保定市曲阳县", + "Value": "130634" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630024, + "Key": "河北省保定市蠡县", + "Value": "130635" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630025, + "Key": "河北省保定市顺平县", + "Value": "130636" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630026, + "Key": "河北省保定市博野县", + "Value": "130637" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630027, + "Key": "河北省保定市雄县", + "Value": "130638" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630028, + "Key": "河北省保定市涿州市", + "Value": "130681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630029, + "Key": "河北省保定市定州市", + "Value": "130682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630030, + "Key": "河北省保定市安国市", + "Value": "130683" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630031, + "Key": "河北省保定市高碑店市", + "Value": "130684" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630032, + "Key": "河北省张家口市", + "Value": "130700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788630033, + "Key": "河北省张家口市桥东区", + "Value": "130702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634117, + "Key": "河北省张家口市桥西区", + "Value": "130703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634118, + "Key": "河北省张家口市宣化区", + "Value": "130705" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634119, + "Key": "河北省张家口市下花园区", + "Value": "130706" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634120, + "Key": "河北省张家口市万全区", + "Value": "130708" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634121, + "Key": "河北省张家口市崇礼区", + "Value": "130709" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634122, + "Key": "河北省张家口市张北县", + "Value": "130722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634123, + "Key": "河北省张家口市康保县", + "Value": "130723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634124, + "Key": "河北省张家口市沽源县", + "Value": "130724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634125, + "Key": "河北省张家口市尚义县", + "Value": "130725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634126, + "Key": "河北省张家口市蔚县", + "Value": "130726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634127, + "Key": "河北省张家口市阳原县", + "Value": "130727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788634128, + "Key": "河北省张家口市怀安县", + "Value": "130728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638213, + "Key": "河北省张家口市怀来县", + "Value": "130730" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638214, + "Key": "河北省张家口市涿鹿县", + "Value": "130731" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638215, + "Key": "河北省张家口市赤城县", + "Value": "130732" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638216, + "Key": "河北省承德市", + "Value": "130800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638217, + "Key": "河北省承德市双桥区", + "Value": "130802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638218, + "Key": "河北省承德市双滦区", + "Value": "130803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638219, + "Key": "河北省承德市鹰手营子矿区", + "Value": "130804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638220, + "Key": "河北省承德市承德县", + "Value": "130821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638221, + "Key": "河北省承德市兴隆县", + "Value": "130822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638222, + "Key": "河北省承德市滦平县", + "Value": "130824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788638223, + "Key": "河北省承德市隆化县", + "Value": "130825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642309, + "Key": "河北省承德市丰宁满族自治县", + "Value": "130826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642310, + "Key": "河北省承德市宽城满族自治县", + "Value": "130827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642311, + "Key": "河北省承德市围场满族蒙古族自治县", + "Value": "130828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642312, + "Key": "河北省承德市平泉市", + "Value": "130881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642313, + "Key": "河北省沧州市", + "Value": "130900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642314, + "Key": "河北省沧州市新华区", + "Value": "130902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642315, + "Key": "河北省沧州市运河区", + "Value": "130903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642316, + "Key": "河北省沧州市沧县", + "Value": "130921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642317, + "Key": "河北省沧州市青县", + "Value": "130922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642318, + "Key": "河北省沧州市东光县", + "Value": "130923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642319, + "Key": "河北省沧州市海兴县", + "Value": "130924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788642320, + "Key": "河北省沧州市盐山县", + "Value": "130925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646405, + "Key": "河北省沧州市肃宁县", + "Value": "130926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646406, + "Key": "河北省沧州市南皮县", + "Value": "130927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646407, + "Key": "河北省沧州市吴桥县", + "Value": "130928" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646408, + "Key": "河北省沧州市献县", + "Value": "130929" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646409, + "Key": "河北省沧州市孟村回族自治县", + "Value": "130930" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646410, + "Key": "河北省沧州市泊头市", + "Value": "130981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646411, + "Key": "河北省沧州市任丘市", + "Value": "130982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646412, + "Key": "河北省沧州市黄骅市", + "Value": "130983" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646413, + "Key": "河北省沧州市河间市", + "Value": "130984" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646414, + "Key": "河北省廊坊市", + "Value": "131000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788646415, + "Key": "河北省廊坊市安次区", + "Value": "131002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650501, + "Key": "河北省廊坊市广阳区", + "Value": "131003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650502, + "Key": "河北省廊坊市固安县", + "Value": "131022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650503, + "Key": "河北省廊坊市永清县", + "Value": "131023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650504, + "Key": "河北省廊坊市香河县", + "Value": "131024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650505, + "Key": "河北省廊坊市大城县", + "Value": "131025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650506, + "Key": "河北省廊坊市文安县", + "Value": "131026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650507, + "Key": "河北省廊坊市大厂回族自治县", + "Value": "131028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650508, + "Key": "河北省廊坊市霸州市", + "Value": "131081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650509, + "Key": "河北省廊坊市三河市", + "Value": "131082" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650510, + "Key": "河北省衡水市", + "Value": "131100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650511, + "Key": "河北省衡水市桃城区", + "Value": "131102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788650512, + "Key": "河北省衡水市冀州区", + "Value": "131103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654597, + "Key": "河北省衡水市枣强县", + "Value": "131121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654598, + "Key": "河北省衡水市武邑县", + "Value": "131122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654599, + "Key": "河北省衡水市武强县", + "Value": "131123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654600, + "Key": "河北省衡水市饶阳县", + "Value": "131124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654601, + "Key": "河北省衡水市安平县", + "Value": "131125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654602, + "Key": "河北省衡水市故城县", + "Value": "131126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654603, + "Key": "河北省衡水市景县", + "Value": "131127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654604, + "Key": "河北省衡水市阜城县", + "Value": "131128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654605, + "Key": "河北省衡水市深州市", + "Value": "131182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654606, + "Key": "山西省", + "Value": "140000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788654607, + "Key": "山西省太原市", + "Value": "140100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658693, + "Key": "山西省太原市小店区", + "Value": "140105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658694, + "Key": "山西省太原市迎泽区", + "Value": "140106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658695, + "Key": "山西省太原市杏花岭区", + "Value": "140107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658696, + "Key": "山西省太原市尖草坪区", + "Value": "140108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658697, + "Key": "山西省太原市万柏林区", + "Value": "140109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658698, + "Key": "山西省太原市晋源区", + "Value": "140110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658699, + "Key": "山西省太原市清徐县", + "Value": "140121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658700, + "Key": "山西省太原市阳曲县", + "Value": "140122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658701, + "Key": "山西省太原市娄烦县", + "Value": "140123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658702, + "Key": "山西省太原市古交市", + "Value": "140181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788658703, + "Key": "山西省大同市", + "Value": "140200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662789, + "Key": "山西省大同市新荣区", + "Value": "140212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662790, + "Key": "山西省大同市平城区", + "Value": "140213" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662791, + "Key": "山西省大同市云冈区", + "Value": "140214" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662792, + "Key": "山西省大同市云州区", + "Value": "140215" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662793, + "Key": "山西省大同市阳高县", + "Value": "140221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662794, + "Key": "山西省大同市天镇县", + "Value": "140222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662795, + "Key": "山西省大同市广灵县", + "Value": "140223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662796, + "Key": "山西省大同市灵丘县", + "Value": "140224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662797, + "Key": "山西省大同市浑源县", + "Value": "140225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662798, + "Key": "山西省大同市左云县", + "Value": "140226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662799, + "Key": "山西省阳泉市", + "Value": "140300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788662800, + "Key": "山西省阳泉市城区", + "Value": "140302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666885, + "Key": "山西省阳泉市矿区", + "Value": "140303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666886, + "Key": "山西省阳泉市郊区", + "Value": "140311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666887, + "Key": "山西省阳泉市平定县", + "Value": "140321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666888, + "Key": "山西省阳泉市盂县", + "Value": "140322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666889, + "Key": "山西省长治市", + "Value": "140400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666890, + "Key": "山西省长治市潞州区", + "Value": "140403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666891, + "Key": "山西省长治市上党区", + "Value": "140404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666892, + "Key": "山西省长治市屯留区", + "Value": "140405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666893, + "Key": "山西省长治市潞城区", + "Value": "140406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666894, + "Key": "山西省长治市襄垣县", + "Value": "140423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666895, + "Key": "山西省长治市平顺县", + "Value": "140425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788666896, + "Key": "山西省长治市黎城县", + "Value": "140426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670981, + "Key": "山西省长治市壶关县", + "Value": "140427" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670982, + "Key": "山西省长治市长子县", + "Value": "140428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670983, + "Key": "山西省长治市武乡县", + "Value": "140429" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670984, + "Key": "山西省长治市沁县", + "Value": "140430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670985, + "Key": "山西省长治市沁源县", + "Value": "140431" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670986, + "Key": "山西省晋城市", + "Value": "140500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670987, + "Key": "山西省晋城市城区", + "Value": "140502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670988, + "Key": "山西省晋城市沁水县", + "Value": "140521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670989, + "Key": "山西省晋城市阳城县", + "Value": "140522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670990, + "Key": "山西省晋城市陵川县", + "Value": "140524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670991, + "Key": "山西省晋城市泽州县", + "Value": "140525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788670992, + "Key": "山西省晋城市高平市", + "Value": "140581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675077, + "Key": "山西省朔州市", + "Value": "140600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675078, + "Key": "山西省朔州市朔城区", + "Value": "140602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675079, + "Key": "山西省朔州市平鲁区", + "Value": "140603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675080, + "Key": "山西省朔州市山阴县", + "Value": "140621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675081, + "Key": "山西省朔州市应县", + "Value": "140622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675082, + "Key": "山西省朔州市右玉县", + "Value": "140623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675083, + "Key": "山西省朔州市怀仁市", + "Value": "140681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675084, + "Key": "山西省晋中市", + "Value": "140700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675085, + "Key": "山西省晋中市榆次区", + "Value": "140702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675086, + "Key": "山西省晋中市太谷区", + "Value": "140703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675087, + "Key": "山西省晋中市榆社县", + "Value": "140721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788675088, + "Key": "山西省晋中市左权县", + "Value": "140722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679173, + "Key": "山西省晋中市和顺县", + "Value": "140723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679174, + "Key": "山西省晋中市昔阳县", + "Value": "140724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679175, + "Key": "山西省晋中市寿阳县", + "Value": "140725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679176, + "Key": "山西省晋中市祁县", + "Value": "140727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679177, + "Key": "山西省晋中市平遥县", + "Value": "140728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679178, + "Key": "山西省晋中市灵石县", + "Value": "140729" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679179, + "Key": "山西省晋中市介休市", + "Value": "140781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679180, + "Key": "山西省运城市", + "Value": "140800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679181, + "Key": "山西省运城市盐湖区", + "Value": "140802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679182, + "Key": "山西省运城市临猗县", + "Value": "140821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679183, + "Key": "山西省运城市万荣县", + "Value": "140822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788679184, + "Key": "山西省运城市闻喜县", + "Value": "140823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683269, + "Key": "山西省运城市稷山县", + "Value": "140824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683270, + "Key": "山西省运城市新绛县", + "Value": "140825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683271, + "Key": "山西省运城市绛县", + "Value": "140826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683272, + "Key": "山西省运城市垣曲县", + "Value": "140827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683273, + "Key": "山西省运城市夏县", + "Value": "140828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683274, + "Key": "山西省运城市平陆县", + "Value": "140829" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683275, + "Key": "山西省运城市芮城县", + "Value": "140830" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683276, + "Key": "山西省运城市永济市", + "Value": "140881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683277, + "Key": "山西省运城市河津市", + "Value": "140882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683278, + "Key": "山西省忻州市", + "Value": "140900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683279, + "Key": "山西省忻州市忻府区", + "Value": "140902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683280, + "Key": "山西省忻州市定襄县", + "Value": "140921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788683281, + "Key": "山西省忻州市五台县", + "Value": "140922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687365, + "Key": "山西省忻州市代县", + "Value": "140923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687366, + "Key": "山西省忻州市繁峙县", + "Value": "140924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687367, + "Key": "山西省忻州市宁武县", + "Value": "140925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687368, + "Key": "山西省忻州市静乐县", + "Value": "140926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687369, + "Key": "山西省忻州市神池县", + "Value": "140927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687370, + "Key": "山西省忻州市五寨县", + "Value": "140928" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687371, + "Key": "山西省忻州市岢岚县", + "Value": "140929" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687372, + "Key": "山西省忻州市河曲县", + "Value": "140930" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687373, + "Key": "山西省忻州市保德县", + "Value": "140931" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687374, + "Key": "山西省忻州市偏关县", + "Value": "140932" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687375, + "Key": "山西省忻州市原平市", + "Value": "140981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788687376, + "Key": "山西省临汾市", + "Value": "141000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691461, + "Key": "山西省临汾市尧都区", + "Value": "141002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691462, + "Key": "山西省临汾市曲沃县", + "Value": "141021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691463, + "Key": "山西省临汾市翼城县", + "Value": "141022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691464, + "Key": "山西省临汾市襄汾县", + "Value": "141023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691465, + "Key": "山西省临汾市洪洞县", + "Value": "141024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691466, + "Key": "山西省临汾市古县", + "Value": "141025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691467, + "Key": "山西省临汾市安泽县", + "Value": "141026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691468, + "Key": "山西省临汾市浮山县", + "Value": "141027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691469, + "Key": "山西省临汾市吉县", + "Value": "141028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691470, + "Key": "山西省临汾市乡宁县", + "Value": "141029" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691471, + "Key": "山西省临汾市大宁县", + "Value": "141030" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691472, + "Key": "山西省临汾市隰县", + "Value": "141031" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788691473, + "Key": "山西省临汾市永和县", + "Value": "141032" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695557, + "Key": "山西省临汾市蒲县", + "Value": "141033" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695558, + "Key": "山西省临汾市汾西县", + "Value": "141034" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695559, + "Key": "山西省临汾市侯马市", + "Value": "141081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695560, + "Key": "山西省临汾市霍州市", + "Value": "141082" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695561, + "Key": "山西省吕梁市", + "Value": "141100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695562, + "Key": "山西省吕梁市离石区", + "Value": "141102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695563, + "Key": "山西省吕梁市文水县", + "Value": "141121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695564, + "Key": "山西省吕梁市交城县", + "Value": "141122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695565, + "Key": "山西省吕梁市兴县", + "Value": "141123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695566, + "Key": "山西省吕梁市临县", + "Value": "141124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695567, + "Key": "山西省吕梁市柳林县", + "Value": "141125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695568, + "Key": "山西省吕梁市石楼县", + "Value": "141126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788695569, + "Key": "山西省吕梁市岚县", + "Value": "141127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699653, + "Key": "山西省吕梁市方山县", + "Value": "141128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699654, + "Key": "山西省吕梁市中阳县", + "Value": "141129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699655, + "Key": "山西省吕梁市交口县", + "Value": "141130" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699656, + "Key": "山西省吕梁市孝义市", + "Value": "141181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699657, + "Key": "山西省吕梁市汾阳市", + "Value": "141182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699658, + "Key": "内蒙古自治区", + "Value": "150000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699659, + "Key": "内蒙古自治区呼和浩特市呼和浩特市", + "Value": "150100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699660, + "Key": "内蒙古自治区呼和浩特市新城区", + "Value": "150102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699661, + "Key": "内蒙古自治区呼和浩特市回民区", + "Value": "150103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699662, + "Key": "内蒙古自治区呼和浩特市玉泉区", + "Value": "150104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699663, + "Key": "内蒙古自治区呼和浩特市赛罕区", + "Value": "150105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788699664, + "Key": "内蒙古自治区呼和浩特市土默特左旗", + "Value": "150121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703749, + "Key": "内蒙古自治区呼和浩特市托克托县", + "Value": "150122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703750, + "Key": "内蒙古自治区呼和浩特市和林格尔县", + "Value": "150123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703751, + "Key": "内蒙古自治区呼和浩特市清水河县", + "Value": "150124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703752, + "Key": "内蒙古自治区呼和浩特市武川县", + "Value": "150125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703753, + "Key": "内蒙古自治区包头市", + "Value": "150200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703754, + "Key": "内蒙古自治区包头市东河区", + "Value": "150202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703755, + "Key": "内蒙古自治区包头市昆都仑区", + "Value": "150203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703756, + "Key": "内蒙古自治区包头市青山区", + "Value": "150204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703757, + "Key": "内蒙古自治区包头市石拐区", + "Value": "150205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703758, + "Key": "内蒙古自治区包头市白云鄂博矿区", + "Value": "150206" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703759, + "Key": "内蒙古自治区包头市九原区", + "Value": "150207" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703760, + "Key": "内蒙古自治区包头市土默特右旗", + "Value": "150221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788703761, + "Key": "内蒙古自治区包头市固阳县", + "Value": "150222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707845, + "Key": "内蒙古自治区包头市达尔罕茂明安联合旗", + "Value": "150223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707846, + "Key": "内蒙古自治区乌海市", + "Value": "150300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707847, + "Key": "内蒙古自治区乌海市海勃湾区", + "Value": "150302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707848, + "Key": "内蒙古自治区乌海市海南区", + "Value": "150303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707849, + "Key": "内蒙古自治区乌海市乌达区", + "Value": "150304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707850, + "Key": "内蒙古自治区赤峰市", + "Value": "150400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707851, + "Key": "内蒙古自治区赤峰市红山区", + "Value": "150402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707852, + "Key": "内蒙古自治区赤峰市元宝山区", + "Value": "150403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707853, + "Key": "内蒙古自治区赤峰市松山区", + "Value": "150404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707854, + "Key": "内蒙古自治区赤峰市阿鲁科尔沁旗", + "Value": "150421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707855, + "Key": "内蒙古自治区赤峰市巴林左旗", + "Value": "150422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788707856, + "Key": "内蒙古自治区赤峰市巴林右旗", + "Value": "150423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711941, + "Key": "内蒙古自治区赤峰市林西县", + "Value": "150424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711942, + "Key": "内蒙古自治区赤峰市克什克腾旗", + "Value": "150425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711943, + "Key": "内蒙古自治区赤峰市翁牛特旗", + "Value": "150426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711944, + "Key": "内蒙古自治区赤峰市喀喇沁旗", + "Value": "150428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711945, + "Key": "内蒙古自治区赤峰市宁城县", + "Value": "150429" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711946, + "Key": "内蒙古自治区赤峰市敖汉旗", + "Value": "150430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711947, + "Key": "内蒙古自治区通辽市", + "Value": "150500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711948, + "Key": "内蒙古自治区通辽市科尔沁区", + "Value": "150502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711949, + "Key": "内蒙古自治区通辽市科尔沁左翼中旗", + "Value": "150521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711950, + "Key": "内蒙古自治区通辽市科尔沁左翼后旗", + "Value": "150522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711951, + "Key": "内蒙古自治区通辽市开鲁县", + "Value": "150523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788711952, + "Key": "内蒙古自治区通辽市库伦旗", + "Value": "150524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716037, + "Key": "内蒙古自治区通辽市奈曼旗", + "Value": "150525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716038, + "Key": "内蒙古自治区通辽市扎鲁特旗", + "Value": "150526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716039, + "Key": "内蒙古自治区通辽市霍林郭勒市", + "Value": "150581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716040, + "Key": "内蒙古自治区鄂尔多斯市", + "Value": "150600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716041, + "Key": "内蒙古自治区鄂尔多斯市东胜区", + "Value": "150602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716042, + "Key": "内蒙古自治区鄂尔多斯市康巴什区", + "Value": "150603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716043, + "Key": "内蒙古自治区鄂尔多斯市达拉特旗", + "Value": "150621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716044, + "Key": "内蒙古自治区鄂尔多斯市准格尔旗", + "Value": "150622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716045, + "Key": "内蒙古自治区鄂尔多斯市鄂托克前旗", + "Value": "150623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716046, + "Key": "内蒙古自治区鄂尔多斯市鄂托克旗", + "Value": "150624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716047, + "Key": "内蒙古自治区鄂尔多斯市杭锦旗", + "Value": "150625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716048, + "Key": "内蒙古自治区鄂尔多斯市乌审旗", + "Value": "150626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788716049, + "Key": "内蒙古自治区鄂尔多斯市伊金霍洛旗", + "Value": "150627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720133, + "Key": "内蒙古自治区呼伦贝尔市", + "Value": "150700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720134, + "Key": "内蒙古自治区呼伦贝尔市海拉尔区", + "Value": "150702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720135, + "Key": "内蒙古自治区呼伦贝尔市扎赉诺尔区", + "Value": "150703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720136, + "Key": "内蒙古自治区呼伦贝尔市阿荣旗", + "Value": "150721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720137, + "Key": "内蒙古自治区呼伦贝尔市莫力达瓦达斡尔族自治旗", + "Value": "150722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720138, + "Key": "内蒙古自治区呼伦贝尔市鄂伦春自治旗", + "Value": "150723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720139, + "Key": "内蒙古自治区呼伦贝尔市鄂温克族自治旗", + "Value": "150724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720140, + "Key": "内蒙古自治区呼伦贝尔市陈巴尔虎旗", + "Value": "150725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720141, + "Key": "内蒙古自治区呼伦贝尔市新巴尔虎左旗", + "Value": "150726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720142, + "Key": "内蒙古自治区呼伦贝尔市新巴尔虎右旗", + "Value": "150727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720143, + "Key": "内蒙古自治区呼伦贝尔市满洲里市", + "Value": "150781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788720144, + "Key": "内蒙古自治区呼伦贝尔市牙克石市", + "Value": "150782" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724229, + "Key": "内蒙古自治区呼伦贝尔市扎兰屯市", + "Value": "150783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724230, + "Key": "内蒙古自治区呼伦贝尔市额尔古纳市", + "Value": "150784" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724231, + "Key": "内蒙古自治区呼伦贝尔市根河市", + "Value": "150785" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724232, + "Key": "内蒙古自治区巴彦淖尔市", + "Value": "150800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724233, + "Key": "内蒙古自治区巴彦淖尔市临河区", + "Value": "150802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724234, + "Key": "内蒙古自治区巴彦淖尔市五原县", + "Value": "150821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724235, + "Key": "内蒙古自治区巴彦淖尔市磴口县", + "Value": "150822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724236, + "Key": "内蒙古自治区巴彦淖尔市乌拉特前旗", + "Value": "150823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724237, + "Key": "内蒙古自治区巴彦淖尔市乌拉特中旗", + "Value": "150824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724238, + "Key": "内蒙古自治区巴彦淖尔市乌拉特后旗", + "Value": "150825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724239, + "Key": "内蒙古自治区巴彦淖尔市杭锦后旗", + "Value": "150826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724240, + "Key": "内蒙古自治区乌兰察布市", + "Value": "150900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788724241, + "Key": "内蒙古自治区乌兰察布市集宁区", + "Value": "150902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728325, + "Key": "内蒙古自治区乌兰察布市卓资县", + "Value": "150921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728326, + "Key": "内蒙古自治区乌兰察布市化德县", + "Value": "150922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728327, + "Key": "内蒙古自治区乌兰察布市商都县", + "Value": "150923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728328, + "Key": "内蒙古自治区乌兰察布市兴和县", + "Value": "150924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728329, + "Key": "内蒙古自治区乌兰察布市凉城县", + "Value": "150925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728330, + "Key": "内蒙古自治区乌兰察布市察哈尔右翼前旗", + "Value": "150926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728331, + "Key": "内蒙古自治区乌兰察布市察哈尔右翼中旗", + "Value": "150927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728332, + "Key": "内蒙古自治区乌兰察布市察哈尔右翼后旗", + "Value": "150928" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728333, + "Key": "内蒙古自治区乌兰察布市四子王旗", + "Value": "150929" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728334, + "Key": "内蒙古自治区乌兰察布市丰镇市", + "Value": "150981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728335, + "Key": "内蒙古自治区兴安盟", + "Value": "152200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788728336, + "Key": "内蒙古自治区兴安盟乌兰浩特市", + "Value": "152201" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732421, + "Key": "内蒙古自治区兴安盟阿尔山市", + "Value": "152202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732422, + "Key": "内蒙古自治区兴安盟科尔沁右翼前旗", + "Value": "152221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732423, + "Key": "内蒙古自治区兴安盟科尔沁右翼中旗", + "Value": "152222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732424, + "Key": "内蒙古自治区兴安盟扎赉特旗", + "Value": "152223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732425, + "Key": "内蒙古自治区兴安盟突泉县", + "Value": "152224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732426, + "Key": "内蒙古自治区锡林郭勒盟", + "Value": "152500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732427, + "Key": "内蒙古自治区锡林郭勒盟二连浩特市", + "Value": "152501" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732428, + "Key": "内蒙古自治区锡林郭勒盟锡林浩特市", + "Value": "152502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732429, + "Key": "内蒙古自治区锡林郭勒盟阿巴嘎旗", + "Value": "152522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732430, + "Key": "内蒙古自治区锡林郭勒盟苏尼特左旗", + "Value": "152523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732431, + "Key": "内蒙古自治区锡林郭勒盟苏尼特右旗", + "Value": "152524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732432, + "Key": "内蒙古自治区锡林郭勒盟东乌珠穆沁旗", + "Value": "152525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788732433, + "Key": "内蒙古自治区锡林郭勒盟西乌珠穆沁旗", + "Value": "152526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736517, + "Key": "内蒙古自治区锡林郭勒盟太仆寺旗", + "Value": "152527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736518, + "Key": "内蒙古自治区锡林郭勒盟镶黄旗", + "Value": "152528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736519, + "Key": "内蒙古自治区锡林郭勒盟正镶白旗", + "Value": "152529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736520, + "Key": "内蒙古自治区锡林郭勒盟正蓝旗", + "Value": "152530" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736521, + "Key": "内蒙古自治区锡林郭勒盟多伦县", + "Value": "152531" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736522, + "Key": "内蒙古自治区阿拉善盟", + "Value": "152900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788736523, + "Key": "内蒙古自治区阿拉善盟阿拉善左旗", + "Value": "152921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788740613, + "Key": "内蒙古自治区阿拉善盟阿拉善右旗", + "Value": "152922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788744709, + "Key": "内蒙古自治区阿拉善盟额济纳旗", + "Value": "152923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788744710, + "Key": "辽宁省", + "Value": "210000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788748805, + "Key": "辽宁省沈阳市", + "Value": "210100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788748806, + "Key": "辽宁省沈阳市和平区", + "Value": "210102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788748807, + "Key": "辽宁省沈阳市沈河区", + "Value": "210103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788752901, + "Key": "辽宁省沈阳市大东区", + "Value": "210104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788752902, + "Key": "辽宁省沈阳市皇姑区", + "Value": "210105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788756997, + "Key": "辽宁省沈阳市铁西区", + "Value": "210106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788756998, + "Key": "辽宁省沈阳市苏家屯区", + "Value": "210111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788761093, + "Key": "辽宁省沈阳市浑南区", + "Value": "210112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788765189, + "Key": "辽宁省沈阳市沈北新区", + "Value": "210113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788765190, + "Key": "辽宁省沈阳市于洪区", + "Value": "210114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788765191, + "Key": "辽宁省沈阳市辽中区", + "Value": "210115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788765192, + "Key": "辽宁省沈阳市康平县", + "Value": "210123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788769285, + "Key": "辽宁省沈阳市法库县", + "Value": "210124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788769286, + "Key": "辽宁省沈阳市新民市", + "Value": "210181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788769287, + "Key": "辽宁省大连市", + "Value": "210200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788769288, + "Key": "辽宁省大连市中山区", + "Value": "210202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788769289, + "Key": "辽宁省大连市西岗区", + "Value": "210203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788773381, + "Key": "辽宁省大连市沙河口区", + "Value": "210204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788773382, + "Key": "辽宁省大连市甘井子区", + "Value": "210211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788773383, + "Key": "辽宁省大连市旅顺口区", + "Value": "210212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788773384, + "Key": "辽宁省大连市金州区", + "Value": "210213" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777477, + "Key": "辽宁省大连市普兰店区", + "Value": "210214" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777478, + "Key": "辽宁省大连市长海县", + "Value": "210224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777479, + "Key": "辽宁省大连市瓦房店市", + "Value": "210281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777480, + "Key": "辽宁省大连市庄河市", + "Value": "210283" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777481, + "Key": "辽宁省鞍山市", + "Value": "210300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777482, + "Key": "辽宁省鞍山市铁东区", + "Value": "210302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777483, + "Key": "辽宁省鞍山市铁西区", + "Value": "210303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777484, + "Key": "辽宁省鞍山市立山区", + "Value": "210304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777485, + "Key": "辽宁省鞍山市千山区", + "Value": "210311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788777486, + "Key": "辽宁省鞍山市台安县", + "Value": "210321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781573, + "Key": "辽宁省鞍山市岫岩满族自治县", + "Value": "210323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781574, + "Key": "辽宁省鞍山市海城市", + "Value": "210381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781575, + "Key": "辽宁省抚顺市", + "Value": "210400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781576, + "Key": "辽宁省抚顺市新抚区", + "Value": "210402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781577, + "Key": "辽宁省抚顺市东洲区", + "Value": "210403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781578, + "Key": "辽宁省抚顺市望花区", + "Value": "210404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781579, + "Key": "辽宁省抚顺市顺城区", + "Value": "210411" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781580, + "Key": "辽宁省抚顺市抚顺县", + "Value": "210421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788781581, + "Key": "辽宁省抚顺市新宾满族自治县", + "Value": "210422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785669, + "Key": "辽宁省抚顺市清原满族自治县", + "Value": "210423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785670, + "Key": "辽宁省本溪市", + "Value": "210500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785671, + "Key": "辽宁省本溪市平山区", + "Value": "210502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785672, + "Key": "辽宁省本溪市溪湖区", + "Value": "210503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785673, + "Key": "辽宁省本溪市明山区", + "Value": "210504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785674, + "Key": "辽宁省本溪市南芬区", + "Value": "210505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785675, + "Key": "辽宁省本溪市本溪满族自治县", + "Value": "210521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788785676, + "Key": "辽宁省本溪市桓仁满族自治县", + "Value": "210522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789765, + "Key": "辽宁省丹东市", + "Value": "210600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789766, + "Key": "辽宁省丹东市元宝区", + "Value": "210602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789767, + "Key": "辽宁省丹东市振兴区", + "Value": "210603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789768, + "Key": "辽宁省丹东市振安区", + "Value": "210604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789769, + "Key": "辽宁省丹东市宽甸满族自治县", + "Value": "210624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789770, + "Key": "辽宁省丹东市东港市", + "Value": "210681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789771, + "Key": "辽宁省丹东市凤城市", + "Value": "210682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789772, + "Key": "辽宁省锦州市", + "Value": "210700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789773, + "Key": "辽宁省锦州市古塔区", + "Value": "210702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788789774, + "Key": "辽宁省锦州市凌河区", + "Value": "210703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793861, + "Key": "辽宁省锦州市太和区", + "Value": "210711" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793862, + "Key": "辽宁省锦州市黑山县", + "Value": "210726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793863, + "Key": "辽宁省锦州市义县", + "Value": "210727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793864, + "Key": "辽宁省锦州市凌海市", + "Value": "210781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793865, + "Key": "辽宁省锦州市北镇市", + "Value": "210782" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793866, + "Key": "辽宁省营口市", + "Value": "210800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793867, + "Key": "辽宁省营口市站前区", + "Value": "210802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793868, + "Key": "辽宁省营口市西市区", + "Value": "210803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793869, + "Key": "辽宁省营口市鲅鱼圈区", + "Value": "210804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793870, + "Key": "辽宁省营口市老边区", + "Value": "210811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793871, + "Key": "辽宁省营口市盖州市", + "Value": "210881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788793872, + "Key": "辽宁省营口市大石桥市", + "Value": "210882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797957, + "Key": "辽宁省阜新市", + "Value": "210900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797958, + "Key": "辽宁省阜新市海州区", + "Value": "210902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797959, + "Key": "辽宁省阜新市新邱区", + "Value": "210903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797960, + "Key": "辽宁省阜新市太平区", + "Value": "210904" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797961, + "Key": "辽宁省阜新市清河门区", + "Value": "210905" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797962, + "Key": "辽宁省阜新市细河区", + "Value": "210911" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797963, + "Key": "辽宁省阜新市阜新蒙古族自治县", + "Value": "210921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797964, + "Key": "辽宁省阜新市彰武县", + "Value": "210922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797965, + "Key": "辽宁省辽阳市", + "Value": "211000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797966, + "Key": "辽宁省辽阳市白塔区", + "Value": "211002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797967, + "Key": "辽宁省辽阳市文圣区", + "Value": "211003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797968, + "Key": "辽宁省辽阳市宏伟区", + "Value": "211004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788797969, + "Key": "辽宁省辽阳市弓长岭区", + "Value": "211005" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802053, + "Key": "辽宁省辽阳市太子河区", + "Value": "211011" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802054, + "Key": "辽宁省辽阳市辽阳县", + "Value": "211021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802055, + "Key": "辽宁省辽阳市灯塔市", + "Value": "211081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802056, + "Key": "辽宁省盘锦市", + "Value": "211100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802057, + "Key": "辽宁省盘锦市双台子区", + "Value": "211102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802058, + "Key": "辽宁省盘锦市兴隆台区", + "Value": "211103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802059, + "Key": "辽宁省盘锦市大洼区", + "Value": "211104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802060, + "Key": "辽宁省盘锦市盘山县", + "Value": "211122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802061, + "Key": "辽宁省铁岭市", + "Value": "211200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802062, + "Key": "辽宁省铁岭市银州区", + "Value": "211202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802063, + "Key": "辽宁省铁岭市清河区", + "Value": "211204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788802064, + "Key": "辽宁省铁岭市铁岭县", + "Value": "211221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806149, + "Key": "辽宁省铁岭市西丰县", + "Value": "211223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806150, + "Key": "辽宁省铁岭市昌图县", + "Value": "211224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806151, + "Key": "辽宁省铁岭市调兵山市", + "Value": "211281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806152, + "Key": "辽宁省铁岭市开原市", + "Value": "211282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806153, + "Key": "辽宁省朝阳市", + "Value": "211300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806154, + "Key": "辽宁省朝阳市双塔区", + "Value": "211302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806155, + "Key": "辽宁省朝阳市龙城区", + "Value": "211303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806156, + "Key": "辽宁省朝阳市朝阳县", + "Value": "211321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806157, + "Key": "辽宁省朝阳市建平县", + "Value": "211322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806158, + "Key": "辽宁省朝阳市喀喇沁左翼蒙古族自治县", + "Value": "211324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806159, + "Key": "辽宁省朝阳市北票市", + "Value": "211381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788806160, + "Key": "辽宁省朝阳市凌源市", + "Value": "211382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810245, + "Key": "辽宁省葫芦岛市", + "Value": "211400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810246, + "Key": "辽宁省葫芦岛市连山区", + "Value": "211402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810247, + "Key": "辽宁省葫芦岛市龙港区", + "Value": "211403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810248, + "Key": "辽宁省葫芦岛市南票区", + "Value": "211404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810249, + "Key": "辽宁省葫芦岛市绥中县", + "Value": "211421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810250, + "Key": "辽宁省葫芦岛市建昌县", + "Value": "211422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810251, + "Key": "辽宁省葫芦岛市兴城市", + "Value": "211481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810252, + "Key": "吉林省", + "Value": "220000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810253, + "Key": "吉林省长春市", + "Value": "220100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810254, + "Key": "吉林省长春市南关区", + "Value": "220102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810255, + "Key": "吉林省长春市宽城区", + "Value": "220103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810256, + "Key": "吉林省长春市朝阳区", + "Value": "220104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788810257, + "Key": "吉林省长春市二道区", + "Value": "220105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814341, + "Key": "吉林省长春市绿园区", + "Value": "220106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814342, + "Key": "吉林省长春市双阳区", + "Value": "220112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814343, + "Key": "吉林省长春市九台区", + "Value": "220113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814344, + "Key": "吉林省长春市农安县", + "Value": "220122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814345, + "Key": "吉林省长春市榆树市", + "Value": "220182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814346, + "Key": "吉林省长春市德惠市", + "Value": "220183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814347, + "Key": "吉林省长春市公主岭市", + "Value": "220184" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814348, + "Key": "吉林省吉林市", + "Value": "220200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814349, + "Key": "吉林省吉林市昌邑区", + "Value": "220202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814350, + "Key": "吉林省吉林市龙潭区", + "Value": "220203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814351, + "Key": "吉林省吉林市船营区", + "Value": "220204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788814352, + "Key": "吉林省吉林市丰满区", + "Value": "220211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818437, + "Key": "吉林省吉林市永吉县", + "Value": "220221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818438, + "Key": "吉林省吉林市蛟河市", + "Value": "220281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818439, + "Key": "吉林省吉林市桦甸市", + "Value": "220282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818440, + "Key": "吉林省吉林市舒兰市", + "Value": "220283" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818441, + "Key": "吉林省吉林市磐石市", + "Value": "220284" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818442, + "Key": "吉林省四平市", + "Value": "220300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818443, + "Key": "吉林省四平市铁西区", + "Value": "220302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818444, + "Key": "吉林省四平市铁东区", + "Value": "220303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818445, + "Key": "吉林省四平市梨树县", + "Value": "220322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818446, + "Key": "吉林省四平市伊通满族自治县", + "Value": "220323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818447, + "Key": "吉林省四平市双辽市", + "Value": "220382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818448, + "Key": "吉林省辽源市", + "Value": "220400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788818449, + "Key": "吉林省辽源市龙山区", + "Value": "220402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822533, + "Key": "吉林省辽源市西安区", + "Value": "220403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822534, + "Key": "吉林省辽源市东丰县", + "Value": "220421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822535, + "Key": "吉林省辽源市东辽县", + "Value": "220422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822536, + "Key": "吉林省通化市", + "Value": "220500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822537, + "Key": "吉林省通化市东昌区", + "Value": "220502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822538, + "Key": "吉林省通化市二道江区", + "Value": "220503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822539, + "Key": "吉林省通化市通化县", + "Value": "220521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822540, + "Key": "吉林省通化市辉南县", + "Value": "220523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822541, + "Key": "吉林省通化市柳河县", + "Value": "220524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822542, + "Key": "吉林省通化市梅河口市", + "Value": "220581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822543, + "Key": "吉林省通化市集安市", + "Value": "220582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788822544, + "Key": "吉林省白山市", + "Value": "220600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826629, + "Key": "吉林省白山市浑江区", + "Value": "220602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826630, + "Key": "吉林省白山市江源区", + "Value": "220605" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826631, + "Key": "吉林省白山市抚松县", + "Value": "220621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826632, + "Key": "吉林省白山市靖宇县", + "Value": "220622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826633, + "Key": "吉林省白山市长白朝鲜族自治县", + "Value": "220623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826634, + "Key": "吉林省白山市临江市", + "Value": "220681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826635, + "Key": "吉林省松原市", + "Value": "220700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826636, + "Key": "吉林省松原市宁江区", + "Value": "220702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826637, + "Key": "吉林省松原市前郭尔罗斯蒙古族自治县", + "Value": "220721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826638, + "Key": "吉林省松原市长岭县", + "Value": "220722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826639, + "Key": "吉林省松原市乾安县", + "Value": "220723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826640, + "Key": "吉林省松原市扶余市", + "Value": "220781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788826641, + "Key": "吉林省白城市", + "Value": "220800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830725, + "Key": "吉林省白城市洮北区", + "Value": "220802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830726, + "Key": "吉林省白城市镇赉县", + "Value": "220821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830727, + "Key": "吉林省白城市通榆县", + "Value": "220822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830728, + "Key": "吉林省白城市洮南市", + "Value": "220881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830729, + "Key": "吉林省白城市大安市", + "Value": "220882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830730, + "Key": "吉林省延边朝鲜族自治州", + "Value": "222400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830731, + "Key": "吉林省延边朝鲜族自治州延吉市", + "Value": "222401" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830732, + "Key": "吉林省延边朝鲜族自治州图们市", + "Value": "222402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830733, + "Key": "吉林省延边朝鲜族自治州敦化市", + "Value": "222403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830734, + "Key": "吉林省延边朝鲜族自治州珲春市", + "Value": "222404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830735, + "Key": "吉林省延边朝鲜族自治州龙井市", + "Value": "222405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830736, + "Key": "吉林省延边朝鲜族自治州和龙市", + "Value": "222406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788830737, + "Key": "吉林省延边朝鲜族自治州汪清县", + "Value": "222424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834821, + "Key": "吉林省延边朝鲜族自治州安图县", + "Value": "222426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834822, + "Key": "黑龙江省", + "Value": "230000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834823, + "Key": "黑龙江省哈尔滨市", + "Value": "230100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834824, + "Key": "黑龙江省哈尔滨市道里区", + "Value": "230102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834825, + "Key": "黑龙江省哈尔滨市南岗区", + "Value": "230103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834826, + "Key": "黑龙江省哈尔滨市道外区", + "Value": "230104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834827, + "Key": "黑龙江省哈尔滨市平房区", + "Value": "230108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834828, + "Key": "黑龙江省哈尔滨市松北区", + "Value": "230109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834829, + "Key": "黑龙江省哈尔滨市香坊区", + "Value": "230110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834830, + "Key": "黑龙江省哈尔滨市呼兰区", + "Value": "230111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834831, + "Key": "黑龙江省哈尔滨市阿城区", + "Value": "230112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788834832, + "Key": "黑龙江省哈尔滨市双城区", + "Value": "230113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838917, + "Key": "黑龙江省哈尔滨市依兰县", + "Value": "230123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838918, + "Key": "黑龙江省哈尔滨市方正县", + "Value": "230124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838919, + "Key": "黑龙江省哈尔滨市宾县", + "Value": "230125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838920, + "Key": "黑龙江省哈尔滨市巴彦县", + "Value": "230126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838921, + "Key": "黑龙江省哈尔滨市木兰县", + "Value": "230127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838922, + "Key": "黑龙江省哈尔滨市通河县", + "Value": "230128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838923, + "Key": "黑龙江省哈尔滨市延寿县", + "Value": "230129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838924, + "Key": "黑龙江省哈尔滨市尚志市", + "Value": "230183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838925, + "Key": "黑龙江省哈尔滨市五常市", + "Value": "230184" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838926, + "Key": "黑龙江省齐齐哈尔市", + "Value": "230200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838927, + "Key": "黑龙江省齐齐哈尔市龙沙区", + "Value": "230202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788838928, + "Key": "黑龙江省齐齐哈尔市建华区", + "Value": "230203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843013, + "Key": "黑龙江省齐齐哈尔市铁锋区", + "Value": "230204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843014, + "Key": "黑龙江省齐齐哈尔市昂昂溪区", + "Value": "230205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843015, + "Key": "黑龙江省齐齐哈尔市富拉尔基区", + "Value": "230206" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843016, + "Key": "黑龙江省齐齐哈尔市碾子山区", + "Value": "230207" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843017, + "Key": "黑龙江省齐齐哈尔市梅里斯达斡尔族区", + "Value": "230208" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843018, + "Key": "黑龙江省齐齐哈尔市龙江县", + "Value": "230221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843019, + "Key": "黑龙江省齐齐哈尔市依安县", + "Value": "230223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843020, + "Key": "黑龙江省齐齐哈尔市泰来县", + "Value": "230224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843021, + "Key": "黑龙江省齐齐哈尔市甘南县", + "Value": "230225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843022, + "Key": "黑龙江省齐齐哈尔市富裕县", + "Value": "230227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843023, + "Key": "黑龙江省齐齐哈尔市克山县", + "Value": "230229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843024, + "Key": "黑龙江省齐齐哈尔市克东县", + "Value": "230230" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788843025, + "Key": "黑龙江省齐齐哈尔市拜泉县", + "Value": "230231" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847109, + "Key": "黑龙江省齐齐哈尔市讷河市", + "Value": "230281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847110, + "Key": "黑龙江省鸡西市", + "Value": "230300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847111, + "Key": "黑龙江省鸡西市鸡冠区", + "Value": "230302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847112, + "Key": "黑龙江省鸡西市恒山区", + "Value": "230303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847113, + "Key": "黑龙江省鸡西市滴道区", + "Value": "230304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847114, + "Key": "黑龙江省鸡西市梨树区", + "Value": "230305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847115, + "Key": "黑龙江省鸡西市城子河区", + "Value": "230306" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847116, + "Key": "黑龙江省鸡西市麻山区", + "Value": "230307" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847117, + "Key": "黑龙江省鸡西市鸡东县", + "Value": "230321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847118, + "Key": "黑龙江省鸡西市虎林市", + "Value": "230381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847119, + "Key": "黑龙江省鸡西市密山市", + "Value": "230382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847120, + "Key": "黑龙江省鹤岗市", + "Value": "230400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788847121, + "Key": "黑龙江省鹤岗市向阳区", + "Value": "230402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851205, + "Key": "黑龙江省鹤岗市工农区", + "Value": "230403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851206, + "Key": "黑龙江省鹤岗市南山区", + "Value": "230404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851207, + "Key": "黑龙江省鹤岗市兴安区", + "Value": "230405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851208, + "Key": "黑龙江省鹤岗市东山区", + "Value": "230406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851209, + "Key": "黑龙江省鹤岗市兴山区", + "Value": "230407" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851210, + "Key": "黑龙江省鹤岗市萝北县", + "Value": "230421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851211, + "Key": "黑龙江省鹤岗市绥滨县", + "Value": "230422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851212, + "Key": "黑龙江省双鸭山市", + "Value": "230500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851213, + "Key": "黑龙江省双鸭山市尖山区", + "Value": "230502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851214, + "Key": "黑龙江省双鸭山市岭东区", + "Value": "230503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851215, + "Key": "黑龙江省双鸭山市四方台区", + "Value": "230505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788851216, + "Key": "黑龙江省双鸭山市宝山区", + "Value": "230506" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855301, + "Key": "黑龙江省双鸭山市集贤县", + "Value": "230521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855302, + "Key": "黑龙江省双鸭山市友谊县", + "Value": "230522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855303, + "Key": "黑龙江省双鸭山市宝清县", + "Value": "230523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855304, + "Key": "黑龙江省双鸭山市饶河县", + "Value": "230524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855305, + "Key": "黑龙江省大庆市", + "Value": "230600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855306, + "Key": "黑龙江省大庆市萨尔图区", + "Value": "230602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855307, + "Key": "黑龙江省大庆市龙凤区", + "Value": "230603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855308, + "Key": "黑龙江省大庆市让胡路区", + "Value": "230604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855309, + "Key": "黑龙江省大庆市红岗区", + "Value": "230605" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855310, + "Key": "黑龙江省大庆市大同区", + "Value": "230606" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855311, + "Key": "黑龙江省大庆市肇州县", + "Value": "230621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855312, + "Key": "黑龙江省大庆市肇源县", + "Value": "230622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788855313, + "Key": "黑龙江省大庆市林甸县", + "Value": "230623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859397, + "Key": "黑龙江省大庆市杜尔伯特蒙古族自治县", + "Value": "230624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859398, + "Key": "黑龙江省伊春市", + "Value": "230700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859399, + "Key": "黑龙江省伊春市伊美区", + "Value": "230717" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859400, + "Key": "黑龙江省伊春市乌翠区", + "Value": "230718" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859401, + "Key": "黑龙江省伊春市友好区", + "Value": "230719" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859402, + "Key": "黑龙江省伊春市嘉荫县", + "Value": "230722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859403, + "Key": "黑龙江省伊春市汤旺县", + "Value": "230723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859404, + "Key": "黑龙江省伊春市丰林县", + "Value": "230724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859405, + "Key": "黑龙江省伊春市大箐山县", + "Value": "230725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859406, + "Key": "黑龙江省伊春市南岔县", + "Value": "230726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859407, + "Key": "黑龙江省伊春市金林区", + "Value": "230751" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859408, + "Key": "黑龙江省伊春市铁力市", + "Value": "230781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788859409, + "Key": "黑龙江省佳木斯市", + "Value": "230800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863493, + "Key": "黑龙江省佳木斯市向阳区", + "Value": "230803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863494, + "Key": "黑龙江省佳木斯市前进区", + "Value": "230804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863495, + "Key": "黑龙江省佳木斯市东风区", + "Value": "230805" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863496, + "Key": "黑龙江省佳木斯市郊区", + "Value": "230811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863497, + "Key": "黑龙江省佳木斯市桦南县", + "Value": "230822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863498, + "Key": "黑龙江省佳木斯市桦川县", + "Value": "230826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863499, + "Key": "黑龙江省佳木斯市汤原县", + "Value": "230828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863500, + "Key": "黑龙江省佳木斯市同江市", + "Value": "230881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863501, + "Key": "黑龙江省佳木斯市富锦市", + "Value": "230882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863502, + "Key": "黑龙江省佳木斯市抚远市", + "Value": "230883" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863503, + "Key": "黑龙江省七台河市", + "Value": "230900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788863504, + "Key": "黑龙江省七台河市新兴区", + "Value": "230902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867589, + "Key": "黑龙江省七台河市桃山区", + "Value": "230903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867590, + "Key": "黑龙江省七台河市茄子河区", + "Value": "230904" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867591, + "Key": "黑龙江省七台河市勃利县", + "Value": "230921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867592, + "Key": "黑龙江省牡丹江市", + "Value": "231000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867593, + "Key": "黑龙江省牡丹江市东安区", + "Value": "231002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867594, + "Key": "黑龙江省牡丹江市阳明区", + "Value": "231003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867595, + "Key": "黑龙江省牡丹江市爱民区", + "Value": "231004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867596, + "Key": "黑龙江省牡丹江市西安区", + "Value": "231005" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867597, + "Key": "黑龙江省牡丹江市林口县", + "Value": "231025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867598, + "Key": "黑龙江省牡丹江市绥芬河市", + "Value": "231081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867599, + "Key": "黑龙江省牡丹江市海林市", + "Value": "231083" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788867600, + "Key": "黑龙江省牡丹江市宁安市", + "Value": "231084" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871685, + "Key": "黑龙江省牡丹江市穆棱市", + "Value": "231085" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871686, + "Key": "黑龙江省牡丹江市东宁市", + "Value": "231086" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871687, + "Key": "黑龙江省黑河市", + "Value": "231100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871688, + "Key": "黑龙江省黑河市爱辉区", + "Value": "231102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871689, + "Key": "黑龙江省黑河市逊克县", + "Value": "231123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871690, + "Key": "黑龙江省黑河市孙吴县", + "Value": "231124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871691, + "Key": "黑龙江省黑河市北安市", + "Value": "231181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871692, + "Key": "黑龙江省黑河市五大连池市", + "Value": "231182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871693, + "Key": "黑龙江省黑河市嫩江市", + "Value": "231183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871694, + "Key": "黑龙江省绥化市", + "Value": "231200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871695, + "Key": "黑龙江省绥化市北林区", + "Value": "231202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871696, + "Key": "黑龙江省绥化市望奎县", + "Value": "231221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788871697, + "Key": "黑龙江省绥化市兰西县", + "Value": "231222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875781, + "Key": "黑龙江省绥化市青冈县", + "Value": "231223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875782, + "Key": "黑龙江省绥化市庆安县", + "Value": "231224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875783, + "Key": "黑龙江省绥化市明水县", + "Value": "231225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875784, + "Key": "黑龙江省绥化市绥棱县", + "Value": "231226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875785, + "Key": "黑龙江省绥化市安达市", + "Value": "231281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875786, + "Key": "黑龙江省绥化市肇东市", + "Value": "231282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875787, + "Key": "黑龙江省绥化市海伦市", + "Value": "231283" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875788, + "Key": "黑龙江省大兴安岭地区", + "Value": "232700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875789, + "Key": "黑龙江省大兴安岭地区漠河市", + "Value": "232701" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875790, + "Key": "黑龙江省大兴安岭地区呼玛县", + "Value": "232721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875791, + "Key": "黑龙江省大兴安岭地区塔河县", + "Value": "232722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788875792, + "Key": "上海市", + "Value": "310000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879877, + "Key": "上海市黄浦区", + "Value": "310101" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879878, + "Key": "上海市徐汇区", + "Value": "310104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879879, + "Key": "上海市长宁区", + "Value": "310105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879880, + "Key": "上海市静安区", + "Value": "310106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879881, + "Key": "上海市普陀区", + "Value": "310107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879882, + "Key": "上海市虹口区", + "Value": "310109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879883, + "Key": "上海市杨浦区", + "Value": "310110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879884, + "Key": "上海市闵行区", + "Value": "310112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879885, + "Key": "上海市宝山区", + "Value": "310113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879886, + "Key": "上海市嘉定区", + "Value": "310114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879887, + "Key": "上海市浦东新区", + "Value": "310115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879888, + "Key": "上海市金山区", + "Value": "310116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788879889, + "Key": "上海市松江区", + "Value": "310117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883973, + "Key": "上海市青浦区", + "Value": "310118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883974, + "Key": "上海市奉贤区", + "Value": "310120" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883975, + "Key": "上海市崇明区", + "Value": "310151" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883976, + "Key": "江苏省", + "Value": "320000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883977, + "Key": "江苏省南京市", + "Value": "320100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883978, + "Key": "江苏省南京市玄武区", + "Value": "320102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883979, + "Key": "江苏省南京市秦淮区", + "Value": "320104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883980, + "Key": "江苏省南京市建邺区", + "Value": "320105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883981, + "Key": "江苏省南京市鼓楼区", + "Value": "320106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883982, + "Key": "江苏省南京市浦口区", + "Value": "320111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883983, + "Key": "江苏省南京市栖霞区", + "Value": "320113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788883984, + "Key": "江苏省南京市雨花台区", + "Value": "320114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888069, + "Key": "江苏省南京市江宁区", + "Value": "320115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888070, + "Key": "江苏省南京市六合区", + "Value": "320116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888071, + "Key": "江苏省南京市溧水区", + "Value": "320117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888072, + "Key": "江苏省南京市高淳区", + "Value": "320118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888073, + "Key": "江苏省无锡市", + "Value": "320200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888074, + "Key": "江苏省无锡市锡山区", + "Value": "320205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888075, + "Key": "江苏省无锡市惠山区", + "Value": "320206" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888076, + "Key": "江苏省无锡市滨湖区", + "Value": "320211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888077, + "Key": "江苏省无锡市梁溪区", + "Value": "320213" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888078, + "Key": "江苏省无锡市新吴区", + "Value": "320214" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888079, + "Key": "江苏省无锡市江阴市", + "Value": "320281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788888080, + "Key": "江苏省无锡市宜兴市", + "Value": "320282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892165, + "Key": "江苏省徐州市", + "Value": "320300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892166, + "Key": "江苏省徐州市鼓楼区", + "Value": "320302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892167, + "Key": "江苏省徐州市云龙区", + "Value": "320303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892168, + "Key": "江苏省徐州市贾汪区", + "Value": "320305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892169, + "Key": "江苏省徐州市泉山区", + "Value": "320311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892170, + "Key": "江苏省徐州市铜山区", + "Value": "320312" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892171, + "Key": "江苏省徐州市丰县", + "Value": "320321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892172, + "Key": "江苏省徐州市沛县", + "Value": "320322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892173, + "Key": "江苏省徐州市睢宁县", + "Value": "320324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892174, + "Key": "江苏省徐州市新沂市", + "Value": "320381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892175, + "Key": "江苏省徐州市邳州市", + "Value": "320382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788892176, + "Key": "江苏省常州市", + "Value": "320400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896261, + "Key": "江苏省常州市天宁区", + "Value": "320402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896262, + "Key": "江苏省常州市钟楼区", + "Value": "320404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896263, + "Key": "江苏省常州市新北区", + "Value": "320411" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896264, + "Key": "江苏省常州市武进区", + "Value": "320412" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896265, + "Key": "江苏省常州市金坛区", + "Value": "320413" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896266, + "Key": "江苏省常州市溧阳市", + "Value": "320481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896267, + "Key": "江苏省苏州市", + "Value": "320500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896268, + "Key": "江苏省苏州市虎丘区", + "Value": "320505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896269, + "Key": "江苏省苏州市吴中区", + "Value": "320506" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896270, + "Key": "江苏省苏州市相城区", + "Value": "320507" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896271, + "Key": "江苏省苏州市姑苏区", + "Value": "320508" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896272, + "Key": "江苏省苏州市吴江区", + "Value": "320509" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788896273, + "Key": "江苏省苏州市常熟市", + "Value": "320581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900357, + "Key": "江苏省苏州市张家港市", + "Value": "320582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900358, + "Key": "江苏省苏州市昆山市", + "Value": "320583" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900359, + "Key": "江苏省苏州市太仓市", + "Value": "320585" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900360, + "Key": "江苏省南通市", + "Value": "320600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900361, + "Key": "江苏省南通市通州区", + "Value": "320612" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900362, + "Key": "江苏省南通市崇川区", + "Value": "320613" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900363, + "Key": "江苏省南通市海门区", + "Value": "320614" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900364, + "Key": "江苏省南通市如东县", + "Value": "320623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900365, + "Key": "江苏省南通市启东市", + "Value": "320681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900366, + "Key": "江苏省南通市如皋市", + "Value": "320682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900367, + "Key": "江苏省南通市海安市", + "Value": "320685" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788900368, + "Key": "江苏省连云港市", + "Value": "320700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904453, + "Key": "江苏省连云港市连云区", + "Value": "320703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904454, + "Key": "江苏省连云港市海州区", + "Value": "320706" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904455, + "Key": "江苏省连云港市赣榆区", + "Value": "320707" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904456, + "Key": "江苏省连云港市东海县", + "Value": "320722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904457, + "Key": "江苏省连云港市灌云县", + "Value": "320723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904458, + "Key": "江苏省连云港市灌南县", + "Value": "320724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904459, + "Key": "江苏省淮安市", + "Value": "320800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904460, + "Key": "江苏省淮安市淮安区", + "Value": "320803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904461, + "Key": "江苏省淮安市淮阴区", + "Value": "320804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904462, + "Key": "江苏省淮安市清江浦区", + "Value": "320812" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904463, + "Key": "江苏省淮安市洪泽区", + "Value": "320813" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788904464, + "Key": "江苏省淮安市涟水县", + "Value": "320826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908549, + "Key": "江苏省淮安市盱眙县", + "Value": "320830" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908550, + "Key": "江苏省淮安市金湖县", + "Value": "320831" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908551, + "Key": "江苏省盐城市", + "Value": "320900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908552, + "Key": "江苏省盐城市亭湖区", + "Value": "320902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908553, + "Key": "江苏省盐城市盐都区", + "Value": "320903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908554, + "Key": "江苏省盐城市大丰区", + "Value": "320904" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908555, + "Key": "江苏省盐城市响水县", + "Value": "320921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908556, + "Key": "江苏省盐城市滨海县", + "Value": "320922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908557, + "Key": "江苏省盐城市阜宁县", + "Value": "320923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908558, + "Key": "江苏省盐城市射阳县", + "Value": "320924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908559, + "Key": "江苏省盐城市建湖县", + "Value": "320925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788908560, + "Key": "江苏省盐城市东台市", + "Value": "320981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912645, + "Key": "江苏省扬州市", + "Value": "321000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912646, + "Key": "江苏省扬州市广陵区", + "Value": "321002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912647, + "Key": "江苏省扬州市邗江区", + "Value": "321003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912648, + "Key": "江苏省扬州市江都区", + "Value": "321012" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912649, + "Key": "江苏省扬州市宝应县", + "Value": "321023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912650, + "Key": "江苏省扬州市仪征市", + "Value": "321081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912651, + "Key": "江苏省扬州市高邮市", + "Value": "321084" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912652, + "Key": "江苏省镇江市", + "Value": "321100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912653, + "Key": "江苏省镇江市京口区", + "Value": "321102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912654, + "Key": "江苏省镇江市润州区", + "Value": "321111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912655, + "Key": "江苏省镇江市丹徒区", + "Value": "321112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788912656, + "Key": "江苏省镇江市丹阳市", + "Value": "321181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916741, + "Key": "江苏省镇江市扬中市", + "Value": "321182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916742, + "Key": "江苏省镇江市句容市", + "Value": "321183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916743, + "Key": "江苏省泰州市", + "Value": "321200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916744, + "Key": "江苏省泰州市海陵区", + "Value": "321202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916745, + "Key": "江苏省泰州市高港区", + "Value": "321203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916746, + "Key": "江苏省泰州市姜堰区", + "Value": "321204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916747, + "Key": "江苏省泰州市兴化市", + "Value": "321281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916748, + "Key": "江苏省泰州市靖江市", + "Value": "321282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916749, + "Key": "江苏省泰州市泰兴市", + "Value": "321283" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916750, + "Key": "江苏省宿迁市", + "Value": "321300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916751, + "Key": "江苏省宿迁市宿城区", + "Value": "321302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916752, + "Key": "江苏省宿迁市宿豫区", + "Value": "321311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788916753, + "Key": "江苏省宿迁市沭阳县", + "Value": "321322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920837, + "Key": "江苏省宿迁市泗阳县", + "Value": "321323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920838, + "Key": "江苏省宿迁市泗洪县", + "Value": "321324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920839, + "Key": "浙江省", + "Value": "330000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920840, + "Key": "浙江省杭州市", + "Value": "330100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920841, + "Key": "浙江省杭州市上城区", + "Value": "330102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920842, + "Key": "浙江省杭州市拱墅区", + "Value": "330105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920843, + "Key": "浙江省杭州市西湖区", + "Value": "330106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920844, + "Key": "浙江省杭州市滨江区", + "Value": "330108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920845, + "Key": "浙江省杭州市萧山区", + "Value": "330109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920846, + "Key": "浙江省杭州市余杭区", + "Value": "330110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920847, + "Key": "浙江省杭州市富阳区", + "Value": "330111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788920848, + "Key": "浙江省杭州市临安区", + "Value": "330112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924933, + "Key": "浙江省杭州市临平区", + "Value": "330113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924934, + "Key": "浙江省杭州市钱塘区", + "Value": "330114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924935, + "Key": "浙江省杭州市桐庐县", + "Value": "330122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924936, + "Key": "浙江省杭州市淳安县", + "Value": "330127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924937, + "Key": "浙江省杭州市建德市", + "Value": "330182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924938, + "Key": "浙江省宁波市", + "Value": "330200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924939, + "Key": "浙江省宁波市海曙区", + "Value": "330203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924940, + "Key": "浙江省宁波市江北区", + "Value": "330205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924941, + "Key": "浙江省宁波市北仑区", + "Value": "330206" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924942, + "Key": "浙江省宁波市镇海区", + "Value": "330211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924943, + "Key": "浙江省宁波市鄞州区", + "Value": "330212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788924944, + "Key": "浙江省宁波市奉化区", + "Value": "330213" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929029, + "Key": "浙江省宁波市象山县", + "Value": "330225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929030, + "Key": "浙江省宁波市宁海县", + "Value": "330226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929031, + "Key": "浙江省宁波市余姚市", + "Value": "330281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929032, + "Key": "浙江省宁波市慈溪市", + "Value": "330282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929033, + "Key": "浙江省温州市", + "Value": "330300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929034, + "Key": "浙江省温州市鹿城区", + "Value": "330302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929035, + "Key": "浙江省温州市龙湾区", + "Value": "330303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929036, + "Key": "浙江省温州市瓯海区", + "Value": "330304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929037, + "Key": "浙江省温州市洞头区", + "Value": "330305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929038, + "Key": "浙江省温州市永嘉县", + "Value": "330324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929039, + "Key": "浙江省温州市平阳县", + "Value": "330326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788929040, + "Key": "浙江省温州市苍南县", + "Value": "330327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933125, + "Key": "浙江省温州市文成县", + "Value": "330328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933126, + "Key": "浙江省温州市泰顺县", + "Value": "330329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933127, + "Key": "浙江省温州市瑞安市", + "Value": "330381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933128, + "Key": "浙江省温州市乐清市", + "Value": "330382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933129, + "Key": "浙江省温州市龙港市", + "Value": "330383" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933130, + "Key": "浙江省嘉兴市", + "Value": "330400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933131, + "Key": "浙江省嘉兴市南湖区", + "Value": "330402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933132, + "Key": "浙江省嘉兴市秀洲区", + "Value": "330411" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933133, + "Key": "浙江省嘉兴市嘉善县", + "Value": "330421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933134, + "Key": "浙江省嘉兴市海盐县", + "Value": "330424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933135, + "Key": "浙江省嘉兴市海宁市", + "Value": "330481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933136, + "Key": "浙江省嘉兴市平湖市", + "Value": "330482" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788933137, + "Key": "浙江省嘉兴市桐乡市", + "Value": "330483" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937221, + "Key": "浙江省湖州市", + "Value": "330500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937222, + "Key": "浙江省湖州市吴兴区", + "Value": "330502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937223, + "Key": "浙江省湖州市南浔区", + "Value": "330503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937224, + "Key": "浙江省湖州市德清县", + "Value": "330521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937225, + "Key": "浙江省湖州市长兴县", + "Value": "330522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937226, + "Key": "浙江省湖州市安吉县", + "Value": "330523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937227, + "Key": "浙江省绍兴市", + "Value": "330600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937228, + "Key": "浙江省绍兴市越城区", + "Value": "330602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937229, + "Key": "浙江省绍兴市柯桥区", + "Value": "330603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937230, + "Key": "浙江省绍兴市上虞区", + "Value": "330604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937231, + "Key": "浙江省绍兴市新昌县", + "Value": "330624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788937232, + "Key": "浙江省绍兴市诸暨市", + "Value": "330681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941317, + "Key": "浙江省绍兴市嵊州市", + "Value": "330683" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941318, + "Key": "浙江省金华市", + "Value": "330700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941319, + "Key": "浙江省金华市婺城区", + "Value": "330702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941320, + "Key": "浙江省金华市金东区", + "Value": "330703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941321, + "Key": "浙江省金华市武义县", + "Value": "330723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941322, + "Key": "浙江省金华市浦江县", + "Value": "330726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941323, + "Key": "浙江省金华市磐安县", + "Value": "330727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941324, + "Key": "浙江省金华市兰溪市", + "Value": "330781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941325, + "Key": "浙江省金华市义乌市", + "Value": "330782" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941326, + "Key": "浙江省金华市东阳市", + "Value": "330783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941327, + "Key": "浙江省金华市永康市", + "Value": "330784" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941328, + "Key": "浙江省衢州市", + "Value": "330800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788941329, + "Key": "浙江省衢州市柯城区", + "Value": "330802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945413, + "Key": "浙江省衢州市衢江区", + "Value": "330803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945414, + "Key": "浙江省衢州市常山县", + "Value": "330822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945415, + "Key": "浙江省衢州市开化县", + "Value": "330824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945416, + "Key": "浙江省衢州市龙游县", + "Value": "330825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945417, + "Key": "浙江省衢州市江山市", + "Value": "330881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945418, + "Key": "浙江省舟山市", + "Value": "330900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945419, + "Key": "浙江省舟山市定海区", + "Value": "330902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945420, + "Key": "浙江省舟山市普陀区", + "Value": "330903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945421, + "Key": "浙江省舟山市岱山县", + "Value": "330921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945422, + "Key": "浙江省舟山市嵊泗县", + "Value": "330922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788945423, + "Key": "浙江省台州市", + "Value": "331000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949509, + "Key": "浙江省台州市椒江区", + "Value": "331002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949510, + "Key": "浙江省台州市黄岩区", + "Value": "331003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949511, + "Key": "浙江省台州市路桥区", + "Value": "331004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949512, + "Key": "浙江省台州市三门县", + "Value": "331022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949513, + "Key": "浙江省台州市天台县", + "Value": "331023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949514, + "Key": "浙江省台州市仙居县", + "Value": "331024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949515, + "Key": "浙江省台州市温岭市", + "Value": "331081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949516, + "Key": "浙江省台州市临海市", + "Value": "331082" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949517, + "Key": "浙江省台州市玉环市", + "Value": "331083" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788949518, + "Key": "浙江省丽水市", + "Value": "331100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788969989, + "Key": "浙江省丽水市莲都区", + "Value": "331102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978181, + "Key": "浙江省丽水市青田县", + "Value": "331121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978182, + "Key": "浙江省丽水市缙云县", + "Value": "331122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978183, + "Key": "浙江省丽水市遂昌县", + "Value": "331123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978184, + "Key": "浙江省丽水市松阳县", + "Value": "331124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978185, + "Key": "浙江省丽水市云和县", + "Value": "331125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978186, + "Key": "浙江省丽水市庆元县", + "Value": "331126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978187, + "Key": "浙江省丽水市景宁畲族自治县", + "Value": "331127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788978188, + "Key": "浙江省丽水市龙泉市", + "Value": "331181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982277, + "Key": "安徽省", + "Value": "340000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982278, + "Key": "安徽省合肥市", + "Value": "340100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982279, + "Key": "安徽省合肥市瑶海区", + "Value": "340102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982280, + "Key": "安徽省合肥市庐阳区", + "Value": "340103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982281, + "Key": "安徽省合肥市蜀山区", + "Value": "340104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982282, + "Key": "安徽省合肥市包河区", + "Value": "340111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982283, + "Key": "安徽省合肥市长丰县", + "Value": "340121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982284, + "Key": "安徽省合肥市肥东县", + "Value": "340122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982285, + "Key": "安徽省合肥市肥西县", + "Value": "340123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982286, + "Key": "安徽省合肥市庐江县", + "Value": "340124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788982287, + "Key": "安徽省合肥市巢湖市", + "Value": "340181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986373, + "Key": "安徽省芜湖市", + "Value": "340200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986374, + "Key": "安徽省芜湖市镜湖区", + "Value": "340202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986375, + "Key": "安徽省芜湖市鸠江区", + "Value": "340207" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986376, + "Key": "安徽省芜湖市弋江区", + "Value": "340209" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986377, + "Key": "安徽省芜湖市湾沚区", + "Value": "340210" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986378, + "Key": "安徽省芜湖市繁昌区", + "Value": "340212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986379, + "Key": "安徽省芜湖市南陵县", + "Value": "340223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986380, + "Key": "安徽省芜湖市无为市", + "Value": "340281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986381, + "Key": "安徽省蚌埠市", + "Value": "340300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986382, + "Key": "安徽省蚌埠市龙子湖区", + "Value": "340302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788986383, + "Key": "安徽省蚌埠市蚌山区", + "Value": "340303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990469, + "Key": "安徽省蚌埠市禹会区", + "Value": "340304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990470, + "Key": "安徽省蚌埠市淮上区", + "Value": "340311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990471, + "Key": "安徽省蚌埠市怀远县", + "Value": "340321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990472, + "Key": "安徽省蚌埠市五河县", + "Value": "340322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990473, + "Key": "安徽省蚌埠市固镇县", + "Value": "340323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990474, + "Key": "安徽省淮南市", + "Value": "340400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990475, + "Key": "安徽省淮南市大通区", + "Value": "340402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990476, + "Key": "安徽省淮南市田家庵区", + "Value": "340403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990477, + "Key": "安徽省淮南市谢家集区", + "Value": "340404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990478, + "Key": "安徽省淮南市八公山区", + "Value": "340405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990479, + "Key": "安徽省淮南市潘集区", + "Value": "340406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788990480, + "Key": "安徽省淮南市凤台县", + "Value": "340421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994565, + "Key": "安徽省淮南市寿县", + "Value": "340422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994566, + "Key": "安徽省马鞍山市", + "Value": "340500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994567, + "Key": "安徽省马鞍山市花山区", + "Value": "340503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994568, + "Key": "安徽省马鞍山市雨山区", + "Value": "340504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994569, + "Key": "安徽省马鞍山市博望区", + "Value": "340506" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994570, + "Key": "安徽省马鞍山市当涂县", + "Value": "340521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994571, + "Key": "安徽省马鞍山市含山县", + "Value": "340522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994572, + "Key": "安徽省马鞍山市和县", + "Value": "340523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994573, + "Key": "安徽省淮北市", + "Value": "340600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994574, + "Key": "安徽省淮北市杜集区", + "Value": "340602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994575, + "Key": "安徽省淮北市相山区", + "Value": "340603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994576, + "Key": "安徽省淮北市烈山区", + "Value": "340604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788994577, + "Key": "安徽省淮北市濉溪县", + "Value": "340621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998661, + "Key": "安徽省铜陵市", + "Value": "340700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998662, + "Key": "安徽省铜陵市铜官区", + "Value": "340705" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998663, + "Key": "安徽省铜陵市义安区", + "Value": "340706" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998664, + "Key": "安徽省铜陵市郊区", + "Value": "340711" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998665, + "Key": "安徽省铜陵市枞阳县", + "Value": "340722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998666, + "Key": "安徽省安庆市", + "Value": "340800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998667, + "Key": "安徽省安庆市迎江区", + "Value": "340802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998668, + "Key": "安徽省安庆市大观区", + "Value": "340803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998669, + "Key": "安徽省安庆市宜秀区", + "Value": "340811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998670, + "Key": "安徽省安庆市怀宁县", + "Value": "340822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998671, + "Key": "安徽省安庆市太湖县", + "Value": "340825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998672, + "Key": "安徽省安庆市宿松县", + "Value": "340826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423788998673, + "Key": "安徽省安庆市望江县", + "Value": "340827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002757, + "Key": "安徽省安庆市岳西县", + "Value": "340828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002758, + "Key": "安徽省安庆市桐城市", + "Value": "340881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002759, + "Key": "安徽省安庆市潜山市", + "Value": "340882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002760, + "Key": "安徽省黄山市", + "Value": "341000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002761, + "Key": "安徽省黄山市屯溪区", + "Value": "341002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002762, + "Key": "安徽省黄山市黄山区", + "Value": "341003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002763, + "Key": "安徽省黄山市徽州区", + "Value": "341004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002764, + "Key": "安徽省黄山市歙县", + "Value": "341021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002765, + "Key": "安徽省黄山市休宁县", + "Value": "341022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002766, + "Key": "安徽省黄山市黟县", + "Value": "341023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002767, + "Key": "安徽省黄山市祁门县", + "Value": "341024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002768, + "Key": "安徽省滁州市", + "Value": "341100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789002769, + "Key": "安徽省滁州市琅琊区", + "Value": "341102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006853, + "Key": "安徽省滁州市南谯区", + "Value": "341103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006854, + "Key": "安徽省滁州市来安县", + "Value": "341122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006855, + "Key": "安徽省滁州市全椒县", + "Value": "341124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006856, + "Key": "安徽省滁州市定远县", + "Value": "341125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006857, + "Key": "安徽省滁州市凤阳县", + "Value": "341126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006858, + "Key": "安徽省滁州市天长市", + "Value": "341181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006859, + "Key": "安徽省滁州市明光市", + "Value": "341182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006860, + "Key": "安徽省阜阳市", + "Value": "341200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006861, + "Key": "安徽省阜阳市颍州区", + "Value": "341202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006862, + "Key": "安徽省阜阳市颍东区", + "Value": "341203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006863, + "Key": "安徽省阜阳市颍泉区", + "Value": "341204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006864, + "Key": "安徽省阜阳市临泉县", + "Value": "341221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789006865, + "Key": "安徽省阜阳市太和县", + "Value": "341222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010949, + "Key": "安徽省阜阳市阜南县", + "Value": "341225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010950, + "Key": "安徽省阜阳市颍上县", + "Value": "341226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010951, + "Key": "安徽省阜阳市界首市", + "Value": "341282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010952, + "Key": "安徽省宿州市", + "Value": "341300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010953, + "Key": "安徽省宿州市埇桥区", + "Value": "341302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010954, + "Key": "安徽省宿州市砀山县", + "Value": "341321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010955, + "Key": "安徽省宿州市萧县", + "Value": "341322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010956, + "Key": "安徽省宿州市灵璧县", + "Value": "341323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010957, + "Key": "安徽省宿州市泗县", + "Value": "341324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010958, + "Key": "安徽省六安市", + "Value": "341500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010959, + "Key": "安徽省六安市金安区", + "Value": "341502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789010960, + "Key": "安徽省六安市裕安区", + "Value": "341503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015045, + "Key": "安徽省六安市叶集区", + "Value": "341504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015046, + "Key": "安徽省六安市霍邱县", + "Value": "341522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015047, + "Key": "安徽省六安市舒城县", + "Value": "341523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015048, + "Key": "安徽省六安市金寨县", + "Value": "341524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015049, + "Key": "安徽省六安市霍山县", + "Value": "341525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015050, + "Key": "安徽省亳州市", + "Value": "341600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015051, + "Key": "安徽省亳州市谯城区", + "Value": "341602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015052, + "Key": "安徽省亳州市涡阳县", + "Value": "341621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015053, + "Key": "安徽省亳州市蒙城县", + "Value": "341622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015054, + "Key": "安徽省亳州市利辛县", + "Value": "341623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015055, + "Key": "安徽省池州市", + "Value": "341700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015056, + "Key": "安徽省池州市贵池区", + "Value": "341702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789015057, + "Key": "安徽省池州市东至县", + "Value": "341721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019141, + "Key": "安徽省池州市石台县", + "Value": "341722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019142, + "Key": "安徽省池州市青阳县", + "Value": "341723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019143, + "Key": "安徽省宣城市", + "Value": "341800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019144, + "Key": "安徽省宣城市宣州区", + "Value": "341802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019145, + "Key": "安徽省宣城市郎溪县", + "Value": "341821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019146, + "Key": "安徽省宣城市泾县", + "Value": "341823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019147, + "Key": "安徽省宣城市绩溪县", + "Value": "341824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019148, + "Key": "安徽省宣城市旌德县", + "Value": "341825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019149, + "Key": "安徽省宣城市宁国市", + "Value": "341881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019150, + "Key": "安徽省宣城市广德市", + "Value": "341882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019151, + "Key": "福建省", + "Value": "350000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019152, + "Key": "福建省福州市", + "Value": "350100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789019153, + "Key": "福建省福州市鼓楼区", + "Value": "350102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023237, + "Key": "福建省福州市台江区", + "Value": "350103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023238, + "Key": "福建省福州市仓山区", + "Value": "350104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023239, + "Key": "福建省福州市马尾区", + "Value": "350105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023240, + "Key": "福建省福州市晋安区", + "Value": "350111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023241, + "Key": "福建省福州市长乐区", + "Value": "350112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023242, + "Key": "福建省福州市闽侯县", + "Value": "350121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023243, + "Key": "福建省福州市连江县", + "Value": "350122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023244, + "Key": "福建省福州市罗源县", + "Value": "350123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023245, + "Key": "福建省福州市闽清县", + "Value": "350124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023246, + "Key": "福建省福州市永泰县", + "Value": "350125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023247, + "Key": "福建省福州市平潭县", + "Value": "350128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023248, + "Key": "福建省福州市福清市", + "Value": "350181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789023249, + "Key": "福建省厦门市", + "Value": "350200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027333, + "Key": "福建省厦门市思明区", + "Value": "350203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027334, + "Key": "福建省厦门市海沧区", + "Value": "350205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027335, + "Key": "福建省厦门市湖里区", + "Value": "350206" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027336, + "Key": "福建省厦门市集美区", + "Value": "350211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027337, + "Key": "福建省厦门市同安区", + "Value": "350212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027338, + "Key": "福建省厦门市翔安区", + "Value": "350213" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027339, + "Key": "福建省莆田市", + "Value": "350300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027340, + "Key": "福建省莆田市城厢区", + "Value": "350302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027341, + "Key": "福建省莆田市涵江区", + "Value": "350303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027342, + "Key": "福建省莆田市荔城区", + "Value": "350304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027343, + "Key": "福建省莆田市秀屿区", + "Value": "350305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027344, + "Key": "福建省莆田市仙游县", + "Value": "350322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789027345, + "Key": "福建省三明市", + "Value": "350400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031429, + "Key": "福建省三明市三元区", + "Value": "350404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031430, + "Key": "福建省三明市沙县区", + "Value": "350405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031431, + "Key": "福建省三明市明溪县", + "Value": "350421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031432, + "Key": "福建省三明市清流县", + "Value": "350423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031433, + "Key": "福建省三明市宁化县", + "Value": "350424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031434, + "Key": "福建省三明市大田县", + "Value": "350425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031435, + "Key": "福建省三明市尤溪县", + "Value": "350426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031436, + "Key": "福建省三明市将乐县", + "Value": "350428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031437, + "Key": "福建省三明市泰宁县", + "Value": "350429" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031438, + "Key": "福建省三明市建宁县", + "Value": "350430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031439, + "Key": "福建省三明市永安市", + "Value": "350481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789031440, + "Key": "福建省泉州市", + "Value": "350500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035525, + "Key": "福建省泉州市鲤城区", + "Value": "350502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035526, + "Key": "福建省泉州市丰泽区", + "Value": "350503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035527, + "Key": "福建省泉州市洛江区", + "Value": "350504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035528, + "Key": "福建省泉州市泉港区", + "Value": "350505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035529, + "Key": "福建省泉州市惠安县", + "Value": "350521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035530, + "Key": "福建省泉州市安溪县", + "Value": "350524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035531, + "Key": "福建省泉州市永春县", + "Value": "350525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035532, + "Key": "福建省泉州市德化县", + "Value": "350526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035533, + "Key": "福建省泉州市金门县", + "Value": "350527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035534, + "Key": "福建省泉州市石狮市", + "Value": "350581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035535, + "Key": "福建省泉州市晋江市", + "Value": "350582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035536, + "Key": "福建省泉州市南安市", + "Value": "350583" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789035537, + "Key": "福建省漳州市", + "Value": "350600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039621, + "Key": "福建省漳州市芗城区", + "Value": "350602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039622, + "Key": "福建省漳州市龙文区", + "Value": "350603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039623, + "Key": "福建省漳州市龙海区", + "Value": "350604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039624, + "Key": "福建省漳州市长泰市", + "Value": "350605" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039625, + "Key": "福建省漳州市云霄县", + "Value": "350622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039626, + "Key": "福建省漳州市漳浦县", + "Value": "350623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039627, + "Key": "福建省漳州市诏安县", + "Value": "350624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039628, + "Key": "福建省漳州市东山县", + "Value": "350626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039629, + "Key": "福建省漳州市南靖县", + "Value": "350627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039630, + "Key": "福建省漳州市平和县", + "Value": "350628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039631, + "Key": "福建省漳州市华安县", + "Value": "350629" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039632, + "Key": "福建省南平市", + "Value": "350700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789039633, + "Key": "福建省南平市延平区", + "Value": "350702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043717, + "Key": "福建省南平市建阳区", + "Value": "350703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043718, + "Key": "福建省南平市顺昌县", + "Value": "350721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043719, + "Key": "福建省南平市浦城县", + "Value": "350722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043720, + "Key": "福建省南平市光泽县", + "Value": "350723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043721, + "Key": "福建省南平市松溪县", + "Value": "350724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043722, + "Key": "福建省南平市政和县", + "Value": "350725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043723, + "Key": "福建省南平市邵武市", + "Value": "350781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043724, + "Key": "福建省南平市武夷山市", + "Value": "350782" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043725, + "Key": "福建省南平市建瓯市", + "Value": "350783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043726, + "Key": "福建省龙岩市", + "Value": "350800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043727, + "Key": "福建省龙岩市新罗区", + "Value": "350802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789043728, + "Key": "福建省龙岩市永定区", + "Value": "350803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047813, + "Key": "福建省龙岩市长汀县", + "Value": "350821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047814, + "Key": "福建省龙岩市上杭县", + "Value": "350823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047815, + "Key": "福建省龙岩市武平县", + "Value": "350824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047816, + "Key": "福建省龙岩市连城县", + "Value": "350825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047817, + "Key": "福建省龙岩市漳平市", + "Value": "350881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047818, + "Key": "福建省宁德市", + "Value": "350900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047819, + "Key": "福建省宁德市蕉城区", + "Value": "350902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047820, + "Key": "福建省宁德市霞浦县", + "Value": "350921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047821, + "Key": "福建省宁德市古田县", + "Value": "350922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047822, + "Key": "福建省宁德市屏南县", + "Value": "350923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047823, + "Key": "福建省宁德市寿宁县", + "Value": "350924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047824, + "Key": "福建省宁德市周宁县", + "Value": "350925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789047825, + "Key": "福建省宁德市柘荣县", + "Value": "350926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051909, + "Key": "福建省宁德市福安市", + "Value": "350981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051910, + "Key": "福建省宁德市福鼎市", + "Value": "350982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051911, + "Key": "江西省", + "Value": "360000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051912, + "Key": "江西省南昌市", + "Value": "360100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051913, + "Key": "江西省南昌市东湖区", + "Value": "360102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051914, + "Key": "江西省南昌市西湖区", + "Value": "360103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051915, + "Key": "江西省南昌市青云谱区", + "Value": "360104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051916, + "Key": "江西省南昌市青山湖区", + "Value": "360111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051917, + "Key": "江西省南昌市新建区", + "Value": "360112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051918, + "Key": "江西省南昌市红谷滩区", + "Value": "360113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051919, + "Key": "江西省南昌市南昌县", + "Value": "360121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051920, + "Key": "江西省南昌市安义县", + "Value": "360123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789051921, + "Key": "江西省南昌市进贤县", + "Value": "360124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056005, + "Key": "江西省景德镇市", + "Value": "360200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056006, + "Key": "江西省景德镇市昌江区", + "Value": "360202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056007, + "Key": "江西省景德镇市珠山区", + "Value": "360203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056008, + "Key": "江西省景德镇市浮梁县", + "Value": "360222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056009, + "Key": "江西省景德镇市乐平市", + "Value": "360281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056010, + "Key": "江西省萍乡市", + "Value": "360300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056011, + "Key": "江西省萍乡市安源区", + "Value": "360302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056012, + "Key": "江西省萍乡市湘东区", + "Value": "360313" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056013, + "Key": "江西省萍乡市莲花县", + "Value": "360321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056014, + "Key": "江西省萍乡市上栗县", + "Value": "360322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056015, + "Key": "江西省萍乡市芦溪县", + "Value": "360323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056016, + "Key": "江西省九江市", + "Value": "360400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789056017, + "Key": "江西省九江市濂溪区", + "Value": "360402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060101, + "Key": "江西省九江市浔阳区", + "Value": "360403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060102, + "Key": "江西省九江市柴桑区", + "Value": "360404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060103, + "Key": "江西省九江市武宁县", + "Value": "360423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060104, + "Key": "江西省九江市修水县", + "Value": "360424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060105, + "Key": "江西省九江市永修县", + "Value": "360425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060106, + "Key": "江西省九江市德安县", + "Value": "360426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060107, + "Key": "江西省九江市都昌县", + "Value": "360428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060108, + "Key": "江西省九江市湖口县", + "Value": "360429" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060109, + "Key": "江西省九江市彭泽县", + "Value": "360430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060110, + "Key": "江西省九江市瑞昌市", + "Value": "360481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060111, + "Key": "江西省九江市共青城市", + "Value": "360482" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060112, + "Key": "江西省九江市庐山市", + "Value": "360483" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789060113, + "Key": "江西省新余市", + "Value": "360500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064197, + "Key": "江西省新余市渝水区", + "Value": "360502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064198, + "Key": "江西省新余市分宜县", + "Value": "360521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064199, + "Key": "江西省鹰潭市", + "Value": "360600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064200, + "Key": "江西省鹰潭市月湖区", + "Value": "360602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064201, + "Key": "江西省鹰潭市余江区", + "Value": "360603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064202, + "Key": "江西省鹰潭市贵溪市", + "Value": "360681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064203, + "Key": "江西省赣州市", + "Value": "360700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064204, + "Key": "江西省赣州市章贡区", + "Value": "360702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064205, + "Key": "江西省赣州市南康区", + "Value": "360703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064206, + "Key": "江西省赣州市赣县区", + "Value": "360704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064207, + "Key": "江西省赣州市信丰县", + "Value": "360722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064208, + "Key": "江西省赣州市大余县", + "Value": "360723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789064209, + "Key": "江西省赣州市上犹县", + "Value": "360724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068293, + "Key": "江西省赣州市崇义县", + "Value": "360725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068294, + "Key": "江西省赣州市安远县", + "Value": "360726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068295, + "Key": "江西省赣州市定南县", + "Value": "360728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068296, + "Key": "江西省赣州市全南县", + "Value": "360729" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068297, + "Key": "江西省赣州市宁都县", + "Value": "360730" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068298, + "Key": "江西省赣州市于都县", + "Value": "360731" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068299, + "Key": "江西省赣州市兴国县", + "Value": "360732" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068300, + "Key": "江西省赣州市会昌县", + "Value": "360733" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068301, + "Key": "江西省赣州市寻乌县", + "Value": "360734" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068302, + "Key": "江西省赣州市石城县", + "Value": "360735" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068303, + "Key": "江西省赣州市瑞金市", + "Value": "360781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789068304, + "Key": "江西省赣州市龙南市", + "Value": "360783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072389, + "Key": "江西省吉安市", + "Value": "360800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072390, + "Key": "江西省吉安市吉州区", + "Value": "360802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072391, + "Key": "江西省吉安市青原区", + "Value": "360803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072392, + "Key": "江西省吉安市吉安县", + "Value": "360821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072393, + "Key": "江西省吉安市吉水县", + "Value": "360822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072394, + "Key": "江西省吉安市峡江县", + "Value": "360823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072395, + "Key": "江西省吉安市新干县", + "Value": "360824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072396, + "Key": "江西省吉安市永丰县", + "Value": "360825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072397, + "Key": "江西省吉安市泰和县", + "Value": "360826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072398, + "Key": "江西省吉安市遂川县", + "Value": "360827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072399, + "Key": "江西省吉安市万安县", + "Value": "360828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072400, + "Key": "江西省吉安市安福县", + "Value": "360829" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789072401, + "Key": "江西省吉安市永新县", + "Value": "360830" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076485, + "Key": "江西省吉安市井冈山市", + "Value": "360881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076486, + "Key": "江西省宜春市", + "Value": "360900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076487, + "Key": "江西省宜春市袁州区", + "Value": "360902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076488, + "Key": "江西省宜春市奉新县", + "Value": "360921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076489, + "Key": "江西省宜春市万载县", + "Value": "360922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076490, + "Key": "江西省宜春市上高县", + "Value": "360923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076491, + "Key": "江西省宜春市宜丰县", + "Value": "360924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076492, + "Key": "江西省宜春市靖安县", + "Value": "360925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076493, + "Key": "江西省宜春市铜鼓县", + "Value": "360926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076494, + "Key": "江西省宜春市丰城市", + "Value": "360981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076495, + "Key": "江西省宜春市樟树市", + "Value": "360982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076496, + "Key": "江西省宜春市高安市", + "Value": "360983" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789076497, + "Key": "江西省抚州市", + "Value": "361000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080581, + "Key": "江西省抚州市临川区", + "Value": "361002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080582, + "Key": "江西省抚州市东乡区", + "Value": "361003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080583, + "Key": "江西省抚州市南城县", + "Value": "361021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080584, + "Key": "江西省抚州市黎川县", + "Value": "361022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080585, + "Key": "江西省抚州市南丰县", + "Value": "361023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080586, + "Key": "江西省抚州市崇仁县", + "Value": "361024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080587, + "Key": "江西省抚州市乐安县", + "Value": "361025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080588, + "Key": "江西省抚州市宜黄县", + "Value": "361026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080589, + "Key": "江西省抚州市金溪县", + "Value": "361027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080590, + "Key": "江西省抚州市资溪县", + "Value": "361028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080591, + "Key": "江西省抚州市广昌县", + "Value": "361030" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080592, + "Key": "江西省上饶市", + "Value": "361100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789080593, + "Key": "江西省上饶市信州区", + "Value": "361102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084677, + "Key": "江西省上饶市广丰区", + "Value": "361103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084678, + "Key": "江西省上饶市广信区", + "Value": "361104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084679, + "Key": "江西省上饶市玉山县", + "Value": "361123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084680, + "Key": "江西省上饶市铅山县", + "Value": "361124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084681, + "Key": "江西省上饶市横峰县", + "Value": "361125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084682, + "Key": "江西省上饶市弋阳县", + "Value": "361126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084683, + "Key": "江西省上饶市余干县", + "Value": "361127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084684, + "Key": "江西省上饶市鄱阳县", + "Value": "361128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084685, + "Key": "江西省上饶市万年县", + "Value": "361129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084686, + "Key": "江西省上饶市婺源县", + "Value": "361130" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084687, + "Key": "江西省上饶市德兴市", + "Value": "361181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084688, + "Key": "山东省", + "Value": "370000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789084689, + "Key": "山东省济南市", + "Value": "370100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088773, + "Key": "山东省济南市历下区", + "Value": "370102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088774, + "Key": "山东省济南市市中区", + "Value": "370103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088775, + "Key": "山东省济南市槐荫区", + "Value": "370104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088776, + "Key": "山东省济南市天桥区", + "Value": "370105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088777, + "Key": "山东省济南市历城区", + "Value": "370112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088778, + "Key": "山东省济南市长清区", + "Value": "370113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088779, + "Key": "山东省济南市章丘区", + "Value": "370114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088780, + "Key": "山东省济南市济阳区", + "Value": "370115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088781, + "Key": "山东省济南市莱芜区", + "Value": "370116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088782, + "Key": "山东省济南市钢城区", + "Value": "370117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088783, + "Key": "山东省济南市平阴县", + "Value": "370124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088784, + "Key": "山东省济南市商河县", + "Value": "370126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789088785, + "Key": "山东省青岛市", + "Value": "370200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092869, + "Key": "山东省青岛市市南区", + "Value": "370202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092870, + "Key": "山东省青岛市市北区", + "Value": "370203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092871, + "Key": "山东省青岛市黄岛区", + "Value": "370211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092872, + "Key": "山东省青岛市崂山区", + "Value": "370212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092873, + "Key": "山东省青岛市李沧区", + "Value": "370213" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092874, + "Key": "山东省青岛市城阳区", + "Value": "370214" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092875, + "Key": "山东省青岛市即墨区", + "Value": "370215" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092876, + "Key": "山东省青岛市胶州市", + "Value": "370281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092877, + "Key": "山东省青岛市平度市", + "Value": "370283" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092878, + "Key": "山东省青岛市莱西市", + "Value": "370285" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092879, + "Key": "山东省淄博市", + "Value": "370300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092880, + "Key": "山东省淄博市淄川区", + "Value": "370302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789092881, + "Key": "山东省淄博市张店区", + "Value": "370303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096965, + "Key": "山东省淄博市博山区", + "Value": "370304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096966, + "Key": "山东省淄博市临淄区", + "Value": "370305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096967, + "Key": "山东省淄博市周村区", + "Value": "370306" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096968, + "Key": "山东省淄博市桓台县", + "Value": "370321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096969, + "Key": "山东省淄博市高青县", + "Value": "370322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096970, + "Key": "山东省淄博市沂源县", + "Value": "370323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096971, + "Key": "山东省枣庄市", + "Value": "370400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096972, + "Key": "山东省枣庄市市中区", + "Value": "370402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096973, + "Key": "山东省枣庄市薛城区", + "Value": "370403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096974, + "Key": "山东省枣庄市峄城区", + "Value": "370404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096975, + "Key": "山东省枣庄市台儿庄区", + "Value": "370405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096976, + "Key": "山东省枣庄市山亭区", + "Value": "370406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789096977, + "Key": "山东省枣庄市滕州市", + "Value": "370481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101061, + "Key": "山东省东营市", + "Value": "370500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101062, + "Key": "山东省东营市东营区", + "Value": "370502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101063, + "Key": "山东省东营市河口区", + "Value": "370503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101064, + "Key": "山东省东营市垦利区", + "Value": "370505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101065, + "Key": "山东省东营市利津县", + "Value": "370522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101066, + "Key": "山东省东营市广饶县", + "Value": "370523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101067, + "Key": "山东省烟台市", + "Value": "370600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101068, + "Key": "山东省烟台市芝罘区", + "Value": "370602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101069, + "Key": "山东省烟台市福山区", + "Value": "370611" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101070, + "Key": "山东省烟台市牟平区", + "Value": "370612" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101071, + "Key": "山东省烟台市莱山区", + "Value": "370613" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101072, + "Key": "山东省烟台市蓬莱区", + "Value": "370614" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789101073, + "Key": "山东省烟台市龙口市", + "Value": "370681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105157, + "Key": "山东省烟台市莱阳市", + "Value": "370682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105158, + "Key": "山东省烟台市莱州市", + "Value": "370683" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105159, + "Key": "山东省烟台市招远市", + "Value": "370685" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105160, + "Key": "山东省烟台市栖霞市", + "Value": "370686" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105161, + "Key": "山东省烟台市海阳市", + "Value": "370687" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105162, + "Key": "山东省潍坊市", + "Value": "370700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105163, + "Key": "山东省潍坊市潍城区", + "Value": "370702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105164, + "Key": "山东省潍坊市寒亭区", + "Value": "370703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105165, + "Key": "山东省潍坊市坊子区", + "Value": "370704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105166, + "Key": "山东省潍坊市奎文区", + "Value": "370705" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105167, + "Key": "山东省潍坊市临朐县", + "Value": "370724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105168, + "Key": "山东省潍坊市昌乐县", + "Value": "370725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789105169, + "Key": "山东省潍坊市青州市", + "Value": "370781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109253, + "Key": "山东省潍坊市诸城市", + "Value": "370782" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109254, + "Key": "山东省潍坊市寿光市", + "Value": "370783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109255, + "Key": "山东省潍坊市安丘市", + "Value": "370784" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109256, + "Key": "山东省潍坊市高密市", + "Value": "370785" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109257, + "Key": "山东省潍坊市昌邑市", + "Value": "370786" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109258, + "Key": "山东省济宁市", + "Value": "370800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109259, + "Key": "山东省济宁市任城区", + "Value": "370811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109260, + "Key": "山东省济宁市兖州区", + "Value": "370812" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109261, + "Key": "山东省济宁市微山县", + "Value": "370826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109262, + "Key": "山东省济宁市鱼台县", + "Value": "370827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109263, + "Key": "山东省济宁市金乡县", + "Value": "370828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789109264, + "Key": "山东省济宁市嘉祥县", + "Value": "370829" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113349, + "Key": "山东省济宁市汶上县", + "Value": "370830" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113350, + "Key": "山东省济宁市泗水县", + "Value": "370831" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113351, + "Key": "山东省济宁市梁山县", + "Value": "370832" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113352, + "Key": "山东省济宁市曲阜市", + "Value": "370881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113353, + "Key": "山东省济宁市邹城市", + "Value": "370883" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113354, + "Key": "山东省泰安市", + "Value": "370900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113355, + "Key": "山东省泰安市泰山区", + "Value": "370902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113356, + "Key": "山东省泰安市岱岳区", + "Value": "370911" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789113357, + "Key": "山东省泰安市宁阳县", + "Value": "370921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117445, + "Key": "山东省泰安市东平县", + "Value": "370923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117446, + "Key": "山东省泰安市新泰市", + "Value": "370982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117447, + "Key": "山东省泰安市肥城市", + "Value": "370983" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117448, + "Key": "山东省威海市", + "Value": "371000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117449, + "Key": "山东省威海市环翠区", + "Value": "371002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117450, + "Key": "山东省威海市文登区", + "Value": "371003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117451, + "Key": "山东省威海市荣成市", + "Value": "371082" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117452, + "Key": "山东省威海市乳山市", + "Value": "371083" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117453, + "Key": "山东省日照市", + "Value": "371100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117454, + "Key": "山东省日照市东港区", + "Value": "371102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117455, + "Key": "山东省日照市岚山区", + "Value": "371103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789117456, + "Key": "山东省日照市五莲县", + "Value": "371121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121541, + "Key": "山东省日照市莒县", + "Value": "371122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121542, + "Key": "山东省临沂市", + "Value": "371300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121543, + "Key": "山东省临沂市兰山区", + "Value": "371302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121544, + "Key": "山东省临沂市罗庄区", + "Value": "371311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121545, + "Key": "山东省临沂市河东区", + "Value": "371312" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121546, + "Key": "山东省临沂市沂南县", + "Value": "371321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121547, + "Key": "山东省临沂市郯城县", + "Value": "371322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121548, + "Key": "山东省临沂市沂水县", + "Value": "371323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789121549, + "Key": "山东省临沂市兰陵县", + "Value": "371324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125637, + "Key": "山东省临沂市费县", + "Value": "371325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125638, + "Key": "山东省临沂市平邑县", + "Value": "371326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125639, + "Key": "山东省临沂市莒南县", + "Value": "371327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125640, + "Key": "山东省临沂市蒙阴县", + "Value": "371328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125641, + "Key": "山东省临沂市临沭县", + "Value": "371329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125642, + "Key": "山东省德州市", + "Value": "371400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125643, + "Key": "山东省德州市德城区", + "Value": "371402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125644, + "Key": "山东省德州市陵城区", + "Value": "371403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125645, + "Key": "山东省德州市宁津县", + "Value": "371422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789125646, + "Key": "山东省德州市庆云县", + "Value": "371423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129733, + "Key": "山东省德州市临邑县", + "Value": "371424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129734, + "Key": "山东省德州市齐河县", + "Value": "371425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129735, + "Key": "山东省德州市平原县", + "Value": "371426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129736, + "Key": "山东省德州市夏津县", + "Value": "371427" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129737, + "Key": "山东省德州市武城县", + "Value": "371428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129738, + "Key": "山东省德州市乐陵市", + "Value": "371481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129739, + "Key": "山东省德州市禹城市", + "Value": "371482" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129740, + "Key": "山东省聊城市", + "Value": "371500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129741, + "Key": "山东省聊城市东昌府区", + "Value": "371502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129742, + "Key": "山东省聊城市茌平区", + "Value": "371503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129743, + "Key": "山东省聊城市阳谷县", + "Value": "371521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789129744, + "Key": "山东省聊城市莘县", + "Value": "371522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133829, + "Key": "山东省聊城市东阿县", + "Value": "371524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133830, + "Key": "山东省聊城市冠县", + "Value": "371525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133831, + "Key": "山东省聊城市高唐县", + "Value": "371526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133832, + "Key": "山东省聊城市临清市", + "Value": "371581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133833, + "Key": "山东省滨州市", + "Value": "371600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133834, + "Key": "山东省滨州市滨城区", + "Value": "371602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133835, + "Key": "山东省滨州市沾化区", + "Value": "371603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133836, + "Key": "山东省滨州市惠民县", + "Value": "371621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133837, + "Key": "山东省滨州市阳信县", + "Value": "371622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133838, + "Key": "山东省滨州市无棣县", + "Value": "371623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789133839, + "Key": "山东省滨州市博兴县", + "Value": "371625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137925, + "Key": "山东省滨州市邹平市", + "Value": "371681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137926, + "Key": "山东省菏泽市", + "Value": "371700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137927, + "Key": "山东省菏泽市牡丹区", + "Value": "371702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137928, + "Key": "山东省菏泽市定陶区", + "Value": "371703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137929, + "Key": "山东省菏泽市曹县", + "Value": "371721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137930, + "Key": "山东省菏泽市单县", + "Value": "371722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137931, + "Key": "山东省菏泽市成武县", + "Value": "371723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137932, + "Key": "山东省菏泽市巨野县", + "Value": "371724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137933, + "Key": "山东省菏泽市郓城县", + "Value": "371725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137934, + "Key": "山东省菏泽市鄄城县", + "Value": "371726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137935, + "Key": "山东省菏泽市东明县", + "Value": "371728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789137936, + "Key": "河南省", + "Value": "410000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142021, + "Key": "河南省郑州市", + "Value": "410100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142022, + "Key": "河南省郑州市中原区", + "Value": "410102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142023, + "Key": "河南省郑州市二七区", + "Value": "410103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142024, + "Key": "河南省郑州市管城回族区", + "Value": "410104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142025, + "Key": "河南省郑州市金水区", + "Value": "410105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142026, + "Key": "河南省郑州市上街区", + "Value": "410106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142027, + "Key": "河南省郑州市惠济区", + "Value": "410108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142028, + "Key": "河南省郑州市中牟县", + "Value": "410122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142029, + "Key": "河南省郑州市巩义市", + "Value": "410181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142030, + "Key": "河南省郑州市荥阳市", + "Value": "410182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142031, + "Key": "河南省郑州市新密市", + "Value": "410183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142032, + "Key": "河南省郑州市新郑市", + "Value": "410184" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789142033, + "Key": "河南省郑州市登封市", + "Value": "410185" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146117, + "Key": "河南省开封市", + "Value": "410200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146118, + "Key": "河南省开封市龙亭区", + "Value": "410202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146119, + "Key": "河南省开封市顺河回族区", + "Value": "410203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146120, + "Key": "河南省开封市鼓楼区", + "Value": "410204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146121, + "Key": "河南省开封市禹王台区", + "Value": "410205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146122, + "Key": "河南省开封市祥符区", + "Value": "410212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146123, + "Key": "河南省开封市杞县", + "Value": "410221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146124, + "Key": "河南省开封市通许县", + "Value": "410222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146125, + "Key": "河南省开封市尉氏县", + "Value": "410223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146126, + "Key": "河南省开封市兰考县", + "Value": "410225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146127, + "Key": "河南省洛阳市", + "Value": "410300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789146128, + "Key": "河南省洛阳市老城区", + "Value": "410302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150213, + "Key": "河南省洛阳市西工区", + "Value": "410303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150214, + "Key": "河南省洛阳市瀍河回族区", + "Value": "410304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150215, + "Key": "河南省洛阳市涧西区", + "Value": "410305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150216, + "Key": "河南省洛阳市偃师区", + "Value": "410307" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150217, + "Key": "河南省洛阳市孟津区", + "Value": "410308" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150218, + "Key": "河南省洛阳市洛龙区", + "Value": "410311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150219, + "Key": "河南省洛阳市新安县", + "Value": "410323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150220, + "Key": "河南省洛阳市栾川县", + "Value": "410324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150221, + "Key": "河南省洛阳市嵩县", + "Value": "410325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150222, + "Key": "河南省洛阳市汝阳县", + "Value": "410326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150223, + "Key": "河南省洛阳市宜阳县", + "Value": "410327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789150224, + "Key": "河南省洛阳市洛宁县", + "Value": "410328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154309, + "Key": "河南省洛阳市伊川县", + "Value": "410329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154310, + "Key": "河南省平顶山市", + "Value": "410400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154311, + "Key": "河南省平顶山市新华区", + "Value": "410402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154312, + "Key": "河南省平顶山市卫东区", + "Value": "410403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154313, + "Key": "河南省平顶山市石龙区", + "Value": "410404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154314, + "Key": "河南省平顶山市湛河区", + "Value": "410411" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154315, + "Key": "河南省平顶山市宝丰县", + "Value": "410421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154316, + "Key": "河南省平顶山市叶县", + "Value": "410422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154317, + "Key": "河南省平顶山市鲁山县", + "Value": "410423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154318, + "Key": "河南省平顶山市郏县", + "Value": "410425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154319, + "Key": "河南省平顶山市舞钢市", + "Value": "410481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154320, + "Key": "河南省平顶山市汝州市", + "Value": "410482" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789154321, + "Key": "河南省安阳市", + "Value": "410500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158405, + "Key": "河南省安阳市文峰区", + "Value": "410502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158406, + "Key": "河南省安阳市北关区", + "Value": "410503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158407, + "Key": "河南省安阳市殷都区", + "Value": "410505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158408, + "Key": "河南省安阳市龙安区", + "Value": "410506" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158409, + "Key": "河南省安阳市安阳县", + "Value": "410522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158410, + "Key": "河南省安阳市汤阴县", + "Value": "410523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158411, + "Key": "河南省安阳市滑县", + "Value": "410526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158412, + "Key": "河南省安阳市内黄县", + "Value": "410527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158413, + "Key": "河南省安阳市林州市", + "Value": "410581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158414, + "Key": "河南省鹤壁市", + "Value": "410600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158415, + "Key": "河南省鹤壁市鹤山区", + "Value": "410602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158416, + "Key": "河南省鹤壁市山城区", + "Value": "410603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789158417, + "Key": "河南省鹤壁市淇滨区", + "Value": "410611" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162501, + "Key": "河南省鹤壁市浚县", + "Value": "410621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162502, + "Key": "河南省鹤壁市淇县", + "Value": "410622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162503, + "Key": "河南省新乡市", + "Value": "410700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162504, + "Key": "河南省新乡市红旗区", + "Value": "410702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162505, + "Key": "河南省新乡市卫滨区", + "Value": "410703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162506, + "Key": "河南省新乡市凤泉区", + "Value": "410704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162507, + "Key": "河南省新乡市牧野区", + "Value": "410711" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162508, + "Key": "河南省新乡市新乡县", + "Value": "410721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162509, + "Key": "河南省新乡市获嘉县", + "Value": "410724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162510, + "Key": "河南省新乡市原阳县", + "Value": "410725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162511, + "Key": "河南省新乡市延津县", + "Value": "410726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162512, + "Key": "河南省新乡市封丘县", + "Value": "410727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789162513, + "Key": "河南省新乡市卫辉市", + "Value": "410781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166597, + "Key": "河南省新乡市辉县市", + "Value": "410782" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166598, + "Key": "河南省新乡市长垣市", + "Value": "410783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166599, + "Key": "河南省焦作市", + "Value": "410800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166600, + "Key": "河南省焦作市解放区", + "Value": "410802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166601, + "Key": "河南省焦作市中站区", + "Value": "410803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166602, + "Key": "河南省焦作市马村区", + "Value": "410804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166603, + "Key": "河南省焦作市山阳区", + "Value": "410811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166604, + "Key": "河南省焦作市修武县", + "Value": "410821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166605, + "Key": "河南省焦作市博爱县", + "Value": "410822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166606, + "Key": "河南省焦作市武陟县", + "Value": "410823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166607, + "Key": "河南省焦作市温县", + "Value": "410825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166608, + "Key": "河南省焦作市沁阳市", + "Value": "410882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789166609, + "Key": "河南省焦作市孟州市", + "Value": "410883" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170693, + "Key": "河南省濮阳市", + "Value": "410900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170694, + "Key": "河南省濮阳市华龙区", + "Value": "410902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170695, + "Key": "河南省濮阳市清丰县", + "Value": "410922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170696, + "Key": "河南省濮阳市南乐县", + "Value": "410923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170697, + "Key": "河南省濮阳市范县", + "Value": "410926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170698, + "Key": "河南省濮阳市台前县", + "Value": "410927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170699, + "Key": "河南省濮阳市濮阳县", + "Value": "410928" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170700, + "Key": "河南省许昌市", + "Value": "411000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170701, + "Key": "河南省许昌市魏都区", + "Value": "411002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170702, + "Key": "河南省许昌市建安区", + "Value": "411003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170703, + "Key": "河南省许昌市鄢陵县", + "Value": "411024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170704, + "Key": "河南省许昌市襄城县", + "Value": "411025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789170705, + "Key": "河南省许昌市禹州市", + "Value": "411081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174789, + "Key": "河南省许昌市长葛市", + "Value": "411082" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174790, + "Key": "河南省漯河市", + "Value": "411100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174791, + "Key": "河南省漯河市源汇区", + "Value": "411102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174792, + "Key": "河南省漯河市郾城区", + "Value": "411103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174793, + "Key": "河南省漯河市召陵区", + "Value": "411104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174794, + "Key": "河南省漯河市舞阳县", + "Value": "411121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174795, + "Key": "河南省漯河市临颍县", + "Value": "411122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174796, + "Key": "河南省三门峡市", + "Value": "411200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174797, + "Key": "河南省三门峡市湖滨区", + "Value": "411202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174798, + "Key": "河南省三门峡市陕州区", + "Value": "411203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174799, + "Key": "河南省三门峡市渑池县", + "Value": "411221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174800, + "Key": "河南省三门峡市卢氏县", + "Value": "411224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789174801, + "Key": "河南省三门峡市义马市", + "Value": "411281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178885, + "Key": "河南省三门峡市灵宝市", + "Value": "411282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178886, + "Key": "河南省南阳市", + "Value": "411300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178887, + "Key": "河南省南阳市宛城区", + "Value": "411302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178888, + "Key": "河南省南阳市卧龙区", + "Value": "411303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178889, + "Key": "河南省南阳市南召县", + "Value": "411321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178890, + "Key": "河南省南阳市方城县", + "Value": "411322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178891, + "Key": "河南省南阳市西峡县", + "Value": "411323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178892, + "Key": "河南省南阳市镇平县", + "Value": "411324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178893, + "Key": "河南省南阳市内乡县", + "Value": "411325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178894, + "Key": "河南省南阳市淅川县", + "Value": "411326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178895, + "Key": "河南省南阳市社旗县", + "Value": "411327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178896, + "Key": "河南省南阳市唐河县", + "Value": "411328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789178897, + "Key": "河南省南阳市新野县", + "Value": "411329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182981, + "Key": "河南省南阳市桐柏县", + "Value": "411330" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182982, + "Key": "河南省南阳市邓州市", + "Value": "411381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182983, + "Key": "河南省商丘市", + "Value": "411400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182984, + "Key": "河南省商丘市梁园区", + "Value": "411402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182985, + "Key": "河南省商丘市睢阳区", + "Value": "411403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182986, + "Key": "河南省商丘市民权县", + "Value": "411421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182987, + "Key": "河南省商丘市睢县", + "Value": "411422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182988, + "Key": "河南省商丘市宁陵县", + "Value": "411423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182989, + "Key": "河南省商丘市柘城县", + "Value": "411424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182990, + "Key": "河南省商丘市虞城县", + "Value": "411425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182991, + "Key": "河南省商丘市夏邑县", + "Value": "411426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789182992, + "Key": "河南省商丘市永城市", + "Value": "411481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187077, + "Key": "河南省信阳市", + "Value": "411500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187078, + "Key": "河南省信阳市浉河区", + "Value": "411502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187079, + "Key": "河南省信阳市平桥区", + "Value": "411503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187080, + "Key": "河南省信阳市罗山县", + "Value": "411521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187081, + "Key": "河南省信阳市光山县", + "Value": "411522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187082, + "Key": "河南省信阳市新县", + "Value": "411523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187083, + "Key": "河南省信阳市商城县", + "Value": "411524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187084, + "Key": "河南省信阳市固始县", + "Value": "411525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187085, + "Key": "河南省信阳市潢川县", + "Value": "411526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187086, + "Key": "河南省信阳市淮滨县", + "Value": "411527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187087, + "Key": "河南省信阳市息县", + "Value": "411528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187088, + "Key": "河南省周口市", + "Value": "411600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789187089, + "Key": "河南省周口市川汇区", + "Value": "411602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191173, + "Key": "河南省周口市淮阳区", + "Value": "411603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191174, + "Key": "河南省周口市扶沟县", + "Value": "411621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191175, + "Key": "河南省周口市西华县", + "Value": "411622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191176, + "Key": "河南省周口市商水县", + "Value": "411623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191177, + "Key": "河南省周口市沈丘县", + "Value": "411624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191178, + "Key": "河南省周口市郸城县", + "Value": "411625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191179, + "Key": "河南省周口市太康县", + "Value": "411627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191180, + "Key": "河南省周口市鹿邑县", + "Value": "411628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191181, + "Key": "河南省周口市项城市", + "Value": "411681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191182, + "Key": "河南省驻马店市", + "Value": "411700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191183, + "Key": "河南省驻马店市驿城区", + "Value": "411702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191184, + "Key": "河南省驻马店市西平县", + "Value": "411721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789191185, + "Key": "河南省驻马店市上蔡县", + "Value": "411722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195269, + "Key": "河南省驻马店市平舆县", + "Value": "411723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195270, + "Key": "河南省驻马店市正阳县", + "Value": "411724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195271, + "Key": "河南省驻马店市确山县", + "Value": "411725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195272, + "Key": "河南省驻马店市泌阳县", + "Value": "411726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195273, + "Key": "河南省驻马店市汝南县", + "Value": "411727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195274, + "Key": "河南省驻马店市遂平县", + "Value": "411728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195275, + "Key": "河南省驻马店市新蔡县", + "Value": "411729" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195276, + "Key": "河南省济源市", + "Value": "419001" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195277, + "Key": "湖北省", + "Value": "420000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195278, + "Key": "湖北省武汉市", + "Value": "420100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195279, + "Key": "湖北省武汉市江岸区", + "Value": "420102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789195280, + "Key": "湖北省武汉市江汉区", + "Value": "420103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199365, + "Key": "湖北省武汉市硚口区", + "Value": "420104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199366, + "Key": "湖北省武汉市汉阳区", + "Value": "420105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199367, + "Key": "湖北省武汉市武昌区", + "Value": "420106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199368, + "Key": "湖北省武汉市青山区", + "Value": "420107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199369, + "Key": "湖北省武汉市洪山区", + "Value": "420111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199370, + "Key": "湖北省武汉市东西湖区", + "Value": "420112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199371, + "Key": "湖北省武汉市汉南区", + "Value": "420113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199372, + "Key": "湖北省武汉市蔡甸区", + "Value": "420114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199373, + "Key": "湖北省武汉市江夏区", + "Value": "420115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199374, + "Key": "湖北省武汉市黄陂区", + "Value": "420116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199375, + "Key": "湖北省武汉市新洲区", + "Value": "420117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199376, + "Key": "湖北省黄石市", + "Value": "420200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789199377, + "Key": "湖北省黄石市黄石港区", + "Value": "420202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203461, + "Key": "湖北省黄石市西塞山区", + "Value": "420203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203462, + "Key": "湖北省黄石市下陆区", + "Value": "420204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203463, + "Key": "湖北省黄石市铁山区", + "Value": "420205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203464, + "Key": "湖北省黄石市阳新县", + "Value": "420222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203465, + "Key": "湖北省黄石市大冶市", + "Value": "420281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203466, + "Key": "湖北省十堰市", + "Value": "420300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203467, + "Key": "湖北省十堰市茅箭区", + "Value": "420302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203468, + "Key": "湖北省十堰市张湾区", + "Value": "420303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203469, + "Key": "湖北省十堰市郧阳区", + "Value": "420304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203470, + "Key": "湖北省十堰市郧西县", + "Value": "420322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203471, + "Key": "湖北省十堰市竹山县", + "Value": "420323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203472, + "Key": "湖北省十堰市竹溪县", + "Value": "420324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789203473, + "Key": "湖北省十堰市房县", + "Value": "420325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207557, + "Key": "湖北省十堰市丹江口市", + "Value": "420381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207558, + "Key": "湖北省宜昌市", + "Value": "420500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207559, + "Key": "湖北省宜昌市西陵区", + "Value": "420502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207560, + "Key": "湖北省宜昌市伍家岗区", + "Value": "420503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207561, + "Key": "湖北省宜昌市点军区", + "Value": "420504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207562, + "Key": "湖北省宜昌市猇亭区", + "Value": "420505" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207563, + "Key": "湖北省宜昌市夷陵区", + "Value": "420506" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207564, + "Key": "湖北省宜昌市远安县", + "Value": "420525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207565, + "Key": "湖北省宜昌市兴山县", + "Value": "420526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207566, + "Key": "湖北省宜昌市秭归县", + "Value": "420527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207567, + "Key": "湖北省宜昌市长阳土家族自治县", + "Value": "420528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207568, + "Key": "湖北省宜昌市五峰土家族自治县", + "Value": "420529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789207569, + "Key": "湖北省宜昌市宜都市", + "Value": "420581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211653, + "Key": "湖北省宜昌市当阳市", + "Value": "420582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211654, + "Key": "湖北省宜昌市枝江市", + "Value": "420583" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211655, + "Key": "湖北省襄阳市", + "Value": "420600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211656, + "Key": "湖北省襄阳市襄城区", + "Value": "420602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211657, + "Key": "湖北省襄阳市樊城区", + "Value": "420606" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211658, + "Key": "湖北省襄阳市襄州区", + "Value": "420607" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211659, + "Key": "湖北省襄阳市南漳县", + "Value": "420624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211660, + "Key": "湖北省襄阳市谷城县", + "Value": "420625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211661, + "Key": "湖北省襄阳市保康县", + "Value": "420626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211662, + "Key": "湖北省襄阳市老河口市", + "Value": "420682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211663, + "Key": "湖北省襄阳市枣阳市", + "Value": "420683" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211664, + "Key": "湖北省襄阳市宜城市", + "Value": "420684" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789211665, + "Key": "湖北省鄂州市", + "Value": "420700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215749, + "Key": "湖北省鄂州市梁子湖区", + "Value": "420702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215750, + "Key": "湖北省鄂州市华容区", + "Value": "420703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215751, + "Key": "湖北省鄂州市鄂城区", + "Value": "420704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215752, + "Key": "湖北省荆门市", + "Value": "420800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215753, + "Key": "湖北省荆门市东宝区", + "Value": "420802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215754, + "Key": "湖北省荆门市掇刀区", + "Value": "420804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215755, + "Key": "湖北省荆门市沙洋县", + "Value": "420822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215756, + "Key": "湖北省荆门市钟祥市", + "Value": "420881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215757, + "Key": "湖北省荆门市京山市", + "Value": "420882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215758, + "Key": "湖北省孝感市", + "Value": "420900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215759, + "Key": "湖北省孝感市孝南区", + "Value": "420902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215760, + "Key": "湖北省孝感市孝昌县", + "Value": "420921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789215761, + "Key": "湖北省孝感市大悟县", + "Value": "420922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219845, + "Key": "湖北省孝感市云梦县", + "Value": "420923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219846, + "Key": "湖北省孝感市应城市", + "Value": "420981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219847, + "Key": "湖北省孝感市安陆市", + "Value": "420982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219848, + "Key": "湖北省孝感市汉川市", + "Value": "420984" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219849, + "Key": "湖北省荆州市", + "Value": "421000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219850, + "Key": "湖北省荆州市沙市区", + "Value": "421002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219851, + "Key": "湖北省荆州市荆州区", + "Value": "421003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219852, + "Key": "湖北省荆州市公安县", + "Value": "421022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219853, + "Key": "湖北省荆州市江陵县", + "Value": "421024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219854, + "Key": "湖北省荆州市石首市", + "Value": "421081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219855, + "Key": "湖北省荆州市洪湖市", + "Value": "421083" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219856, + "Key": "湖北省荆州市松滋市", + "Value": "421087" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789219857, + "Key": "湖北省荆州市监利市", + "Value": "421088" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223941, + "Key": "湖北省黄冈市", + "Value": "421100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223942, + "Key": "湖北省黄冈市黄州区", + "Value": "421102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223943, + "Key": "湖北省黄冈市团风县", + "Value": "421121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223944, + "Key": "湖北省黄冈市红安县", + "Value": "421122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223945, + "Key": "湖北省黄冈市罗田县", + "Value": "421123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223946, + "Key": "湖北省黄冈市英山县", + "Value": "421124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223947, + "Key": "湖北省黄冈市浠水县", + "Value": "421125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223948, + "Key": "湖北省黄冈市蕲春县", + "Value": "421126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223949, + "Key": "湖北省黄冈市黄梅县", + "Value": "421127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223950, + "Key": "湖北省黄冈市麻城市", + "Value": "421181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223951, + "Key": "湖北省黄冈市武穴市", + "Value": "421182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223952, + "Key": "湖北省咸宁市", + "Value": "421200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789223953, + "Key": "湖北省咸宁市咸安区", + "Value": "421202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228037, + "Key": "湖北省咸宁市嘉鱼县", + "Value": "421221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228038, + "Key": "湖北省咸宁市通城县", + "Value": "421222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228039, + "Key": "湖北省咸宁市崇阳县", + "Value": "421223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228040, + "Key": "湖北省咸宁市通山县", + "Value": "421224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228041, + "Key": "湖北省咸宁市赤壁市", + "Value": "421281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228042, + "Key": "湖北省随州市", + "Value": "421300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228043, + "Key": "湖北省随州市曾都区", + "Value": "421303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228044, + "Key": "湖北省随州市随县", + "Value": "421321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228045, + "Key": "湖北省随州市广水市", + "Value": "421381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228046, + "Key": "湖北省恩施土家族苗族自治州", + "Value": "422800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228047, + "Key": "湖北省恩施土家族苗族自治州恩施市", + "Value": "422801" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228048, + "Key": "湖北省恩施土家族苗族自治州利川市", + "Value": "422802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789228049, + "Key": "湖北省恩施土家族苗族自治州建始县", + "Value": "422822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232133, + "Key": "湖北省恩施土家族苗族自治州巴东县", + "Value": "422823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232134, + "Key": "湖北省恩施土家族苗族自治州宣恩县", + "Value": "422825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232135, + "Key": "湖北省恩施土家族苗族自治州咸丰县", + "Value": "422826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232136, + "Key": "湖北省恩施土家族苗族自治州来凤县", + "Value": "422827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232137, + "Key": "湖北省恩施土家族苗族自治州鹤峰县", + "Value": "422828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232138, + "Key": "湖北省仙桃市", + "Value": "429004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232139, + "Key": "湖北省潜江市", + "Value": "429005" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232140, + "Key": "湖北省天门市", + "Value": "429006" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232141, + "Key": "湖北省神农架林区", + "Value": "429021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232142, + "Key": "湖南省", + "Value": "430000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232143, + "Key": "湖南省长沙市", + "Value": "430100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232144, + "Key": "湖南省长沙市芙蓉区", + "Value": "430102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789232145, + "Key": "湖南省长沙市天心区", + "Value": "430103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236229, + "Key": "湖南省长沙市岳麓区", + "Value": "430104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236230, + "Key": "湖南省长沙市开福区", + "Value": "430105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236231, + "Key": "湖南省长沙市雨花区", + "Value": "430111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236232, + "Key": "湖南省长沙市望城区", + "Value": "430112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236233, + "Key": "湖南省长沙市长沙县", + "Value": "430121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236234, + "Key": "湖南省长沙市浏阳市", + "Value": "430181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236235, + "Key": "湖南省长沙市宁乡市", + "Value": "430182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236236, + "Key": "湖南省株洲市", + "Value": "430200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236237, + "Key": "湖南省株洲市荷塘区", + "Value": "430202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236238, + "Key": "湖南省株洲市芦淞区", + "Value": "430203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236239, + "Key": "湖南省株洲市石峰区", + "Value": "430204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236240, + "Key": "湖南省株洲市天元区", + "Value": "430211" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789236241, + "Key": "湖南省株洲市渌口区", + "Value": "430212" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240325, + "Key": "湖南省株洲市攸县", + "Value": "430223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240326, + "Key": "湖南省株洲市茶陵县", + "Value": "430224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240327, + "Key": "湖南省株洲市炎陵县", + "Value": "430225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240328, + "Key": "湖南省株洲市醴陵市", + "Value": "430281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240329, + "Key": "湖南省湘潭市", + "Value": "430300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240330, + "Key": "湖南省湘潭市雨湖区", + "Value": "430302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240331, + "Key": "湖南省湘潭市岳塘区", + "Value": "430304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240332, + "Key": "湖南省湘潭市湘潭县", + "Value": "430321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240333, + "Key": "湖南省湘潭市湘乡市", + "Value": "430381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240334, + "Key": "湖南省湘潭市韶山市", + "Value": "430382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240335, + "Key": "湖南省衡阳市", + "Value": "430400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240336, + "Key": "湖南省衡阳市珠晖区", + "Value": "430405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789240337, + "Key": "湖南省衡阳市雁峰区", + "Value": "430406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244421, + "Key": "湖南省衡阳市石鼓区", + "Value": "430407" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244422, + "Key": "湖南省衡阳市蒸湘区", + "Value": "430408" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244423, + "Key": "湖南省衡阳市南岳区", + "Value": "430412" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244424, + "Key": "湖南省衡阳市衡阳县", + "Value": "430421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244425, + "Key": "湖南省衡阳市衡南县", + "Value": "430422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244426, + "Key": "湖南省衡阳市衡山县", + "Value": "430423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244427, + "Key": "湖南省衡阳市衡东县", + "Value": "430424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244428, + "Key": "湖南省衡阳市祁东县", + "Value": "430426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244429, + "Key": "湖南省衡阳市耒阳市", + "Value": "430481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244430, + "Key": "湖南省衡阳市常宁市", + "Value": "430482" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244431, + "Key": "湖南省邵阳市", + "Value": "430500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244432, + "Key": "湖南省邵阳市双清区", + "Value": "430502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789244433, + "Key": "湖南省邵阳市大祥区", + "Value": "430503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248517, + "Key": "湖南省邵阳市北塔区", + "Value": "430511" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248518, + "Key": "湖南省邵阳市新邵县", + "Value": "430522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248519, + "Key": "湖南省邵阳市邵阳县", + "Value": "430523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248520, + "Key": "湖南省邵阳市隆回县", + "Value": "430524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248521, + "Key": "湖南省邵阳市洞口县", + "Value": "430525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248522, + "Key": "湖南省邵阳市绥宁县", + "Value": "430527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248523, + "Key": "湖南省邵阳市新宁县", + "Value": "430528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248524, + "Key": "湖南省邵阳市城步苗族自治县", + "Value": "430529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248525, + "Key": "湖南省邵阳市武冈市", + "Value": "430581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248526, + "Key": "湖南省邵阳市邵东市", + "Value": "430582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248527, + "Key": "湖南省岳阳市", + "Value": "430600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248528, + "Key": "湖南省岳阳市岳阳楼区", + "Value": "430602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789248529, + "Key": "湖南省岳阳市云溪区", + "Value": "430603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252613, + "Key": "湖南省岳阳市君山区", + "Value": "430611" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252614, + "Key": "湖南省岳阳市岳阳县", + "Value": "430621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252615, + "Key": "湖南省岳阳市华容县", + "Value": "430623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252616, + "Key": "湖南省岳阳市湘阴县", + "Value": "430624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252617, + "Key": "湖南省岳阳市平江县", + "Value": "430626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252618, + "Key": "湖南省岳阳市汨罗市", + "Value": "430681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252619, + "Key": "湖南省岳阳市临湘市", + "Value": "430682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252620, + "Key": "湖南省常德市", + "Value": "430700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252621, + "Key": "湖南省常德市武陵区", + "Value": "430702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252622, + "Key": "湖南省常德市鼎城区", + "Value": "430703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252623, + "Key": "湖南省常德市安乡县", + "Value": "430721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252624, + "Key": "湖南省常德市汉寿县", + "Value": "430722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789252625, + "Key": "湖南省常德市澧县", + "Value": "430723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256709, + "Key": "湖南省常德市临澧县", + "Value": "430724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256710, + "Key": "湖南省常德市桃源县", + "Value": "430725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256711, + "Key": "湖南省常德市石门县", + "Value": "430726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256712, + "Key": "湖南省常德市津市市", + "Value": "430781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256713, + "Key": "湖南省张家界市", + "Value": "430800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256714, + "Key": "湖南省张家界市永定区", + "Value": "430802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256715, + "Key": "湖南省张家界市武陵源区", + "Value": "430811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256716, + "Key": "湖南省张家界市慈利县", + "Value": "430821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256717, + "Key": "湖南省张家界市桑植县", + "Value": "430822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256718, + "Key": "湖南省益阳市", + "Value": "430900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256719, + "Key": "湖南省益阳市资阳区", + "Value": "430902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256720, + "Key": "湖南省益阳市赫山区", + "Value": "430903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789256721, + "Key": "湖南省益阳市南县", + "Value": "430921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260805, + "Key": "湖南省益阳市桃江县", + "Value": "430922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260806, + "Key": "湖南省益阳市安化县", + "Value": "430923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260807, + "Key": "湖南省益阳市沅江市", + "Value": "430981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260808, + "Key": "湖南省郴州市", + "Value": "431000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260809, + "Key": "湖南省郴州市北湖区", + "Value": "431002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260810, + "Key": "湖南省郴州市苏仙区", + "Value": "431003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260811, + "Key": "湖南省郴州市桂阳县", + "Value": "431021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260812, + "Key": "湖南省郴州市宜章县", + "Value": "431022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260813, + "Key": "湖南省郴州市永兴县", + "Value": "431023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260814, + "Key": "湖南省郴州市嘉禾县", + "Value": "431024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260815, + "Key": "湖南省郴州市临武县", + "Value": "431025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260816, + "Key": "湖南省郴州市汝城县", + "Value": "431026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260817, + "Key": "湖南省郴州市桂东县", + "Value": "431027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260818, + "Key": "湖南省郴州市安仁县", + "Value": "431028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789260819, + "Key": "湖南省郴州市资兴市", + "Value": "431081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264901, + "Key": "湖南省永州市", + "Value": "431100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264902, + "Key": "湖南省永州市零陵区", + "Value": "431102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264903, + "Key": "湖南省永州市冷水滩区", + "Value": "431103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264904, + "Key": "湖南省永州市东安县", + "Value": "431122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264905, + "Key": "湖南省永州市双牌县", + "Value": "431123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264906, + "Key": "湖南省永州市道县", + "Value": "431124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264907, + "Key": "湖南省永州市江永县", + "Value": "431125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264908, + "Key": "湖南省永州市宁远县", + "Value": "431126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264909, + "Key": "湖南省永州市蓝山县", + "Value": "431127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264910, + "Key": "湖南省永州市新田县", + "Value": "431128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264911, + "Key": "湖南省永州市江华瑶族自治县", + "Value": "431129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264912, + "Key": "湖南省永州市祁阳市", + "Value": "431181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264913, + "Key": "湖南省怀化市", + "Value": "431200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789264914, + "Key": "湖南省怀化市鹤城区", + "Value": "431202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789268997, + "Key": "湖南省怀化市中方县", + "Value": "431221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789268998, + "Key": "湖南省怀化市沅陵县", + "Value": "431222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789268999, + "Key": "湖南省怀化市辰溪县", + "Value": "431223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269000, + "Key": "湖南省怀化市溆浦县", + "Value": "431224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269001, + "Key": "湖南省怀化市会同县", + "Value": "431225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269002, + "Key": "湖南省怀化市麻阳苗族自治县", + "Value": "431226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269003, + "Key": "湖南省怀化市新晃侗族自治县", + "Value": "431227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269004, + "Key": "湖南省怀化市芷江侗族自治县", + "Value": "431228" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269005, + "Key": "湖南省怀化市靖州苗族侗族自治县", + "Value": "431229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269006, + "Key": "湖南省怀化市通道侗族自治县", + "Value": "431230" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269007, + "Key": "湖南省怀化市洪江市", + "Value": "431281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269008, + "Key": "湖南省娄底市", + "Value": "431300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269009, + "Key": "湖南省娄底市娄星区", + "Value": "431302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789269010, + "Key": "湖南省娄底市双峰县", + "Value": "431321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273093, + "Key": "湖南省娄底市新化县", + "Value": "431322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273094, + "Key": "湖南省娄底市冷水江市", + "Value": "431381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273095, + "Key": "湖南省娄底市涟源市", + "Value": "431382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273096, + "Key": "湖南省湘西土家族苗族自治州", + "Value": "433100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273097, + "Key": "湖南省湘西土家族苗族自治州吉首市", + "Value": "433101" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273098, + "Key": "湖南省湘西土家族苗族自治州泸溪县", + "Value": "433122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273099, + "Key": "湖南省湘西土家族苗族自治州凤凰县", + "Value": "433123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273100, + "Key": "湖南省湘西土家族苗族自治州花垣县", + "Value": "433124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273101, + "Key": "湖南省湘西土家族苗族自治州保靖县", + "Value": "433125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273102, + "Key": "湖南省湘西土家族苗族自治州古丈县", + "Value": "433126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273103, + "Key": "湖南省湘西土家族苗族自治州永顺县", + "Value": "433127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273104, + "Key": "湖南省湘西土家族苗族自治州龙山县", + "Value": "433130" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273105, + "Key": "广东省", + "Value": "440000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789273106, + "Key": "广东省广州市", + "Value": "440100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277189, + "Key": "广东省广州市荔湾区", + "Value": "440103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277190, + "Key": "广东省广州市越秀区", + "Value": "440104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277191, + "Key": "广东省广州市海珠区", + "Value": "440105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277192, + "Key": "广东省广州市天河区", + "Value": "440106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277193, + "Key": "广东省广州市白云区", + "Value": "440111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277194, + "Key": "广东省广州市黄埔区", + "Value": "440112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277195, + "Key": "广东省广州市番禺区", + "Value": "440113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277196, + "Key": "广东省广州市花都区", + "Value": "440114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277197, + "Key": "广东省广州市南沙区", + "Value": "440115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277198, + "Key": "广东省广州市从化区", + "Value": "440117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277199, + "Key": "广东省广州市增城区", + "Value": "440118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277200, + "Key": "广东省韶关市", + "Value": "440200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789277201, + "Key": "广东省韶关市武江区", + "Value": "440203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281285, + "Key": "广东省韶关市浈江区", + "Value": "440204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281286, + "Key": "广东省韶关市曲江区", + "Value": "440205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281287, + "Key": "广东省韶关市始兴县", + "Value": "440222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281288, + "Key": "广东省韶关市仁化县", + "Value": "440224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281289, + "Key": "广东省韶关市翁源县", + "Value": "440229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281290, + "Key": "广东省韶关市乳源瑶族自治县", + "Value": "440232" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281291, + "Key": "广东省韶关市新丰县", + "Value": "440233" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281292, + "Key": "广东省韶关市乐昌市", + "Value": "440281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281293, + "Key": "广东省韶关市南雄市", + "Value": "440282" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281294, + "Key": "广东省深圳市", + "Value": "440300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281295, + "Key": "广东省深圳市罗湖区", + "Value": "440303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281296, + "Key": "广东省深圳市福田区", + "Value": "440304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789281297, + "Key": "广东省深圳市南山区", + "Value": "440305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285381, + "Key": "广东省深圳市宝安区", + "Value": "440306" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285382, + "Key": "广东省深圳市龙岗区", + "Value": "440307" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285383, + "Key": "广东省深圳市盐田区", + "Value": "440308" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285384, + "Key": "广东省深圳市龙华区", + "Value": "440309" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285385, + "Key": "广东省深圳市坪山区", + "Value": "440310" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285386, + "Key": "广东省深圳市光明区", + "Value": "440311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285387, + "Key": "广东省珠海市", + "Value": "440400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285388, + "Key": "广东省珠海市香洲区", + "Value": "440402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285389, + "Key": "广东省珠海市斗门区", + "Value": "440403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285390, + "Key": "广东省珠海市金湾区", + "Value": "440404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285391, + "Key": "广东省汕头市", + "Value": "440500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789285392, + "Key": "广东省汕头市龙湖区", + "Value": "440507" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289477, + "Key": "广东省汕头市金平区", + "Value": "440511" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289478, + "Key": "广东省汕头市濠江区", + "Value": "440512" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289479, + "Key": "广东省汕头市潮阳区", + "Value": "440513" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289480, + "Key": "广东省汕头市潮南区", + "Value": "440514" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289481, + "Key": "广东省汕头市澄海区", + "Value": "440515" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289482, + "Key": "广东省汕头市南澳县", + "Value": "440523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289483, + "Key": "广东省佛山市", + "Value": "440600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289484, + "Key": "广东省佛山市禅城区", + "Value": "440604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289485, + "Key": "广东省佛山市南海区", + "Value": "440605" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289486, + "Key": "广东省佛山市顺德区", + "Value": "440606" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289487, + "Key": "广东省佛山市三水区", + "Value": "440607" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289488, + "Key": "广东省佛山市高明区", + "Value": "440608" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289489, + "Key": "广东省江门市", + "Value": "440700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789289490, + "Key": "广东省江门市蓬江区", + "Value": "440703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293573, + "Key": "广东省江门市江海区", + "Value": "440704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293574, + "Key": "广东省江门市新会区", + "Value": "440705" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293575, + "Key": "广东省江门市台山市", + "Value": "440781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293576, + "Key": "广东省江门市开平市", + "Value": "440783" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293577, + "Key": "广东省江门市鹤山市", + "Value": "440784" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293578, + "Key": "广东省江门市恩平市", + "Value": "440785" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293579, + "Key": "广东省湛江市", + "Value": "440800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293580, + "Key": "广东省湛江市赤坎区", + "Value": "440802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293581, + "Key": "广东省湛江市霞山区", + "Value": "440803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293582, + "Key": "广东省湛江市坡头区", + "Value": "440804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293583, + "Key": "广东省湛江市麻章区", + "Value": "440811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293584, + "Key": "广东省湛江市遂溪县", + "Value": "440823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293585, + "Key": "广东省湛江市徐闻县", + "Value": "440825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789293586, + "Key": "广东省湛江市廉江市", + "Value": "440881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297669, + "Key": "广东省湛江市雷州市", + "Value": "440882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297670, + "Key": "广东省湛江市吴川市", + "Value": "440883" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297671, + "Key": "广东省茂名市", + "Value": "440900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297672, + "Key": "广东省茂名市茂南区", + "Value": "440902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297673, + "Key": "广东省茂名市电白区", + "Value": "440904" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297674, + "Key": "广东省茂名市高州市", + "Value": "440981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297675, + "Key": "广东省茂名市化州市", + "Value": "440982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297676, + "Key": "广东省茂名市信宜市", + "Value": "440983" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297677, + "Key": "广东省肇庆市", + "Value": "441200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297678, + "Key": "广东省肇庆市端州区", + "Value": "441202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297679, + "Key": "广东省肇庆市鼎湖区", + "Value": "441203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297680, + "Key": "广东省肇庆市高要区", + "Value": "441204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297681, + "Key": "广东省肇庆市广宁县", + "Value": "441223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297682, + "Key": "广东省肇庆市怀集县", + "Value": "441224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789297683, + "Key": "广东省肇庆市封开县", + "Value": "441225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301765, + "Key": "广东省肇庆市德庆县", + "Value": "441226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301766, + "Key": "广东省肇庆市四会市", + "Value": "441284" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301767, + "Key": "广东省惠州市", + "Value": "441300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301768, + "Key": "广东省惠州市惠城区", + "Value": "441302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301769, + "Key": "广东省惠州市惠阳区", + "Value": "441303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301770, + "Key": "广东省惠州市博罗县", + "Value": "441322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301771, + "Key": "广东省惠州市惠东县", + "Value": "441323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301772, + "Key": "广东省惠州市龙门县", + "Value": "441324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301773, + "Key": "广东省梅州市", + "Value": "441400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301774, + "Key": "广东省梅州市梅江区", + "Value": "441402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301775, + "Key": "广东省梅州市梅县区", + "Value": "441403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301776, + "Key": "广东省梅州市大埔县", + "Value": "441422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301777, + "Key": "广东省梅州市丰顺县", + "Value": "441423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789301778, + "Key": "广东省梅州市五华县", + "Value": "441424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305861, + "Key": "广东省梅州市平远县", + "Value": "441426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305862, + "Key": "广东省梅州市蕉岭县", + "Value": "441427" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305863, + "Key": "广东省梅州市兴宁市", + "Value": "441481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305864, + "Key": "广东省汕尾市", + "Value": "441500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305865, + "Key": "广东省汕尾市城区", + "Value": "441502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305866, + "Key": "广东省汕尾市海丰县", + "Value": "441521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305867, + "Key": "广东省汕尾市陆河县", + "Value": "441523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305868, + "Key": "广东省汕尾市陆丰市", + "Value": "441581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305869, + "Key": "广东省汕尾市河源市", + "Value": "441600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305870, + "Key": "广东省汕尾市源城区", + "Value": "441602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305871, + "Key": "广东省汕尾市紫金县", + "Value": "441621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305872, + "Key": "广东省汕尾市龙川县", + "Value": "441622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789305873, + "Key": "广东省汕尾市连平县", + "Value": "441623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309957, + "Key": "广东省汕尾市和平县", + "Value": "441624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309958, + "Key": "广东省汕尾市东源县", + "Value": "441625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309959, + "Key": "广东省阳江市", + "Value": "441700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309960, + "Key": "广东省阳江市江城区", + "Value": "441702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309961, + "Key": "广东省阳江市阳东区", + "Value": "441704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309962, + "Key": "广东省阳江市阳西县", + "Value": "441721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309963, + "Key": "广东省阳江市阳春市", + "Value": "441781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309964, + "Key": "广东省清远市", + "Value": "441800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309965, + "Key": "广东省清远市清城区", + "Value": "441802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309966, + "Key": "广东省清远市清新区", + "Value": "441803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309967, + "Key": "广东省清远市佛冈县", + "Value": "441821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309968, + "Key": "广东省清远市阳山县", + "Value": "441823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309969, + "Key": "广东省清远市连山壮族瑶族自治县", + "Value": "441825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789309970, + "Key": "广东省清远市连南瑶族自治县", + "Value": "441826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314053, + "Key": "广东省清远市英德市", + "Value": "441881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314054, + "Key": "广东省清远市连州市", + "Value": "441882" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314055, + "Key": "广东省清远市东莞市", + "Value": "441900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314056, + "Key": "广东省清远市中山市", + "Value": "442000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314057, + "Key": "广东省潮州市", + "Value": "445100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314058, + "Key": "广东省潮州市湘桥区", + "Value": "445102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314059, + "Key": "广东省潮州市潮安区", + "Value": "445103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314060, + "Key": "广东省潮州市饶平县", + "Value": "445122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314061, + "Key": "广东省揭阳市", + "Value": "445200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314062, + "Key": "广东省揭阳市榕城区", + "Value": "445202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314063, + "Key": "广东省揭阳市揭东区", + "Value": "445203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314064, + "Key": "广东省揭阳市揭西县", + "Value": "445222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789314065, + "Key": "广东省揭阳市惠来县", + "Value": "445224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318149, + "Key": "广东省揭阳市普宁市", + "Value": "445281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318150, + "Key": "广东省云浮市", + "Value": "445300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318151, + "Key": "广东省云浮市云城区", + "Value": "445302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318152, + "Key": "广东省云浮市云安区", + "Value": "445303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318153, + "Key": "广东省云浮市新兴县", + "Value": "445321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318154, + "Key": "广东省云浮市郁南县", + "Value": "445322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318155, + "Key": "广东省云浮市罗定市", + "Value": "445381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318156, + "Key": "广西壮族自治区", + "Value": "450000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318157, + "Key": "广西壮族自治区南宁市", + "Value": "450100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318158, + "Key": "广西壮族自治区南宁市兴宁区", + "Value": "450102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318159, + "Key": "广西壮族自治区南宁市青秀区", + "Value": "450103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318160, + "Key": "广西壮族自治区南宁市江南区", + "Value": "450105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318161, + "Key": "广西壮族自治区南宁市西乡塘区", + "Value": "450107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789318162, + "Key": "广西壮族自治区南宁市良庆区", + "Value": "450108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322245, + "Key": "广西壮族自治区南宁市邕宁区", + "Value": "450109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322246, + "Key": "广西壮族自治区南宁市武鸣区", + "Value": "450110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322247, + "Key": "广西壮族自治区南宁市隆安县", + "Value": "450123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322248, + "Key": "广西壮族自治区南宁市马山县", + "Value": "450124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322249, + "Key": "广西壮族自治区南宁市上林县", + "Value": "450125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322250, + "Key": "广西壮族自治区南宁市宾阳县", + "Value": "450126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322251, + "Key": "广西壮族自治区南宁市横州市", + "Value": "450181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322252, + "Key": "广西壮族自治区柳州市", + "Value": "450200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322253, + "Key": "广西壮族自治区柳州市城中区", + "Value": "450202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322254, + "Key": "广西壮族自治区柳州市鱼峰区", + "Value": "450203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322255, + "Key": "广西壮族自治区柳州市柳南区", + "Value": "450204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322256, + "Key": "广西壮族自治区柳州市柳北区", + "Value": "450205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789322257, + "Key": "广西壮族自治区柳州市柳江区", + "Value": "450206" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326341, + "Key": "广西壮族自治区柳州市柳城县", + "Value": "450222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326342, + "Key": "广西壮族自治区柳州市鹿寨县", + "Value": "450223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326343, + "Key": "广西壮族自治区柳州市融安县", + "Value": "450224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326344, + "Key": "广西壮族自治区柳州市融水苗族自治县", + "Value": "450225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326345, + "Key": "广西壮族自治区柳州市三江侗族自治县", + "Value": "450226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326346, + "Key": "广西壮族自治区桂林市", + "Value": "450300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326347, + "Key": "广西壮族自治区桂林市秀峰区", + "Value": "450302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326348, + "Key": "广西壮族自治区桂林市叠彩区", + "Value": "450303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326349, + "Key": "广西壮族自治区桂林市象山区", + "Value": "450304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326350, + "Key": "广西壮族自治区桂林市七星区", + "Value": "450305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326351, + "Key": "广西壮族自治区桂林市雁山区", + "Value": "450311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326352, + "Key": "广西壮族自治区桂林市临桂区", + "Value": "450312" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326353, + "Key": "广西壮族自治区桂林市阳朔县", + "Value": "450321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789326354, + "Key": "广西壮族自治区桂林市灵川县", + "Value": "450323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330437, + "Key": "广西壮族自治区桂林市全州县", + "Value": "450324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330438, + "Key": "广西壮族自治区桂林市兴安县", + "Value": "450325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330439, + "Key": "广西壮族自治区桂林市永福县", + "Value": "450326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330440, + "Key": "广西壮族自治区桂林市灌阳县", + "Value": "450327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330441, + "Key": "广西壮族自治区桂林市龙胜各族自治县", + "Value": "450328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330442, + "Key": "广西壮族自治区桂林市资源县", + "Value": "450329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330443, + "Key": "广西壮族自治区桂林市平乐县", + "Value": "450330" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330444, + "Key": "广西壮族自治区桂林市恭城瑶族自治县", + "Value": "450332" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330445, + "Key": "广西壮族自治区桂林市荔浦市", + "Value": "450381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330446, + "Key": "广西壮族自治区梧州市", + "Value": "450400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330447, + "Key": "广西壮族自治区梧州市万秀区", + "Value": "450403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330448, + "Key": "广西壮族自治区梧州市长洲区", + "Value": "450405" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330449, + "Key": "广西壮族自治区梧州市龙圩区", + "Value": "450406" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789330450, + "Key": "广西壮族自治区梧州市苍梧县", + "Value": "450421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334533, + "Key": "广西壮族自治区梧州市藤县", + "Value": "450422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334534, + "Key": "广西壮族自治区梧州市蒙山县", + "Value": "450423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334535, + "Key": "广西壮族自治区梧州市岑溪市", + "Value": "450481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334536, + "Key": "广西壮族自治区北海市", + "Value": "450500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334537, + "Key": "广西壮族自治区北海市海城区", + "Value": "450502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334538, + "Key": "广西壮族自治区北海市银海区", + "Value": "450503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334539, + "Key": "广西壮族自治区北海市铁山港区", + "Value": "450512" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334540, + "Key": "广西壮族自治区北海市合浦县", + "Value": "450521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334541, + "Key": "广西壮族自治区防城港市", + "Value": "450600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334542, + "Key": "广西壮族自治区防城港市港口区", + "Value": "450602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334543, + "Key": "广西壮族自治区防城港市防城区", + "Value": "450603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334544, + "Key": "广西壮族自治区防城港市上思县", + "Value": "450621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334545, + "Key": "广西壮族自治区防城港市东兴市", + "Value": "450681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789334546, + "Key": "广西壮族自治区钦州市", + "Value": "450700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338629, + "Key": "广西壮族自治区钦州市钦南区", + "Value": "450702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338630, + "Key": "广西壮族自治区钦州市钦北区", + "Value": "450703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338631, + "Key": "广西壮族自治区钦州市灵山县", + "Value": "450721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338632, + "Key": "广西壮族自治区钦州市浦北县", + "Value": "450722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338633, + "Key": "广西壮族自治区贵港市", + "Value": "450800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338634, + "Key": "广西壮族自治区贵港市港北区", + "Value": "450802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338635, + "Key": "广西壮族自治区贵港市港南区", + "Value": "450803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338636, + "Key": "广西壮族自治区贵港市覃塘区", + "Value": "450804" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338637, + "Key": "广西壮族自治区贵港市平南县", + "Value": "450821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338638, + "Key": "广西壮族自治区贵港市桂平市", + "Value": "450881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338639, + "Key": "广西壮族自治区玉林市", + "Value": "450900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338640, + "Key": "广西壮族自治区玉林市玉州区", + "Value": "450902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338641, + "Key": "广西壮族自治区玉林市福绵区", + "Value": "450903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789338642, + "Key": "广西壮族自治区玉林市容县", + "Value": "450921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342725, + "Key": "广西壮族自治区玉林市陆川县", + "Value": "450922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342726, + "Key": "广西壮族自治区玉林市博白县", + "Value": "450923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342727, + "Key": "广西壮族自治区玉林市兴业县", + "Value": "450924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342728, + "Key": "广西壮族自治区玉林市北流市", + "Value": "450981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342729, + "Key": "广西壮族自治区百色市", + "Value": "451000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342730, + "Key": "广西壮族自治区百色市右江区", + "Value": "451002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342731, + "Key": "广西壮族自治区百色市田阳区", + "Value": "451003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342732, + "Key": "广西壮族自治区百色市田东县", + "Value": "451022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342733, + "Key": "广西壮族自治区百色市德保县", + "Value": "451024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342734, + "Key": "广西壮族自治区百色市那坡县", + "Value": "451026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342735, + "Key": "广西壮族自治区百色市凌云县", + "Value": "451027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342736, + "Key": "广西壮族自治区百色市乐业县", + "Value": "451028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342737, + "Key": "广西壮族自治区百色市田林县", + "Value": "451029" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342738, + "Key": "广西壮族自治区百色市西林县", + "Value": "451030" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789342739, + "Key": "广西壮族自治区百色市隆林各族自治县", + "Value": "451031" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346821, + "Key": "广西壮族自治区百色市靖西市", + "Value": "451081" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346822, + "Key": "广西壮族自治区百色市平果市", + "Value": "451082" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346823, + "Key": "广西壮族自治区贺州市", + "Value": "451100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346824, + "Key": "广西壮族自治区贺州市八步区", + "Value": "451102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346825, + "Key": "广西壮族自治区贺州市平桂区", + "Value": "451103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346826, + "Key": "广西壮族自治区贺州市昭平县", + "Value": "451121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346827, + "Key": "广西壮族自治区贺州市钟山县", + "Value": "451122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346828, + "Key": "广西壮族自治区贺州市富川瑶族自治县", + "Value": "451123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346829, + "Key": "广西壮族自治区河池市", + "Value": "451200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346830, + "Key": "广西壮族自治区河池市金城江区", + "Value": "451202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346831, + "Key": "广西壮族自治区河池市宜州区", + "Value": "451203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346832, + "Key": "广西壮族自治区河池市南丹县", + "Value": "451221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346833, + "Key": "广西壮族自治区河池市天峨县", + "Value": "451222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789346834, + "Key": "广西壮族自治区河池市凤山县", + "Value": "451223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350917, + "Key": "广西壮族自治区河池市东兰县", + "Value": "451224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350918, + "Key": "广西壮族自治区河池市罗城仫佬族自治县", + "Value": "451225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350919, + "Key": "广西壮族自治区河池市环江毛南族自治县", + "Value": "451226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350920, + "Key": "广西壮族自治区河池市巴马瑶族自治县", + "Value": "451227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350921, + "Key": "广西壮族自治区河池市都安瑶族自治县", + "Value": "451228" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350922, + "Key": "广西壮族自治区河池市大化瑶族自治县", + "Value": "451229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350923, + "Key": "广西壮族自治区来宾市", + "Value": "451300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350924, + "Key": "广西壮族自治区来宾市兴宾区", + "Value": "451302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350925, + "Key": "广西壮族自治区来宾市忻城县", + "Value": "451321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350926, + "Key": "广西壮族自治区来宾市象州县", + "Value": "451322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350927, + "Key": "广西壮族自治区来宾市武宣县", + "Value": "451323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350928, + "Key": "广西壮族自治区来宾市金秀瑶族自治县", + "Value": "451324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350929, + "Key": "广西壮族自治区来宾市合山市", + "Value": "451381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789350930, + "Key": "广西壮族自治区崇左市", + "Value": "451400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355013, + "Key": "广西壮族自治区崇左市江州区", + "Value": "451402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355014, + "Key": "广西壮族自治区崇左市扶绥县", + "Value": "451421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355015, + "Key": "广西壮族自治区崇左市宁明县", + "Value": "451422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355016, + "Key": "广西壮族自治区崇左市龙州县", + "Value": "451423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355017, + "Key": "广西壮族自治区崇左市大新县", + "Value": "451424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355018, + "Key": "广西壮族自治区崇左市天等县", + "Value": "451425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355019, + "Key": "广西壮族自治区崇左市凭祥市", + "Value": "451481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355020, + "Key": "海南省", + "Value": "460000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355021, + "Key": "海南省海口市", + "Value": "460100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355022, + "Key": "海南省海口市秀英区", + "Value": "460105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355023, + "Key": "海南省海口市龙华区", + "Value": "460106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355024, + "Key": "海南省海口市琼山区", + "Value": "460107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355025, + "Key": "海南省海口市美兰区", + "Value": "460108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355026, + "Key": "海南省三亚市", + "Value": "460200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789355027, + "Key": "海南省三亚市海棠区", + "Value": "460202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359109, + "Key": "海南省三亚市吉阳区", + "Value": "460203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359110, + "Key": "海南省三亚市天涯区", + "Value": "460204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359111, + "Key": "海南省三亚市崖州区", + "Value": "460205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359112, + "Key": "海南省三亚市三沙市", + "Value": "460300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359113, + "Key": "海南省三亚市儋州市", + "Value": "460400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359114, + "Key": "海南省五指山市", + "Value": "469001" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359115, + "Key": "海南省琼海市", + "Value": "469002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359116, + "Key": "海南省文昌市", + "Value": "469005" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359117, + "Key": "海南省万宁市", + "Value": "469006" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359118, + "Key": "海南省东方市", + "Value": "469007" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359119, + "Key": "海南省定安县", + "Value": "469021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359120, + "Key": "海南省屯昌县", + "Value": "469022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359121, + "Key": "海南省澄迈县", + "Value": "469023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789359122, + "Key": "海南省临高县", + "Value": "469024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363205, + "Key": "海南省白沙黎族自治县", + "Value": "469025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363206, + "Key": "海南省昌江黎族自治县", + "Value": "469026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363207, + "Key": "海南省乐东黎族自治县", + "Value": "469027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363208, + "Key": "海南省陵水黎族自治县", + "Value": "469028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363209, + "Key": "海南省保亭黎族苗族自治县", + "Value": "469029" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363210, + "Key": "海南省琼中黎族苗族自治县", + "Value": "469030" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363211, + "Key": "重庆市", + "Value": "500000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363212, + "Key": "重庆市万州区", + "Value": "500101" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363213, + "Key": "重庆市涪陵区", + "Value": "500102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363214, + "Key": "重庆市渝中区", + "Value": "500103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363215, + "Key": "重庆市大渡口区", + "Value": "500104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363216, + "Key": "重庆市江北区", + "Value": "500105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363217, + "Key": "重庆市沙坪坝区", + "Value": "500106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789363218, + "Key": "重庆市九龙坡区", + "Value": "500107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367301, + "Key": "重庆市南岸区", + "Value": "500108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367302, + "Key": "重庆市北碚区", + "Value": "500109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367303, + "Key": "重庆市綦江区", + "Value": "500110" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367304, + "Key": "重庆市大足区", + "Value": "500111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367305, + "Key": "重庆市渝北区", + "Value": "500112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367306, + "Key": "重庆市巴南区", + "Value": "500113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367307, + "Key": "重庆市黔江区", + "Value": "500114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367308, + "Key": "重庆市长寿区", + "Value": "500115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367309, + "Key": "重庆市江津区", + "Value": "500116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367310, + "Key": "重庆市合川区", + "Value": "500117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367311, + "Key": "重庆市永川区", + "Value": "500118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367312, + "Key": "重庆市南川区", + "Value": "500119" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367313, + "Key": "重庆市璧山区", + "Value": "500120" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367314, + "Key": "重庆市铜梁区", + "Value": "500151" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789367315, + "Key": "重庆市潼南区", + "Value": "500152" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371397, + "Key": "重庆市荣昌区", + "Value": "500153" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371398, + "Key": "重庆市开州区", + "Value": "500154" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371399, + "Key": "重庆市梁平区", + "Value": "500155" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371400, + "Key": "重庆市武隆区", + "Value": "500156" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371401, + "Key": "重庆市城口县", + "Value": "500229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371402, + "Key": "重庆市丰都县", + "Value": "500230" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371403, + "Key": "重庆市垫江县", + "Value": "500231" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371404, + "Key": "重庆市忠县", + "Value": "500233" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371405, + "Key": "重庆市云阳县", + "Value": "500235" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371406, + "Key": "重庆市奉节县", + "Value": "500236" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371407, + "Key": "重庆市巫山县", + "Value": "500237" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371408, + "Key": "重庆市巫溪县", + "Value": "500238" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371409, + "Key": "重庆市石柱土家族自治县", + "Value": "500240" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789371410, + "Key": "重庆市秀山土家族苗族自治县", + "Value": "500241" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375493, + "Key": "重庆市酉阳土家族苗族自治县", + "Value": "500242" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375494, + "Key": "重庆市彭水苗族土家族自治县", + "Value": "500243" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375495, + "Key": "四川省", + "Value": "510000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375496, + "Key": "四川省成都市", + "Value": "510100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375497, + "Key": "四川省成都市锦江区", + "Value": "510104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375498, + "Key": "四川省成都市青羊区", + "Value": "510105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375499, + "Key": "四川省成都市金牛区", + "Value": "510106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375500, + "Key": "四川省成都市武侯区", + "Value": "510107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375501, + "Key": "四川省成都市成华区", + "Value": "510108" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375502, + "Key": "四川省成都市龙泉驿区", + "Value": "510112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375503, + "Key": "四川省成都市青白江区", + "Value": "510113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375504, + "Key": "四川省成都市新都区", + "Value": "510114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375505, + "Key": "四川省成都市温江区", + "Value": "510115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789375506, + "Key": "四川省成都市双流区", + "Value": "510116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379589, + "Key": "四川省成都市郫都区", + "Value": "510117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379590, + "Key": "四川省成都市新津区", + "Value": "510118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379591, + "Key": "四川省成都市金堂县", + "Value": "510121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379592, + "Key": "四川省成都市大邑县", + "Value": "510129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379593, + "Key": "四川省成都市蒲江县", + "Value": "510131" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379594, + "Key": "四川省成都市都江堰市", + "Value": "510181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379595, + "Key": "四川省成都市彭州市", + "Value": "510182" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379596, + "Key": "四川省成都市邛崃市", + "Value": "510183" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379597, + "Key": "四川省成都市崇州市", + "Value": "510184" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379598, + "Key": "四川省成都市简阳市", + "Value": "510185" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379599, + "Key": "四川省自贡市", + "Value": "510300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379600, + "Key": "四川省自贡市自流井区", + "Value": "510302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789379601, + "Key": "四川省自贡市贡井区", + "Value": "510303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383685, + "Key": "四川省自贡市大安区", + "Value": "510304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383686, + "Key": "四川省自贡市沿滩区", + "Value": "510311" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383687, + "Key": "四川省自贡市荣县", + "Value": "510321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383688, + "Key": "四川省自贡市富顺县", + "Value": "510322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383689, + "Key": "四川省攀枝花市", + "Value": "510400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383690, + "Key": "四川省攀枝花市东区", + "Value": "510402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383691, + "Key": "四川省攀枝花市西区", + "Value": "510403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383692, + "Key": "四川省攀枝花市仁和区", + "Value": "510411" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383693, + "Key": "四川省攀枝花市米易县", + "Value": "510421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383694, + "Key": "四川省攀枝花市盐边县", + "Value": "510422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383695, + "Key": "四川省泸州市", + "Value": "510500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383696, + "Key": "四川省泸州市江阳区", + "Value": "510502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789383697, + "Key": "四川省泸州市纳溪区", + "Value": "510503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387781, + "Key": "四川省泸州市龙马潭区", + "Value": "510504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387782, + "Key": "四川省泸州市泸县", + "Value": "510521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387783, + "Key": "四川省泸州市合江县", + "Value": "510522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387784, + "Key": "四川省泸州市叙永县", + "Value": "510524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387785, + "Key": "四川省泸州市古蔺县", + "Value": "510525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387786, + "Key": "四川省德阳市", + "Value": "510600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387787, + "Key": "四川省德阳市旌阳区", + "Value": "510603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387788, + "Key": "四川省德阳市罗江区", + "Value": "510604" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387789, + "Key": "四川省德阳市中江县", + "Value": "510623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387790, + "Key": "四川省德阳市广汉市", + "Value": "510681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387791, + "Key": "四川省德阳市什邡市", + "Value": "510682" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387792, + "Key": "四川省德阳市绵竹市", + "Value": "510683" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387793, + "Key": "四川省绵阳市", + "Value": "510700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789387794, + "Key": "四川省绵阳市涪城区", + "Value": "510703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391877, + "Key": "四川省绵阳市游仙区", + "Value": "510704" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391878, + "Key": "四川省绵阳市安州区", + "Value": "510705" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391879, + "Key": "四川省绵阳市三台县", + "Value": "510722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391880, + "Key": "四川省绵阳市盐亭县", + "Value": "510723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391881, + "Key": "四川省绵阳市梓潼县", + "Value": "510725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391882, + "Key": "四川省绵阳市北川羌族自治县", + "Value": "510726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391883, + "Key": "四川省绵阳市平武县", + "Value": "510727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391884, + "Key": "四川省绵阳市江油市", + "Value": "510781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391885, + "Key": "四川省广元市", + "Value": "510800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391886, + "Key": "四川省广元市利州区", + "Value": "510802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391887, + "Key": "四川省广元市昭化区", + "Value": "510811" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391888, + "Key": "四川省广元市朝天区", + "Value": "510812" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391889, + "Key": "四川省广元市旺苍县", + "Value": "510821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789391890, + "Key": "四川省广元市青川县", + "Value": "510822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395973, + "Key": "四川省广元市剑阁县", + "Value": "510823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395974, + "Key": "四川省广元市苍溪县", + "Value": "510824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395975, + "Key": "四川省遂宁市", + "Value": "510900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395976, + "Key": "四川省遂宁市船山区", + "Value": "510903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395977, + "Key": "四川省遂宁市安居区", + "Value": "510904" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395978, + "Key": "四川省遂宁市蓬溪县", + "Value": "510921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395979, + "Key": "四川省遂宁市大英县", + "Value": "510923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395980, + "Key": "四川省遂宁市射洪市", + "Value": "510981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395981, + "Key": "四川省内江市", + "Value": "511000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395982, + "Key": "四川省内江市市中区", + "Value": "511002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395983, + "Key": "四川省内江市东兴区", + "Value": "511011" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395984, + "Key": "四川省内江市威远县", + "Value": "511024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395985, + "Key": "四川省内江市资中县", + "Value": "511025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789395986, + "Key": "四川省内江市隆昌市", + "Value": "511083" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400069, + "Key": "四川省乐山市", + "Value": "511100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400070, + "Key": "四川省乐山市市中区", + "Value": "511102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400071, + "Key": "四川省乐山市沙湾区", + "Value": "511111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400072, + "Key": "四川省乐山市五通桥区", + "Value": "511112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400073, + "Key": "四川省乐山市金口河区", + "Value": "511113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400074, + "Key": "四川省乐山市犍为县", + "Value": "511123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400075, + "Key": "四川省乐山市井研县", + "Value": "511124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400076, + "Key": "四川省乐山市夹江县", + "Value": "511126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400077, + "Key": "四川省乐山市沐川县", + "Value": "511129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400078, + "Key": "四川省乐山市峨边彝族自治县", + "Value": "511132" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400079, + "Key": "四川省乐山市马边彝族自治县", + "Value": "511133" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400080, + "Key": "四川省乐山市峨眉山市", + "Value": "511181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400081, + "Key": "四川省南充市", + "Value": "511300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789400082, + "Key": "四川省南充市顺庆区", + "Value": "511302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404165, + "Key": "四川省南充市高坪区", + "Value": "511303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404166, + "Key": "四川省南充市嘉陵区", + "Value": "511304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404167, + "Key": "四川省南充市南部县", + "Value": "511321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404168, + "Key": "四川省南充市营山县", + "Value": "511322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404169, + "Key": "四川省南充市蓬安县", + "Value": "511323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404170, + "Key": "四川省南充市仪陇县", + "Value": "511324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404171, + "Key": "四川省南充市西充县", + "Value": "511325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404172, + "Key": "四川省南充市阆中市", + "Value": "511381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404173, + "Key": "四川省眉山市", + "Value": "511400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404174, + "Key": "四川省眉山市东坡区", + "Value": "511402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404175, + "Key": "四川省眉山市彭山区", + "Value": "511403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404176, + "Key": "四川省眉山市仁寿县", + "Value": "511421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404177, + "Key": "四川省眉山市洪雅县", + "Value": "511423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789404178, + "Key": "四川省眉山市丹棱县", + "Value": "511424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408261, + "Key": "四川省眉山市青神县", + "Value": "511425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408262, + "Key": "四川省宜宾市", + "Value": "511500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408263, + "Key": "四川省宜宾市翠屏区", + "Value": "511502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408264, + "Key": "四川省宜宾市南溪区", + "Value": "511503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408265, + "Key": "四川省宜宾市叙州区", + "Value": "511504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408266, + "Key": "四川省宜宾市江安县", + "Value": "511523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408267, + "Key": "四川省宜宾市长宁县", + "Value": "511524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408268, + "Key": "四川省宜宾市高县", + "Value": "511525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408269, + "Key": "四川省宜宾市珙县", + "Value": "511526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408270, + "Key": "四川省宜宾市筠连县", + "Value": "511527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408271, + "Key": "四川省宜宾市兴文县", + "Value": "511528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408272, + "Key": "四川省宜宾市屏山县", + "Value": "511529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408273, + "Key": "四川省广安市", + "Value": "511600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789408274, + "Key": "四川省广安市广安区", + "Value": "511602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412357, + "Key": "四川省广安市前锋区", + "Value": "511603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412358, + "Key": "四川省广安市岳池县", + "Value": "511621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412359, + "Key": "四川省广安市武胜县", + "Value": "511622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412360, + "Key": "四川省广安市邻水县", + "Value": "511623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412361, + "Key": "四川省广安市华蓥市", + "Value": "511681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412362, + "Key": "四川省达州市", + "Value": "511700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412363, + "Key": "四川省达州市通川区", + "Value": "511702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412364, + "Key": "四川省达州市达川区", + "Value": "511703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412365, + "Key": "四川省达州市宣汉县", + "Value": "511722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412366, + "Key": "四川省达州市开江县", + "Value": "511723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412367, + "Key": "四川省达州市大竹县", + "Value": "511724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412368, + "Key": "四川省达州市渠县", + "Value": "511725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412369, + "Key": "四川省达州市万源市", + "Value": "511781" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789412370, + "Key": "四川省雅安市", + "Value": "511800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416453, + "Key": "四川省雅安市雨城区", + "Value": "511802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416454, + "Key": "四川省雅安市名山区", + "Value": "511803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416455, + "Key": "四川省雅安市荥经县", + "Value": "511822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416456, + "Key": "四川省雅安市汉源县", + "Value": "511823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416457, + "Key": "四川省雅安市石棉县", + "Value": "511824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416458, + "Key": "四川省雅安市天全县", + "Value": "511825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416459, + "Key": "四川省雅安市芦山县", + "Value": "511826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416460, + "Key": "四川省雅安市宝兴县", + "Value": "511827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416461, + "Key": "四川省巴中市", + "Value": "511900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416462, + "Key": "四川省巴中市巴州区", + "Value": "511902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416463, + "Key": "四川省巴中市恩阳区", + "Value": "511903" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416464, + "Key": "四川省巴中市通江县", + "Value": "511921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416465, + "Key": "四川省巴中市南江县", + "Value": "511922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789416466, + "Key": "四川省巴中市平昌县", + "Value": "511923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420549, + "Key": "四川省资阳市", + "Value": "512000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420550, + "Key": "四川省资阳市雁江区", + "Value": "512002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420551, + "Key": "四川省资阳市安岳县", + "Value": "512021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420552, + "Key": "四川省资阳市乐至县", + "Value": "512022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420553, + "Key": "四川省阿坝藏族羌族自治州", + "Value": "513200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420554, + "Key": "四川省阿坝藏族羌族自治州马尔康市", + "Value": "513201" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420555, + "Key": "四川省阿坝藏族羌族自治州汶川县", + "Value": "513221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420556, + "Key": "四川省阿坝藏族羌族自治州理县", + "Value": "513222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420557, + "Key": "四川省阿坝藏族羌族自治州茂县", + "Value": "513223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420558, + "Key": "四川省阿坝藏族羌族自治州松潘县", + "Value": "513224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420559, + "Key": "四川省阿坝藏族羌族自治州九寨沟县", + "Value": "513225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420560, + "Key": "四川省阿坝藏族羌族自治州金川县", + "Value": "513226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420561, + "Key": "四川省阿坝藏族羌族自治州小金县", + "Value": "513227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420562, + "Key": "四川省阿坝藏族羌族自治州黑水县", + "Value": "513228" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789420563, + "Key": "四川省阿坝藏族羌族自治州壤塘县", + "Value": "513230" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424645, + "Key": "四川省阿坝藏族羌族自治州阿坝县", + "Value": "513231" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424646, + "Key": "四川省阿坝藏族羌族自治州若尔盖县", + "Value": "513232" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424647, + "Key": "四川省阿坝藏族羌族自治州红原县", + "Value": "513233" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424648, + "Key": "四川省甘孜藏族自治州", + "Value": "513300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424649, + "Key": "四川省甘孜藏族自治州康定市", + "Value": "513301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424650, + "Key": "四川省甘孜藏族自治州泸定县", + "Value": "513322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424651, + "Key": "四川省甘孜藏族自治州丹巴县", + "Value": "513323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424652, + "Key": "四川省甘孜藏族自治州九龙县", + "Value": "513324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424653, + "Key": "四川省甘孜藏族自治州雅江县", + "Value": "513325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424654, + "Key": "四川省甘孜藏族自治州道孚县", + "Value": "513326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424655, + "Key": "四川省甘孜藏族自治州炉霍县", + "Value": "513327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424656, + "Key": "四川省甘孜藏族自治州甘孜县", + "Value": "513328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789424657, + "Key": "四川省甘孜藏族自治州新龙县", + "Value": "513329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428741, + "Key": "四川省甘孜藏族自治州德格县", + "Value": "513330" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428742, + "Key": "四川省甘孜藏族自治州白玉县", + "Value": "513331" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428743, + "Key": "四川省甘孜藏族自治州石渠县", + "Value": "513332" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428744, + "Key": "四川省甘孜藏族自治州色达县", + "Value": "513333" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428745, + "Key": "四川省甘孜藏族自治州理塘县", + "Value": "513334" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428746, + "Key": "四川省甘孜藏族自治州巴塘县", + "Value": "513335" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428747, + "Key": "四川省甘孜藏族自治州乡城县", + "Value": "513336" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428748, + "Key": "四川省甘孜藏族自治州稻城县", + "Value": "513337" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428749, + "Key": "四川省甘孜藏族自治州得荣县", + "Value": "513338" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428750, + "Key": "四川省凉山彝族自治州", + "Value": "513400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428751, + "Key": "四川省凉山彝族自治州西昌市", + "Value": "513401" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428752, + "Key": "四川省凉山彝族自治州会理市", + "Value": "513402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428753, + "Key": "四川省凉山彝族自治州木里藏族自治县", + "Value": "513422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428754, + "Key": "四川省凉山彝族自治州盐源县", + "Value": "513423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789428755, + "Key": "四川省凉山彝族自治州德昌县", + "Value": "513424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432837, + "Key": "四川省凉山彝族自治州会东县", + "Value": "513426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432838, + "Key": "四川省凉山彝族自治州宁南县", + "Value": "513427" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432839, + "Key": "四川省凉山彝族自治州普格县", + "Value": "513428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432840, + "Key": "四川省凉山彝族自治州布拖县", + "Value": "513429" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432841, + "Key": "四川省凉山彝族自治州金阳县", + "Value": "513430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432842, + "Key": "四川省凉山彝族自治州昭觉县", + "Value": "513431" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432843, + "Key": "四川省凉山彝族自治州喜德县", + "Value": "513432" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432844, + "Key": "四川省凉山彝族自治州冕宁县", + "Value": "513433" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432845, + "Key": "四川省凉山彝族自治州越西县", + "Value": "513434" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432846, + "Key": "四川省凉山彝族自治州甘洛县", + "Value": "513435" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432847, + "Key": "四川省凉山彝族自治州美姑县", + "Value": "513436" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432848, + "Key": "四川省凉山彝族自治州雷波县", + "Value": "513437" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432849, + "Key": "贵州省", + "Value": "520000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789432850, + "Key": "贵州省贵阳市", + "Value": "520100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436933, + "Key": "贵州省贵阳市南明区", + "Value": "520102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436934, + "Key": "贵州省贵阳市云岩区", + "Value": "520103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436935, + "Key": "贵州省贵阳市花溪区", + "Value": "520111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436936, + "Key": "贵州省贵阳市乌当区", + "Value": "520112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436937, + "Key": "贵州省贵阳市白云区", + "Value": "520113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436938, + "Key": "贵州省贵阳市观山湖区", + "Value": "520115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436939, + "Key": "贵州省贵阳市开阳县", + "Value": "520121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436940, + "Key": "贵州省贵阳市息烽县", + "Value": "520122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436941, + "Key": "贵州省贵阳市修文县", + "Value": "520123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436942, + "Key": "贵州省贵阳市清镇市", + "Value": "520181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436943, + "Key": "贵州省六盘水市", + "Value": "520200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789436944, + "Key": "贵州省六盘水市钟山区", + "Value": "520201" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441029, + "Key": "贵州省六盘水市六枝特区", + "Value": "520203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441030, + "Key": "贵州省六盘水市水城区", + "Value": "520204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441031, + "Key": "贵州省六盘水市盘州市", + "Value": "520281" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441032, + "Key": "贵州省遵义市", + "Value": "520300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441033, + "Key": "贵州省遵义市红花岗区", + "Value": "520302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441034, + "Key": "贵州省遵义市汇川区", + "Value": "520303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441035, + "Key": "贵州省遵义市播州区", + "Value": "520304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441036, + "Key": "贵州省遵义市桐梓县", + "Value": "520322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789441037, + "Key": "贵州省遵义市绥阳县", + "Value": "520323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445125, + "Key": "贵州省遵义市正安县", + "Value": "520324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445126, + "Key": "贵州省遵义市道真仡佬族苗族自治县", + "Value": "520325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445127, + "Key": "贵州省遵义市务川仡佬族苗族自治县", + "Value": "520326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445128, + "Key": "贵州省遵义市凤冈县", + "Value": "520327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445129, + "Key": "贵州省遵义市湄潭县", + "Value": "520328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445130, + "Key": "贵州省遵义市余庆县", + "Value": "520329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445131, + "Key": "贵州省遵义市习水县", + "Value": "520330" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445132, + "Key": "贵州省遵义市赤水市", + "Value": "520381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445133, + "Key": "贵州省遵义市仁怀市", + "Value": "520382" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445134, + "Key": "贵州省安顺市", + "Value": "520400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445135, + "Key": "贵州省安顺市西秀区", + "Value": "520402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445136, + "Key": "贵州省安顺市平坝区", + "Value": "520403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789445137, + "Key": "贵州省安顺市普定县", + "Value": "520422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449221, + "Key": "贵州省安顺市镇宁布依族苗族自治县", + "Value": "520423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449222, + "Key": "贵州省安顺市关岭布依族苗族自治县", + "Value": "520424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449223, + "Key": "贵州省安顺市紫云苗族布依族自治县", + "Value": "520425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449224, + "Key": "贵州省毕节市", + "Value": "520500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449225, + "Key": "贵州省毕节市七星关区", + "Value": "520502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449226, + "Key": "贵州省毕节市大方县", + "Value": "520521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449227, + "Key": "贵州省毕节市金沙县", + "Value": "520523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449228, + "Key": "贵州省毕节市织金县", + "Value": "520524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449229, + "Key": "贵州省毕节市纳雍县", + "Value": "520525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449230, + "Key": "贵州省毕节市威宁彝族回族苗族自治县", + "Value": "520526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449231, + "Key": "贵州省毕节市赫章县", + "Value": "520527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449232, + "Key": "贵州省毕节市黔西市", + "Value": "520581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449233, + "Key": "贵州省铜仁市", + "Value": "520600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789449234, + "Key": "贵州省铜仁市碧江区", + "Value": "520602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453317, + "Key": "贵州省铜仁市万山区", + "Value": "520603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453318, + "Key": "贵州省铜仁市江口县", + "Value": "520621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453319, + "Key": "贵州省铜仁市玉屏侗族自治县", + "Value": "520622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453320, + "Key": "贵州省铜仁市石阡县", + "Value": "520623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453321, + "Key": "贵州省铜仁市思南县", + "Value": "520624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453322, + "Key": "贵州省铜仁市印江土家族苗族自治县", + "Value": "520625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453323, + "Key": "贵州省铜仁市德江县", + "Value": "520626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453324, + "Key": "贵州省铜仁市沿河土家族自治县", + "Value": "520627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453325, + "Key": "贵州省铜仁市松桃苗族自治县", + "Value": "520628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453326, + "Key": "贵州省黔西南布依族苗族自治州", + "Value": "522300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453327, + "Key": "贵州省黔西南布依族苗族自治州兴义市", + "Value": "522301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453328, + "Key": "贵州省黔西南布依族苗族自治州兴仁市", + "Value": "522302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789453329, + "Key": "贵州省黔西南布依族苗族自治州普安县", + "Value": "522323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457413, + "Key": "贵州省黔西南布依族苗族自治州晴隆县", + "Value": "522324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457414, + "Key": "贵州省黔西南布依族苗族自治州贞丰县", + "Value": "522325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457415, + "Key": "贵州省黔西南布依族苗族自治州望谟县", + "Value": "522326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457416, + "Key": "贵州省黔西南布依族苗族自治州册亨县", + "Value": "522327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457417, + "Key": "贵州省黔西南布依族苗族自治州安龙县", + "Value": "522328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457418, + "Key": "贵州省黔东南苗族侗族自治州", + "Value": "522600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457419, + "Key": "贵州省黔东南苗族侗族自治州凯里市", + "Value": "522601" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457420, + "Key": "贵州省黔东南苗族侗族自治州黄平县", + "Value": "522622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457421, + "Key": "贵州省黔东南苗族侗族自治州施秉县", + "Value": "522623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457422, + "Key": "贵州省黔东南苗族侗族自治州三穗县", + "Value": "522624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457423, + "Key": "贵州省黔东南苗族侗族自治州镇远县", + "Value": "522625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457424, + "Key": "贵州省黔东南苗族侗族自治州岑巩县", + "Value": "522626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457425, + "Key": "贵州省黔东南苗族侗族自治州天柱县", + "Value": "522627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789457426, + "Key": "贵州省黔东南苗族侗族自治州锦屏县", + "Value": "522628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461509, + "Key": "贵州省黔东南苗族侗族自治州剑河县", + "Value": "522629" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461510, + "Key": "贵州省黔东南苗族侗族自治州台江县", + "Value": "522630" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461511, + "Key": "贵州省黔东南苗族侗族自治州黎平县", + "Value": "522631" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461512, + "Key": "贵州省黔东南苗族侗族自治州榕江县", + "Value": "522632" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461513, + "Key": "贵州省黔东南苗族侗族自治州从江县", + "Value": "522633" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461514, + "Key": "贵州省黔东南苗族侗族自治州雷山县", + "Value": "522634" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461515, + "Key": "贵州省黔东南苗族侗族自治州麻江县", + "Value": "522635" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461516, + "Key": "贵州省黔东南苗族侗族自治州丹寨县", + "Value": "522636" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461517, + "Key": "贵州省黔南布依族苗族自治州", + "Value": "522700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461518, + "Key": "贵州省黔南布依族苗族自治州都匀市", + "Value": "522701" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461519, + "Key": "贵州省黔南布依族苗族自治州福泉市", + "Value": "522702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461520, + "Key": "贵州省黔南布依族苗族自治州荔波县", + "Value": "522722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789461521, + "Key": "贵州省黔南布依族苗族自治州贵定县", + "Value": "522723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465605, + "Key": "贵州省黔南布依族苗族自治州瓮安县", + "Value": "522725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465606, + "Key": "贵州省黔南布依族苗族自治州独山县", + "Value": "522726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465607, + "Key": "贵州省黔南布依族苗族自治州平塘县", + "Value": "522727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465608, + "Key": "贵州省黔南布依族苗族自治州罗甸县", + "Value": "522728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465609, + "Key": "贵州省黔南布依族苗族自治州长顺县", + "Value": "522729" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465610, + "Key": "贵州省黔南布依族苗族自治州龙里县", + "Value": "522730" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465611, + "Key": "贵州省黔南布依族苗族自治州惠水县", + "Value": "522731" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465612, + "Key": "贵州省黔南布依族苗族自治州三都水族自治县", + "Value": "522732" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465613, + "Key": "云南省", + "Value": "530000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465614, + "Key": "云南省昆明市", + "Value": "530100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465615, + "Key": "云南省昆明市五华区", + "Value": "530102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465616, + "Key": "云南省昆明市盘龙区", + "Value": "530103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465617, + "Key": "云南省昆明市官渡区", + "Value": "530111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789465618, + "Key": "云南省昆明市西山区", + "Value": "530112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469701, + "Key": "云南省昆明市东川区", + "Value": "530113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469702, + "Key": "云南省昆明市呈贡区", + "Value": "530114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469703, + "Key": "云南省昆明市晋宁区", + "Value": "530115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469704, + "Key": "云南省昆明市富民县", + "Value": "530124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469705, + "Key": "云南省昆明市宜良县", + "Value": "530125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469706, + "Key": "云南省昆明市石林彝族自治县", + "Value": "530126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469707, + "Key": "云南省昆明市嵩明县", + "Value": "530127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469708, + "Key": "云南省昆明市禄劝彝族苗族自治县", + "Value": "530128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469709, + "Key": "云南省昆明市寻甸回族彝族自治县", + "Value": "530129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469710, + "Key": "云南省昆明市安宁市", + "Value": "530181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469711, + "Key": "云南省曲靖市", + "Value": "530300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469712, + "Key": "云南省曲靖市麒麟区", + "Value": "530302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789469713, + "Key": "云南省曲靖市沾益区", + "Value": "530303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473797, + "Key": "云南省曲靖市马龙区", + "Value": "530304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473798, + "Key": "云南省曲靖市陆良县", + "Value": "530322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473799, + "Key": "云南省曲靖市师宗县", + "Value": "530323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473800, + "Key": "云南省曲靖市罗平县", + "Value": "530324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473801, + "Key": "云南省曲靖市富源县", + "Value": "530325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473802, + "Key": "云南省曲靖市会泽县", + "Value": "530326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473803, + "Key": "云南省曲靖市宣威市", + "Value": "530381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473804, + "Key": "云南省玉溪市", + "Value": "530400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473805, + "Key": "云南省玉溪市红塔区", + "Value": "530402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473806, + "Key": "云南省玉溪市江川区", + "Value": "530403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789473807, + "Key": "云南省玉溪市通海县", + "Value": "530423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477893, + "Key": "云南省玉溪市华宁县", + "Value": "530424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477894, + "Key": "云南省玉溪市易门县", + "Value": "530425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477895, + "Key": "云南省玉溪市峨山彝族自治县", + "Value": "530426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477896, + "Key": "云南省玉溪市新平彝族傣族自治县", + "Value": "530427" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477897, + "Key": "云南省玉溪市元江哈尼族彝族傣族自治县", + "Value": "530428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477898, + "Key": "云南省玉溪市澄江市", + "Value": "530481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477899, + "Key": "云南省保山市", + "Value": "530500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477900, + "Key": "云南省保山市隆阳区", + "Value": "530502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477901, + "Key": "云南省保山市施甸县", + "Value": "530521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477902, + "Key": "云南省保山市龙陵县", + "Value": "530523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477903, + "Key": "云南省保山市昌宁县", + "Value": "530524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477904, + "Key": "云南省保山市腾冲市", + "Value": "530581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477905, + "Key": "云南省昭通市", + "Value": "530600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789477906, + "Key": "云南省昭通市昭阳区", + "Value": "530602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481989, + "Key": "云南省昭通市鲁甸县", + "Value": "530621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481990, + "Key": "云南省昭通市巧家县", + "Value": "530622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481991, + "Key": "云南省昭通市盐津县", + "Value": "530623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481992, + "Key": "云南省昭通市大关县", + "Value": "530624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481993, + "Key": "云南省昭通市永善县", + "Value": "530625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481994, + "Key": "云南省昭通市绥江县", + "Value": "530626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481995, + "Key": "云南省昭通市镇雄县", + "Value": "530627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481996, + "Key": "云南省昭通市彝良县", + "Value": "530628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481997, + "Key": "云南省昭通市威信县", + "Value": "530629" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481998, + "Key": "云南省昭通市水富市", + "Value": "530681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789481999, + "Key": "云南省丽江市", + "Value": "530700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789482000, + "Key": "云南省丽江市古城区", + "Value": "530702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789482001, + "Key": "云南省丽江市玉龙纳西族自治县", + "Value": "530721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789482002, + "Key": "云南省丽江市永胜县", + "Value": "530722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486085, + "Key": "云南省丽江市华坪县", + "Value": "530723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486086, + "Key": "云南省丽江市宁蒗彝族自治县", + "Value": "530724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486087, + "Key": "云南省普洱市", + "Value": "530800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486088, + "Key": "云南省普洱市思茅区", + "Value": "530802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486089, + "Key": "云南省普洱市宁洱哈尼族彝族自治县", + "Value": "530821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486090, + "Key": "云南省普洱市墨江哈尼族自治县", + "Value": "530822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486091, + "Key": "云南省普洱市景东彝族自治县", + "Value": "530823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486092, + "Key": "云南省普洱市景谷傣族彝族自治县", + "Value": "530824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486093, + "Key": "云南省普洱市镇沅彝族哈尼族拉祜族自治县", + "Value": "530825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486094, + "Key": "云南省普洱市江城哈尼族彝族自治县", + "Value": "530826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486095, + "Key": "云南省普洱市孟连傣族拉祜族佤族自治县", + "Value": "530827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486096, + "Key": "云南省普洱市澜沧拉祜族自治县", + "Value": "530828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486097, + "Key": "云南省普洱市西盟佤族自治县", + "Value": "530829" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789486098, + "Key": "云南省临沧市", + "Value": "530900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490181, + "Key": "云南省临沧市临翔区", + "Value": "530902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490182, + "Key": "云南省临沧市凤庆县", + "Value": "530921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490183, + "Key": "云南省临沧市云县", + "Value": "530922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490184, + "Key": "云南省临沧市永德县", + "Value": "530923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490185, + "Key": "云南省临沧市镇康县", + "Value": "530924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490186, + "Key": "云南省临沧市双江拉祜族佤族布朗族傣族自治县", + "Value": "530925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490187, + "Key": "云南省临沧市耿马傣族佤族自治县", + "Value": "530926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490188, + "Key": "云南省临沧市沧源佤族自治县", + "Value": "530927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490189, + "Key": "云南省楚雄彝族自治州", + "Value": "532300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490190, + "Key": "云南省楚雄彝族自治州楚雄市", + "Value": "532301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490191, + "Key": "云南省楚雄彝族自治州禄丰市", + "Value": "532302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490192, + "Key": "云南省楚雄彝族自治州双柏县", + "Value": "532322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490193, + "Key": "云南省楚雄彝族自治州牟定县", + "Value": "532323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789490194, + "Key": "云南省楚雄彝族自治州南华县", + "Value": "532324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494277, + "Key": "云南省楚雄彝族自治州姚安县", + "Value": "532325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494278, + "Key": "云南省楚雄彝族自治州大姚县", + "Value": "532326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494279, + "Key": "云南省楚雄彝族自治州永仁县", + "Value": "532327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494280, + "Key": "云南省楚雄彝族自治州元谋县", + "Value": "532328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494281, + "Key": "云南省楚雄彝族自治州武定县", + "Value": "532329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494282, + "Key": "云南省红河哈尼族彝族自治州", + "Value": "532500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494283, + "Key": "云南省红河哈尼族彝族自治州个旧市", + "Value": "532501" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494284, + "Key": "云南省红河哈尼族彝族自治州开远市", + "Value": "532502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494285, + "Key": "云南省红河哈尼族彝族自治州蒙自市", + "Value": "532503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494286, + "Key": "云南省红河哈尼族彝族自治州弥勒市", + "Value": "532504" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494287, + "Key": "云南省红河哈尼族彝族自治州屏边苗族自治县", + "Value": "532523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494288, + "Key": "云南省红河哈尼族彝族自治州建水县", + "Value": "532524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494289, + "Key": "云南省红河哈尼族彝族自治州石屏县", + "Value": "532525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494290, + "Key": "云南省红河哈尼族彝族自治州泸西县", + "Value": "532527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789494291, + "Key": "云南省红河哈尼族彝族自治州元阳县", + "Value": "532528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498373, + "Key": "云南省红河哈尼族彝族自治州红河县", + "Value": "532529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498374, + "Key": "云南省红河哈尼族彝族自治州金平苗族瑶族傣族自治县", + "Value": "532530" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498375, + "Key": "云南省红河哈尼族彝族自治州绿春县", + "Value": "532531" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498376, + "Key": "云南省红河哈尼族彝族自治州河口瑶族自治县", + "Value": "532532" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498377, + "Key": "云南省文山壮族苗族自治州", + "Value": "532600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498378, + "Key": "云南省文山壮族苗族自治州文山市", + "Value": "532601" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498379, + "Key": "云南省文山壮族苗族自治州砚山县", + "Value": "532622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498380, + "Key": "云南省文山壮族苗族自治州西畴县", + "Value": "532623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498381, + "Key": "云南省文山壮族苗族自治州麻栗坡县", + "Value": "532624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498382, + "Key": "云南省文山壮族苗族自治州马关县", + "Value": "532625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498383, + "Key": "云南省文山壮族苗族自治州丘北县", + "Value": "532626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498384, + "Key": "云南省文山壮族苗族自治州广南县", + "Value": "532627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498385, + "Key": "云南省文山壮族苗族自治州富宁县", + "Value": "532628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789498386, + "Key": "云南省西双版纳傣族自治州", + "Value": "532800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502469, + "Key": "云南省西双版纳傣族自治州景洪市", + "Value": "532801" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502470, + "Key": "云南省西双版纳傣族自治州勐海县", + "Value": "532822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502471, + "Key": "云南省西双版纳傣族自治州勐腊县", + "Value": "532823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502472, + "Key": "云南省大理白族自治州", + "Value": "532900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502473, + "Key": "云南省大理白族自治州大理市", + "Value": "532901" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502474, + "Key": "云南省大理白族自治州漾濞彝族自治县", + "Value": "532922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502475, + "Key": "云南省大理白族自治州祥云县", + "Value": "532923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502476, + "Key": "云南省大理白族自治州宾川县", + "Value": "532924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502477, + "Key": "云南省大理白族自治州弥渡县", + "Value": "532925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502478, + "Key": "云南省大理白族自治州南涧彝族自治县", + "Value": "532926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502479, + "Key": "云南省大理白族自治州巍山彝族回族自治县", + "Value": "532927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502480, + "Key": "云南省大理白族自治州永平县", + "Value": "532928" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502481, + "Key": "云南省大理白族自治州云龙县", + "Value": "532929" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789502482, + "Key": "云南省大理白族自治州洱源县", + "Value": "532930" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506565, + "Key": "云南省大理白族自治州剑川县", + "Value": "532931" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506566, + "Key": "云南省大理白族自治州鹤庆县", + "Value": "532932" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506567, + "Key": "云南省德宏傣族景颇族自治州", + "Value": "533100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506568, + "Key": "云南省德宏傣族景颇族自治州瑞丽市", + "Value": "533102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506569, + "Key": "云南省德宏傣族景颇族自治州芒市", + "Value": "533103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506570, + "Key": "云南省德宏傣族景颇族自治州梁河县", + "Value": "533122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506571, + "Key": "云南省德宏傣族景颇族自治州盈江县", + "Value": "533123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506572, + "Key": "云南省德宏傣族景颇族自治州陇川县", + "Value": "533124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506573, + "Key": "云南省怒江傈僳族自治州", + "Value": "533300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506574, + "Key": "云南省怒江傈僳族自治州泸水市", + "Value": "533301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506575, + "Key": "云南省怒江傈僳族自治州福贡县", + "Value": "533323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506576, + "Key": "云南省怒江傈僳族自治州贡山独龙族怒族自治县", + "Value": "533324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506577, + "Key": "云南省怒江傈僳族自治州兰坪白族普米族自治县", + "Value": "533325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789506578, + "Key": "云南省迪庆藏族自治州", + "Value": "533400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510661, + "Key": "云南省迪庆藏族自治州香格里拉市", + "Value": "533401" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510662, + "Key": "云南省迪庆藏族自治州德钦县", + "Value": "533422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510663, + "Key": "云南省迪庆藏族自治州维西傈僳族自治县", + "Value": "533423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510664, + "Key": "西藏自治区", + "Value": "540000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510665, + "Key": "西藏自治区拉萨市", + "Value": "540100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510666, + "Key": "西藏自治区拉萨市城关区", + "Value": "540102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510667, + "Key": "西藏自治区拉萨市堆龙德庆区", + "Value": "540103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510668, + "Key": "西藏自治区拉萨市达孜区", + "Value": "540104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510669, + "Key": "西藏自治区拉萨市林周县", + "Value": "540121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510670, + "Key": "西藏自治区拉萨市当雄县", + "Value": "540122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510671, + "Key": "西藏自治区拉萨市尼木县", + "Value": "540123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510672, + "Key": "西藏自治区拉萨市曲水县", + "Value": "540124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510673, + "Key": "西藏自治区拉萨市墨竹工卡县", + "Value": "540127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789510674, + "Key": "西藏自治区日喀则市", + "Value": "540200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514757, + "Key": "西藏自治区日喀则市桑珠孜区", + "Value": "540202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514758, + "Key": "西藏自治区日喀则市南木林县", + "Value": "540221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514759, + "Key": "西藏自治区日喀则市江孜县", + "Value": "540222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514760, + "Key": "西藏自治区日喀则市定日县", + "Value": "540223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514761, + "Key": "西藏自治区日喀则市萨迦县", + "Value": "540224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514762, + "Key": "西藏自治区日喀则市拉孜县", + "Value": "540225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514763, + "Key": "西藏自治区日喀则市昂仁县", + "Value": "540226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514764, + "Key": "西藏自治区日喀则市谢通门县", + "Value": "540227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514765, + "Key": "西藏自治区日喀则市白朗县", + "Value": "540228" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514766, + "Key": "西藏自治区日喀则市仁布县", + "Value": "540229" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514767, + "Key": "西藏自治区日喀则市康马县", + "Value": "540230" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514768, + "Key": "西藏自治区日喀则市定结县", + "Value": "540231" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514769, + "Key": "西藏自治区日喀则市仲巴县", + "Value": "540232" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514770, + "Key": "西藏自治区日喀则市亚东县", + "Value": "540233" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789514771, + "Key": "西藏自治区日喀则市吉隆县", + "Value": "540234" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518853, + "Key": "西藏自治区日喀则市聂拉木县", + "Value": "540235" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518854, + "Key": "西藏自治区日喀则市萨嘎县", + "Value": "540236" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518855, + "Key": "西藏自治区日喀则市岗巴县", + "Value": "540237" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518856, + "Key": "西藏自治区昌都市", + "Value": "540300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518857, + "Key": "西藏自治区昌都市卡若区", + "Value": "540302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518858, + "Key": "西藏自治区昌都市江达县", + "Value": "540321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518859, + "Key": "西藏自治区昌都市贡觉县", + "Value": "540322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518860, + "Key": "西藏自治区昌都市类乌齐县", + "Value": "540323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518861, + "Key": "西藏自治区昌都市丁青县", + "Value": "540324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518862, + "Key": "西藏自治区昌都市察雅县", + "Value": "540325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789518863, + "Key": "西藏自治区昌都市八宿县", + "Value": "540326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522949, + "Key": "西藏自治区昌都市左贡县", + "Value": "540327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522950, + "Key": "西藏自治区昌都市芒康县", + "Value": "540328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522951, + "Key": "西藏自治区昌都市洛隆县", + "Value": "540329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522952, + "Key": "西藏自治区昌都市边坝县", + "Value": "540330" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522953, + "Key": "西藏自治区林芝市", + "Value": "540400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522954, + "Key": "西藏自治区林芝市巴宜区", + "Value": "540402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522955, + "Key": "西藏自治区林芝市工布江达县", + "Value": "540421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522956, + "Key": "西藏自治区林芝市米林县", + "Value": "540422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522957, + "Key": "西藏自治区林芝市墨脱县", + "Value": "540423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522958, + "Key": "西藏自治区林芝市波密县", + "Value": "540424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789522959, + "Key": "西藏自治区林芝市察隅县", + "Value": "540425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527045, + "Key": "西藏自治区林芝市朗县", + "Value": "540426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527046, + "Key": "西藏自治区山南市", + "Value": "540500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527047, + "Key": "西藏自治区山南市乃东区", + "Value": "540502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527048, + "Key": "西藏自治区山南市扎囊县", + "Value": "540521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527049, + "Key": "西藏自治区山南市贡嘎县", + "Value": "540522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527050, + "Key": "西藏自治区山南市桑日县", + "Value": "540523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527051, + "Key": "西藏自治区山南市琼结县", + "Value": "540524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527052, + "Key": "西藏自治区山南市曲松县", + "Value": "540525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527053, + "Key": "西藏自治区山南市措美县", + "Value": "540526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527054, + "Key": "西藏自治区山南市洛扎县", + "Value": "540527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527055, + "Key": "西藏自治区山南市加查县", + "Value": "540528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527056, + "Key": "西藏自治区山南市隆子县", + "Value": "540529" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527057, + "Key": "西藏自治区山南市错那县", + "Value": "540530" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527058, + "Key": "西藏自治区山南市浪卡子县", + "Value": "540531" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789527059, + "Key": "西藏自治区那曲市", + "Value": "540600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531141, + "Key": "西藏自治区那曲市色尼区", + "Value": "540602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531142, + "Key": "西藏自治区那曲市嘉黎县", + "Value": "540621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531143, + "Key": "西藏自治区那曲市比如县", + "Value": "540622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531144, + "Key": "西藏自治区那曲市聂荣县", + "Value": "540623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531145, + "Key": "西藏自治区那曲市安多县", + "Value": "540624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531146, + "Key": "西藏自治区那曲市申扎县", + "Value": "540625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531147, + "Key": "西藏自治区那曲市索县", + "Value": "540626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531148, + "Key": "西藏自治区那曲市班戈县", + "Value": "540627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531149, + "Key": "西藏自治区那曲市巴青县", + "Value": "540628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531150, + "Key": "西藏自治区那曲市尼玛县", + "Value": "540629" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531151, + "Key": "西藏自治区那曲市双湖县", + "Value": "540630" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531152, + "Key": "西藏自治区阿里地区", + "Value": "542500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531153, + "Key": "西藏自治区阿里地区普兰县", + "Value": "542521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789531154, + "Key": "西藏自治区阿里地区札达县", + "Value": "542522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535237, + "Key": "西藏自治区阿里地区噶尔县", + "Value": "542523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535238, + "Key": "西藏自治区阿里地区日土县", + "Value": "542524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535239, + "Key": "西藏自治区阿里地区革吉县", + "Value": "542525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535240, + "Key": "西藏自治区阿里地区改则县", + "Value": "542526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535241, + "Key": "西藏自治区阿里地区措勤县", + "Value": "542527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535242, + "Key": "陕西省", + "Value": "610000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535243, + "Key": "陕西省西安市", + "Value": "610100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535244, + "Key": "陕西省西安市新城区", + "Value": "610102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535245, + "Key": "陕西省西安市碑林区", + "Value": "610103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535246, + "Key": "陕西省西安市莲湖区", + "Value": "610104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535247, + "Key": "陕西省西安市灞桥区", + "Value": "610111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789535248, + "Key": "陕西省西安市未央区", + "Value": "610112" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539333, + "Key": "陕西省西安市雁塔区", + "Value": "610113" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539334, + "Key": "陕西省西安市阎良区", + "Value": "610114" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539335, + "Key": "陕西省西安市临潼区", + "Value": "610115" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539336, + "Key": "陕西省西安市长安区", + "Value": "610116" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539337, + "Key": "陕西省西安市高陵区", + "Value": "610117" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539338, + "Key": "陕西省西安市鄠邑区", + "Value": "610118" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539339, + "Key": "陕西省西安市蓝田县", + "Value": "610122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539340, + "Key": "陕西省西安市周至县", + "Value": "610124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539341, + "Key": "陕西省铜川市", + "Value": "610200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539342, + "Key": "陕西省铜川市王益区", + "Value": "610202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539343, + "Key": "陕西省铜川市印台区", + "Value": "610203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539344, + "Key": "陕西省铜川市耀州区", + "Value": "610204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539345, + "Key": "陕西省铜川市宜君县", + "Value": "610222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789539346, + "Key": "陕西省宝鸡市", + "Value": "610300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543429, + "Key": "陕西省宝鸡市渭滨区", + "Value": "610302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543430, + "Key": "陕西省宝鸡市金台区", + "Value": "610303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543431, + "Key": "陕西省宝鸡市陈仓区", + "Value": "610304" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543432, + "Key": "陕西省宝鸡市凤翔区", + "Value": "610305" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543433, + "Key": "陕西省宝鸡市岐山县", + "Value": "610323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543434, + "Key": "陕西省宝鸡市扶风县", + "Value": "610324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543435, + "Key": "陕西省宝鸡市眉县", + "Value": "610326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543436, + "Key": "陕西省宝鸡市陇县", + "Value": "610327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543437, + "Key": "陕西省宝鸡市千阳县", + "Value": "610328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543438, + "Key": "陕西省宝鸡市麟游县", + "Value": "610329" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543439, + "Key": "陕西省宝鸡市凤县", + "Value": "610330" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543440, + "Key": "陕西省宝鸡市太白县", + "Value": "610331" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543441, + "Key": "陕西省咸阳市", + "Value": "610400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543442, + "Key": "陕西省咸阳市秦都区", + "Value": "610402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789543443, + "Key": "陕西省咸阳市杨陵区", + "Value": "610403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547525, + "Key": "陕西省咸阳市渭城区", + "Value": "610404" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547526, + "Key": "陕西省咸阳市三原县", + "Value": "610422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547527, + "Key": "陕西省咸阳市泾阳县", + "Value": "610423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547528, + "Key": "陕西省咸阳市乾县", + "Value": "610424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547529, + "Key": "陕西省咸阳市礼泉县", + "Value": "610425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547530, + "Key": "陕西省咸阳市永寿县", + "Value": "610426" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547531, + "Key": "陕西省咸阳市长武县", + "Value": "610428" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547532, + "Key": "陕西省咸阳市旬邑县", + "Value": "610429" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547533, + "Key": "陕西省咸阳市淳化县", + "Value": "610430" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547534, + "Key": "陕西省咸阳市武功县", + "Value": "610431" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547535, + "Key": "陕西省咸阳市兴平市", + "Value": "610481" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547536, + "Key": "陕西省咸阳市彬州市", + "Value": "610482" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547537, + "Key": "陕西省渭南市", + "Value": "610500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789547538, + "Key": "陕西省渭南市临渭区", + "Value": "610502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551621, + "Key": "陕西省渭南市华州区", + "Value": "610503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551622, + "Key": "陕西省渭南市潼关县", + "Value": "610522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551623, + "Key": "陕西省渭南市大荔县", + "Value": "610523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551624, + "Key": "陕西省渭南市合阳县", + "Value": "610524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551625, + "Key": "陕西省渭南市澄城县", + "Value": "610525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551626, + "Key": "陕西省渭南市蒲城县", + "Value": "610526" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551627, + "Key": "陕西省渭南市白水县", + "Value": "610527" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551628, + "Key": "陕西省渭南市富平县", + "Value": "610528" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551629, + "Key": "陕西省渭南市韩城市", + "Value": "610581" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551630, + "Key": "陕西省渭南市华阴市", + "Value": "610582" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551631, + "Key": "陕西省延安市", + "Value": "610600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551632, + "Key": "陕西省延安市宝塔区", + "Value": "610602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551633, + "Key": "陕西省延安市安塞区", + "Value": "610603" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789551634, + "Key": "陕西省延安市延长县", + "Value": "610621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555717, + "Key": "陕西省延安市延川县", + "Value": "610622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555718, + "Key": "陕西省延安市志丹县", + "Value": "610625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555719, + "Key": "陕西省延安市吴起县", + "Value": "610626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555720, + "Key": "陕西省延安市甘泉县", + "Value": "610627" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555721, + "Key": "陕西省延安市富县", + "Value": "610628" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555722, + "Key": "陕西省延安市洛川县", + "Value": "610629" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555723, + "Key": "陕西省延安市宜川县", + "Value": "610630" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555724, + "Key": "陕西省延安市黄龙县", + "Value": "610631" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555725, + "Key": "陕西省延安市黄陵县", + "Value": "610632" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555726, + "Key": "陕西省延安市子长市", + "Value": "610681" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555727, + "Key": "陕西省汉中市", + "Value": "610700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555728, + "Key": "陕西省汉中市汉台区", + "Value": "610702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555729, + "Key": "陕西省汉中市南郑区", + "Value": "610703" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789555730, + "Key": "陕西省汉中市城固县", + "Value": "610722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559813, + "Key": "陕西省汉中市洋县", + "Value": "610723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559814, + "Key": "陕西省汉中市西乡县", + "Value": "610724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559815, + "Key": "陕西省汉中市勉县", + "Value": "610725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559816, + "Key": "陕西省汉中市宁强县", + "Value": "610726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559817, + "Key": "陕西省汉中市略阳县", + "Value": "610727" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559818, + "Key": "陕西省汉中市镇巴县", + "Value": "610728" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559819, + "Key": "陕西省汉中市留坝县", + "Value": "610729" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559820, + "Key": "陕西省汉中市佛坪县", + "Value": "610730" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559821, + "Key": "陕西省榆林市", + "Value": "610800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559822, + "Key": "陕西省榆林市榆阳区", + "Value": "610802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559823, + "Key": "陕西省榆林市横山区", + "Value": "610803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559824, + "Key": "陕西省榆林市府谷县", + "Value": "610822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559825, + "Key": "陕西省榆林市靖边县", + "Value": "610824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789559826, + "Key": "陕西省榆林市定边县", + "Value": "610825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563909, + "Key": "陕西省榆林市绥德县", + "Value": "610826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563910, + "Key": "陕西省榆林市米脂县", + "Value": "610827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563911, + "Key": "陕西省榆林市佳县", + "Value": "610828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563912, + "Key": "陕西省榆林市吴堡县", + "Value": "610829" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563913, + "Key": "陕西省榆林市清涧县", + "Value": "610830" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563914, + "Key": "陕西省榆林市子洲县", + "Value": "610831" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563915, + "Key": "陕西省榆林市神木市", + "Value": "610881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563916, + "Key": "陕西省安康市", + "Value": "610900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563917, + "Key": "陕西省安康市汉滨区", + "Value": "610902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563918, + "Key": "陕西省安康市汉阴县", + "Value": "610921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563919, + "Key": "陕西省安康市石泉县", + "Value": "610922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563920, + "Key": "陕西省安康市宁陕县", + "Value": "610923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563921, + "Key": "陕西省安康市紫阳县", + "Value": "610924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563922, + "Key": "陕西省安康市岚皋县", + "Value": "610925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789563923, + "Key": "陕西省安康市平利县", + "Value": "610926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568005, + "Key": "陕西省安康市镇坪县", + "Value": "610927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568006, + "Key": "陕西省安康市白河县", + "Value": "610929" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568007, + "Key": "陕西省安康市旬阳市", + "Value": "610981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568008, + "Key": "陕西省商洛市", + "Value": "611000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568009, + "Key": "陕西省商洛市商州区", + "Value": "611002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568010, + "Key": "陕西省商洛市洛南县", + "Value": "611021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568011, + "Key": "陕西省商洛市丹凤县", + "Value": "611022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568012, + "Key": "陕西省商洛市商南县", + "Value": "611023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568013, + "Key": "陕西省商洛市山阳县", + "Value": "611024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568014, + "Key": "陕西省商洛市镇安县", + "Value": "611025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568015, + "Key": "陕西省商洛市柞水县", + "Value": "611026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568016, + "Key": "甘肃省", + "Value": "620000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568017, + "Key": "甘肃省兰州市", + "Value": "620100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789568018, + "Key": "甘肃省兰州市城关区", + "Value": "620102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572101, + "Key": "甘肃省兰州市七里河区", + "Value": "620103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572102, + "Key": "甘肃省兰州市西固区", + "Value": "620104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572103, + "Key": "甘肃省兰州市安宁区", + "Value": "620105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572104, + "Key": "甘肃省兰州市红古区", + "Value": "620111" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572105, + "Key": "甘肃省兰州市永登县", + "Value": "620121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572106, + "Key": "甘肃省兰州市皋兰县", + "Value": "620122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572107, + "Key": "甘肃省兰州市榆中县", + "Value": "620123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572108, + "Key": "甘肃省兰州市嘉峪关市", + "Value": "620200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572109, + "Key": "甘肃省金昌市", + "Value": "620300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572110, + "Key": "甘肃省金昌市金川区", + "Value": "620302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572111, + "Key": "甘肃省金昌市永昌县", + "Value": "620321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572112, + "Key": "甘肃省白银市", + "Value": "620400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572113, + "Key": "甘肃省白银市白银区", + "Value": "620402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789572114, + "Key": "甘肃省白银市平川区", + "Value": "620403" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576197, + "Key": "甘肃省白银市靖远县", + "Value": "620421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576198, + "Key": "甘肃省白银市会宁县", + "Value": "620422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576199, + "Key": "甘肃省白银市景泰县", + "Value": "620423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576200, + "Key": "甘肃省天水市", + "Value": "620500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576201, + "Key": "甘肃省天水市秦州区", + "Value": "620502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576202, + "Key": "甘肃省天水市麦积区", + "Value": "620503" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576203, + "Key": "甘肃省天水市清水县", + "Value": "620521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576204, + "Key": "甘肃省天水市秦安县", + "Value": "620522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576205, + "Key": "甘肃省天水市甘谷县", + "Value": "620523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576206, + "Key": "甘肃省天水市武山县", + "Value": "620524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576207, + "Key": "甘肃省天水市张家川回族自治县", + "Value": "620525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576208, + "Key": "甘肃省武威市", + "Value": "620600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576209, + "Key": "甘肃省武威市凉州区", + "Value": "620602" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576210, + "Key": "甘肃省武威市民勤县", + "Value": "620621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789576211, + "Key": "甘肃省武威市古浪县", + "Value": "620622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580293, + "Key": "甘肃省武威市天祝藏族自治县", + "Value": "620623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580294, + "Key": "甘肃省张掖市", + "Value": "620700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580295, + "Key": "甘肃省张掖市甘州区", + "Value": "620702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580296, + "Key": "甘肃省张掖市肃南裕固族自治县", + "Value": "620721" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580297, + "Key": "甘肃省张掖市民乐县", + "Value": "620722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580298, + "Key": "甘肃省张掖市临泽县", + "Value": "620723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580299, + "Key": "甘肃省张掖市高台县", + "Value": "620724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580300, + "Key": "甘肃省张掖市山丹县", + "Value": "620725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580301, + "Key": "甘肃省平凉市", + "Value": "620800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580302, + "Key": "甘肃省平凉市崆峒区", + "Value": "620802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580303, + "Key": "甘肃省平凉市泾川县", + "Value": "620821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580304, + "Key": "甘肃省平凉市灵台县", + "Value": "620822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580305, + "Key": "甘肃省平凉市崇信县", + "Value": "620823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789580306, + "Key": "甘肃省平凉市庄浪县", + "Value": "620825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584389, + "Key": "甘肃省平凉市静宁县", + "Value": "620826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584390, + "Key": "甘肃省平凉市华亭市", + "Value": "620881" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584391, + "Key": "甘肃省酒泉市", + "Value": "620900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584392, + "Key": "甘肃省酒泉市肃州区", + "Value": "620902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584393, + "Key": "甘肃省酒泉市金塔县", + "Value": "620921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584394, + "Key": "甘肃省酒泉市瓜州县", + "Value": "620922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584395, + "Key": "甘肃省酒泉市肃北蒙古族自治县", + "Value": "620923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584396, + "Key": "甘肃省酒泉市阿克塞哈萨克族自治县", + "Value": "620924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584397, + "Key": "甘肃省酒泉市玉门市", + "Value": "620981" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584398, + "Key": "甘肃省酒泉市敦煌市", + "Value": "620982" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584399, + "Key": "甘肃省庆阳市", + "Value": "621000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584400, + "Key": "甘肃省庆阳市西峰区", + "Value": "621002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584401, + "Key": "甘肃省庆阳市庆城县", + "Value": "621021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789584402, + "Key": "甘肃省庆阳市环县", + "Value": "621022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588485, + "Key": "甘肃省庆阳市华池县", + "Value": "621023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588486, + "Key": "甘肃省庆阳市合水县", + "Value": "621024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588487, + "Key": "甘肃省庆阳市正宁县", + "Value": "621025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588488, + "Key": "甘肃省庆阳市宁县", + "Value": "621026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588489, + "Key": "甘肃省庆阳市镇原县", + "Value": "621027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588490, + "Key": "甘肃省定西市", + "Value": "621100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588491, + "Key": "甘肃省定西市安定区", + "Value": "621102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588492, + "Key": "甘肃省定西市通渭县", + "Value": "621121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588493, + "Key": "甘肃省定西市陇西县", + "Value": "621122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588494, + "Key": "甘肃省定西市渭源县", + "Value": "621123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588495, + "Key": "甘肃省定西市临洮县", + "Value": "621124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588496, + "Key": "甘肃省定西市漳县", + "Value": "621125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588497, + "Key": "甘肃省定西市岷县", + "Value": "621126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789588498, + "Key": "甘肃省陇南市", + "Value": "621200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592581, + "Key": "甘肃省陇南市武都区", + "Value": "621202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592582, + "Key": "甘肃省陇南市成县", + "Value": "621221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592583, + "Key": "甘肃省陇南市文县", + "Value": "621222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592584, + "Key": "甘肃省陇南市宕昌县", + "Value": "621223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592585, + "Key": "甘肃省陇南市康县", + "Value": "621224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592586, + "Key": "甘肃省陇南市西和县", + "Value": "621225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592587, + "Key": "甘肃省陇南市礼县", + "Value": "621226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592588, + "Key": "甘肃省陇南市徽县", + "Value": "621227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592589, + "Key": "甘肃省陇南市两当县", + "Value": "621228" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592590, + "Key": "甘肃省临夏回族自治州", + "Value": "622900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592591, + "Key": "甘肃省临夏回族自治州临夏市", + "Value": "622901" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592592, + "Key": "甘肃省临夏回族自治州临夏县", + "Value": "622921" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592593, + "Key": "甘肃省临夏回族自治州康乐县", + "Value": "622922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592594, + "Key": "甘肃省临夏回族自治州永靖县", + "Value": "622923" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789592595, + "Key": "甘肃省临夏回族自治州广河县", + "Value": "622924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596677, + "Key": "甘肃省临夏回族自治州和政县", + "Value": "622925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596678, + "Key": "甘肃省临夏回族自治州东乡族自治县", + "Value": "622926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596679, + "Key": "甘肃省临夏回族自治州积石山保安族东乡族撒拉族自治县", + "Value": "622927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596680, + "Key": "甘肃省甘南藏族自治州", + "Value": "623000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596681, + "Key": "甘肃省甘南藏族自治州合作市", + "Value": "623001" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596682, + "Key": "甘肃省甘南藏族自治州临潭县", + "Value": "623021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596683, + "Key": "甘肃省甘南藏族自治州卓尼县", + "Value": "623022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596684, + "Key": "甘肃省甘南藏族自治州舟曲县", + "Value": "623023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596685, + "Key": "甘肃省甘南藏族自治州迭部县", + "Value": "623024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596686, + "Key": "甘肃省甘南藏族自治州玛曲县", + "Value": "623025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596687, + "Key": "甘肃省甘南藏族自治州碌曲县", + "Value": "623026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596688, + "Key": "甘肃省甘南藏族自治州夏河县", + "Value": "623027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596689, + "Key": "青海省", + "Value": "630000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789596690, + "Key": "青海省西宁市", + "Value": "630100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600773, + "Key": "青海省西宁市城东区", + "Value": "630102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600774, + "Key": "青海省西宁市城中区", + "Value": "630103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600775, + "Key": "青海省西宁市城西区", + "Value": "630104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600776, + "Key": "青海省西宁市城北区", + "Value": "630105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600777, + "Key": "青海省西宁市湟中区", + "Value": "630106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600778, + "Key": "青海省西宁市大通回族土族自治县", + "Value": "630121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600779, + "Key": "青海省西宁市湟源县", + "Value": "630123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600780, + "Key": "青海省海东市", + "Value": "630200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600781, + "Key": "青海省海东市乐都区", + "Value": "630202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600782, + "Key": "青海省海东市平安区", + "Value": "630203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600783, + "Key": "青海省海东市民和回族土族自治县", + "Value": "630222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600784, + "Key": "青海省海东市互助土族自治县", + "Value": "630223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789600785, + "Key": "青海省海东市化隆回族自治县", + "Value": "630224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604869, + "Key": "青海省海东市循化撒拉族自治县", + "Value": "630225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604870, + "Key": "青海省海北藏族自治州", + "Value": "632200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604871, + "Key": "青海省海北藏族自治州门源回族自治县", + "Value": "632221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604872, + "Key": "青海省海北藏族自治州祁连县", + "Value": "632222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604873, + "Key": "青海省海北藏族自治州海晏县", + "Value": "632223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604874, + "Key": "青海省海北藏族自治州刚察县", + "Value": "632224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604875, + "Key": "青海省黄南藏族自治州", + "Value": "632300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604876, + "Key": "青海省黄南藏族自治州同仁市", + "Value": "632301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604877, + "Key": "青海省黄南藏族自治州尖扎县", + "Value": "632322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604878, + "Key": "青海省黄南藏族自治州泽库县", + "Value": "632323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604879, + "Key": "青海省黄南藏族自治州河南蒙古族自治县", + "Value": "632324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604880, + "Key": "青海省海南藏族自治州", + "Value": "632500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789604881, + "Key": "青海省海南藏族自治州共和县", + "Value": "632521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608965, + "Key": "青海省海南藏族自治州同德县", + "Value": "632522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608966, + "Key": "青海省海南藏族自治州贵德县", + "Value": "632523" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608967, + "Key": "青海省海南藏族自治州兴海县", + "Value": "632524" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608968, + "Key": "青海省海南藏族自治州贵南县", + "Value": "632525" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608969, + "Key": "青海省果洛藏族自治州", + "Value": "632600" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608970, + "Key": "青海省果洛藏族自治州玛沁县", + "Value": "632621" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608971, + "Key": "青海省果洛藏族自治州班玛县", + "Value": "632622" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608972, + "Key": "青海省果洛藏族自治州甘德县", + "Value": "632623" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608973, + "Key": "青海省果洛藏族自治州达日县", + "Value": "632624" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608974, + "Key": "青海省果洛藏族自治州久治县", + "Value": "632625" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608975, + "Key": "青海省果洛藏族自治州玛多县", + "Value": "632626" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608976, + "Key": "青海省玉树藏族自治州", + "Value": "632700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608977, + "Key": "青海省玉树藏族自治州玉树市", + "Value": "632701" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789608978, + "Key": "青海省玉树藏族自治州杂多县", + "Value": "632722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613061, + "Key": "青海省玉树藏族自治州称多县", + "Value": "632723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613062, + "Key": "青海省玉树藏族自治州治多县", + "Value": "632724" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613063, + "Key": "青海省玉树藏族自治州囊谦县", + "Value": "632725" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613064, + "Key": "青海省玉树藏族自治州曲麻莱县", + "Value": "632726" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613065, + "Key": "青海省海西蒙古族藏族自治州", + "Value": "632800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613066, + "Key": "青海省海西蒙古族藏族自治州格尔木市", + "Value": "632801" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613067, + "Key": "青海省海西蒙古族藏族自治州德令哈市", + "Value": "632802" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613068, + "Key": "青海省海西蒙古族藏族自治州茫崖市", + "Value": "632803" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613069, + "Key": "青海省海西蒙古族藏族自治州乌兰县", + "Value": "632821" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613070, + "Key": "青海省海西蒙古族藏族自治州都兰县", + "Value": "632822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613071, + "Key": "青海省海西蒙古族藏族自治州天峻县", + "Value": "632823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613072, + "Key": "宁夏回族自治区", + "Value": "640000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789613073, + "Key": "宁夏回族自治区银川市", + "Value": "640100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617157, + "Key": "宁夏回族自治区银川市兴庆区", + "Value": "640104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617158, + "Key": "宁夏回族自治区银川市西夏区", + "Value": "640105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617159, + "Key": "宁夏回族自治区银川市金凤区", + "Value": "640106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617160, + "Key": "宁夏回族自治区银川市永宁县", + "Value": "640121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617161, + "Key": "宁夏回族自治区银川市贺兰县", + "Value": "640122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617162, + "Key": "宁夏回族自治区银川市灵武市", + "Value": "640181" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617163, + "Key": "宁夏回族自治区石嘴山市", + "Value": "640200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617164, + "Key": "宁夏回族自治区石嘴山市大武口区", + "Value": "640202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617165, + "Key": "宁夏回族自治区石嘴山市惠农区", + "Value": "640205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617166, + "Key": "宁夏回族自治区石嘴山市平罗县", + "Value": "640221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617167, + "Key": "宁夏回族自治区吴忠市", + "Value": "640300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617168, + "Key": "宁夏回族自治区吴忠市利通区", + "Value": "640302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617169, + "Key": "宁夏回族自治区吴忠市红寺堡区", + "Value": "640303" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789617170, + "Key": "宁夏回族自治区吴忠市盐池县", + "Value": "640323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621253, + "Key": "宁夏回族自治区吴忠市同心县", + "Value": "640324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621254, + "Key": "宁夏回族自治区吴忠市青铜峡市", + "Value": "640381" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621255, + "Key": "宁夏回族自治区固原市", + "Value": "640400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621256, + "Key": "宁夏回族自治区固原市原州区", + "Value": "640402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621257, + "Key": "宁夏回族自治区固原市西吉县", + "Value": "640422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621258, + "Key": "宁夏回族自治区固原市隆德县", + "Value": "640423" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621259, + "Key": "宁夏回族自治区固原市泾源县", + "Value": "640424" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621260, + "Key": "宁夏回族自治区固原市彭阳县", + "Value": "640425" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621261, + "Key": "宁夏回族自治区中卫市", + "Value": "640500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621262, + "Key": "宁夏回族自治区中卫市沙坡头区", + "Value": "640502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621263, + "Key": "宁夏回族自治区中卫市中宁县", + "Value": "640521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621264, + "Key": "宁夏回族自治区中卫市海原县", + "Value": "640522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621265, + "Key": "新疆维吾尔自治区", + "Value": "650000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789621266, + "Key": "新疆维吾尔自治区乌鲁木齐市", + "Value": "650100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625349, + "Key": "新疆维吾尔自治区乌鲁木齐市天山区", + "Value": "650102" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625350, + "Key": "新疆维吾尔自治区乌鲁木齐市沙依巴克区", + "Value": "650103" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625351, + "Key": "新疆维吾尔自治区乌鲁木齐市新市区", + "Value": "650104" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625352, + "Key": "新疆维吾尔自治区乌鲁木齐市水磨沟区", + "Value": "650105" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625353, + "Key": "新疆维吾尔自治区乌鲁木齐市头屯河区", + "Value": "650106" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625354, + "Key": "新疆维吾尔自治区乌鲁木齐市达坂城区", + "Value": "650107" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625355, + "Key": "新疆维吾尔自治区乌鲁木齐市米东区", + "Value": "650109" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625356, + "Key": "新疆维吾尔自治区乌鲁木齐市乌鲁木齐县", + "Value": "650121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625357, + "Key": "新疆维吾尔自治区克拉玛依市", + "Value": "650200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625358, + "Key": "新疆维吾尔自治区克拉玛依市独山子区", + "Value": "650202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625359, + "Key": "新疆维吾尔自治区克拉玛依市克拉玛依区", + "Value": "650203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625360, + "Key": "新疆维吾尔自治区克拉玛依市白碱滩区", + "Value": "650204" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625361, + "Key": "新疆维吾尔自治区克拉玛依市乌尔禾区", + "Value": "650205" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789625362, + "Key": "新疆维吾尔自治区吐鲁番市", + "Value": "650400" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629445, + "Key": "新疆维吾尔自治区吐鲁番市高昌区", + "Value": "650402" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629446, + "Key": "新疆维吾尔自治区吐鲁番市鄯善县", + "Value": "650421" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629447, + "Key": "新疆维吾尔自治区吐鲁番市托克逊县", + "Value": "650422" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629448, + "Key": "新疆维吾尔自治区哈密市", + "Value": "650500" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629449, + "Key": "新疆维吾尔自治区哈密市伊州区", + "Value": "650502" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629450, + "Key": "新疆维吾尔自治区哈密市巴里坤哈萨克自治县", + "Value": "650521" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629451, + "Key": "新疆维吾尔自治区哈密市伊吾县", + "Value": "650522" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629452, + "Key": "新疆维吾尔自治区昌吉回族自治州", + "Value": "652300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629453, + "Key": "新疆维吾尔自治区昌吉回族自治州昌吉市", + "Value": "652301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629454, + "Key": "新疆维吾尔自治区昌吉回族自治州阜康市", + "Value": "652302" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629455, + "Key": "新疆维吾尔自治区昌吉回族自治州呼图壁县", + "Value": "652323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629456, + "Key": "新疆维吾尔自治区昌吉回族自治州玛纳斯县", + "Value": "652324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629457, + "Key": "新疆维吾尔自治区昌吉回族自治州奇台县", + "Value": "652325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629458, + "Key": "新疆维吾尔自治区昌吉回族自治州吉木萨尔县", + "Value": "652327" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789629459, + "Key": "新疆维吾尔自治区昌吉回族自治州木垒哈萨克自治县", + "Value": "652328" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633541, + "Key": "新疆维吾尔自治区博尔塔拉蒙古自治州", + "Value": "652700" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633542, + "Key": "新疆维吾尔自治区博尔塔拉蒙古自治州博乐市", + "Value": "652701" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633543, + "Key": "新疆维吾尔自治区博尔塔拉蒙古自治州阿拉山口市", + "Value": "652702" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633544, + "Key": "新疆维吾尔自治区博尔塔拉蒙古自治州精河县", + "Value": "652722" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633545, + "Key": "新疆维吾尔自治区博尔塔拉蒙古自治州温泉县", + "Value": "652723" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633546, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州", + "Value": "652800" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633547, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州库尔勒市", + "Value": "652801" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633548, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州轮台县", + "Value": "652822" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633549, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州尉犁县", + "Value": "652823" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633550, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州若羌县", + "Value": "652824" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633551, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州且末县", + "Value": "652825" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633552, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州焉耆回族自治县", + "Value": "652826" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633553, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州和静县", + "Value": "652827" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789633554, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州和硕县", + "Value": "652828" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637637, + "Key": "新疆维吾尔自治区巴音郭楞蒙古自治州博湖县", + "Value": "652829" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637638, + "Key": "新疆维吾尔自治区阿克苏地区", + "Value": "652900" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637639, + "Key": "新疆维吾尔自治区阿克苏地区阿克苏市", + "Value": "652901" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637640, + "Key": "新疆维吾尔自治区阿克苏地区库车市", + "Value": "652902" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637641, + "Key": "新疆维吾尔自治区阿克苏地区温宿县", + "Value": "652922" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637642, + "Key": "新疆维吾尔自治区阿克苏地区沙雅县", + "Value": "652924" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637643, + "Key": "新疆维吾尔自治区阿克苏地区新和县", + "Value": "652925" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637644, + "Key": "新疆维吾尔自治区阿克苏地区拜城县", + "Value": "652926" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637645, + "Key": "新疆维吾尔自治区阿克苏地区乌什县", + "Value": "652927" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637646, + "Key": "新疆维吾尔自治区阿克苏地区阿瓦提县", + "Value": "652928" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637647, + "Key": "新疆维吾尔自治区阿克苏地区柯坪县", + "Value": "652929" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637648, + "Key": "新疆维吾尔自治区克孜勒苏柯尔克孜自治州", + "Value": "653000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637649, + "Key": "新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿图什市", + "Value": "653001" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789637650, + "Key": "新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿克陶县", + "Value": "653022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641733, + "Key": "新疆维吾尔自治区克孜勒苏柯尔克孜自治州阿合奇县", + "Value": "653023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641734, + "Key": "新疆维吾尔自治区克孜勒苏柯尔克孜自治州乌恰县", + "Value": "653024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641735, + "Key": "新疆维吾尔自治区喀什地区", + "Value": "653100" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641736, + "Key": "新疆维吾尔自治区喀什地区喀什市", + "Value": "653101" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641737, + "Key": "新疆维吾尔自治区喀什地区疏附县", + "Value": "653121" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641738, + "Key": "新疆维吾尔自治区喀什地区疏勒县", + "Value": "653122" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641739, + "Key": "新疆维吾尔自治区喀什地区英吉沙县", + "Value": "653123" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641740, + "Key": "新疆维吾尔自治区喀什地区泽普县", + "Value": "653124" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641741, + "Key": "新疆维吾尔自治区喀什地区莎车县", + "Value": "653125" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641742, + "Key": "新疆维吾尔自治区喀什地区叶城县", + "Value": "653126" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641743, + "Key": "新疆维吾尔自治区喀什地区麦盖提县", + "Value": "653127" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641744, + "Key": "新疆维吾尔自治区喀什地区岳普湖县", + "Value": "653128" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641745, + "Key": "新疆维吾尔自治区喀什地区伽师县", + "Value": "653129" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789641746, + "Key": "新疆维吾尔自治区喀什地区巴楚县", + "Value": "653130" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645829, + "Key": "新疆维吾尔自治区喀什地区塔什库尔干塔吉克自治县", + "Value": "653131" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645830, + "Key": "新疆维吾尔自治区和田地区", + "Value": "653200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645831, + "Key": "新疆维吾尔自治区和田地区和田市", + "Value": "653201" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645832, + "Key": "新疆维吾尔自治区和田地区和田县", + "Value": "653221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645833, + "Key": "新疆维吾尔自治区和田地区墨玉县", + "Value": "653222" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645834, + "Key": "新疆维吾尔自治区和田地区皮山县", + "Value": "653223" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645835, + "Key": "新疆维吾尔自治区和田地区洛浦县", + "Value": "653224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645836, + "Key": "新疆维吾尔自治区和田地区策勒县", + "Value": "653225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645837, + "Key": "新疆维吾尔自治区和田地区于田县", + "Value": "653226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645838, + "Key": "新疆维吾尔自治区和田地区民丰县", + "Value": "653227" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645839, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州", + "Value": "654000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645840, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州伊宁市", + "Value": "654002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645841, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州奎屯市", + "Value": "654003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645842, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州霍尔果斯市", + "Value": "654004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789645843, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州伊宁县", + "Value": "654021" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649925, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州察布查尔锡伯自治县", + "Value": "654022" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649926, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州霍城县", + "Value": "654023" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649927, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州巩留县", + "Value": "654024" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649928, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州新源县", + "Value": "654025" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649929, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州昭苏县", + "Value": "654026" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649930, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州特克斯县", + "Value": "654027" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649931, + "Key": "新疆维吾尔自治区伊犁哈萨克自治州尼勒克县", + "Value": "654028" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649932, + "Key": "新疆维吾尔自治区塔城地区", + "Value": "654200" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649933, + "Key": "新疆维吾尔自治区塔城地区塔城市", + "Value": "654201" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649934, + "Key": "新疆维吾尔自治区塔城地区乌苏市", + "Value": "654202" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649935, + "Key": "新疆维吾尔自治区塔城地区沙湾市", + "Value": "654203" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649936, + "Key": "新疆维吾尔自治区塔城地区额敏县", + "Value": "654221" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649937, + "Key": "新疆维吾尔自治区塔城地区托里县", + "Value": "654224" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789649938, + "Key": "新疆维吾尔自治区塔城地区裕民县", + "Value": "654225" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654021, + "Key": "新疆维吾尔自治区塔城地区和布克赛尔蒙古自治县", + "Value": "654226" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654022, + "Key": "新疆维吾尔自治区阿勒泰地区", + "Value": "654300" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654023, + "Key": "新疆维吾尔自治区阿勒泰地区阿勒泰市", + "Value": "654301" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654024, + "Key": "新疆维吾尔自治区阿勒泰地区布尔津县", + "Value": "654321" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654025, + "Key": "新疆维吾尔自治区阿勒泰地区富蕴县", + "Value": "654322" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654026, + "Key": "新疆维吾尔自治区阿勒泰地区福海县", + "Value": "654323" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654027, + "Key": "新疆维吾尔自治区阿勒泰地区哈巴河县", + "Value": "654324" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654028, + "Key": "新疆维吾尔自治区阿勒泰地区青河县", + "Value": "654325" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654029, + "Key": "新疆维吾尔自治区阿勒泰地区吉木乃县", + "Value": "654326" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654030, + "Key": "新疆维吾尔自治区石河子市", + "Value": "659001" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654031, + "Key": "新疆维吾尔自治区阿拉尔市", + "Value": "659002" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654032, + "Key": "新疆维吾尔自治区图木舒克市", + "Value": "659003" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654033, + "Key": "新疆维吾尔自治区五家渠市", + "Value": "659004" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654034, + "Key": "新疆维吾尔自治区北屯市", + "Value": "659005" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789654035, + "Key": "新疆维吾尔自治区铁门关市", + "Value": "659006" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658117, + "Key": "新疆维吾尔自治区双河市", + "Value": "659007" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658118, + "Key": "新疆维吾尔自治区可克达拉市", + "Value": "659008" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658119, + "Key": "新疆维吾尔自治区昆玉市", + "Value": "659009" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658120, + "Key": "新疆维吾尔自治区胡杨河市", + "Value": "659010" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658121, + "Key": "新疆维吾尔自治区新星市", + "Value": "659011" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658122, + "Key": "台湾省", + "Value": "710000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658123, + "Key": "香港特别行政区", + "Value": "810000" + }, + { + "CatalogId": 379794295185413, + "Id": 396423789658124, + "Key": "澳门特别行政区", + "Value": "820000" + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_Menu.json b/assets/seed-data/Sys_Menu.json new file mode 100644 index 00000000..5aa362e2 --- /dev/null +++ b/assets/seed-data/Sys_Menu.json @@ -0,0 +1,192 @@ +[ + { + "Component": "home", + "Icon": "el-icon-house", + "Id": 373837717815301, + "Name": "home", + "Path": "/home", + "Sort": 100, + "Title": "控制面板", + "Type": 1 + }, + { + "Component": "profile", + "Id": 374967228141573, + "Name": "profile", + "Path": "/profile", + "Sort": 100, + "Title": "账号信息", + "Hidden": true, + "Type": 1 + }, + { + "Icon": "el-icon-setting", + "Id": 373837917724677, + "Name": "sys", + "Path": "/sys", + "Sort": 99, + "Title": "系统管理", + "Type": 1 + }, + { + "Component": "sys/user", + "Icon": "el-icon-user", + "Id": 373837957840901, + "Name": "sys-user", + "ParentId": 373837917724677, + "Path": "/sys/user", + "Sort": 100, + "Title": "用户管理", + "Type": 1 + }, + { + "Component": "sys/role", + "Icon": "sc-icon-role", + "Id": 373838018527237, + "Name": "sys-role", + "ParentId": 373837917724677, + "Path": "/sys/role", + "Sort": 99, + "Title": "角色管理", + "Type": 1 + }, + { + "Component": "sys/dept", + "Icon": "sc-icon-dept", + "Id": 373838045605893, + "Name": "sys-dept", + "ParentId": 373837917724677, + "Path": "/sys/dept", + "Sort": 98, + "Title": "部门管理", + "Type": 1 + }, + { + "Component": "sys/menu", + "Icon": "el-icon-fold", + "Id": 373838070898693, + "Name": "sys-menu", + "ParentId": 373837917724677, + "Path": "/sys/menu", + "Sort": 96, + "Title": "菜单管理", + "Type": 1 + }, + { + "Component": "sys/log", + "Icon": "el-icon-tickets", + "Id": 374792687640581, + "Name": "sys-log", + "ParentId": 373837917724677, + "Path": "/sys/log", + "Sort": 93, + "Title": "请求日志", + "Type": 1 + }, + { + "Component": "sys/cache", + "Icon": "sc-icon-memory", + "Id": 374911555702789, + "Name": "sys-cache", + "ParentId": 373837917724677, + "Path": "/sys/cache", + "Sort": 94, + "Title": "缓存管理", + "Type": 1 + }, + { + "Component": "sys/dic", + "Icon": "sc-icon-dic", + "Id": 375315654221829, + "Name": "sys-dic", + "ParentId": 373837917724677, + "Path": "/sys/dic", + "Sort": 95, + "Title": "字典管理", + "Type": 1 + }, + { + "Component": "sys/config", + "Icon": "el-icon-set-up", + "Id": 380415005847557, + "Name": "sys-config", + "ParentId": 373837917724677, + "Path": "/sys/config", + "Sort": 92, + "Title": "系统设置", + "Type": 1 + }, + { + "Component": "sys/api", + "Icon": "sc-icon-api", + "Id": 397880678895621, + "Name": "sys-api", + "ParentId": 373837917724677, + "Path": "/sys/api", + "Sort": 96, + "Title": "接口管理", + "Type": 1 + }, + { + "Icon": "sc-icon-business", + "Id": 420881941635077, + "Name": "biz", + "Path": "/biz", + "Sort": 99, + "Title": "业务管理", + "Type": 1 + }, + { + "Component": "biz/product-category", + "Icon": "sc-icon-product-category", + "Id": 420881941635087, + "Name": "biz-product-category", + "ParentId": 420881941635077, + "Path": "/biz/product-category", + "Sort": 100, + "Title": "商品分类", + "Type": 1 + }, + { + "Component": "biz/member", + "Icon": "el-icon-user", + "Id": 422658027704337, + "Name": "biz-member", + "ParentId": 420881941635077, + "Path": "/biz/member", + "Sort": 100, + "Title": "会员管理", + "Type": 1 + }, + { + "Component": "biz/product", + "Icon": "sc-icon-product", + "Id": 421506245349391, + "Name": "biz-product", + "ParentId": 420881941635077, + "Path": "/biz/product", + "Sort": 100, + "Title": "商品管理", + "Type": 1 + }, + { + "Icon": "sc-icon-code", + "Id": 373838105399301, + "Name": "dev", + "Path": "/dev", + "Sort": 97, + "Title": "开发管理", + "Type": 1 + }, + { + "Component": "dev/code", + "Icon": "sc-icon-code2", + "Id": 373838147022853, + "Name": "dev-code", + "ParentId": 373838105399301, + "Path": "/dev/code", + "Sort": 100, + "Title": "代码生成", + "Type": 1 + }, +] \ No newline at end of file diff --git a/assets/seed-data/Sys_Role.json b/assets/seed-data/Sys_Role.json new file mode 100644 index 00000000..3fa98853 --- /dev/null +++ b/assets/seed-data/Sys_Role.json @@ -0,0 +1,18 @@ +[ + { + "DataScope": 1, + "Enabled": true, + "Id": 370943613149253, + "IgnorePermissionControl": true, + "DisplayDashboard": true, + "Name": "超级管理员", + "Sort": 100 + }, + { + "DataScope": 1, + "Enabled": true, + "Id": 371729946431493, + "Name": "普通用户", + "Sort": 100 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_RoleApi.json b/assets/seed-data/Sys_RoleApi.json new file mode 100644 index 00000000..d141e48c --- /dev/null +++ b/assets/seed-data/Sys_RoleApi.json @@ -0,0 +1,22 @@ +[ + { + "ApiId": "api/sys/menu/user.menus", + "RoleId": 371729946431493 + }, + { + "ApiId": "api/sys/user/user.info", + "RoleId": 371729946431493 + }, + { + "ApiId": "api/sys/menu", + "RoleId": 371729946431493 + }, + { + "ApiId": "api/sys/user", + "RoleId": 371729946431493 + }, + { + "ApiId": "api/biz/member/member.info", + "RoleId": 371729946431493 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_RoleMenu.json b/assets/seed-data/Sys_RoleMenu.json new file mode 100644 index 00000000..1d33ef9e --- /dev/null +++ b/assets/seed-data/Sys_RoleMenu.json @@ -0,0 +1,12 @@ +[ + { + "Id": 396423792566281, + "MenuId": 373837717815301, + "RoleId": 371729946431493 + }, + { + "Id": 396423792566282, + "MenuId": 374967228141573, + "RoleId": 371729946431493 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_User.json b/assets/seed-data/Sys_User.json new file mode 100644 index 00000000..a86d7889 --- /dev/null +++ b/assets/seed-data/Sys_User.json @@ -0,0 +1,10 @@ +[ + { + "DeptId": 372119301627909, + "Enabled": true, + "Id": 370942943322181, + "Password": "A8E87D23-49BC-25A1-1C7C-59186BEF5D15", + "Token": "A9AFD92E-A33D-4152-9A6C-A9C141D24887", + "UserName": "root" + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_UserProfile.json b/assets/seed-data/Sys_UserProfile.json new file mode 100644 index 00000000..fa8bc31b --- /dev/null +++ b/assets/seed-data/Sys_UserProfile.json @@ -0,0 +1,5 @@ +[ + { + "Id": 370942943322181 + } +] \ No newline at end of file diff --git a/assets/seed-data/Sys_UserRole.json b/assets/seed-data/Sys_UserRole.json new file mode 100644 index 00000000..5069b6c8 --- /dev/null +++ b/assets/seed-data/Sys_UserRole.json @@ -0,0 +1,6 @@ +[ + { + "RoleId": 370943613149253, + "UserId": 370942943322181 + } +] \ No newline at end of file diff --git a/dotnet-tools.json b/dotnet-tools.json new file mode 100644 index 00000000..e476009c --- /dev/null +++ b/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-t4": { + "version": "2.3.1", + "commands": [ + "t4" + ] + }, + "cake.tool": { + "version": "3.1.0", + "commands": [ + "dotnet-cake" + ] + }, + "dotnet-script": { + "version": "1.4.0", + "commands": [ + "dotnet-script" + ] + }, + "jetbrains.resharper.globaltools": { + "version": "2023.2.0", + "commands": [ + "jb" + ] + }, + "dnt": { + "version": "1.8.3", + "commands": [ + "dnt" + ] + } + } +} \ No newline at end of file diff --git a/global.json b/global.json new file mode 100644 index 00000000..89476433 --- /dev/null +++ b/global.json @@ -0,0 +1,10 @@ +{ + "sdk": { + "version": "7.0.0", + "rollForward": "latestMajor", + "allowPrerelease": true + }, + "tools": { + "dotnet": "7.0.0" + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..414cf903 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "devDependencies": { + "cz-conventional-changelog": "^3.3.0", + "prettier": "3.0.2", + "prettier-plugin-csharp": "0.6.0-development" + }, + "config": { + "commitizen": { + "path": "./node_modules/cz-conventional-changelog" + } + } +} \ No newline at end of file diff --git a/src/backend/GlobalUsings.cs b/src/backend/GlobalUsings.cs new file mode 100644 index 00000000..237e18fb --- /dev/null +++ b/src/backend/GlobalUsings.cs @@ -0,0 +1,69 @@ +// ReSharper disable RedundantUsingDirective.Global + +global using System; +global using System.Collections; +global using System.Collections.Generic; +global using System.Collections.Immutable; +global using System.ComponentModel; +global using System.ComponentModel.DataAnnotations; +global using System.Data; +global using System.Diagnostics; +global using System.Globalization; +global using System.IO; +global using System.Linq; +global using System.Linq.Expressions; +global using System.Net; +global using System.Reflection; +global using System.Text; +global using System.Text.Encodings.Web; +global using System.Text.Json; +global using System.Text.Json.Serialization; +global using System.Text.Json.Serialization.Metadata; +global using System.Text.RegularExpressions; +global using System.Threading.Tasks; +global using FreeSql; +global using FreeSql.Aop; +global using FreeSql.DataAnnotations; +global using FreeSql.Internal.Model; +global using Furion; +global using Furion.Authorization; +global using Furion.ConfigurableOptions; +global using Furion.DataEncryption; +global using Furion.DataValidation; +global using Furion.DependencyInjection; +global using Furion.DynamicApiController; +global using Furion.EventBus; +global using Furion.SpecificationDocument; +global using Furion.UnifyResult; +global using Mapster; +global using Microsoft.AspNetCore.Authorization; +global using Microsoft.AspNetCore.Builder; +global using Microsoft.AspNetCore.Diagnostics; +global using Microsoft.AspNetCore.Http; +global using Microsoft.AspNetCore.Mvc; +global using Microsoft.AspNetCore.Mvc.ActionConstraints; +global using Microsoft.AspNetCore.Mvc.Controllers; +global using Microsoft.AspNetCore.Mvc.Filters; +global using Microsoft.AspNetCore.Mvc.Infrastructure; +global using Microsoft.Extensions.Caching.Distributed; +global using Microsoft.Extensions.Caching.Memory; +global using Microsoft.Extensions.DependencyInjection; +global using Microsoft.Extensions.Hosting; +global using Microsoft.Extensions.Logging; +global using Microsoft.Extensions.Options; +global using NetAdmin.Infrastructure; +global using NetAdmin.Infrastructure.Attributes; +global using NetAdmin.Infrastructure.Configuration.Options; +global using NetAdmin.Infrastructure.Configuration.Options.SubNodes.Redis; +global using NetAdmin.Infrastructure.Configuration.Options.SubNodes.Upload; +global using NetAdmin.Infrastructure.Constant; +global using NetAdmin.Infrastructure.Enums; +global using NetAdmin.Infrastructure.Exceptions; +global using NetAdmin.Infrastructure.Exceptions.InvalidInput; +global using NetAdmin.Infrastructure.Exceptions.InvalidOperation; +global using NetAdmin.Infrastructure.Exceptions.Unexpected; +global using NetAdmin.Infrastructure.Extensions; +global using NetAdmin.Infrastructure.Languages; +global using NetAdmin.Infrastructure.Utils; +global using NSExt.Attributes; +global using NSExt.Extensions; \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Modules/ICrudModule.cs b/src/backend/NetAdmin.Application/Modules/ICrudModule.cs new file mode 100644 index 00000000..f093de83 --- /dev/null +++ b/src/backend/NetAdmin.Application/Modules/ICrudModule.cs @@ -0,0 +1,64 @@ +using NetAdmin.Domain; +using NetAdmin.Domain.Dto.Dependency; + +namespace NetAdmin.Application.Modules; + +/// +/// 增删改查模块接口 +/// +/// 创建请求类型 +/// 创建响应类型 +/// 查询请求类型 +/// 查询响应类型 +/// 修改请求类型 +/// 修改响应类型 +/// 删除请求类型 +public interface ICrudModule + where TCreateReq : DataAbstraction, new() + where TCreateRsp : DataAbstraction + where TQueryReq : DataAbstraction, new() + where TQueryRsp : DataAbstraction + where TUpdateReq : DataAbstraction, new() + where TUpdateRsp : DataAbstraction + where TDelReq : DataAbstraction, new() +{ + /// + /// 批量删除实体 + /// + Task BulkDeleteAsync(BulkReq req); + + /// + /// 创建实体 + /// + Task CreateAsync(TCreateReq req); + + /// + /// 删除实体 + /// + Task DeleteAsync(TDelReq req); + + /// + /// 判断实体是否存在 + /// + Task ExistAsync(QueryReq req); + + /// + /// 获取单个实体 + /// + Task GetAsync(TQueryReq req); + + /// + /// 分页查询实体 + /// + Task> PagedQueryAsync(PagedQueryReq req); + + /// + /// 查询实体 + /// + Task> QueryAsync(QueryReq req); + + /// + /// 更新实体 + /// + Task UpdateAsync(TUpdateReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/NetAdmin.Application.csproj b/src/backend/NetAdmin.Application/NetAdmin.Application.csproj new file mode 100644 index 00000000..9f0908f5 --- /dev/null +++ b/src/backend/NetAdmin.Application/NetAdmin.Application.csproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Repositories/IRepository.cs b/src/backend/NetAdmin.Application/Repositories/IRepository.cs new file mode 100644 index 00000000..e0da9fd2 --- /dev/null +++ b/src/backend/NetAdmin.Application/Repositories/IRepository.cs @@ -0,0 +1,39 @@ +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Application.Repositories; + +/// +/// 基础仓储接口 +/// +public interface IRepository : IBaseRepository + where TEntity : EntityBase +{ + /// + /// 当前上下文关联的用户 + /// + ContextUserToken UserToken { get; } + + /// + /// 递归删除 + /// + /// exp + /// 禁用全局过滤器名 + Task DeleteRecursiveAsync(Expression> exp, params string[] disableGlobalFilterNames); + + /// + /// 获得Dto + /// + /// 主键 + Task GetAsync(long id); + + /// + /// 根据条件获取Dto + /// + Task GetAsync(Expression> exp); + + /// + /// 根据条件获取实体 + /// + Task GetAsync(Expression> exp); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Repositories/Repository.cs b/src/backend/NetAdmin.Application/Repositories/Repository.cs new file mode 100644 index 00000000..85b3d444 --- /dev/null +++ b/src/backend/NetAdmin.Application/Repositories/Repository.cs @@ -0,0 +1,82 @@ +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Application.Repositories; + +/// +public sealed class Repository : DefaultRepository, IRepository + where TEntity : EntityBase +{ + /// + /// Initializes a new instance of the class. + /// + public Repository(IFreeSql fSql, UnitOfWorkManager uowManger, ContextUserToken userToken) // + : base(fSql, uowManger) + { + UserToken = userToken; + } + + /// + /// 当前上下文关联的用户 + /// + public ContextUserToken UserToken { get; } + + /// + /// 递归删除 + /// + /// exp + /// 禁用全局过滤器名 + public async Task DeleteRecursiveAsync( // + Expression> exp, params string[] disableGlobalFilterNames) + { + _ = await Select.Where(exp) + .DisableGlobalFilter(disableGlobalFilterNames) + .AsTreeCte() + .ToDelete() + .ExecuteAffrowsAsync(); + + return true; + } + + /// + /// 获得Dto + /// + /// 主键 + public Task GetAsync(long id) + { + return Select.WhereDynamic(id).ToOneAsync(); + } + + /// + /// 根据条件获取Dto + /// + public Task GetAsync(Expression> exp) + { + return Select.Where(exp).ToOneAsync(); + } + + /// + /// 根据条件获取实体 + /// + public Task GetAsync(Expression> exp) + { + return Select.Where(exp).ToOneAsync(); + } + + /// + /// 获取分页列表 + /// + /// 动态过滤器 + /// 页码 + /// 页容量 + /// 分页列表和总条数 + public async Task<(IEnumerable List, long Total)> GetPagedListAsync( + DynamicFilterInfo dynamicFilterInfo, int page, int pageSize) + { + var list = await Select.WhereDynamicFilter(dynamicFilterInfo) + .Count(out var total) + .Page(page, pageSize) + .ToListAsync(); + return (list, total); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Services/IService.cs b/src/backend/NetAdmin.Application/Services/IService.cs new file mode 100644 index 00000000..7453be44 --- /dev/null +++ b/src/backend/NetAdmin.Application/Services/IService.cs @@ -0,0 +1,19 @@ +using NetAdmin.Domain.Contexts; + +namespace NetAdmin.Application.Services; + +/// +/// 服务接口 +/// +public interface IService +{ + /// + /// 服务编号 + /// + Guid ServiceId { get; set; } + + /// + /// 上下文用户 + /// + ContextUserToken UserToken { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Services/RepositoryService.cs b/src/backend/NetAdmin.Application/Services/RepositoryService.cs new file mode 100644 index 00000000..11c313d3 --- /dev/null +++ b/src/backend/NetAdmin.Application/Services/RepositoryService.cs @@ -0,0 +1,34 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Application.Services; + +/// +/// 仓储服务基类 +/// +/// 实体类型 +/// 日志类型 +public abstract class RepositoryService : ServiceBase + where TEntity : EntityBase +{ + /// + /// Initializes a new instance of the class. + /// + protected RepositoryService(Repository rpo) // + { + Rpo = rpo; + } + + /// + /// 默认仓储 + /// + protected Repository Rpo { get; } + + /// + /// 启用级联保存 + /// + protected bool EnableCascadeSave { + get => Rpo.DbContextOptions.EnableCascadeSave; + set => Rpo.DbContextOptions.EnableCascadeSave = value; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Application/Services/ServiceBase.cs b/src/backend/NetAdmin.Application/Services/ServiceBase.cs new file mode 100644 index 00000000..476adfd9 --- /dev/null +++ b/src/backend/NetAdmin.Application/Services/ServiceBase.cs @@ -0,0 +1,45 @@ +using NetAdmin.Domain.Contexts; + +namespace NetAdmin.Application.Services; + +/// +public abstract class ServiceBase : ServiceBase +{ + /// + /// Initializes a new instance of the class. + /// + protected ServiceBase() // + { + Logger = App.GetService>(); + } + + /// + /// 日志记录器 + /// + protected ILogger Logger { get; } +} + +/// +/// 服务基类 +/// +public abstract class ServiceBase : IScoped, IService +{ + /// + /// Initializes a new instance of the class. + /// + protected ServiceBase() + { + UserToken = App.GetService(); + ServiceId = Guid.NewGuid(); + } + + /// + /// 服务编号 + /// + public Guid ServiceId { get; set; } + + /// + /// 上下文用户 + /// + public ContextUserToken UserToken { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Application/NetAdmin.BizServer.Application.csproj b/src/backend/NetAdmin.BizServer.Application/NetAdmin.BizServer.Application.csproj new file mode 100644 index 00000000..d66eacec --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Application/NetAdmin.BizServer.Application.csproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Cache/NetAdmin.BizServer.Cache.csproj b/src/backend/NetAdmin.BizServer.Cache/NetAdmin.BizServer.Cache.csproj new file mode 100644 index 00000000..1c307fc1 --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Cache/NetAdmin.BizServer.Cache.csproj @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs b/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..979b7096 --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,39 @@ +using NetAdmin.BizServer.Host.Filters; +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.Enums.Sys; +using NetAdmin.Host.Extensions; + +namespace NetAdmin.BizServer.Host.Extensions; + +/// +/// ServiceCollection 扩展方法 +/// +[SuppressSniffer] +public static class ServiceCollectionExtensions +{ + /// + /// 注册FreeSql + /// + public static IServiceCollection AddFreeSql(this IServiceCollection me) + { + _ = me.AddFreeSql( // + FreeSqlInitOptions.SyncStructure | FreeSqlInitOptions.InsertSeedData, freeSql => { + // 数据权限过滤器 + _ = freeSql.GlobalFilter.ApplyOnlyIf( // + Chars.FLG_GLOBAL_FILTER_DATA + , () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.Self) ?? false + , a => a.OwnerId == ContextUserInfo.Create().Id); + }); + return me; + } + + /// + /// jwt授权处理器 + /// + public static IServiceCollection AddJwt(this IServiceCollection me) + { + _ = me.AddJwt(enableGlobalAuthorize: true); + return me; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/Filters/JwtHandler.cs b/src/backend/NetAdmin.BizServer.Host/Filters/JwtHandler.cs new file mode 100644 index 00000000..6b74d59f --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/Filters/JwtHandler.cs @@ -0,0 +1,48 @@ +using NetAdmin.Domain.Contexts; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.BizServer.Host.Filters; + +/// +[SuppressSniffer] +public sealed class JwtHandler : AppAuthorizeHandler +{ + /// + /// Initializes a new instance of the class. + /// + public JwtHandler() { } + + /// + /// 验证管道 + /// + public override async Task PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext) + { + // 无法从token中获取context user,拒绝访问 + if (App.GetService() == null) { + return false; + } + + // 数据库不存在context user,或用户已被禁用,拒绝访问 + var userInfo = await App.GetService().UserInfoAsync(); + if (userInfo?.Roles == null) { + return false; + } + + httpContext.Items.Add(Chars.FLG_CONTEXT_USER_INFO, userInfo); + + var path = httpContext.Request.Path.Value!.TrimStart('/'); + foreach (var role in userInfo.Roles) { + // 忽略权限控制,直接通过 + if (role.IgnorePermissionControl) { + return true; + } + + // 获取所属角色接口权限 进行核对 + if (role.ApiIds?.Contains(path) ?? false) { + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj b/src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj new file mode 100644 index 00000000..cff7f53a --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/NetAdmin.BizServer.Host.csproj @@ -0,0 +1,15 @@ + + + + + + + + + + + + PreserveNewest + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json b/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json new file mode 100644 index 00000000..6794562a --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/Properties/launchSettings.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "NetAdmin.BizServer.Host": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "http://localhost:65010", + "applicationUrl": "http://[::]:65010", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/Startup.cs b/src/backend/NetAdmin.BizServer.Host/Startup.cs new file mode 100644 index 00000000..cb304232 --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/Startup.cs @@ -0,0 +1,67 @@ +using NetAdmin.BizServer.Host.Extensions; +using NetAdmin.Host.Extensions; +using NetAdmin.Host.Middlewares; +using Prometheus; + +namespace NetAdmin.BizServer.Host; + +/// +/// 启动类 +/// +public sealed class Startup : NetAdmin.Host.Startup +{ + /// + /// 程序入口 + /// + public static void Main(string[] args) + { + ShowBanner(); + _ = Serve.Run(RunOptions.Default.WithArgs(args)); + } + + /// + /// 配置应用程序中间件 + /// + public void Configure(IApplicationBuilder app) + { + _ = app // + .UseRealIp() // 获取真实IP + .EnableBuffering() // 启用 Body 重读 + .UseMiddleware() // 请求审计 + #if DEBUG + .UseOpenApiSkin() // Swagger皮肤 + #endif + .UseInject(string.Empty) // / Furion脚手架 + .UseUnifyResultStatusCodes() // 状态码拦截 + .UseCorsAccessor() // 跨域访问 + .UseRouting() // 路由映射 + .UseHttpMetrics() // 性能监控 + .UseAuthentication() // / 认证 + .UseAuthorization() // 授权 + .UseMiddleware() // 删除json空节点 + .UseEndpoints(); // 执行匹配的端点 + } + + /// + /// 配置服务容器 + /// + public void ConfigureServices(IServiceCollection services) + { + _ = services.AddConsoleFormatter() // 控制台日志模板 + .AddAllOptions() // 注册配置项 + .AddJwt() // Jwt 授权处理器 + .AddSnowflake() // 雪花编号生成器 + .AddEventBus() // 事件总线 + .AddFreeSql() // freeSql + .AddRemoteRequest() // 注册远程请求 + .AddCorsAccessor() // 支持跨域访问 + .AddContextUser() // 上下文用户 + .AddRedisCache() // Redis缓存 + + // IMvcBuilder + .AddControllers() // 注册控制器 + .AddJsonSerializer(true) // json序列化配置 + .AddDefaultApiResultHandler() // Api结果处理器 + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/settings.Development.json b/src/backend/NetAdmin.BizServer.Host/settings.Development.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/settings.Development.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/settings.Test.json b/src/backend/NetAdmin.BizServer.Host/settings.Test.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/settings.Test.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Host/settings.json b/src/backend/NetAdmin.BizServer.Host/settings.json new file mode 100644 index 00000000..1da5c252 --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Host/settings.json @@ -0,0 +1,47 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + "SpecificationDocumentSettings": { + "GroupOpenApiInfos": [ + { + "Group": "Sys", + "Title": "系统组件", + "Description": "NetAdmin - 系统组件", + }, + { + "Group": "Biz", + "Title": "业务服务", + "Description": "NetAdmin - 业务服务", + }, + { + "Group": "Tpl", + "Title": "示例服务", + "Description": "NetAdmin - 示例服务", + "Visible": false + }, + { + "Group": "Health", + "Visible": false + } + ], + "SecurityDefinitions": [ + { + "Id": "Bearer", + "Type": "ApiKey", + "Name": "Authorization", + "Description": "JWT Authorization header using the Bearer scheme.", + "BearerFormat": "JWT", + "Scheme": "bearer", + "In": "Header", + "Requirement": { + "Scheme": { + "Reference": { + "Id": "Bearer", + "Type": "SecurityScheme" + }, + "Accesses": [] + } + } + } + ] + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Tests/NetAdmin.BizServer.Tests.csproj b/src/backend/NetAdmin.BizServer.Tests/NetAdmin.BizServer.Tests.csproj new file mode 100644 index 00000000..974ab32d --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Tests/NetAdmin.BizServer.Tests.csproj @@ -0,0 +1,21 @@ + + + true + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.BizServer.Tests/UsedNumberTests.cs b/src/backend/NetAdmin.BizServer.Tests/UsedNumberTests.cs new file mode 100644 index 00000000..88b63515 --- /dev/null +++ b/src/backend/NetAdmin.BizServer.Tests/UsedNumberTests.cs @@ -0,0 +1,18 @@ +using Xunit; + +namespace NetAdmin.BizServer.Tests; + +/// +/// UsedNumberTests +/// +public class UsedNumberTests +{ + /// + /// Test1 + /// + [Fact] + public void Test1() + { + // Assert.True("1".Int32() == 2); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Cache/CacheBase.cs b/src/backend/NetAdmin.Cache/CacheBase.cs new file mode 100644 index 00000000..67b87c14 --- /dev/null +++ b/src/backend/NetAdmin.Cache/CacheBase.cs @@ -0,0 +1,29 @@ +using NetAdmin.Application.Services; + +namespace NetAdmin.Cache; + +/// +/// 缓存基类 +/// +public abstract class CacheBase : ICache + where TService : IService +{ + /// + /// Initializes a new instance of the class. + /// + protected CacheBase(TCacheContainer cache, TService service) + { + Cache = cache; + Service = service; + } + + /// + /// 缓存对象 + /// + public TCacheContainer Cache { get; } + + /// + /// 关联的服务 + /// + public TService Service { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Cache/DistributedCache.cs b/src/backend/NetAdmin.Cache/DistributedCache.cs new file mode 100644 index 00000000..f8d20b93 --- /dev/null +++ b/src/backend/NetAdmin.Cache/DistributedCache.cs @@ -0,0 +1,95 @@ +using System.Runtime.CompilerServices; +using NetAdmin.Application.Services; + +namespace NetAdmin.Cache; + +/// +/// 分布式缓存 +/// +public abstract class DistributedCache : CacheBase + where TService : IService +{ + /// + /// Initializes a new instance of the class. + /// + protected DistributedCache(IDistributedCache cache, TService service) // + : base(cache, service) { } + + /// + /// 创建缓存 + /// + /// 缓存键 + /// 创建对象 + /// 绝对过期时间 + /// 滑动过期时间 + /// 缓存对象类型 + /// 缓存对象 + protected Task CreateAsync(string key, T createObj, TimeSpan? absLifeTime = null, TimeSpan? slideLifeTime = null) + { + var cacheWrite = createObj.ToJson(); + + var options = new DistributedCacheEntryOptions(); + if (absLifeTime != null) { + _ = options.SetAbsoluteExpiration(absLifeTime.Value); + } + + if (slideLifeTime != null) { + _ = options.SetSlidingExpiration(slideLifeTime.Value); + } + + return Cache.SetAsync(key, cacheWrite.Hex(), options); + } + + /// + /// 获取缓存 + /// + protected async Task GetAsync(string key) + { + var cacheRead = await Cache.GetStringAsync(key); + return cacheRead != null ? cacheRead.ToObject() : default; + } + + /// + /// 获取缓存键 + /// + protected virtual string GetCacheKey(string id = "0", [CallerMemberName] string memberName = null) + { + return $"{GetType().FullName}.{memberName}.{id}"; + } + + /// + /// 获取或创建缓存 + /// + /// 缓存键 + /// 创建函数 + /// 绝对过期时间 + /// 滑动过期时间 + /// 缓存对象类型 + /// 缓存对象 + protected async Task GetOrCreateAsync(string key, Func> createProc, TimeSpan? absLifeTime = null + , TimeSpan? slideLifeTime = null) + { + var cacheRead = await GetAsync(key); + if (cacheRead is not null) { + return cacheRead; + } + + var obj = await createProc.Invoke(); + + var cacheWrite = obj?.ToJson(); + if (cacheWrite == null) { + return obj; + } + + await CreateAsync(key, obj, absLifeTime, slideLifeTime); + return obj; + } + + /// + /// 删除缓存 + /// + protected Task RemoveAsync(string key) + { + return Cache.RemoveAsync(key); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Cache/ICache.cs b/src/backend/NetAdmin.Cache/ICache.cs new file mode 100644 index 00000000..092f8efd --- /dev/null +++ b/src/backend/NetAdmin.Cache/ICache.cs @@ -0,0 +1,20 @@ +using NetAdmin.Application.Services; + +namespace NetAdmin.Cache; + +/// +/// 缓存接口 +/// +public interface ICache + where TService : IService +{ + /// + /// 缓存对象 + /// + TCacheLoad Cache { get; } + + /// + /// 关联的服务 + /// + public TService Service { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Cache/MemoryCache.cs b/src/backend/NetAdmin.Cache/MemoryCache.cs new file mode 100644 index 00000000..a2c3cf95 --- /dev/null +++ b/src/backend/NetAdmin.Cache/MemoryCache.cs @@ -0,0 +1,16 @@ +using NetAdmin.Application.Services; + +namespace NetAdmin.Cache; + +/// +/// 内存缓存 +/// +public abstract class MemoryCache : CacheBase + where TService : IService +{ + /// + /// Initializes a new instance of the class. + /// + protected MemoryCache(IMemoryCache cache, TService service) // + : base(cache, service) { } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Cache/NetAdmin.Cache.csproj b/src/backend/NetAdmin.Cache/NetAdmin.Cache.csproj new file mode 100644 index 00000000..1124ffb6 --- /dev/null +++ b/src/backend/NetAdmin.Cache/NetAdmin.Cache.csproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/AlipayAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/AlipayAttribute.cs new file mode 100644 index 00000000..47b7dfef --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/AlipayAttribute.cs @@ -0,0 +1,23 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 支付宝验证器(手机或邮箱) +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class AlipayAttribute : ValidationAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public AlipayAttribute() + { + ErrorMessageResourceName = nameof(Ln.支付宝账号); + ErrorMessageResourceType = typeof(Ln); + } + + /// + public override bool IsValid(object value) + { + return new MobileAttribute().IsValid(value) || new EmailAddressAttribute().IsValid(value); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CertificateAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CertificateAttribute.cs new file mode 100644 index 00000000..95eec345 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CertificateAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 证件号码 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class CertificateAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public CertificateAttribute() // + : base(Chars.RGX_CERTIFICATE) + { + ErrorMessageResourceName = nameof(Ln.无效证件号码); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs new file mode 100644 index 00000000..8e5e9652 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/ChineseNameAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 中文姓名 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class ChineseNameAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public ChineseNameAttribute() // + : base(Chars.RGX_CHINESE_NAME) + { + ErrorMessageResourceName = nameof(Ln.中文姓名); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CulturePhoneAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CulturePhoneAttribute.cs new file mode 100644 index 00000000..c866505e --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CulturePhoneAttribute.cs @@ -0,0 +1,23 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 电话验证器(手机或固话) +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class CulturePhoneAttribute : ValidationAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public CulturePhoneAttribute() + { + ErrorMessageResourceName = nameof(Ln.手机号码或座机号码); + ErrorMessageResourceType = typeof(Ln); + } + + /// + public override bool IsValid(object value) + { + return new MobileAttribute().IsValid(value) || new TelephoneAttribute().IsValid(value); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRangeAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRangeAttribute.cs new file mode 100644 index 00000000..0069dcd3 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRangeAttribute.cs @@ -0,0 +1,26 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 区间验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class CultureRangeAttribute : RangeAttribute +{ + /// + public CultureRangeAttribute(double minimum, double maximum) // + : base(minimum, maximum) { } + + /// + public CultureRangeAttribute(int minimum, int maximum) // + : base(minimum, maximum) { } + + /// + public CultureRangeAttribute(Type type, string minimum, string maximum) // + : base(type, minimum, maximum) { } + + /// + public override string FormatErrorMessage(string name) + { + return $"{ErrorMessageString} {Ln.必须介于} {Minimum} - {Maximum}"; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRequiredAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRequiredAttribute.cs new file mode 100644 index 00000000..44fd7c6f --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureRequiredAttribute.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 非空验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class CultureRequiredAttribute : RequiredAttribute +{ + /// Applies formatting to an error message, based on the data field where the error occurred. + /// The name to include in the formatted message. + /// The current attribute is malformed. + /// An instance of the formatted error message. + public override string FormatErrorMessage(string name) + { + return $"{ErrorMessageString.NullOrEmpty(name)} {Ln.不能为空}"; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureUrlAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureUrlAttribute.cs new file mode 100644 index 00000000..8658c418 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/CultureUrlAttribute.cs @@ -0,0 +1,21 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// Url验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class CultureUrlAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public CultureUrlAttribute() // + : base(Chars.RGX_URL) + { + ErrorMessageResourceName = nameof(Ln.无效网络地址); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs new file mode 100644 index 00000000..6717b8f6 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/EmailAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 邮箱验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class EmailAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public EmailAttribute() // + : base(Chars.RGX_EMAIL) + { + ErrorMessageResourceName = nameof(Ln.电子邮箱); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/InviteCodeAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/InviteCodeAttribute.cs new file mode 100644 index 00000000..a55a02ec --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/InviteCodeAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 邀请码验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class InviteCodeAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public InviteCodeAttribute() // + : base(Chars.RGX_INVITE_CODE) + { + ErrorMessageResourceName = nameof(Ln.邀请码不正确); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs new file mode 100644 index 00000000..f37e34bf --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/MobileAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 手机号验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class MobileAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public MobileAttribute() // + : base(Chars.RGX_MOBILE) + { + ErrorMessageResourceName = nameof(Ln.手机号码); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/PasswordAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/PasswordAttribute.cs new file mode 100644 index 00000000..0ff71759 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/PasswordAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 密码验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class PasswordAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public PasswordAttribute() // + : base(Chars.RGX_PASSWORD) + { + ErrorMessageResourceName = nameof(Ln._8位以上数字字母组合); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/PayPasswordAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/PayPasswordAttribute.cs new file mode 100644 index 00000000..f97f1c5c --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/PayPasswordAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 交易密码验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class PayPasswordAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public PayPasswordAttribute() // + : base(Chars.RGX_PAY_PASSWORD) + { + ErrorMessageResourceName = nameof(Ln._6位数字); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/RegexAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/RegexAttribute.cs new file mode 100644 index 00000000..f4eeb44d --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/RegexAttribute.cs @@ -0,0 +1,16 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 正则表达式验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +#pragma warning disable DesignedForInheritance +public class RegexAttribute : RegularExpressionAttribute + #pragma warning restore DesignedForInheritance +{ + /// + /// Initializes a new instance of the class. + /// + protected RegexAttribute(string pattern) // + : base(pattern) { } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/SpecificDeptAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/SpecificDeptAttribute.cs new file mode 100644 index 00000000..b3bd1cbd --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/SpecificDeptAttribute.cs @@ -0,0 +1,27 @@ +using NetAdmin.Domain.Dto.Sys.Role; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 数据范围为特定部门的验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class SpecificDeptAttribute : ValidationAttribute +{ + /// + protected override ValidationResult IsValid(object value, ValidationContext validationContext) + { + if (validationContext.ObjectInstance is not CreateRoleReq { DataScope: DataScopes.SpecificDept }) { + return ValidationResult.Success; + } + #pragma warning disable IDE0046 + + if ((value as IEnumerable)?.Any() ?? false) { + #pragma warning restore IDE0046 + return ValidationResult.Success; + } + + return new ValidationResult(Ln.未指定部门); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/TelephoneAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/TelephoneAttribute.cs new file mode 100644 index 00000000..c521e97a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/TelephoneAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 固定电话验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class TelephoneAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public TelephoneAttribute() // + : base(Chars.RGX_TELEPHONE) + { + ErrorMessageResourceName = nameof(Ln.区号电话号码分机号); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/UserNameAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/UserNameAttribute.cs new file mode 100644 index 00000000..a97ed3da --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/UserNameAttribute.cs @@ -0,0 +1,34 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 用户名验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class UserNameAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public UserNameAttribute() // + : base(Chars.RGX_USERNAME) + { + ErrorMessageResourceType = typeof(Ln); + } + + /// + public override bool IsValid(object value) + { + if (!base.IsValid(value)) { + ErrorMessageResourceName = nameof(Ln.用户名长度4位以上); + return false; + } + + if (!new MobileAttribute().IsValid(value)) { + return true; + } + + // 不能是手机号 + ErrorMessageResourceName = nameof(Ln.用户名不能是手机号); + return false; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/DataValidation/VerifyCodeAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/DataValidation/VerifyCodeAttribute.cs new file mode 100644 index 00000000..07cdf1c1 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/DataValidation/VerifyCodeAttribute.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Domain.Attributes.DataValidation; + +/// +/// 验证码验证器 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Parameter)] +public sealed class VerifyCodeAttribute : RegexAttribute +{ + /// + /// Initializes a new instance of the class. + /// + public VerifyCodeAttribute() // + : base(Chars.RGX_VERIFY_CODE) + { + ErrorMessageResourceName = nameof(Ln.验证码不正确); + ErrorMessageResourceType = typeof(Ln); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/ServerTimeAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/ServerTimeAttribute.cs new file mode 100644 index 00000000..47d195bf --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/ServerTimeAttribute.cs @@ -0,0 +1,7 @@ +namespace NetAdmin.Domain.Attributes; + +/// +/// 标记一个字段启用服务器时间 +/// +[AttributeUsage(AttributeTargets.Property)] +public sealed class ServerTimeAttribute : Attribute { } \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Attributes/SnowflakeAttribute.cs b/src/backend/NetAdmin.Domain/Attributes/SnowflakeAttribute.cs new file mode 100644 index 00000000..3c652389 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Attributes/SnowflakeAttribute.cs @@ -0,0 +1,12 @@ +// ReSharper disable AutoPropertyCanBeMadeGetOnly.Global + +namespace NetAdmin.Domain.Attributes; + +/// +/// 标记一个字段启用雪花编号生成 +/// +[AttributeUsage(AttributeTargets.Property)] +public sealed class SnowflakeAttribute : Attribute +{ + // +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Contexts/ContextApp.cs b/src/backend/NetAdmin.Domain/Contexts/ContextApp.cs new file mode 100644 index 00000000..836fa40b --- /dev/null +++ b/src/backend/NetAdmin.Domain/Contexts/ContextApp.cs @@ -0,0 +1,113 @@ +namespace NetAdmin.Domain.Contexts; + +/// +/// 上下文应用信息 +/// +/// +/// 签名算法: $"${appId}{appSecret.ToLowerInvariant()}{timestamp}{reqBody}".Md5(Encoding.UTF8); +/// reqBody 需去除\r、\n、whitespace +/// +public sealed record ContextApp : DataAbstraction, IValidatableObject +{ + private const int _TS_OFFSET_SCOPE_SEC = 30; + + /// + /// Initializes a new instance of the class. + /// + public ContextApp(long appId, string appSecret, long timestamp) + { + AppId = appId; + AppSecret = appSecret; + Timestamp = timestamp; + } + + /// + /// Initializes a new instance of the class. + /// + private ContextApp() + { + AppId = App.HttpContext.Request.Headers[nameof(AppId)].FirstOrDefault().Int64Try(0); + AppSecret = App.HttpContext.Request.Headers[nameof(AppSecret)].FirstOrDefault(); + Sign = App.HttpContext.Request.Headers[nameof(Sign)].FirstOrDefault(); + Timestamp = App.HttpContext.Request.Headers[nameof(Timestamp)].FirstOrDefault().Int64Try(0); + } + + /// + /// AppId + /// + [Range(1, long.MaxValue)] + public long AppId { get; init; } + + /// + /// AppSecret + /// + public string AppSecret { get; init; } + + /// + /// 签名 + /// + public string Sign { get; set; } + + /// + /// 时间戳 + /// + public long Timestamp { get; set; } + + /// + /// 从HttpContext 创建上下文应用 + /// + public static async Task CreateAsync() + { + var ret = new ContextApp(); + if (!ret.TryValidate().IsValid) { + return null; + } + + // 具有secret的情况下,自动生成时间戳+sign,方便调试 + if (!ret.AppSecret.NullOrEmpty()) { + ret.Timestamp = DateTime.Now.TimeUnixUtc(); + ret.Sign = await ret.BuildSignFromHttpContextAsync(); + } + + return ret; + } + + /// + /// 构建签名 + /// + public string BuildSign(string reqBody) + { + // 去除\r\n和空格再计算签名,规避风格样式问题 + reqBody = reqBody.Replace("\r", string.Empty).Replace("\n", string.Empty).Replace(" ", string.Empty); + return $"{AppId}{AppSecret.ToLowerInvariant()}{Timestamp}{reqBody}".Md5(Encoding.UTF8); + } + + /// + /// 构建签名(从http上下文) + /// + public async Task BuildSignFromHttpContextAsync() + { + var sr = new StreamReader(App.HttpContext.Request.Body); + var reqBody = await sr.ReadToEndAsync(); + + _ = App.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin); + return BuildSign(reqBody); + } + + /// + public IEnumerable Validate(ValidationContext validationContext) + { + if (!AppSecret.NullOrEmpty()) { + yield break; + } + + // 没有密码, 就要签名+时间戳 + if (Sign.NullOrEmpty()) { + yield return new ValidationResult(Ln.签名缺失, new[] { nameof(Sign) }); + } + + if (Math.Abs(DateTime.Now.TimeUnixUtc() - Timestamp) > _TS_OFFSET_SCOPE_SEC) { + yield return new ValidationResult(Ln.时间戳缺失或误差过大, new[] { nameof(Timestamp) }); + } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Contexts/ContextUserInfo.cs b/src/backend/NetAdmin.Domain/Contexts/ContextUserInfo.cs new file mode 100644 index 00000000..481e2133 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Contexts/ContextUserInfo.cs @@ -0,0 +1,26 @@ +using NetAdmin.Domain.Dto.Sys.User; + +namespace NetAdmin.Domain.Contexts; + +/// +/// 上下文用户信息 +/// +public sealed record ContextUserInfo : QueryUserRsp +{ + /// + /// 从HttpContext 创建上下文用户信息 + /// + public static ContextUserInfo Create() + { + var ret = App.HttpContext?.Items[nameof(Chars.FLG_CONTEXT_USER_INFO)] as QueryUserRsp; + return ret?.Adapt(); + } + + /// + /// 是否存在于 HttpContext + /// + public static bool HasInContext() + { + return App.HttpContext?.Items.ContainsKey(Chars.FLG_CONTEXT_USER_INFO) ?? false; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Contexts/ContextUserToken.cs b/src/backend/NetAdmin.Domain/Contexts/ContextUserToken.cs new file mode 100644 index 00000000..b768f7c7 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Contexts/ContextUserToken.cs @@ -0,0 +1,41 @@ +using NetAdmin.Domain.Dto.Sys.User; + +namespace NetAdmin.Domain.Contexts; + +/// +/// 上下文用户凭据 +/// +public sealed record ContextUserToken : DataAbstraction +{ + /// + /// 用户编号 + /// + public long Id { get; set; } + + /// + /// 做授权验证的Token,全局唯一,可以随时重置(强制下线) + /// + public Guid Token { get; init; } + + /// + /// 用户名 + /// + public string UserName { get; init; } + + /// + /// 从HttpContext 创建上下文用户 + /// + public static ContextUserToken Create() + { + var claim = App.User?.FindFirst(nameof(ContextUserToken)); + return claim?.Value.ToObject(); + } + + /// + /// 从 QueryUserRsp 创建上下文用户 + /// + public static ContextUserToken Create(QueryUserRsp user) + { + return new ContextUserToken { Id = user.Id, Token = user.Token, UserName = user.UserName }; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DataAbstraction.cs b/src/backend/NetAdmin.Domain/DataAbstraction.cs new file mode 100644 index 00000000..498be2a0 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DataAbstraction.cs @@ -0,0 +1,36 @@ +namespace NetAdmin.Domain; + +/// +/// 数据基类 +/// +public abstract record DataAbstraction +{ + /// + public override string ToString() + { + return this.ToJson(); + } + + /// + /// 截断所有字符串属性 以符合[MaxLength(x)]特性 + /// + public void TruncateStrings() + { + foreach (var property in GetType() + .GetProperties(BindingFlags.Public | BindingFlags.Instance) + .Where(x => x.PropertyType == typeof(string))) { + var maxLen = property.GetCustomAttribute(true)?.Length; + if (maxLen is null or 0) { + continue; + } + + var value = property.GetValue(this); + if (value is not string s || s.Length < maxLen) { + continue; + } + + s = s.Sub(0, maxLen.Value); + property.SetValue(this, s); + } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/EntityBase.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/EntityBase.cs new file mode 100644 index 00000000..db6af365 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/EntityBase.cs @@ -0,0 +1,6 @@ +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 数据库实体基类 +/// +public abstract record EntityBase : DataAbstraction; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedClient.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedClient.cs new file mode 100644 index 00000000..3f3687e4 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedClient.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 创建者客户端字段接口 +/// +public interface IFieldCreatedClient +{ + /// + /// 创建者客户端IP + /// + int? CreatedClientIp { get; init; } + + /// + /// 创建者来源地址 + /// + string CreatedReferer { get; init; } + + /// + /// 创建者客户端用户代理 + /// + string CreatedUserAgent { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedTime.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedTime.cs new file mode 100644 index 00000000..e2e2336c --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedTime.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 创建时间字段接口 +/// +public interface IFieldCreatedTime +{ + /// + /// 创建时间 + /// + DateTime CreatedTime { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedUser.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedUser.cs new file mode 100644 index 00000000..4591804c --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldCreatedUser.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 创建用户字段接口 +/// +public interface IFieldCreatedUser +{ + /// + /// 创建者编号 + /// + long? CreatedUserId { get; init; } + + /// + /// 创建者用户名 + /// + string CreatedUserName { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldEnabled.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldEnabled.cs new file mode 100644 index 00000000..a537d5cb --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldEnabled.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 启用字段接口 +/// +public interface IFieldEnabled +{ + /// + /// 是否启用 + /// + bool Enabled { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedClient.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedClient.cs new file mode 100644 index 00000000..f95d2c25 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedClient.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 修改客户端字段接口 +/// +public interface IFieldModifiedClient +{ + /// + /// 客户端IP + /// + int ModifiedClientIp { get; init; } + + /// + /// 客户端用户代理 + /// + string ModifiedUserAgent { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedTime.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedTime.cs new file mode 100644 index 00000000..50f55804 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedTime.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 修改时间字段接口 +/// +public interface IFieldModifiedTime +{ + /// + /// 修改时间 + /// + DateTime? ModifiedTime { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedUser.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedUser.cs new file mode 100644 index 00000000..b5fce03d --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldModifiedUser.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 更新用户字段接口 +/// +public interface IFieldModifiedUser +{ + /// + /// 修改者编号 + /// + long? ModifiedUserId { get; init; } + + /// + /// 修改者用户名 + /// + string ModifiedUserName { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldOwner.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldOwner.cs new file mode 100644 index 00000000..91b45072 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldOwner.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 拥有者字段接口 +/// +public interface IFieldOwner +{ + /// + /// 拥有者部门编号 + /// + long? OwnerDeptId { get; init; } + + /// + /// 拥有者用户编号 + /// + long? OwnerId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldPrimary.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldPrimary.cs new file mode 100644 index 00000000..20172a99 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldPrimary.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 主键字段接口 +/// +public interface IFieldPrimary +{ + /// + /// 唯一编码 + /// + T Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSort.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSort.cs new file mode 100644 index 00000000..620cc0fa --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSort.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 排序字段接口 +/// +public interface IFieldSort +{ + /// + /// 排序值,越大越前 + /// + long Sort { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs new file mode 100644 index 00000000..bd93c673 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldSummary.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 描述字段接口 +/// +public interface IFieldSummary +{ + /// + /// 描述 + /// + string Summary { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldVersion.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldVersion.cs new file mode 100644 index 00000000..56d7d54b --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/Fields/IFieldVersion.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.DbMaps.Dependency.Fields; + +/// +/// 版本字段接口 +/// +public interface IFieldVersion +{ + /// + /// 数据版本 + /// + long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs new file mode 100644 index 00000000..c18883b8 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/ImmutableEntity.cs @@ -0,0 +1,44 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 不可变实体 +/// +public abstract record ImmutableEntity : ImmutableEntity +{ + /// + /// 唯一编码 + /// + [Snowflake] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override long Id { get; init; } +} + +/// +/// 不可变实体 +/// +/// +public abstract record ImmutableEntity : LiteImmutableEntity, IFieldCreatedUser +{ + /// + /// 创建者编号 + /// + [JsonIgnore] + [Column(CanUpdate = false, Position = -1)] + public long? CreatedUserId { get; init; } + + /// + /// 创建者用户名 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanUpdate = false, Position = -1)] + public virtual string CreatedUserName { get; set; } + + /// + /// 唯一编码 + /// + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override T Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteImmutableEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteImmutableEntity.cs new file mode 100644 index 00000000..af30950f --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteImmutableEntity.cs @@ -0,0 +1,38 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 轻型不可变实体 +/// +public abstract record LiteImmutableEntity : LiteImmutableEntity +{ + /// + /// 唯一编码 + /// + [Snowflake] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override long Id { get; init; } +} + +/// +/// 轻型不可变实体 +/// +/// +public abstract record LiteImmutableEntity : EntityBase, IFieldPrimary, IFieldCreatedTime +{ + /// + /// 创建时间 + /// + [JsonIgnore] + [Column(ServerTime = DateTimeKind.Utc, CanUpdate = false, Position = -1)] + public virtual DateTime CreatedTime { get; init; } + + /// + /// 唯一编码 + /// + [JsonIgnore] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public virtual T Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteMutableEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteMutableEntity.cs new file mode 100644 index 00000000..7b7e7e93 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteMutableEntity.cs @@ -0,0 +1,36 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 轻型可变实体 +/// +public abstract record LiteMutableEntity : LiteMutableEntity +{ + /// + /// 唯一编码 + /// + [Snowflake] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override long Id { get; init; } +} + +/// +/// 轻型可变实体 +/// +public abstract record LiteMutableEntity : LiteImmutableEntity, IFieldModifiedTime +{ + /// + /// 唯一编码 + /// + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override T Id { get; init; } + + /// + /// 修改时间 + /// + [JsonIgnore] + [Column(ServerTime = DateTimeKind.Utc, CanInsert = false, Position = -1)] + public virtual DateTime? ModifiedTime { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteVersionEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteVersionEntity.cs new file mode 100644 index 00000000..10495ca0 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/LiteVersionEntity.cs @@ -0,0 +1,36 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 乐观锁轻型可变实体 +/// +public abstract record LiteVersionEntity : LiteVersionEntity +{ + /// + /// 唯一编码 + /// + [Snowflake] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override long Id { get; init; } +} + +/// +/// 乐观锁轻型可变实体 +/// +public abstract record LiteVersionEntity : LiteMutableEntity, IFieldVersion +{ + /// + /// 唯一编码 + /// + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override T Id { get; init; } + + /// + /// 数据版本 + /// + [JsonIgnore] + [Column(IsVersion = true, Position = -1)] + public virtual long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/MutableEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/MutableEntity.cs new file mode 100644 index 00000000..16ce7f87 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/MutableEntity.cs @@ -0,0 +1,43 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 可变实体 +/// +public abstract record MutableEntity : MutableEntity +{ + /// + /// 唯一编码 + /// + [Snowflake] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override long Id { get; init; } +} + +/// +/// 可变实体 +/// +public abstract record MutableEntity : LiteMutableEntity, IFieldModifiedUser +{ + /// + /// 唯一编码 + /// + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override T Id { get; init; } + + /// + /// 修改者编号 + /// + [JsonIgnore] + [Column(CanInsert = false, Position = -1)] + public long? ModifiedUserId { get; init; } + + /// + /// 修改者用户名 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)] + public string ModifiedUserName { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/SimpleEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/SimpleEntity.cs new file mode 100644 index 00000000..71bf2c1e --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/SimpleEntity.cs @@ -0,0 +1,6 @@ +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 简单实体 +/// +public abstract record SimpleEntity : EntityBase; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Dependency/VersionEntity.cs b/src/backend/NetAdmin.Domain/DbMaps/Dependency/VersionEntity.cs new file mode 100644 index 00000000..5d658533 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Dependency/VersionEntity.cs @@ -0,0 +1,43 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Dependency; + +/// +/// 乐观锁可变实体 +/// +public abstract record VersionEntity : VersionEntity +{ + /// + /// 唯一编码 + /// + [Snowflake] + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override long Id { get; init; } +} + +/// +/// 乐观锁可变实体 +/// +public abstract record VersionEntity : LiteVersionEntity, IFieldModifiedUser +{ + /// + /// 唯一编码 + /// + [Column(IsIdentity = false, IsPrimary = true, Position = 1)] + public override T Id { get; init; } + + /// + /// 修改者编号 + /// + [JsonIgnore] + [Column(CanInsert = false, Position = -1)] + public long? ModifiedUserId { get; init; } + + /// + /// 修改者用户名 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31, CanInsert = false, Position = -1)] + public string ModifiedUserName { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs new file mode 100644 index 00000000..7b66da95 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Api.cs @@ -0,0 +1,67 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// Api接口表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Api))] +public record Sys_Api : ImmutableEntity, IFieldSummary +{ + /// + /// 子节点 + /// + [JsonIgnore] + [Navigate(nameof(ParentId))] + public IEnumerable Children { get; init; } + + /// + /// 唯一编码 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127, IsIdentity = false, IsPrimary = true, Position = 1)] + public override string Id { get; init; } + + /// + /// 请求方式 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)] + public virtual string Method { get; init; } + + /// + /// 服务名称 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Name { get; init; } + + /// + /// 命名空间 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Namespace { get; init; } + + /// + /// 父编号 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string ParentId { get; init; } + + /// + /// 角色集合 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_RoleApi))] + public ICollection Roles { get; init; } + + /// + /// 服务描述 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Summary { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs new file mode 100644 index 00000000..73a89a8c --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Config.cs @@ -0,0 +1,53 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 配置表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Config))] +public record Sys_Config : VersionEntity, IFieldEnabled +{ + /// + /// 是否启用 + /// + [JsonIgnore] + [Column] + public virtual bool Enabled { get; init; } + + /// + /// 用户注册是否需要人工确认 + /// + [JsonIgnore] + [Column] + public virtual bool UserRegisterConfirm { get; set; } + + /// + /// 用户注册默认部门 + /// + [JsonIgnore] + [Navigate(nameof(UserRegisterDeptId))] + public Sys_Dept UserRegisterDept { get; init; } + + /// + /// 用户注册默认部门编号 + /// + [JsonIgnore] + [Column] + public virtual long UserRegisterDeptId { get; init; } + + /// + /// 用户注册默认角色 + /// + [JsonIgnore] + [Navigate(nameof(UserRegisterRoleId))] + public Sys_Role UserRegisterRole { get; init; } + + /// + /// 用户注册默认角色编号 + /// + [JsonIgnore] + [Column] + public virtual long UserRegisterRoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs new file mode 100644 index 00000000..634c888a --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Dept.cs @@ -0,0 +1,60 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 部门表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Dept))] +public record Sys_Dept : VersionEntity, IFieldEnabled, IFieldSummary, IFieldSort +{ + /// + /// 子节点 + /// + [JsonIgnore] + [Navigate(nameof(ParentId))] + public IEnumerable Children { get; init; } + + /// + /// 是否启用 + /// + [JsonIgnore] + [Column] + public virtual bool Enabled { get; init; } + + /// + /// 部门名称 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Name { get; init; } + + /// + /// 父编号 + /// + [JsonIgnore] + [Column] + public virtual long ParentId { get; init; } + + /// + /// 角色集合 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_RoleDept))] + public ICollection Roles { get; init; } + + /// + /// 排序值,越大越前 + /// + [JsonIgnore] + [Column] + public virtual long Sort { get; init; } + + /// + /// 部门描述 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + public virtual string Summary { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs new file mode 100644 index 00000000..ee326b1d --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicCatalog.cs @@ -0,0 +1,46 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 字典目录表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_DicCatalog))] +[Index($"idx_{{tablename}}_{nameof(Code)}", nameof(Code), true)] +public record Sys_DicCatalog : VersionEntity +{ + /// + /// 子节点 + /// + [JsonIgnore] + [Navigate(nameof(ParentId))] + public IEnumerable Children { get; init; } + + /// + /// 字典编码 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Code { get; init; } + + /// + /// 字典内容集合 + /// + [JsonIgnore] + [Navigate(nameof(Sys_DicContent.CatalogId))] + public ICollection Contents { get; init; } + + /// + /// 字典名称 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Name { get; init; } + + /// + /// 父编号 + /// + [JsonIgnore] + [Column] + public virtual long ParentId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs new file mode 100644 index 00000000..bfc0a2aa --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_DicContent.cs @@ -0,0 +1,40 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 字典内容表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_DicContent))] +[Index($"idx_{{tablename}}_{nameof(CatalogId)}_{nameof(Key)}", $"{nameof(CatalogId)},{nameof(Key)}", true)] +[Index($"idx_{{tablename}}_{nameof(CatalogId)}_{nameof(Value)}", $"{nameof(CatalogId)},{nameof(Value)}", true)] +public record Sys_DicContent : VersionEntity +{ + /// + /// 字典目录 + /// + [JsonIgnore] + [Navigate(nameof(CatalogId))] + public Sys_DicCatalog Catalog { get; init; } + + /// + /// 字典目录编号 + /// + [JsonIgnore] + [Column] + public virtual long CatalogId { get; init; } + + /// + /// 键名称 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Key { get; init; } + + /// + /// 键值 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + public virtual string Value { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs new file mode 100644 index 00000000..a85073b7 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Menu.cs @@ -0,0 +1,132 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 菜单表 +/// +[Table(Name = "Sys_Menu")] +[Index($"idx_{{tablename}}_{nameof(Name)}", nameof(Name), true)] +public record Sys_Menu : VersionEntity, IFieldSort +{ + /// + /// 子节点或详情页需要高亮的上级菜单路由地址 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string Active { get; init; } + + /// + /// 子节点 + /// + [JsonIgnore] + [Navigate(nameof(ParentId))] + public IEnumerable Children { get; init; } + + /// + /// 背景颜色 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_7)] + public virtual string Color { get; init; } + + /// + /// 组件 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Component { get; init; } + + /// + /// 是否整页路由 + /// + [JsonIgnore] + [Column] + public virtual bool FullPageRouting { get; init; } + + /// + /// 是否隐藏菜单 + /// + [JsonIgnore] + [Column] + public virtual bool Hidden { get; init; } + + /// + /// 是否隐藏面包屑 + /// + [JsonIgnore] + [Column] + public virtual bool HiddenBreadCrumb { get; init; } + + /// + /// 图标 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Icon { get; init; } + + /// + /// 菜单名称 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Name { get; init; } + + /// + /// 父编号 + /// + [JsonIgnore] + [Column] + public virtual long ParentId { get; init; } + + /// + /// 菜单路径 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string Path { get; init; } + + /// + /// 重定向地址 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string Redirect { get; init; } + + /// + /// 拥有此菜单的角色集合 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_RoleMenu))] + public ICollection Roles { get; init; } + + /// + /// 排序值,越大越前 + /// + [JsonIgnore] + [Column] + public virtual long Sort { get; init; } + + /// + /// 标签 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Tag { get; init; } + + /// + /// 菜单标题 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Title { get; init; } + + /// + /// 菜单类型 + /// + [JsonIgnore] + [Column] + public virtual MenuTypes Type { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs new file mode 100644 index 00000000..52dca8ac --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RequestLog.cs @@ -0,0 +1,151 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 请求日志表 +/// +[Table(Name = "Sys_RequestLog")] +public record Sys_RequestLog : ImmutableEntity, IFieldCreatedClient +{ + /// + /// 接口 + /// + [JsonIgnore] + [Navigate(nameof(ApiId))] + public Sys_Api Api { get; init; } + + /// + /// 接口编号 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + [JsonIgnore] + public virtual string ApiId { get; init; } + + /// + /// 创建者客户端IP + /// + [Column(Position = -1)] + [JsonIgnore] + public virtual int? CreatedClientIp { get; init; } + + /// + /// 创建者来源地址 + /// + [Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public string CreatedReferer { get; init; } + + /// + /// 创建者客户端用户代理 + /// + [Column(Position = -1, DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string CreatedUserAgent { get; init; } + + /// + /// 执行耗时(微秒) + /// + [Column] + [JsonIgnore] + public virtual long Duration { get; init; } + + /// + /// 程序响应码 + /// + [Column] + [JsonIgnore] + public virtual ErrorCodes ErrorCode { get; init; } + + /// + /// 异常信息 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string Exception { get; init; } + + /// + /// 附加数据 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string ExtraData { get; init; } + + /// + /// HTTP状态码 + /// + [Column] + [JsonIgnore] + public virtual int HttpStatusCode { get; init; } + + /// + /// 请求方法 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)] + [JsonIgnore] + public virtual string Method { get; init; } + + /// + /// 来源地址 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string ReferUrl { get; init; } + + /// + /// 请求内容 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string RequestBody { get; init; } + + /// + /// 请求content-type + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + [JsonIgnore] + public virtual string RequestContentType { get; init; } + + /// + /// 请求头信息 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string RequestHeaders { get; init; } + + /// + /// 请求地址 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + [JsonIgnore] + public virtual string RequestUrl { get; init; } + + /// + /// 响应内容 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string ResponseBody { get; init; } + + /// + /// 响应content-type + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + [JsonIgnore] + public virtual string ResponseContentType { get; init; } + + /// + /// 响应头 + /// + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + [JsonIgnore] + public virtual string ResponseHeaders { get; init; } + + /// + /// 服务器IP + /// + [Column] + [JsonIgnore] + public virtual int? ServerIp { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs new file mode 100644 index 00000000..e2f700e4 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_Role.cs @@ -0,0 +1,115 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.Dto.Sys.Role; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 角色表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_Role))] +[Index("idx_{tablename}_01", nameof(Name), true)] +public record Sys_Role : VersionEntity, IFieldSort, IFieldEnabled, IFieldSummary, IRegister +{ + /// + /// 角色-接口映射 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_RoleApi))] + public ICollection Apis { get; init; } + + /// + /// 数据范围 + /// + [JsonIgnore] + [Column] + public virtual DataScopes DataScope { get; init; } + + /// + /// 角色-部门映射 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_RoleDept))] + public ICollection Depts { get; init; } + + /// + /// 是否显示仪表板 + /// + [JsonIgnore] + [Column] + public virtual bool DisplayDashboard { get; init; } + + /// + /// 是否启用 + /// + [JsonIgnore] + [Column] + public virtual bool Enabled { get; init; } + + /// + /// 是否忽略权限控制 + /// + [JsonIgnore] + [Column] + public virtual bool IgnorePermissionControl { get; init; } + + /// + /// 角色-菜单映射 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_RoleMenu))] + public ICollection Menus { get; init; } + + /// + /// 角色名称 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Name { get; init; } + + /// + /// 排序值,越大越前 + /// + [JsonIgnore] + [Column] + public virtual long Sort { get; init; } + + /// + /// 备注 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + public virtual string Summary { get; init; } + + /// + /// 此角色下的用户集合 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_UserRole))] + public ICollection Users { get; init; } + + /// + public void Register(TypeAdapterConfig config) + { + _ = config.ForType() + .Map( // + d => d.Depts + , s => s.DeptIds.NullOrEmpty() + ? Array.Empty() + : s.DeptIds.Select(x => new Sys_Dept { Id = x })) + .Map( // + d => d.Menus + , s => s.MenuIds.NullOrEmpty() + ? Array.Empty() + : s.MenuIds.Select(x => new Sys_Menu { Id = x })) + .Map( // + d => d.Apis + , s => s.ApiIds.NullOrEmpty() + ? Array.Empty() + : s.ApiIds.Select(x => new Sys_Api { Id = x })) + + // + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs new file mode 100644 index 00000000..5582acdc --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleApi.cs @@ -0,0 +1,36 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 角色-接口映射表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RoleApi))] +public sealed record Sys_RoleApi : ImmutableEntity +{ + /// + /// 关联的接口 + /// + [JsonIgnore] + public Sys_Api Api { get; init; } + + /// + /// 接口编号 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public string ApiId { get; init; } + + /// + /// 关联的角色 + /// + [JsonIgnore] + public Sys_Role Role { get; init; } + + /// + /// 角色编号 + /// + [JsonIgnore] + [Column] + public long RoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs new file mode 100644 index 00000000..2bfa7681 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleDept.cs @@ -0,0 +1,37 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 角色-部门映射表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RoleDept))] +[Index($"idx_{{tablename}}_{nameof(RoleId)}_{nameof(DeptId)}", $"{nameof(RoleId)},{nameof(DeptId)}", true)] +public sealed record Sys_RoleDept : ImmutableEntity +{ + /// + /// 关联的部门 + /// + [JsonIgnore] + public Sys_Dept Dept { get; init; } + + /// + /// 可访问的部门编号 + /// + [JsonIgnore] + [Column] + public long DeptId { get; init; } + + /// + /// 关联的角色 + /// + [JsonIgnore] + public Sys_Role Role { get; init; } + + /// + /// 角色编号 + /// + [JsonIgnore] + [Column] + public long RoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs new file mode 100644 index 00000000..8e90d6ad --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_RoleMenu.cs @@ -0,0 +1,37 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 角色-菜单映射表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_RoleMenu))] +[Index($"idx_{{tablename}}_{nameof(RoleId)}_{nameof(MenuId)}", $"{nameof(RoleId)},{nameof(MenuId)}", true)] +public record Sys_RoleMenu : ImmutableEntity +{ + /// + /// 关联的菜单 + /// + [JsonIgnore] + public Sys_Menu Menu { get; init; } + + /// + /// 菜单编号 + /// + [JsonIgnore] + [Column] + public virtual long MenuId { get; init; } + + /// + /// 关联的角色 + /// + [JsonIgnore] + public Sys_Role Role { get; init; } + + /// + /// 角色编号 + /// + [JsonIgnore] + [Column] + public virtual long RoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs new file mode 100644 index 00000000..ab0af16e --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_User.cs @@ -0,0 +1,120 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.Dto.Sys.User; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 用户基本信息表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_User))] +[Index($"idx_{{tablename}}_{nameof(UserName)}", nameof(UserName), true)] +[Index($"idx_{{tablename}}_{nameof(Mobile)}", nameof(Mobile), true)] +[Index($"idx_{{tablename}}_{nameof(Email)}", nameof(Email), true)] +public record Sys_User : VersionEntity, IFieldSummary, IFieldEnabled, IRegister +{ + /// + /// 头像链接 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string Avatar { get; init; } + + /// + /// 所属部门 + /// + [JsonIgnore] + [Navigate(nameof(DeptId))] + public Sys_Dept Dept { get; init; } + + /// + /// 部门编号 + /// + [JsonIgnore] + [Column] + public virtual long DeptId { get; init; } + + /// + /// 邮箱 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string Email { get; init; } + + /// + /// 是否启用 + /// + [JsonIgnore] + [Column] + public virtual bool Enabled { get; init; } + + /// + /// 手机号 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)] + public virtual string Mobile { get; init; } + + /// + /// 密码 + /// + [JsonIgnore] + [Column] + public Guid Password { get; set; } + + /// + /// 用户档案 + /// + [JsonIgnore] + public Sys_UserProfile Profile { get; init; } + + /// + /// 所属角色 + /// + [JsonIgnore] + [Navigate(ManyToMany = typeof(Sys_UserRole))] + public ICollection Roles { get; init; } + + /// + /// 描述 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + public virtual string Summary { get; init; } + + /// + /// 授权验证Token,全局唯一,可以随时重置(强制下线) + /// + [JsonIgnore] + [Column] + public Guid Token { get; init; } + + /// + /// 用户名 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string UserName { get; init; } + + /// + public void Register(TypeAdapterConfig config) + { + _ = config.ForType() + .Map(d => d.Password, s => s.PasswordText.Pwd().Guid()) + .Map(d => d.Token, _ => Guid.NewGuid()) + .Map( // + d => d.Roles + , s => s.RoleIds.NullOrEmpty() + ? Array.Empty() + : s.RoleIds.Select(x => new Sys_Role { Id = x })); + + _ = config.ForType() + .Map( // + d => d.Password, s => s.PasswordText.NullOrEmpty() ? Guid.Empty : s.PasswordText.Pwd().Guid()) + .Map( // + d => d.Roles + , s => s.RoleIds.NullOrEmpty() + ? Array.Empty() + : s.RoleIds.Select(x => new Sys_Role { Id = x })); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs new file mode 100644 index 00000000..35e67df8 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserProfile.cs @@ -0,0 +1,198 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.Dto.Sys.UserProfile; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 用户档案表 +/// +[Table(Name = "Sys_UserProfile")] +public record Sys_UserProfile : VersionEntity, IRegister +{ + /// + /// 出生日期 + /// + [JsonIgnore] + [Column] + public virtual DateTime? BornDate { get; init; } + + /// + /// 证件号码 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string CertificateNumber { get; init; } + + /// + /// 证件类型 + /// + [JsonIgnore] + [Column] + public virtual CertificateTypes? CertificateType { get; init; } + + /// + /// 工作地址 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string CompanyAddress { get; init; } + + /// + /// 工作地区 + /// + [JsonIgnore] + [Column] + public int? CompanyArea { get; init; } + + /// + /// 工作单位 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string CompanyName { get; init; } + + /// + /// 工作电话 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string CompanyTelephone { get; init; } + + /// + /// 文化程度 + /// + [JsonIgnore] + [Column] + public virtual Educations? Education { get; init; } + + /// + /// 紧急联系地址 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string EmergencyContactAddress { get; init; } + + /// + /// 紧急联系地区 + /// + [JsonIgnore] + [Column] + public int? EmergencyContactArea { get; init; } + + /// + /// 紧急联系人手机号 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_15)] + public virtual string EmergencyContactMobile { get; init; } + + /// + /// 紧急联系人 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string EmergencyContactName { get; init; } + + /// + /// 毕业学校 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string GraduateSchool { get; init; } + + /// + /// 身高 + /// + [JsonIgnore] + [Column] + public virtual int? Height { get; init; } + + /// + /// 住宅地址 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_127)] + public virtual string HomeAddress { get; init; } + + /// + /// 住宅地区 + /// + [JsonIgnore] + [Column] + public int? HomeArea { get; init; } + + /// + /// 住宅电话 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string HomeTelephone { get; init; } + + /// + /// 婚姻状况 + /// + [JsonIgnore] + [Column] + public virtual MarriageStatues? MarriageStatus { get; init; } + + /// + /// 民族 + /// + /// 7 + [JsonIgnore] + [Column] + public virtual Nations? Nation { get; init; } + + /// + /// 籍贯 + /// + [JsonIgnore] + [Column] + public int? NationArea { get; init; } + + /// + /// 政治面貌 + /// + [JsonIgnore] + [Column] + public virtual PoliticalStatues? PoliticalStatus { get; init; } + + /// + /// 职业 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string Profession { get; init; } + + /// + /// 真实姓名 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_31)] + public virtual string RealName { get; init; } + + /// + /// 性别 + /// + [JsonIgnore] + [Column] + public virtual Sexes? Sex { get; init; } + + /// + /// 用户基本信息 + /// + [JsonIgnore] + public Sys_User User { get; init; } + + /// + public void Register(TypeAdapterConfig config) + { + _ = config.ForType() + .Map(d => d.NationArea, s => s.NationArea == null ? null : s.NationArea.Value) + .Map(d => d.CompanyArea, s => s.CompanyArea == null ? null : s.CompanyArea.Value) + .Map(d => d.HomeArea, s => s.HomeArea == null ? null : s.HomeArea.Value) + .Map( // + d => d.EmergencyContactArea + , s => s.EmergencyContactArea == null ? null : s.EmergencyContactArea.Value); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs new file mode 100644 index 00000000..05f99f72 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_UserRole.cs @@ -0,0 +1,36 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 用户-角色映射表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_UserRole))] +public sealed record Sys_UserRole : VersionEntity +{ + /// + /// 关联的角色 + /// + [JsonIgnore] + public Sys_Role Role { get; init; } + + /// + /// 角色编号 + /// + [JsonIgnore] + [Column] + public long RoleId { get; init; } + + /// + /// 关联的用户 + /// + [JsonIgnore] + public Sys_User User { get; init; } + + /// + /// 用户编号 + /// + [JsonIgnore] + [Column] + public long UserId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs new file mode 100644 index 00000000..bd4a864e --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Sys/Sys_VerifyCode.cs @@ -0,0 +1,53 @@ +using NetAdmin.Domain.DbMaps.Dependency; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.DbMaps.Sys; + +/// +/// 验证码表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Sys_VerifyCode))] +public record Sys_VerifyCode : VersionEntity +{ + /// + /// 验证码 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_7)] + public virtual string Code { get; init; } + + /// + /// 目标设备 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_63)] + public virtual string DestDevice { get; init; } + + /// + /// 设备类型 + /// + [JsonIgnore] + [Column] + public virtual VerifyCodeDeviceTypes DeviceType { get; init; } + + /// + /// 发送报告 + /// + [JsonIgnore] + [Column(DbType = Chars.FLG_DB_FIELD_TYPE_VARCHAR_255)] + public string Report { get; init; } + + /// + /// 验证码状态 + /// + [JsonIgnore] + [Column] + public virtual VerifyCodeStatues Status { get; init; } + + /// + /// 验证码类型 + /// + [JsonIgnore] + [Column] + public virtual VerifyCodeTypes Type { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs b/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs new file mode 100644 index 00000000..421c1f79 --- /dev/null +++ b/src/backend/NetAdmin.Domain/DbMaps/Tpl/Tpl_Example.cs @@ -0,0 +1,9 @@ +using NetAdmin.Domain.DbMaps.Dependency; + +namespace NetAdmin.Domain.DbMaps.Tpl; + +/// +/// 示例表 +/// +[Table(Name = Chars.FLG_TABLE_NAME_PREFIX + nameof(Tpl_Example))] +public record Tpl_Example : VersionEntity; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs new file mode 100644 index 00000000..20a7a1f4 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/BulkReq.cs @@ -0,0 +1,18 @@ +using NetAdmin.Domain.Attributes.DataValidation; + +namespace NetAdmin.Domain.Dto.Dependency; + +/// +/// 批量请求 +/// +public sealed record BulkReq : DataAbstraction + where T : DataAbstraction, new() +{ + /// + /// 请求对象 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.请求对象))] + [MinLength(1)] + [MaxLength(Numbers.BULK_REQ_LIMIT)] + public IEnumerable Items { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/DelReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/DelReq.cs new file mode 100644 index 00000000..d33eaec2 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/DelReq.cs @@ -0,0 +1,16 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Dependency; + +/// +public sealed record DelReq : DelReq; + +/// +/// 请求:通过编号删除 +/// +/// +public record DelReq : DataAbstraction, IFieldPrimary +{ + /// + public T Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/IPagedInfo.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/IPagedInfo.cs new file mode 100644 index 00000000..c02bb3fe --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/IPagedInfo.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.Domain.Dto.Dependency; + +/// +/// 信息:分页 +/// +public interface IPagedInfo +{ + /// + /// 当前页码 + /// + int Page { get; init; } + + /// + /// 页容量 + /// + int PageSize { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/NopReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/NopReq.cs new file mode 100644 index 00000000..667c3045 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/NopReq.cs @@ -0,0 +1,6 @@ +namespace NetAdmin.Domain.Dto.Dependency; + +/// +/// 空请求 +/// +public sealed record NopReq : DataAbstraction; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs new file mode 100644 index 00000000..0f4a3a4a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryReq.cs @@ -0,0 +1,16 @@ +namespace NetAdmin.Domain.Dto.Dependency; + +/// +/// 请求:分页查询 +/// +public sealed record PagedQueryReq : QueryReq, IPagedInfo + where T : DataAbstraction, new() +{ + /// + [Range(1, Numbers.QUERY_MAX_PAGE_NO)] + public int Page { get; init; } = 1; + + /// + [Range(1, Numbers.QUERY_MAX_PAGE_SIZE)] + public int PageSize { get; init; } = Numbers.QUERY_DEF_PAGE_SIZE; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryRsp.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryRsp.cs new file mode 100644 index 00000000..b341b454 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/PagedQueryRsp.cs @@ -0,0 +1,24 @@ +namespace NetAdmin.Domain.Dto.Dependency; + +/// +/// 响应:分页查询 +/// +public sealed record PagedQueryRsp(int Page, int PageSize, long Total, IEnumerable Rows) : IPagedInfo + where T : DataAbstraction +{ + /// + public int Page { get; init; } = Page; + + /// + public int PageSize { get; init; } = PageSize; + + /// + /// 数据行 + /// + public IEnumerable Rows { get; init; } = Rows; + + /// + /// 数据总条 + /// + public long Total { get; init; } = Total; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs b/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs new file mode 100644 index 00000000..b69b191c --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Dependency/QueryReq.cs @@ -0,0 +1,39 @@ +namespace NetAdmin.Domain.Dto.Dependency; + +/// +/// 请求:查询 +/// +public record QueryReq : DataAbstraction + where T : DataAbstraction, new() +{ + /// + /// 取前n条 + /// + [Range(1, Numbers.QUERY_LIMIT)] + public int Count { get; init; } = Numbers.QUERY_LIMIT; + + /// + /// 动态查询条件 + /// + public DynamicFilterInfo DynamicFilter { get; init; } + + /// + /// 查询条件 + /// + public T Filter { get; init; } + + /// + /// 查询关键字 + /// + public string Keywords { get; set; } + + /// + /// 排序方式 + /// + public Orders? Order { get; init; } + + /// + /// 排序字段 + /// + public string Prop { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/RestfulInfo.cs b/src/backend/NetAdmin.Domain/Dto/RestfulInfo.cs new file mode 100644 index 00000000..08856711 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/RestfulInfo.cs @@ -0,0 +1,23 @@ +namespace NetAdmin.Domain.Dto; + +/// +/// 信息:RESTful 风格结果集 +/// +public record RestfulInfo : DataAbstraction +{ + /// + /// 代码 + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public ErrorCodes Code { get; init; } + + /// + /// 数据 + /// + public T Data { get; init; } + + /// + /// 消息 + /// + public object Msg { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Api/CreateApiReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Api/CreateApiReq.cs new file mode 100644 index 00000000..7c600097 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Api/CreateApiReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Api; + +/// +/// 请求:创建接口 +/// +public sealed record CreateApiReq : Sys_Api; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiReq.cs new file mode 100644 index 00000000..fb0e1310 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Api; + +/// +/// 请求:查询接口 +/// +public sealed record QueryApiReq : Sys_Api; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs new file mode 100644 index 00000000..05558293 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Api/QueryApiRsp.cs @@ -0,0 +1,38 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Api; + +/// +/// 响应:查询接口 +/// +public sealed record QueryApiRsp : Sys_Api +{ + /// + /// 子节点 + /// + public new IEnumerable Children { get; init; } + + /// + public override string Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Method { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Namespace { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ParentId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Cache/CacheStatisticsRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/CacheStatisticsRsp.cs new file mode 100644 index 00000000..c1396d69 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/CacheStatisticsRsp.cs @@ -0,0 +1,71 @@ +namespace NetAdmin.Domain.Dto.Sys.Cache; + +/// +/// 响应:缓存统计 +/// +public sealed record CacheStatisticsRsp : DataAbstraction +{ + private static readonly Regex[] _regexes = { + new(@"keyspace_hits:(\d+)", RegexOptions.Compiled) + , new(@"keyspace_misses:(\d+)", RegexOptions.Compiled) + , new(@"uptime_in_seconds:(\d+)", RegexOptions.Compiled) + , new(@"used_cpu_sys:([\d\\.]+)", RegexOptions.Compiled) + , new(@"used_cpu_user:([\d\\.]+)", RegexOptions.Compiled) + , new(@"used_memory:(\d+)", RegexOptions.Compiled) + , new("redis_version:(.+)", RegexOptions.Compiled) + }; + + /// + /// Initializes a new instance of the class. + /// + public CacheStatisticsRsp() { } + + /// + /// Initializes a new instance of the class. + /// + public CacheStatisticsRsp(string redisResult) + { + KeyspaceHits = _regexes[0].Match(redisResult).Groups[1].Value.Trim().Int64Try(0); + KeyspaceMisses = _regexes[1].Match(redisResult).Groups[1].Value.Trim().Int64Try(0); + UpTime = _regexes[2].Match(redisResult).Groups[1].Value.Trim().Int64Try(0); + UsedCpu = _regexes[3].Match(redisResult).Groups[1].Value.Trim().DecTry(0) + + _regexes[4].Match(redisResult).Groups[1].Value.Trim().DecTry(0); + UsedMemory = _regexes[5].Match(redisResult).Groups[1].Value.Trim().Int64Try(0); + Version = _regexes[6].Match(redisResult).Groups[1].Value.Trim(); + } + + /// + /// 键总数 + /// + public long DbSize { get; init; } + + /// + /// 命中键的数量 + /// + public long KeyspaceHits { get; init; } + + /// + /// 未命中键的数量 + /// + public long KeyspaceMisses { get; init; } + + /// + /// Redis运行时间(秒) + /// + public long UpTime { get; init; } + + /// + /// 使用的CPU时间(秒) + /// + public decimal UsedCpu { get; init; } + + /// + /// 使用的内存量(字节) + /// + public long UsedMemory { get; init; } + + /// + /// Redis版本号 + /// + public string Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesReq.cs new file mode 100644 index 00000000..e44860f8 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesReq.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.Dto.Sys.Cache; + +/// +/// 请求:获取所有缓存项 +/// +public sealed record GetAllEntriesReq : DataAbstraction +{ + /// + /// 数据库索引号 + /// + public uint DbIndex { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs new file mode 100644 index 00000000..fd386241 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Cache/GetAllEntriesRsp.cs @@ -0,0 +1,43 @@ +namespace NetAdmin.Domain.Dto.Sys.Cache; + +/// +/// 响应:获取所有缓存项 +/// +public sealed record GetAllEntriesRsp : DataAbstraction +{ + /// + /// Initializes a new instance of the class. + /// + public GetAllEntriesRsp() { } + + /// + /// Initializes a new instance of the class. + /// + public GetAllEntriesRsp(long absExp, string key, long sldExp, string data) + { + AbsExp = absExp; + Key = key; + SldExp = sldExp; + Data = data; + } + + /// + /// 绝对过期时间 + /// + public long AbsExp { get; init; } + + /// + /// 缓存值 + /// + public string Data { get; init; } + + /// + /// 缓存键 + /// + public string Key { get; init; } + + /// + /// 滑动过期时间 + /// + public long SldExp { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Captcha/GetCaptchaRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Captcha/GetCaptchaRsp.cs new file mode 100644 index 00000000..2472c75e --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Captcha/GetCaptchaRsp.cs @@ -0,0 +1,28 @@ +namespace NetAdmin.Domain.Dto.Sys.Captcha; + +/// +/// 响应:获取人机校验图 +/// +public sealed record GetCaptchaRsp : DataAbstraction +{ + /// + /// 背景图(base64) + /// + public string BackgroundImage { get; init; } + + /// + /// 唯一编码 + /// + public string Id { get; init; } + + /// + /// 缺口x坐标 + /// + [JsonIgnore] + public int SawOffsetX { get; init; } + + /// + /// 滑块图(base64) + /// + public string SliderImage { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Captcha/VerifyCaptchaReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Captcha/VerifyCaptchaReq.cs new file mode 100644 index 00000000..c8ac2893 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Captcha/VerifyCaptchaReq.cs @@ -0,0 +1,27 @@ +using NetAdmin.Domain.Attributes.DataValidation; + +namespace NetAdmin.Domain.Dto.Sys.Captcha; + +/// +/// 请求:完成人机验证 +/// +public sealed record VerifyCaptchaReq : DataAbstraction +{ + /// + /// 唯一编码 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.唯一编码))] + public string Id { get; init; } + + /// + /// 缺口x坐标 + /// + [JsonIgnore] + public int? SawOffsetX { get; init; } + + /// + /// 验证数据 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.验证数据))] + public string VerifyData { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Config/CreateConfigReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Config/CreateConfigReq.cs new file mode 100644 index 00000000..5db55870 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Config/CreateConfigReq.cs @@ -0,0 +1,26 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Config; + +/// +/// 请求:创建配置 +/// +public record CreateConfigReq : Sys_Config +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool UserRegisterConfirm { get; set; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long UserRegisterDeptId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long UserRegisterRoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigReq.cs new file mode 100644 index 00000000..3e753085 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigReq.cs @@ -0,0 +1,20 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Config; + +/// +/// 请求:查询配置 +/// +public sealed record QueryConfigReq : Sys_Config +{ + /// + /// 是否启用 + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public new bool? Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs new file mode 100644 index 00000000..281583b5 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Config/QueryConfigRsp.cs @@ -0,0 +1,44 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.Dept; +using NetAdmin.Domain.Dto.Sys.Role; + +namespace NetAdmin.Domain.Dto.Sys.Config; + +/// +/// 响应:查询配置 +/// +public sealed record QueryConfigRsp : Sys_Config +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool UserRegisterConfirm { get; set; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public new QueryDeptRsp UserRegisterDept { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long UserRegisterDeptId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public new QueryRoleRsp UserRegisterRole { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long UserRegisterRoleId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Config/UpdateConfigReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Config/UpdateConfigReq.cs new file mode 100644 index 00000000..11cd77ba --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Config/UpdateConfigReq.cs @@ -0,0 +1,13 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.Config; + +/// +/// 请求:更新配置 +/// +public sealed record UpdateConfigReq : CreateConfigReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs new file mode 100644 index 00000000..0f8620c5 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/CreateDeptReq.cs @@ -0,0 +1,32 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dept; + +/// +/// 请求:创建部门 +/// +public record CreateDeptReq : Sys_Dept +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.部门名称))] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long ParentId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } = Numbers.DEF_SORT_VAL; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Summary { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptReq.cs new file mode 100644 index 00000000..891961cb --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dept; + +/// +/// 请求:查询部门 +/// +public sealed record QueryDeptReq : Sys_Dept +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs new file mode 100644 index 00000000..fb594b17 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/QueryDeptRsp.cs @@ -0,0 +1,47 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dept; + +/// +/// 响应:查询部门 +/// +public record QueryDeptRsp : Sys_Dept +{ + /// + /// 子节点 + /// + public new virtual IEnumerable Children { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime CreatedTime { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long ParentId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } = Numbers.DEF_SORT_VAL; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dept/UpdateDeptReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/UpdateDeptReq.cs new file mode 100644 index 00000000..eba8983e --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dept/UpdateDeptReq.cs @@ -0,0 +1,17 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.Dept; + +/// +/// 请求:更新部门 +/// +public sealed record UpdateDeptReq : CreateDeptReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs new file mode 100644 index 00000000..c6fc980c --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateCsCodeReq.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Domain.Dto.Sys.Dev; + +/// +/// 请求:生成后端代码 +/// +public sealed record GenerateCsCodeReq : DataAbstraction +{ + /// + /// 模块名称 + /// + public string ModuleName { get; init; } + + /// + /// 模块说明 + /// + public string ModuleRemark { get; init; } + + /// + /// 模块类型 + /// + public ModuleTypes Type { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateIconCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateIconCodeReq.cs new file mode 100644 index 00000000..f6503ef1 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dev/GenerateIconCodeReq.cs @@ -0,0 +1,21 @@ +using NetAdmin.Domain.Attributes.DataValidation; + +namespace NetAdmin.Domain.Dto.Sys.Dev; + +/// +/// 请求:生成图标代码 +/// +public sealed record GenerateIconCodeReq : DataAbstraction +{ + /// + /// 图标名称 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.图标名称))] + public string IconName { get; init; } + + /// + /// 图标代码 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.图标代码))] + public string SvgCode { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dev/IconExportJsInfo.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dev/IconExportJsInfo.cs new file mode 100644 index 00000000..820fb60e --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dev/IconExportJsInfo.cs @@ -0,0 +1,39 @@ +namespace NetAdmin.Domain.Dto.Sys.Dev; + +/// +/// IconExportJsInfo +/// +public sealed record IconExportJsInfo : DataAbstraction +{ + /// + /// ExportDefault + /// + public ExportDefaultRecord ExportDefault { get; init; } + + /// + /// ExportDefaultRecord + /// + public sealed record ExportDefaultRecord + { + /// + /// Icons + /// + public IEnumerable Icons { get; init; } + } + + /// + /// IconsItem + /// + public sealed record IconsItem + { + /// + /// Icons + /// + public ICollection Icons { get; init; } + + /// + /// Name + /// + public string Name { get; init; } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/CreateDicCatalogReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/CreateDicCatalogReq.cs new file mode 100644 index 00000000..bab0c3ed --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/CreateDicCatalogReq.cs @@ -0,0 +1,24 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog; + +/// +/// 请求:创建字典目录 +/// +public record CreateDicCatalogReq : Sys_DicCatalog +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.字典编码))] + public override string Code { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.字典名称))] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long ParentId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogReq.cs new file mode 100644 index 00000000..7109e016 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog; + +/// +/// 请求:查询字典目录 +/// +public sealed record QueryDicCatalogReq : Sys_DicCatalog; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogRsp.cs new file mode 100644 index 00000000..d85e86d7 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/QueryDicCatalogRsp.cs @@ -0,0 +1,35 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog; + +/// +/// 响应:查询字典目录 +/// +public sealed record QueryDicCatalogRsp : Sys_DicCatalog +{ + /// + /// 子节点 + /// + public new IEnumerable Children { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Code { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long ParentId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/UpdateDicCatalogReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/UpdateDicCatalogReq.cs new file mode 100644 index 00000000..cb71d31f --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Catalog/UpdateDicCatalogReq.cs @@ -0,0 +1,13 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Catalog; + +/// +/// 请求:更新字典目录 +/// +public sealed record UpdateDicCatalogReq : CreateDicCatalogReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs new file mode 100644 index 00000000..49e1affc --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/CreateDicContentReq.cs @@ -0,0 +1,25 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Content; + +/// +/// 请求:创建字典内容 +/// +public record CreateDicContentReq : Sys_DicContent +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.字典目录编号))] + public override long CatalogId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.键名称))] + public override string Key { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.键值))] + public override string Value { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentReq.cs new file mode 100644 index 00000000..542721db --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Content; + +/// +/// 请求:查询字典内容 +/// +public sealed record QueryDicContentReq : Sys_DicContent; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs new file mode 100644 index 00000000..f1fcdecd --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/QueryDicContentRsp.cs @@ -0,0 +1,30 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Content; + +/// +/// 响应:查询字典内容 +/// +public sealed record QueryDicContentRsp : Sys_DicContent +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long CatalogId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime CreatedTime { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Key { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Value { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/UpdateDicContentReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/UpdateDicContentReq.cs new file mode 100644 index 00000000..c2a1ba76 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Dic/Content/UpdateDicContentReq.cs @@ -0,0 +1,13 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.Dic.Content; + +/// +/// 请求:更新字典内容 +/// +public sealed record UpdateDicContentReq : CreateDicContentReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Menu/CreateMenuReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/CreateMenuReq.cs new file mode 100644 index 00000000..9230f278 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/CreateMenuReq.cs @@ -0,0 +1,72 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Menu; + +/// +/// 请求:创建菜单 +/// +public record CreateMenuReq : Sys_Menu +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Active { get; init; } + + /// + public override string Color => Meta.Color; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Component { get; init; } + + /// + public override bool FullPageRouting => Meta.FullPage; + + /// + public override bool Hidden => Meta.Hidden; + + /// + public override bool HiddenBreadCrumb => Meta.HiddenBreadCrumb; + + /// + public override string Icon => Meta.Icon; + + /// + /// 元数据 + /// + public MetaInfo Meta { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.菜单名称))] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long ParentId { get; init; } = 0; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Path { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Redirect { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } = Numbers.DEF_SORT_VAL; + + /// + public override string Tag => Meta.Tag; + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.菜单标题))] + public override string Title => Meta.Title; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override MenuTypes Type => Meta.Type; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Menu/MetaInfo.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/MetaInfo.cs new file mode 100644 index 00000000..04879e31 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/MetaInfo.cs @@ -0,0 +1,71 @@ +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Menu; + +/// +/// 信息:元数据 +/// +public sealed record MetaInfo : DataAbstraction +{ + /// + /// Initializes a new instance of the class. + /// + public MetaInfo() { } + + /// + /// Initializes a new instance of the class. + /// + public MetaInfo(string color, bool fullPage, bool hidden, bool hiddenBreadCrumb, string icon, string tag + , string title, MenuTypes type) + { + Color = color; + FullPage = fullPage; + Hidden = hidden; + HiddenBreadCrumb = hiddenBreadCrumb; + Icon = icon; + Tag = tag; + Title = title; + Type = type; + } + + /// + /// 背景颜色 + /// + public string Color { get; init; } + + /// + /// 是否整页路由 + /// + public bool FullPage { get; init; } + + /// + /// 是否隐藏 + /// + public bool Hidden { get; init; } + + /// + /// 是否隐藏面包屑 + /// + public bool HiddenBreadCrumb { get; init; } + + /// + /// 图标 + /// + public string Icon { get; init; } + + /// + /// 标签 + /// + public string Tag { get; init; } + + /// + /// 标题 + /// + public string Title { get; init; } + + /// + /// 类型 + /// + [EnumDataType(typeof(MenuTypes))] + public MenuTypes Type { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuReq.cs new file mode 100644 index 00000000..bf2af730 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Menu; + +/// +/// 请求:查询菜单 +/// +public sealed record QueryMenuReq : Sys_Menu +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuRsp.cs new file mode 100644 index 00000000..054a19a9 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/QueryMenuRsp.cs @@ -0,0 +1,78 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Menu; + +/// +/// 信息:菜单 +/// +public sealed record QueryMenuRsp : Sys_Menu, IRegister +{ + /// + /// 元数据 + /// + public MetaInfo Meta => new(Color, FullPageRouting, Hidden, HiddenBreadCrumb, Icon, Tag, Title, Type); + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Active { get; init; } + + /// + /// 子节点 + /// + public new IEnumerable Children { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Component { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool FullPageRouting { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Hidden { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool HiddenBreadCrumb { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long ParentId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Path { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Redirect { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } + + /// + public void Register(TypeAdapterConfig config) + { + _ = config.ForType() // + .Map(d => d.Path, s => s.Path ?? string.Empty) + + // + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Menu/UpdateMenuReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/UpdateMenuReq.cs new file mode 100644 index 00000000..d0275beb --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Menu/UpdateMenuReq.cs @@ -0,0 +1,17 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.Menu; + +/// +/// 请求:更新菜单 +/// +public sealed record UpdateMenuReq : CreateMenuReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/CreateRequestLogReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/CreateRequestLogReq.cs new file mode 100644 index 00000000..bbf1681a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/CreateRequestLogReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.RequestLog; + +/// +/// 请求:创建请求日志 +/// +public sealed record CreateRequestLogReq : Sys_RequestLog; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogReq.cs new file mode 100644 index 00000000..9d175f7b --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.RequestLog; + +/// +/// 请求:查询请求日志 +/// +public sealed record QueryRequestLogReq : Sys_RequestLog; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogRsp.cs new file mode 100644 index 00000000..dd979b8d --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/RequestLog/QueryRequestLogRsp.cs @@ -0,0 +1,106 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.RequestLog; + +/// +/// 响应:查询请求日志 +/// +public sealed record QueryRequestLogRsp : Sys_RequestLog, IRegister +{ + /// + /// 操作系统 + /// + public string Os => UserAgentParser.Create(CreatedUserAgent).Platform; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ApiId { get; init; } + + /// + /// 接口描述 + /// + public string ApiSummary { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override int? CreatedClientIp { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime CreatedTime { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string CreatedUserAgent { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string CreatedUserName { get; set; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Duration { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override ErrorCodes ErrorCode { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Exception { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ExtraData { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override int HttpStatusCode { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Method { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ReferUrl { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string RequestBody { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string RequestContentType { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string RequestHeaders { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string RequestUrl { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ResponseBody { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ResponseContentType { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string ResponseHeaders { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override int? ServerIp { get; init; } + + /// + public void Register(TypeAdapterConfig config) + { + _ = config.ForType().Map(dest => dest.ApiSummary, src => src.Api.Summary); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs new file mode 100644 index 00000000..c762b7b0 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Role/CreateRoleReq.cs @@ -0,0 +1,57 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Role; + +/// +/// 请求:创建角色 +/// +public record CreateRoleReq : Sys_Role +{ + /// + /// 角色-接口映射 + /// + public IReadOnlyCollection ApiIds { get; init; } + + /// + [EnumDataType(typeof(DataScopes))] + public override DataScopes DataScope { get; init; } = DataScopes.All; + + /// + /// 当 DataScope = SpecificDept ,此参数指定部门编号 + /// + [SpecificDept] + public IReadOnlyCollection DeptIds { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool DisplayDashboard { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool IgnorePermissionControl { get; init; } + + /// + /// 角色-菜单映射 + /// + public IReadOnlyCollection MenuIds { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.角色名称))] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } = Numbers.DEF_SORT_VAL; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Summary { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Role/GetMenusRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Role/GetMenusRsp.cs new file mode 100644 index 00000000..64c8153f --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Role/GetMenusRsp.cs @@ -0,0 +1,17 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Role; + +/// +/// 响应: 获取角色菜单 +/// +public sealed record GetMenusRsp : Sys_RoleMenu +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long MenuId { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long RoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Role/MapMenusReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Role/MapMenusReq.cs new file mode 100644 index 00000000..1edfd0cf --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Role/MapMenusReq.cs @@ -0,0 +1,21 @@ +using NetAdmin.Domain.Attributes.DataValidation; + +namespace NetAdmin.Domain.Dto.Sys.Role; + +/// +/// 请求:角色-菜单映射 +/// +public sealed record MapMenusReq : DataAbstraction +{ + /// + /// 菜单编号 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.菜单编号))] + public IReadOnlyCollection MenuIds { get; init; } + + /// + /// 角色编号 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.角色编号))] + public long RoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleReq.cs new file mode 100644 index 00000000..db256ba9 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Role; + +/// +/// 请求:查询角色 +/// +public sealed record QueryRoleReq : Sys_Role +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs new file mode 100644 index 00000000..221817f5 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Role/QueryRoleRsp.cs @@ -0,0 +1,84 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.Role; + +/// +/// 响应:查询角色 +/// +public sealed record QueryRoleRsp : Sys_Role, IRegister +{ + /// + /// 角色-接口映射 + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public IReadOnlyCollection ApiIds { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime CreatedTime { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DataScopes DataScope { get; init; } + + /// + /// 角色-部门映射 + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public IEnumerable DeptIds { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool DisplayDashboard { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool IgnorePermissionControl { get; init; } + + /// + /// 角色-菜单映射 + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public IReadOnlyCollection MenuIds { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Name { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Sort { get; init; } = Numbers.DEF_SORT_VAL; + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } + + /// + public new void Register(TypeAdapterConfig config) + { + _ = config.ForType() // + .IgnoreIf((s, _) => s.Depts == null, d => d.DeptIds) + .IgnoreIf((s, _) => s.Menus == null, d => d.MenuIds) + .IgnoreIf((s, _) => s.Apis == null, d => d.ApiIds) + .Map(d => d.DeptIds, s => s.Depts.Select(x => x.Id)) + .Map(d => d.ApiIds, s => s.Apis.Select(x => x.Id)) + .Map(d => d.MenuIds, s => s.Menus.Select(x => x.Id)) + + // + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/Role/UpdateRoleReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/Role/UpdateRoleReq.cs new file mode 100644 index 00000000..304d0b04 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/Role/UpdateRoleReq.cs @@ -0,0 +1,20 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.Role; + +/// +/// 请求:修改角色 +/// +public sealed record UpdateRoleReq : CreateRoleReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.唯一编码))] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.数据版本))] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs new file mode 100644 index 00000000..4dadc4a6 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckMobileAvailableReq.cs @@ -0,0 +1,20 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:检查手机号是否可用 +/// +public sealed record CheckMobileAvailableReq : Sys_User +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [Mobile] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Mobile { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckUserNameAvailableReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckUserNameAvailableReq.cs new file mode 100644 index 00000000..dd3b234a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/CheckUserNameAvailableReq.cs @@ -0,0 +1,21 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:检查用户名是否可用 +/// +public sealed record CheckUserNameAvailableReq : Sys_User +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.用户名))] + [UserName] + public override string UserName { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs new file mode 100644 index 00000000..b656c305 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUpdateUserReq.cs @@ -0,0 +1,58 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:创建更新用户 +/// +public abstract record CreateUpdateUserReq : Sys_User +{ + /// + [CultureUrl] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Avatar { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long DeptId { get; init; } + + /// + [EmailAddress] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Email { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [Mobile] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Mobile { get; init; } + + /// + /// 登录密码 + /// + [Password] + public virtual string PasswordText { get; init; } + + /// + /// 角色编号列表 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.角色编号列表))] + [MinLength(1)] + [MaxLength(Numbers.BULK_REQ_LIMIT)] + public IReadOnlyCollection RoleIds { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Summary { get; init; } + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.用户名))] + [UserName] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string UserName { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs new file mode 100644 index 00000000..b7167f45 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/CreateUserReq.cs @@ -0,0 +1,29 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.UserProfile; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:创建用户 +/// +public record CreateUserReq : CreateUpdateUserReq, IRegister +{ + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.密码))] + public override string PasswordText { get; init; } + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.用户档案))] + public new CreateUserProfileReq Profile { get; init; } + + /// + public new void Register(TypeAdapterConfig config) + { + _ = config.ForType() // + .Map(d => d.Mobile, s => s.VerifySmsCodeReq.DestDevice) + + // + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginByPwdReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginByPwdReq.cs new file mode 100644 index 00000000..00071fd9 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginByPwdReq.cs @@ -0,0 +1,20 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:密码登录 +/// +public record LoginByPwdReq : DataAbstraction +{ + /// + /// 用户名、手机号、邮箱 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.账号))] + public string Account { get; init; } + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.密码))] + public string Password { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginBySmsReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginBySmsReq.cs new file mode 100644 index 00000000..f2b5e07e --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginBySmsReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:短信登录 +/// +public record LoginBySmsReq : VerifySmsCodeReq; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs new file mode 100644 index 00000000..a74c40dc --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/LoginRsp.cs @@ -0,0 +1,27 @@ +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 响应:密码登录 +/// +public record LoginRsp : DataAbstraction +{ + /// + /// 访问令牌 + /// + public string AccessToken { get; init; } + + /// + /// 刷新令牌 + /// + public string RefreshToken { get; init; } + + /// + /// 设置到响应头 + /// + public void SetToRspHeader() + { + // 设置响应报文头 + App.HttpContext.Response.Headers[Chars.FLG_ACCESS_TOKEN] = AccessToken; + App.HttpContext.Response.Headers[Chars.FLG_X_ACCESS_TOKEN] = RefreshToken; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserReq.cs new file mode 100644 index 00000000..ad3d07ec --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserReq.cs @@ -0,0 +1,26 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:查询用户 +/// +public sealed record QueryUserReq : Sys_User +{ + /// + /// 部门编号 + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long DeptId { get; init; } + + /// + /// id + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + /// 角色编号 + /// + public long RoleId { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs new file mode 100644 index 00000000..1e7203ef --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/QueryUserRsp.cs @@ -0,0 +1,58 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.Dept; +using NetAdmin.Domain.Dto.Sys.Role; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 响应:查询用户 +/// +public record QueryUserRsp : Sys_User +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Avatar { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime CreatedTime { get; init; } + + /// + /// 部门 + /// + public new virtual QueryDeptRsp Dept { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Email { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override bool Enabled { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Mobile { get; init; } + + /// + /// 角色列表 + /// + public new virtual IEnumerable Roles { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Summary { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string UserName { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/RegisterUserReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/RegisterUserReq.cs new file mode 100644 index 00000000..1ca7bb4a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/RegisterUserReq.cs @@ -0,0 +1,39 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:注册用户 +/// +public record RegisterUserReq : Sys_User +{ + /// + /// 密码 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.密码))] + [Password] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public virtual string PasswordText { get; init; } + + /// + /// 角色编号列表 + /// + [JsonIgnore] + public IReadOnlyCollection RoleIds { get; init; } + + /// + /// 用户名 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.用户名))] + [UserName] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string UserName { get; init; } + + /// + /// 短信验证请求 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.短信验证请求))] + public VerifySmsCodeReq VerifySmsCodeReq { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/ResetPasswordReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/ResetPasswordReq.cs new file mode 100644 index 00000000..06ad2631 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/ResetPasswordReq.cs @@ -0,0 +1,23 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:重置密码 +/// +public sealed record ResetPasswordReq : DataAbstraction +{ + /// + /// 密码 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.密码))] + [Password] + public string PasswordText { get; init; } + + /// + /// 短信验证请求 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.短信验证请求))] + public VerifySmsCodeReq VerifySmsCodeReq { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs new file mode 100644 index 00000000..7ebd7e7d --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetAvatarReq.cs @@ -0,0 +1,16 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:更新用户头像 +/// +public sealed record SetAvatarReq : Sys_User +{ + /// + [CultureUrl] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.用户头像))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Avatar { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/SetEmailReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetEmailReq.cs new file mode 100644 index 00000000..c63c8125 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetEmailReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:设置邮箱 +/// +public sealed record SetEmailReq : VerifyEmailCodeReq +{ + /// + /// 短信验证请求 + /// + public VerifySmsCodeReq VerifySmsCodeReq { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/SetMobileReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetMobileReq.cs new file mode 100644 index 00000000..93688358 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetMobileReq.cs @@ -0,0 +1,21 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:设置手机号 +/// +public sealed record SetMobileReq : DataAbstraction +{ + /// + /// 新手机短信验证请求 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.短信验证请求))] + public VerifySmsCodeReq NewVerifySmsCodeReq { get; init; } + + /// + /// 原手机短信验证请求 + /// + public VerifySmsCodeReq OriginVerifySmsCodeReq { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/SetPasswordReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetPasswordReq.cs new file mode 100644 index 00000000..579aa226 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/SetPasswordReq.cs @@ -0,0 +1,23 @@ +using NetAdmin.Domain.Attributes.DataValidation; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:设置密码 +/// +public sealed record SetPasswordReq : DataAbstraction +{ + /// + /// 新密码 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.新密码))] + [Password] + public string NewPassword { get; init; } + + /// + /// 旧密码 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.旧密码))] + [Password] + public string OldPassword { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/UpdateUserReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/UpdateUserReq.cs new file mode 100644 index 00000000..17101947 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/UpdateUserReq.cs @@ -0,0 +1,24 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.UserProfile; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 请求:更新用户 +/// +public sealed record UpdateUserReq : CreateUpdateUserReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.用户档案))] + public new UpdateUserProfileReq Profile { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/User/UserInfoRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/User/UserInfoRsp.cs new file mode 100644 index 00000000..42844656 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/User/UserInfoRsp.cs @@ -0,0 +1,28 @@ +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.Dept; +using NetAdmin.Domain.Dto.Sys.Role; + +namespace NetAdmin.Domain.Dto.Sys.User; + +/// +/// 响应:当前用户信息 +/// +public record UserInfoRsp : QueryUserRsp, IRegister +{ + /// + public override QueryDeptRsp Dept { get; init; } + + /// + public override IEnumerable Roles { get; init; } + + /// + public new void Register(TypeAdapterConfig config) + { + _ = config.ForType() // + .IgnoreIf((s, _) => s.Mobile == null, d => d.Mobile) + .Map(d => d.Mobile, s => s.Mobile.MaskMobile()) + + // + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/CreateUserProfileReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/CreateUserProfileReq.cs new file mode 100644 index 00000000..f7a1e9c7 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/CreateUserProfileReq.cs @@ -0,0 +1,122 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.Dic.Content; + +namespace NetAdmin.Domain.Dto.Sys.UserProfile; + +/// +/// 请求:创建用户档案 +/// +public record CreateUserProfileReq : Sys_UserProfile +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override DateTime? BornDate { get; init; } + + /// + [Certificate] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string CertificateNumber { get; init; } + + /// + [EnumDataType(typeof(CertificateTypes))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override CertificateTypes? CertificateType { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string CompanyAddress { get; init; } + + /// + /// 工作地区 + /// + public new QueryDicContentRsp CompanyArea { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string CompanyName { get; init; } + + /// + [Telephone] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string CompanyTelephone { get; init; } + + /// + [EnumDataType(typeof(Educations))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override Educations? Education { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string EmergencyContactAddress { get; init; } + + /// + /// 紧急联系地区 + /// + public new QueryDicContentRsp EmergencyContactArea { get; init; } + + /// + [Mobile] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string EmergencyContactMobile { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string EmergencyContactName { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string GraduateSchool { get; init; } + + /// + [Range(100, 250)] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override int? Height { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string HomeAddress { get; init; } + + /// + /// 住宅地区 + /// + public new QueryDicContentRsp HomeArea { get; init; } + + /// + [Telephone] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string HomeTelephone { get; init; } + + /// + [EnumDataType(typeof(MarriageStatues))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override MarriageStatues? MarriageStatus { get; init; } + + /// + [EnumDataType(typeof(Nations))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override Nations? Nation { get; init; } + + /// + /// 籍贯 + /// + public new CreateDicContentReq NationArea { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [EnumDataType(typeof(PoliticalStatues))] + public override PoliticalStatues? PoliticalStatus { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Profession { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string RealName { get; init; } + + /// + [EnumDataType(typeof(Sexes))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override Sexes? Sex { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileReq.cs new file mode 100644 index 00000000..38d2ac12 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.UserProfile; + +/// +/// 请求:查询用户档案 +/// +public sealed record QueryUserProfileReq : Sys_UserProfile +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileRsp.cs new file mode 100644 index 00000000..56540ddf --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/QueryUserProfileRsp.cs @@ -0,0 +1,119 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.Dic.Content; + +namespace NetAdmin.Domain.Dto.Sys.UserProfile; + +/// +/// 响应:查询用户档案 +/// +public sealed record QueryUserProfileRsp : Sys_UserProfile +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override DateTime? BornDate { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string CertificateNumber { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override CertificateTypes? CertificateType { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string CompanyAddress { get; init; } + + /// + /// 工作地区 + /// + public new QueryDicContentRsp CompanyArea { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string CompanyName { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string CompanyTelephone { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override Educations? Education { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string EmergencyContactAddress { get; init; } + + /// + /// 紧急联系地区 + /// + public new QueryDicContentRsp EmergencyContactArea { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string EmergencyContactMobile { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string EmergencyContactName { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string GraduateSchool { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override int? Height { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string HomeAddress { get; init; } + + /// + /// 住宅地区 + /// + public new QueryDicContentRsp HomeArea { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string HomeTelephone { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override MarriageStatues? MarriageStatus { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override Nations? Nation { get; init; } + + /// + /// 籍贯 + /// + public new QueryDicContentRsp NationArea { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override PoliticalStatues? PoliticalStatus { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string Profession { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string RealName { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override Sexes? Sex { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/UpdateUserProfileReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/UpdateUserProfileReq.cs new file mode 100644 index 00000000..ee467ee9 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/UserProfile/UpdateUserProfileReq.cs @@ -0,0 +1,13 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.UserProfile; + +/// +/// 请求:更新用户档案 +/// +public sealed record UpdateUserProfileReq : CreateUserProfileReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/CreateVerifyCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/CreateVerifyCodeReq.cs new file mode 100644 index 00000000..edad0698 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/CreateVerifyCodeReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:创建验证码 +/// +public record CreateVerifyCodeReq : Sys_VerifyCode; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeReq.cs new file mode 100644 index 00000000..502325c5 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:查询验证码 +/// +public sealed record QueryVerifyCodeReq : Sys_VerifyCode +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeRsp.cs new file mode 100644 index 00000000..82084c48 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/QueryVerifyCodeRsp.cs @@ -0,0 +1,18 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 响应:查询验证码 +/// +public sealed record QueryVerifyCodeRsp : Sys_VerifyCode +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeReq.cs new file mode 100644 index 00000000..abfef460 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeReq.cs @@ -0,0 +1,64 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Sys.Captcha; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:发送验证码 +/// +public sealed record SendVerifyCodeReq : Sys_VerifyCode, IValidatableObject +{ + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.目标设备))] + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + public override string DestDevice { get; init; } + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.设备类型))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [EnumDataType(typeof(VerifyCodeDeviceTypes))] + public override VerifyCodeDeviceTypes DeviceType { get; init; } + + /// + public override VerifyCodeStatues Status => VerifyCodeStatues.Waiting; + + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.验证码类型))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [EnumDataType(typeof(VerifyCodeTypes))] + public override VerifyCodeTypes Type { get; init; } + + /// + /// 人机校验请求 + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.人机校验请求))] + public VerifyCaptchaReq VerifyCaptchaReq { get; init; } + + /// + public IEnumerable Validate(ValidationContext validationContext) + { + ValidationResult validationResult; + switch (DeviceType) { + case VerifyCodeDeviceTypes.Email: + validationResult = new EmailAttribute().GetValidationResult(DestDevice, validationContext); + if (validationResult == null) { + yield break; + } + + yield return new ValidationResult(validationResult.ErrorMessage, new[] { nameof(DestDevice) }); + break; + case VerifyCodeDeviceTypes.Mobile: + validationResult = new MobileAttribute().GetValidationResult(DestDevice, validationContext); + if (validationResult == null) { + yield break; + } + + yield return new ValidationResult(validationResult.ErrorMessage, new[] { nameof(DestDevice) }); + break; + default: + yield break; + } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeRsp.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeRsp.cs new file mode 100644 index 00000000..9bfc1aa2 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/SendVerifyCodeRsp.cs @@ -0,0 +1,15 @@ +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 响应:发送验证码 +/// +public sealed record SendVerifyCodeRsp : Sys_VerifyCode +{ + #if DEBUG + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override string Code { get; init; } + #endif +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/UpdateVerifyCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/UpdateVerifyCodeReq.cs new file mode 100644 index 00000000..f6186caa --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/UpdateVerifyCodeReq.cs @@ -0,0 +1,13 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:更新验证码 +/// +public sealed record UpdateVerifyCodeReq : CreateVerifyCodeReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyCodeReq.cs new file mode 100644 index 00000000..2a41d82a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyCodeReq.cs @@ -0,0 +1,21 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.DbMaps.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:核实验证码 +/// +public abstract record VerifyCodeReq : Sys_VerifyCode +{ + /// + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.验证码))] + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [VerifyCode] + public override string Code { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + [CultureRequired(ErrorMessageResourceType = typeof(Ln), ErrorMessageResourceName = nameof(Ln.目标设备))] + public override string DestDevice { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyEmailCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyEmailCodeReq.cs new file mode 100644 index 00000000..caeb9d38 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifyEmailCodeReq.cs @@ -0,0 +1,18 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:核实邮箱验证码 +/// +public record VerifyEmailCodeReq : VerifyCodeReq +{ + /// + [Email] + public override string DestDevice { get; init; } + + /// + [JsonIgnore] + public override VerifyCodeDeviceTypes DeviceType { get; init; } = VerifyCodeDeviceTypes.Email; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifySmsCodeReq.cs b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifySmsCodeReq.cs new file mode 100644 index 00000000..93f1a36f --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Sys/VerifyCode/VerifySmsCodeReq.cs @@ -0,0 +1,18 @@ +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.Enums.Sys; + +namespace NetAdmin.Domain.Dto.Sys.VerifyCode; + +/// +/// 请求:核实短信验证码 +/// +public record VerifySmsCodeReq : VerifyCodeReq +{ + /// + [Mobile] + public override string DestDevice { get; init; } + + /// + [JsonIgnore] + public override VerifyCodeDeviceTypes DeviceType { get; init; } = VerifyCodeDeviceTypes.Mobile; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Tpl/Example/CreateExampleReq.cs b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/CreateExampleReq.cs new file mode 100644 index 00000000..bf6eeb95 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/CreateExampleReq.cs @@ -0,0 +1,8 @@ +using NetAdmin.Domain.DbMaps.Tpl; + +namespace NetAdmin.Domain.Dto.Tpl.Example; + +/// +/// 请求:创建示例 +/// +public record CreateExampleReq : Tpl_Example; \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleReq.cs b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleReq.cs new file mode 100644 index 00000000..2db659c8 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleReq.cs @@ -0,0 +1,14 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Tpl; + +namespace NetAdmin.Domain.Dto.Tpl.Example; + +/// +/// 请求:查询示例 +/// +public sealed record QueryExampleReq : Tpl_Example +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleRsp.cs b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleRsp.cs new file mode 100644 index 00000000..b07f12fa --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/QueryExampleRsp.cs @@ -0,0 +1,18 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Tpl; + +namespace NetAdmin.Domain.Dto.Tpl.Example; + +/// +/// 响应:查询示例 +/// +public sealed record QueryExampleRsp : Tpl_Example +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Id { get; init; } + + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Dto/Tpl/Example/UpdateExampleReq.cs b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/UpdateExampleReq.cs new file mode 100644 index 00000000..a8ffd174 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Dto/Tpl/Example/UpdateExampleReq.cs @@ -0,0 +1,13 @@ +using NetAdmin.Domain.DbMaps.Dependency.Fields; + +namespace NetAdmin.Domain.Dto.Tpl.Example; + +/// +/// 请求:更新示例 +/// +public sealed record UpdateExampleReq : CreateExampleReq +{ + /// + [JsonIgnore(Condition = JsonIgnoreCondition.Never)] + public override long Version { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Enums/Sys/DataScopes.cs b/src/backend/NetAdmin.Domain/Enums/Sys/DataScopes.cs new file mode 100644 index 00000000..4f5c9d98 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Enums/Sys/DataScopes.cs @@ -0,0 +1,46 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 角色数据范围 +/// +[Export] +public enum DataScopes +{ + /// + /// 全部数据 + /// + [ResourceDescription(nameof(Ln.全部数据))] + All = 1 + + , + + /// + /// 本部门和下级部门数据 + /// + [ResourceDescription(nameof(Ln.本部门和下级部门数据))] + DeptWithChild = 2 + + , + + /// + /// 本部门数据 + /// + [ResourceDescription(nameof(Ln.本部门数据))] + Dept = 3 + + , + + /// + /// 本人数据 + /// + [ResourceDescription(nameof(Ln.本人数据))] + Self = 4 + + , + + /// + /// 指定部门数据 + /// + [ResourceDescription(nameof(Ln.指定部门数据))] + SpecificDept = 5 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Enums/Sys/MenuTypes.cs b/src/backend/NetAdmin.Domain/Enums/Sys/MenuTypes.cs new file mode 100644 index 00000000..70f22274 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Enums/Sys/MenuTypes.cs @@ -0,0 +1,38 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 菜单类型 +/// +[Export] +public enum MenuTypes +{ + /// + /// 菜单 + /// + [ResourceDescription(nameof(Ln.菜单))] + Menu = 1 + + , + + /// + /// 链接 + /// + [ResourceDescription(nameof(Ln.链接))] + Link = 2 + + , + + /// + /// 框架 + /// + [ResourceDescription(nameof(Ln.框架))] + Iframe = 3 + + , + + /// + /// 按钮 + /// + [ResourceDescription(nameof(Ln.按钮))] + Button = 4 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeDeviceTypes.cs b/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeDeviceTypes.cs new file mode 100644 index 00000000..18563bc0 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeDeviceTypes.cs @@ -0,0 +1,21 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 验证码目标设备类型 +/// +public enum VerifyCodeDeviceTypes +{ + /// + /// 手机 + /// + [ResourceDescription(nameof(Ln.手机))] + Mobile = 1 + + , + + /// + /// 电子邮箱 + /// + [ResourceDescription(nameof(Ln.电子邮箱))] + Email = 2 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeStatues.cs b/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeStatues.cs new file mode 100644 index 00000000..ef7a0941 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeStatues.cs @@ -0,0 +1,37 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 验证码状态 +/// +public enum VerifyCodeStatues +{ + /// + /// 等待发送 + /// + [ResourceDescription(nameof(Ln.等待发送))] + Waiting = 1 + + , + + /// + /// 已发送 + /// + [ResourceDescription(nameof(Ln.已发送))] + Sent = 2 + + , + + /// + /// 发送失败 + /// + [ResourceDescription(nameof(Ln.发送失败))] + Failed = 3 + + , + + /// + /// 已校验 + /// + [ResourceDescription(nameof(Ln.已校验))] + Verified = 4 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeTypes.cs b/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeTypes.cs new file mode 100644 index 00000000..a30fa9c2 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Enums/Sys/VerifyCodeTypes.cs @@ -0,0 +1,46 @@ +namespace NetAdmin.Domain.Enums.Sys; + +/// +/// 验证码类型 +/// +[Export] +public enum VerifyCodeTypes +{ + /// + /// 绑定手机号 + /// + [ResourceDescription(nameof(Ln.绑定手机号))] + LinkMobile = 1 + + , + + /// + /// 登录 + /// + [ResourceDescription(nameof(Ln.登录))] + Login = 2 + + , + + /// + /// 解绑手机号 + /// + [ResourceDescription(nameof(Ln.解绑手机号))] + UnlinkMobile = 3 + + , + + /// + /// 注册 + /// + [ResourceDescription(nameof(Ln.注册))] + Register = 4 + + , + + /// + /// 重设密码 + /// + [ResourceDescription(nameof(Ln.重设密码))] + ResetPassword = 5 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/IEventSourceGeneric.cs b/src/backend/NetAdmin.Domain/Events/IEventSourceGeneric.cs new file mode 100644 index 00000000..b784b80b --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/IEventSourceGeneric.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Domain.Events; + +/// +/// 泛型事件源接口 +/// +public interface IEventSourceGeneric : IEventSource +{ + /// + /// 事件承载(携带)数据 + /// + T Data { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs b/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs new file mode 100644 index 00000000..aeaa9dc3 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/SqlCommandAfterEvent.cs @@ -0,0 +1,28 @@ +namespace NetAdmin.Domain.Events; + +/// +/// Sql命令执行后事件 +/// +public sealed record SqlCommandAfterEvent : SqlCommandBeforeEvent +{ + /// + /// Initializes a new instance of the class. + /// + public SqlCommandAfterEvent(CommandAfterEventArgs e) // + : base(e) + { + ElapsedMicroseconds = (long)((double)e.ElapsedTicks / Stopwatch.Frequency * 1_000_000); + EventId = nameof(SqlCommandAfterEvent); + } + + /// + /// 耗时(单位:微秒) + /// + public long ElapsedMicroseconds { get; set; } + + /// + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, "SQL-{0}: {2} us {1}", Id, Sql, ElapsedMicroseconds); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/SqlCommandBeforeEvent.cs b/src/backend/NetAdmin.Domain/Events/SqlCommandBeforeEvent.cs new file mode 100644 index 00000000..5a96632a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/SqlCommandBeforeEvent.cs @@ -0,0 +1,24 @@ +namespace NetAdmin.Domain.Events; + +/// +/// Sql命令执行前事件 +/// +public record SqlCommandBeforeEvent : SqlCommandEvent +{ + /// + /// Initializes a new instance of the class. + /// + public SqlCommandBeforeEvent(CommandBeforeEventArgs e) + { + Identifier = e.Identifier; + Sql = e.Command.ParameterFormat().RemoveWrapped(); + EventId = nameof(SqlCommandBeforeEvent); + CreatedTime = DateTime.Now; + } + + /// + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, "SQL-{0}: Executing...", Id); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/SqlCommandEvent.cs b/src/backend/NetAdmin.Domain/Events/SqlCommandEvent.cs new file mode 100644 index 00000000..2e2aa63a --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/SqlCommandEvent.cs @@ -0,0 +1,45 @@ +namespace NetAdmin.Domain.Events; + +/// +/// Sql命令事件 +/// +public record SqlCommandEvent : DataAbstraction, IEventSource +{ + /// + /// 标识符缩写 + /// + public string Id => Identifier.ToString()[..8].ToUpperInvariant(); + + /// + /// 取消任务 Token + /// + /// + /// 用于取消本次消息处理 + /// + public CancellationToken CancellationToken { get; init; } + + /// + /// 事件创建时间 + /// + public DateTime CreatedTime { get; protected init; } + + /// + /// 事件 Id + /// + public string EventId { get; protected init; } + + /// + /// 标识符,可将 CommandBefore 与 CommandAfter 进行匹配 + /// + public Guid Identifier { get; protected init; } + + /// + /// 事件承载(携带)数据 + /// + public object Payload { get; init; } + + /// + /// 关联的Sql语句 + /// + public string Sql { get; protected init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/SyncStructureAfterEvent.cs b/src/backend/NetAdmin.Domain/Events/SyncStructureAfterEvent.cs new file mode 100644 index 00000000..383c03d8 --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/SyncStructureAfterEvent.cs @@ -0,0 +1,23 @@ +namespace NetAdmin.Domain.Events; + +/// +/// 同步数据库结构之后事件 +/// +public sealed record SyncStructureAfterEvent : SyncStructureBeforeEvent +{ + /// + /// Initializes a new instance of the class. + /// + public SyncStructureAfterEvent(SyncStructureBeforeEventArgs e) // + : base(e) + { + EventId = nameof(SyncStructureAfterEvent); + } + + /// + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, "{0}: {1}: {2}", Id, Ln.数据库结构同步完成 + , string.Join(',', EntityTypes.Select(x => x.Name))); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/SyncStructureBeforeEvent.cs b/src/backend/NetAdmin.Domain/Events/SyncStructureBeforeEvent.cs new file mode 100644 index 00000000..8a1012af --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/SyncStructureBeforeEvent.cs @@ -0,0 +1,29 @@ +namespace NetAdmin.Domain.Events; + +/// +/// 同步数据库结构之前事件 +/// +public record SyncStructureBeforeEvent : SqlCommandEvent +{ + /// + /// Initializes a new instance of the class. + /// + public SyncStructureBeforeEvent(SyncStructureBeforeEventArgs e) + { + Identifier = e.Identifier; + EventId = nameof(SyncStructureBeforeEvent); + CreatedTime = DateTime.Now; + EntityTypes = e.EntityTypes; + } + + /// + /// 实体类型 + /// + public Type[] EntityTypes { get; } + + /// + public override string ToString() + { + return string.Format(CultureInfo.InvariantCulture, "{0}: {1}", Id, Ln.数据库同步开始); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/Sys/RequestLogEvent.cs b/src/backend/NetAdmin.Domain/Events/Sys/RequestLogEvent.cs new file mode 100644 index 00000000..f4ccb49d --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/Sys/RequestLogEvent.cs @@ -0,0 +1,45 @@ +using NetAdmin.Domain.Dto.Sys.RequestLog; + +namespace NetAdmin.Domain.Events.Sys; + +/// +/// 请求日志事件 +/// +public sealed record RequestLogEvent : DataAbstraction, IEventSourceGeneric +{ + /// + /// Initializes a new instance of the class. + /// + public RequestLogEvent(CreateRequestLogReq data) + { + Data = data; + } + + /// + /// 取消任务 Token + /// + /// + /// 用于取消本次消息处理 + /// + public CancellationToken CancellationToken { get; } + + /// + /// 事件创建时间 + /// + public DateTime CreatedTime { get; } + + /// + /// 事件承载(携带)数据 + /// + public CreateRequestLogReq Data { get; } + + /// + /// 事件 Id + /// + public string EventId => nameof(RequestLogEvent); + + /// + /// 事件承载(携带)数据 + /// + public object Payload { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/Sys/UserUpdatedEvent.cs b/src/backend/NetAdmin.Domain/Events/Sys/UserUpdatedEvent.cs new file mode 100644 index 00000000..12ffe2dc --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/Sys/UserUpdatedEvent.cs @@ -0,0 +1,45 @@ +using NetAdmin.Domain.Dto.Sys.User; + +namespace NetAdmin.Domain.Events.Sys; + +/// +/// 用户被更新事件 +/// +public sealed record UserUpdatedEvent : DataAbstraction, IEventSourceGeneric +{ + /// + /// Initializes a new instance of the class. + /// + public UserUpdatedEvent(UserInfoRsp data) + { + Data = data; + } + + /// + /// 取消任务 Token + /// + /// + /// 用于取消本次消息处理 + /// + public CancellationToken CancellationToken { get; } + + /// + /// 事件创建时间 + /// + public DateTime CreatedTime { get; } + + /// + /// 事件承载(携带)数据 + /// + public UserInfoRsp Data { get; } + + /// + /// 事件 Id + /// + public string EventId => nameof(UserUpdatedEvent); + + /// + /// 事件承载(携带)数据 + /// + public object Payload { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/Events/Sys/VerifyCodeCreatedEvent.cs b/src/backend/NetAdmin.Domain/Events/Sys/VerifyCodeCreatedEvent.cs new file mode 100644 index 00000000..42c8e26b --- /dev/null +++ b/src/backend/NetAdmin.Domain/Events/Sys/VerifyCodeCreatedEvent.cs @@ -0,0 +1,45 @@ +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.Domain.Events.Sys; + +/// +/// 验证码创建事件 +/// +public sealed record VerifyCodeCreatedEvent : DataAbstraction, IEventSourceGeneric +{ + /// + /// Initializes a new instance of the class. + /// + public VerifyCodeCreatedEvent(QueryVerifyCodeRsp data) + { + Data = data; + } + + /// + /// 取消任务 Token + /// + /// + /// 用于取消本次消息处理 + /// + public CancellationToken CancellationToken { get; } + + /// + /// 事件创建时间 + /// + public DateTime CreatedTime { get; } + + /// + /// 事件承载(携带)数据 + /// + public QueryVerifyCodeRsp Data { get; } + + /// + /// 事件 Id + /// + public string EventId => nameof(VerifyCodeCreatedEvent); + + /// + /// 事件承载(携带)数据 + /// + public object Payload { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj b/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj new file mode 100644 index 00000000..2a10724d --- /dev/null +++ b/src/backend/NetAdmin.Domain/NetAdmin.Domain.csproj @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Attributes/RemoveNullNodeAttribute.cs b/src/backend/NetAdmin.Host/Attributes/RemoveNullNodeAttribute.cs new file mode 100644 index 00000000..6953cb25 --- /dev/null +++ b/src/backend/NetAdmin.Host/Attributes/RemoveNullNodeAttribute.cs @@ -0,0 +1,7 @@ +namespace NetAdmin.Host.Attributes; + +/// +/// 标记一个Action,其响应的json结果会被删除值为null的节点 +/// +[AttributeUsage(AttributeTargets.Method)] +public sealed class RemoveNullNodeAttribute : Attribute { } \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Attributes/TransactionAttribute.cs b/src/backend/NetAdmin.Host/Attributes/TransactionAttribute.cs new file mode 100644 index 00000000..2c74403d --- /dev/null +++ b/src/backend/NetAdmin.Host/Attributes/TransactionAttribute.cs @@ -0,0 +1,41 @@ +namespace NetAdmin.Host.Attributes; + +/// +/// 标记一个Action启用事务 +/// +[AttributeUsage(AttributeTargets.Method)] +public sealed class TransactionAttribute : Attribute +{ + /// + /// Initializes a new instance of the class. + /// + public TransactionAttribute() { } + + /// + /// Initializes a new instance of the class. + /// + public TransactionAttribute(Propagation propagation) // + : this(null, propagation) { } + + /// + /// Initializes a new instance of the class. + /// + public TransactionAttribute(IsolationLevel isolationLevel, Propagation propagation) // + : this(new IsolationLevel?(isolationLevel), propagation) { } + + private TransactionAttribute(IsolationLevel? isolationLevel, Propagation propagation) + { + IsolationLevel = isolationLevel; + Propagation = propagation; + } + + /// + /// 事务隔离级别 + /// + public IsolationLevel? IsolationLevel { get; } + + /// + /// 事务传播方式 + /// + public Propagation Propagation { get; } = Propagation.Required; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs b/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs new file mode 100644 index 00000000..9ffc9343 --- /dev/null +++ b/src/backend/NetAdmin.Host/BackgroundRunning/WorkBase.cs @@ -0,0 +1,72 @@ +using RedLockNet; + +namespace NetAdmin.Host.BackgroundRunning; + +/// +/// 工作基类 +/// +public abstract class WorkBase +{ + private readonly RedLocker _redLocker; + + /// + /// Initializes a new instance of the class. + /// + protected WorkBase() + { + ServiceProvider = App.GetService().CreateScope().ServiceProvider; + _redLocker = ServiceProvider.GetService(); + UowManager = ServiceProvider.GetService(); + Logger = ServiceProvider.GetService>(); + } + + /// + /// 日志记录器 + /// + protected ILogger Logger { get; } + + /// + /// 服务提供器 + /// + protected IServiceProvider ServiceProvider { get; } + + /// + /// 事务单元管理器 + /// + protected UnitOfWorkManager UowManager { get; } + + /// + /// 获取锁 + /// + protected Task GetLockerAsync(string lockId) + { + return _redLocker.RedlockFactory.CreateLockAsync(lockId, TimeSpan.FromSeconds(Numbers.RED_LOCK_EXPIRY_TIME_SECS) + , TimeSpan.FromSeconds(Numbers.RED_LOCK_WAIT_TIME_SECS) + , TimeSpan.FromSeconds(Numbers.RED_LOCK_RETRY_TIME_SECS)); + } + + /// + /// 通用工作流 + /// + protected abstract ValueTask WorkflowAsync(CancellationToken cancelToken); + + /// + /// 通用工作流 + /// + /// 加锁失败异常 + protected virtual async ValueTask WorkflowAsync(bool singleInstance, CancellationToken cancelToken) + { + if (singleInstance) { + // 加锁 + await using var redLock = await GetLockerAsync(GetType().FullName); + if (!redLock.IsAcquired) { + throw new NetAdminGetLockerException(); + } + + await WorkflowAsync(cancelToken); + return; + } + + await WorkflowAsync(cancelToken); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs b/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs new file mode 100644 index 00000000..a5f3dac8 --- /dev/null +++ b/src/backend/NetAdmin.Host/Controllers/ControllerBase.cs @@ -0,0 +1,25 @@ +using NetAdmin.Application.Services; +using NetAdmin.Cache; + +namespace NetAdmin.Host.Controllers; + +/// +/// 控制器基类 +/// +public abstract class ControllerBase : IDynamicApiController + where TCache : ICache // + where TService : IService +{ + /// + /// Initializes a new instance of the class. + /// + protected ControllerBase(TCache cache) + { + Cache = cache; + } + + /// + /// 关联的缓存 + /// + protected TCache Cache { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Controllers/HealthController.cs b/src/backend/NetAdmin.Host/Controllers/HealthController.cs new file mode 100644 index 00000000..688c2db9 --- /dev/null +++ b/src/backend/NetAdmin.Host/Controllers/HealthController.cs @@ -0,0 +1,29 @@ +using NetAdmin.Application.Services; +using NetAdmin.Cache; + +namespace NetAdmin.Host.Controllers; + +/// +/// 健康控制器 +/// +[ApiDescriptionSettings("Health")] +public sealed class HealthController : ControllerBase, IService> +{ + /// + /// Initializes a new instance of the class. + /// + public HealthController(ICache cache) // + : base(cache) { } + + /// + /// 健康检查 + /// + [AllowAnonymous] + [HttpGet] + #pragma warning disable CA1822, S3400 + public string Check() + #pragma warning restore S3400, CA1822 + { + return Global.ProductVersion; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs b/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs new file mode 100644 index 00000000..53aeb343 --- /dev/null +++ b/src/backend/NetAdmin.Host/Extensions/HttpContextExtensions.cs @@ -0,0 +1,34 @@ +namespace NetAdmin.Host.Extensions; + +/// +/// HttpContext 扩展方法 +/// +public static class HttpContextExtensions +{ + private static readonly Regex _nullRegex = new("\"[^\"]+?\":null,?", RegexOptions.Compiled); + + /// + /// 删除 response json body 中value 为null的节点 + /// + public static async Task RemoveJsonNodeWithNullValueAsync(this HttpContext me) + { + // 非json格式,退出 + if (!(me.Response.ContentType?.Contains(Chars.FLG_APPLICATION_JSON) ?? false)) { + return; + } + + // 流不可读,退出 + if (!me.Response.Body.CanSeek || !me.Response.Body.CanRead || !me.Response.Body.CanWrite) { + return; + } + + _ = me.Response.Body.Seek(0, SeekOrigin.Begin); + var sr = new StreamReader(me.Response.Body); + var bodyString = await sr.ReadToEndAsync(); + bodyString = _nullRegex.Replace(bodyString, string.Empty).Replace(",}", "}"); + _ = me.Response.Body.Seek(0, SeekOrigin.Begin); + var bytes = Encoding.UTF8.GetBytes(bodyString); + me.Response.Body.SetLength(bytes.Length); + await me.Response.Body.WriteAsync(bytes); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs b/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs new file mode 100644 index 00000000..094c5437 --- /dev/null +++ b/src/backend/NetAdmin.Host/Extensions/IApplicationBuilderExtensions.cs @@ -0,0 +1,54 @@ +using IGeekFan.AspNetCore.Knife4jUI; +using Microsoft.AspNetCore.HttpOverrides; +using Prometheus; + +namespace NetAdmin.Host.Extensions; + +/// +/// ApplicationBuilder对象 扩展方法 +/// +[SuppressSniffer] + +// ReSharper disable once InconsistentNaming +public static class IApplicationBuilderExtensions +{ + /// + /// 执行匹配的端点 + /// + public static IApplicationBuilder UseEndpoints(this IApplicationBuilder me) + { + _ = me.UseEndpoints(endpoints => { + _ = endpoints.MapControllers(); + _ = endpoints.MapMetrics(); + }); + return me; + } + + /// + /// 使用 api skin (knife4j-vue) + /// + public static IApplicationBuilder UseOpenApiSkin(this IApplicationBuilder me) + { + _ = me.UseKnife4UI(options => { + options.RoutePrefix = string.Empty; // 配置 Knife4UI 路由地址 + foreach (var groupInfo in SpecificationDocumentBuilder.GetOpenApiGroups()) { + options.SwaggerEndpoint($"/{groupInfo.RouteTemplate}", groupInfo.Title); + } + }); + + return me; + } + + /// + /// 获取客户端真实Ip + /// + public static IApplicationBuilder UseRealIp(this IApplicationBuilder me) + { + _ = me.UseForwardedHeaders(new ForwardedHeadersOptions // + { + ForwardedHeaders = ForwardedHeaders.XForwardedFor | + ForwardedHeaders.XForwardedProto + }); + return me; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Extensions/IMvcBuilderExtensions.cs b/src/backend/NetAdmin.Host/Extensions/IMvcBuilderExtensions.cs new file mode 100644 index 00000000..442ec8cf --- /dev/null +++ b/src/backend/NetAdmin.Host/Extensions/IMvcBuilderExtensions.cs @@ -0,0 +1,115 @@ +using NetAdmin.Host.Filters; +using NetAdmin.Host.Utils; + +namespace NetAdmin.Host.Extensions; + +/// +/// IMvcBuilder 扩展方法 +/// +[SuppressSniffer] + +// ReSharper disable once InconsistentNaming +public static class IMvcBuilderExtensions +{ + /// + /// api结果处理器 + /// + public static IMvcBuilder AddDefaultApiResultHandler(this IMvcBuilder me) + { + return me.AddInjectWithUnifyResult(injectOptions => { + injectOptions.ConfigureSwaggerGen( + genOptions => { + // 替换自定义的EnumSchemaFilter,支持多语言Resx资源 (需将SpecificationDocumentSettings.EnableEnumSchemaFilter配置为false) + genOptions + .SchemaFilter< + SwaggerEnumSchemaFixer>(); + + // 将程序集版本号与OpenApi版本号同步 + foreach (var doc in genOptions + .SwaggerGeneratorOptions + .SwaggerDocs) { + doc.Value.Version + = FileVersionInfo + .GetVersionInfo( + Assembly + .GetEntryAssembly()! + .Location) + .ProductVersion; + } + }); + }); + } + + /// + /// Json序列化配置 + /// + /// + /// 正反序列化规则: + /// object->json: + /// 1、值为 null 或 default 的节点将被忽略 + /// 2、值为 "" 的节点将被忽略。 + /// 3、值为 [] 的节点将被忽略。 + /// 4、节点名:大驼峰转小驼峰 + /// 5、不转义除对json结构具有破坏性(如")以外的任何字符 + /// 6、大数字原样输出(不加引号),由前端处理js大数兼容问题 + /// json->object: + /// 1、允许带注释的json(自动忽略) + /// 2、允许尾随逗号 + /// 3、节点名大小写不敏感 + /// 4、允许带双引号的数字 + /// 5、值为"" 转 null + /// 6、值为[] 转 null + /// + public static IMvcBuilder AddJsonSerializer(this IMvcBuilder me, bool enumToString = false) + { + return me.AddJsonOptions(options => { + ////////////////////////////// json -> object + + // 允许带注释 + options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip; + + // 允许尾随逗号 + options.JsonSerializerOptions.AllowTrailingCommas = true; + + // 允许数字带双引号 + options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; + + // 大小写不敏感 + options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; + + // 允许读取引号包围的数字 + options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString; + + ///////////////////////////// object -> json + + // 转小驼峰 + options.JsonSerializerOptions.DictionaryKeyPolicy = JsonNamingPolicy.CamelCase; + options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; + + // 不严格转义 + options.JsonSerializerOptions.Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping; + + // 写入时,忽略null、default + options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; + + ////////////////////////////// object <-> json + + // "" 转 null 双向 + options.JsonSerializerOptions.Converters.Add(new ToNullIfEmptyStringConverter()); + + // [] 转 null 双向 + options.JsonSerializerOptions.TypeInfoResolver = new CollectionJsonTypeInfoResolver(); + + // 日期格式 2023-01-18 20:02:12 + _ = options.JsonSerializerOptions.Converters.AddDateTimeTypeConverters(Chars.TPL_DATE_YYYY_MM_DD_HH_MM_SS); + + // object->json 枚举显名 而非数字 ,json->object 可以枚举名 也可以数值 + if (enumToString) { + options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter(JsonNamingPolicy.CamelCase)); + } + + // 快捷访问方式 + Global.JsonSerializerOptions = options.JsonSerializerOptions; + }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Extensions/ResourceExecutingContextExtensions.cs b/src/backend/NetAdmin.Host/Extensions/ResourceExecutingContextExtensions.cs new file mode 100644 index 00000000..3d5c1a79 --- /dev/null +++ b/src/backend/NetAdmin.Host/Extensions/ResourceExecutingContextExtensions.cs @@ -0,0 +1,19 @@ +using NetAdmin.Domain.Dto; + +namespace NetAdmin.Host.Extensions; + +/// +/// ResourceExecutingContextExtensions +/// +public static class ResourceExecutingContextExtensions +{ + /// + /// 设置失败结果 + /// + public static void SetFailResult(this ResourceExecutingContext me, ErrorCodes errorCode, string errorMsg = null) + where T : RestfulInfo, new() + { + me.Result = new JsonResult(new T { Code = errorCode, Msg = errorMsg }); + me.HttpContext.Response.StatusCode = Numbers.HTTP_STATUS_BIZ_FAIL; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs b/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..7d8c9fa7 --- /dev/null +++ b/src/backend/NetAdmin.Host/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,269 @@ +using Furion.Logging; +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.Events; +using NetAdmin.Host.Filters; +using NetAdmin.Host.Utils; +using Spectre.Console; +using StackExchange.Redis; +using Yitter.IdGenerator; +using FreeSqlBuilder = NetAdmin.Infrastructure.Utils.FreeSqlBuilder; + +namespace NetAdmin.Host.Extensions; + +/// +/// ServiceCollection 扩展方法 +/// +[SuppressSniffer] +public static class ServiceCollectionExtensions +{ + private const int _CONSOLE_LINE_LEN_LIMIT = 4096; + + private static readonly Dictionary _consoleColors // + = new() { + { + new Regex( // + @"(\d{2,}\.\d+ ?ms)", RegexOptions.Compiled) + , $"[{nameof(ConsoleColor.Magenta)}]$1[/]" + } + , { + new Regex( // + "(Tb[a-zA-Z0-9]+)", RegexOptions.Compiled) + , $"[{nameof(ConsoleColor.Cyan)}]$1[/]" + } + , { + new Regex( // + "(INSERT) ", RegexOptions.Compiled) + , $"[{nameof(ConsoleColor.Blue)}]$1[/] " + } + , { + new Regex( // + "(SELECT) ", RegexOptions.Compiled) + , $"[{nameof(ConsoleColor.Green)}]$1[/] " + } + , { + new Regex( // + "(UPDATE) ", RegexOptions.Compiled) + , $"[{nameof(ConsoleColor.Yellow)}]$1[/] " + } + , { + new Regex( // + "(DELETE) ", RegexOptions.Compiled) + , $"[{nameof(ConsoleColor.Red)}]$1[/] " + } + , { + new Regex( // + "()", RegexOptions.Compiled) + , $"[underline {nameof(ConsoleColor.Gray)}]$1[/] " + } + , { + new Regex( // + "(ResponseBody)", RegexOptions.Compiled) + , $"[underline {nameof(ConsoleColor.Cyan)}]$1[/] " + } + , { + new Regex( // + "(RequestBody)", RegexOptions.Compiled) + , $"[underline {nameof(ConsoleColor.Magenta)}]$1[/] " + } + , { + new Regex( // + @"(\[\[dbo\]\]\.)(\[\[.+?\]\]) ", RegexOptions.Compiled) + , $"$1[{nameof(ConsoleColor.Magenta)}]$2[/] " + } + }; + + /// + /// 扫描程序集中继承自IConfigurableOptions的选项,注册 + /// + public static IServiceCollection AddAllOptions( // + this IServiceCollection me) + { + var optionsTypes + = from type in App.EffectiveTypes.Where(x => !x.IsAbstract && !x.FullName!.Contains(nameof(Furion)) && + x.GetInterfaces().Contains(typeof(IConfigurableOptions))) + select type; + + var sbLog = new StringBuilder(); + foreach (var type in optionsTypes) { + var configureMethod = typeof(ConfigurableOptionsServiceCollectionExtensions).GetMethod( + nameof(ConfigurableOptionsServiceCollectionExtensions.AddConfigurableOptions) + , BindingFlags.Public | BindingFlags.Static, new[] { typeof(IServiceCollection) }); + _ = configureMethod!.MakeGenericMethod(type).Invoke(me, new object[] { me }); + _ = sbLog.Append(CultureInfo.InvariantCulture, $", {type.Name}"); + } + + LogHelper.Get()?.Info($"{nameof(IConfigurableOptions)} {Ln.初始化完毕} {sbLog}"); + return me; + } + + /// + /// 注册控制台日志模板 + /// + public static IServiceCollection AddConsoleFormatter(this IServiceCollection me) + { + static (string Date, string LogName, string LogFormat) ParseMessage(LogMessage message, bool showColor) + { + var date = message.LogDateTime.ToString(Chars.TPL_DATE_HH_MM_SS_FFFFFF, CultureInfo.InvariantCulture); + var logName = message.LogName.PadRight(64, ' ')[^64..]; + var format = showColor + ? $"[{nameof(ConsoleColor.Gray)}][[{{0}} {{1}} {{2,-{64}}} #{{3,4}}]][/] {{4}}" + : $"[{{0}} {{1}} {{2,-{64}}} #{{3,4}}] {{4}}"; + + return (date, logName, format); + } + + return me.AddConsoleFormatter(options => { + var logLevels = Enum.GetValues(typeof(LogLevels)) + .Cast() + .ToDictionary(x => x, x => x.GetDisplay()); + + if (App.WebHostEnvironment.IsDevelopment()) { + static void MarkupLine(string msg, LogMessage message + , IReadOnlyDictionary logLevels) + { + // 日志过长 + if (msg.Length > _CONSOLE_LINE_LEN_LIMIT) { + msg = $"{Ln.日志长度超过限制} {_CONSOLE_LINE_LEN_LIMIT}"; + } + + msg = _consoleColors.Aggregate( // + msg, (current, regex) => regex.Key.Replace(current, regex.Value)); + msg = msg.ReplaceLineEndings(string.Empty); + var colorName = logLevels[(LogLevels)message.LogLevel].Name!; + var (date, logName, logFormat) = ParseMessage(message, true); + AnsiConsole.MarkupLine( // + CultureInfo.InvariantCulture, logFormat, date, colorName, logName, message.ThreadId, msg); + } + + options.WriteHandler = (message, _, _, _, _) => { + MarkupLine(message.Message.EscapeMarkup(), message, logLevels); + if (message.Exception != null) { + MarkupLine(message.Exception.ToString().EscapeMarkup(), message, logLevels); + } + }; + } + else { + options.WriteHandler = (message, _, _, _, _) => { + var msg = message.Message.ReplaceLineEndings(string.Empty); + var (date, logName, logFormat) = ParseMessage(message, false); + Console.WriteLine( // + logFormat, date, logLevels[(LogLevels)message.LogLevel].ShortName, logName, message.ThreadId + , msg); + }; + } + }); + } + + /// + /// 注册上下文用户 + /// + public static IServiceCollection AddContextUser(this IServiceCollection me) + { + _ = me.AddScoped(typeof(ContextUserToken), _ => ContextUserToken.Create()); + _ = me.AddScoped(typeof(ContextUserInfo), _ => ContextUserInfo.Create()); + + return me; + } + + /// + /// 注册事件总线 + /// + public static IServiceCollection AddEventBus(this IServiceCollection me) + { + _ = me.AddEventBus(builder => builder.AddSubscribers(App.Assemblies.ToArray())); + return me; + } + + /// + /// 注册freeSql orm工具 + /// + public static IServiceCollection AddFreeSql( // + this IServiceCollection me, FreeSqlInitOptions initOptions = FreeSqlInitOptions.None + , Action freeSqlConfig = null) + { + // 非调试模式下禁止同步数据库 + #if !DEBUG + initOptions = FreeSqlInitOptions.None; + #endif + var freeSql = new FreeSqlBuilder(App.GetOptions()).Build(initOptions); + _ = me.AddSingleton(freeSql); + + var sqlAuditor = App.GetService(); + + freeSql.Aop.AuditValue += sqlAuditor.DataAuditHandler; // Insert/Update自动值处理 + + // AOP事件发布(异步) + freeSql.Aop.CommandBefore + += (_, e) => App.GetService().PublishAsync(new SqlCommandBeforeEvent(e)); // 增删查改,执行命令之前触发 + freeSql.Aop.CommandAfter + += (_, e) => App.GetService().PublishAsync(new SqlCommandAfterEvent(e)); // 增删查改,执行命令完成后触发 + + freeSql.Aop.SyncStructureBefore += (_, e) => + App.GetService().PublishAsync(new SyncStructureBeforeEvent(e)); // CodeFirst迁移,执行之前触发 + + freeSql.Aop.SyncStructureAfter += (_, e) => + App.GetService().PublishAsync(new SyncStructureAfterEvent(e)); // CodeFirst迁移,执行完成触发 + + // 全局过滤器设置 + freeSqlConfig?.Invoke(freeSql); + + _ = me.AddScoped(); // 注入工作单元管理器 + _ = me.AddFreeRepository(null, App.Assemblies.ToArray()); // 批量注入 Repository + _ = me.AddMvcFilter(); // 注入事务拦截器 + + return me; + } + + /// + /// 注册内存缓存 + /// + public static IServiceCollection AddMemCache(this IServiceCollection me) + { + _ = me.AddMemoryCache(options => options.TrackStatistics = true); + return me; + } + + /// + /// OpenTelemetry数据监控 + /// + public static IServiceCollection AddOpenTelemetryNet(this IServiceCollection me) + { + // _ = me.AddOpenTelemetry() + // .WithMetrics(builder => builder.AddAspNetCoreInstrumentation() + // .AddHttpClientInstrumentation() + // .AddRuntimeInstrumentation() + // .AddProcessInstrumentation() + // .AddPrometheusExporter()); + return me; + } + + /// + /// 注册Redis缓存 + /// + public static IServiceCollection AddRedisCache(this IServiceCollection me) + { + var redisOptions = App.GetOptions() + .Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE); + + // IDistributedCache 分布式缓存通用接口 + _ = me.AddStackExchangeRedisCache(options => { + // 连接字符串 + options.Configuration = redisOptions.ConnStr; + }); + + // Redis原生接口 + _ = me.AddSingleton(ConnectionMultiplexer.Connect(redisOptions.ConnStr)); + return me; + } + + /// + /// 注册雪花编号生成器 + /// + public static IServiceCollection AddSnowflake(this IServiceCollection me) + { + // 雪花漂移算法 + var idGeneratorOptions = new IdGeneratorOptions(); + YitIdHelper.SetIdGenerator(idGeneratorOptions); + return me; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Extensions/UnitOfWorkManagerExtensions.cs b/src/backend/NetAdmin.Host/Extensions/UnitOfWorkManagerExtensions.cs new file mode 100644 index 00000000..ebe32d28 --- /dev/null +++ b/src/backend/NetAdmin.Host/Extensions/UnitOfWorkManagerExtensions.cs @@ -0,0 +1,30 @@ +namespace NetAdmin.Host.Extensions; + +/// +/// 工作单元管理器扩展类 +/// +public static class UnitOfWorkManagerExtensions +{ + /// + /// 事务操作 + /// + public static async Task AtomicOperateAsync(this UnitOfWorkManager me, Func handle) + { + var logger = LogHelper.Get(); + using var unitOfWork = me.Begin(); + var hashCode = unitOfWork.GetHashCode(); + try { + #if DEBUG + logger?.Debug($"{Ln.开始事务}: {hashCode}"); + #endif + await handle(); + unitOfWork.Commit(); + logger?.Info($"{Ln.事务已提交}: {hashCode}"); + } + catch { + unitOfWork.Rollback(); + logger?.Error($"{Ln.事务已回滚}: {hashCode}"); + throw; + } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs b/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs new file mode 100644 index 00000000..84876d49 --- /dev/null +++ b/src/backend/NetAdmin.Host/Filters/ApiResultHandler.cs @@ -0,0 +1,99 @@ +using Furion.FriendlyException; +using NetAdmin.Domain.Dto; + +namespace NetAdmin.Host.Filters; + +/// +/// Api结果格式化处理器 +/// +/// +/// 约定: +/// 1、业务异常需要设置HttpStatusCode与成功请求区分,不要统一返回200( 为了方便前端调试:在浏览器F12中快速观察失败请求【红色高亮】) +/// 2、不得占用常见HttpStatusCode,例如4xx、5xx,以免与传输层错误混淆,干扰运维。 +/// 实现: +/// 1、本系统代码覆盖范围内占用4个HttpStatusCode:200(表示业务成功)、401(身份未确认)、403(权限不足)、900(其他所有业务异常) +/// 2、当HttpStatusCode为900时,通过子码(JsonBody里面的Code区分具体异常),同时将子码写入RspHeader中,方便日志系统快速筛选归类。 +/// 3、子码定义,见枚举 +/// +public abstract class ApiResultHandler + where T : RestfulInfo, new() +{ + /// + /// 发生异常 + /// + public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata) + { + var lineException = context.Exception switch { NetAdminException ex => ex, _ => null }; + var errorCode = lineException?.Code ?? ErrorCodes.Unhandled; + var result = RestfulResult(errorCode, metadata.Data, lineException?.Message ?? errorCode.ResDesc()); + + SetErrorCodeToHeader(context.HttpContext, errorCode); + + return new JsonResult(result) { StatusCode = Numbers.HTTP_STATUS_BIZ_FAIL }; + } + + /// + /// HTTP状态码处理 + /// + #pragma warning disable ASA001 + public Task OnResponseStatusCodes( // + HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null) + { + // 设置响应状态码 + UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings); + return Task.CompletedTask; + } + + /// + /// 请求成功 + /// + public IActionResult OnSucceeded(ActionExecutedContext _, object data) + { + return new JsonResult(RestfulResult(0, data)); + } + + /// + /// 校验失败 + /// + public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata) + { + SetErrorCodeToHeader(context.HttpContext, ErrorCodes.InvalidInput); + + return new JsonResult(RestfulResult(ErrorCodes.InvalidInput, metadata.Data + , GetValidationResult(metadata.ValidationResult))) { + StatusCode = Numbers.HTTP_STATUS_BIZ_FAIL + }; + } + + private static object GetValidationResult(object validationResult) + { + var startWithDollar = false; + try { + return validationResult is Dictionary dic + ? dic.ToDictionary( // + x => (startWithDollar = x.Key.StartsWith("$", StringComparison.InvariantCulture)) + ? x.Key[1..].TrimStart('.').NullOrEmpty(null) ?? throw new NetAdminInvalidInputException() + : x.Key, x => startWithDollar ? new[] { Ln.参数格式不正确 } : x.Value) + : validationResult; + } + catch (NetAdminInvalidInputException) { + return Ln.参数格式不正确; + } + } + + /// + /// 返回 RESTful 风格结果集 + /// + private static T RestfulResult(ErrorCodes errorCode, object data = default, object message = default) + { + return new T { Code = errorCode, Data = data, Msg = message }; + } + + /// + /// 写入错误码到HttpHeader + /// + private static void SetErrorCodeToHeader(HttpContext context, ErrorCodes errorCode) + { + context.Response.Headers[nameof(ErrorCodes)] = Enum.GetName(errorCode); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Filters/DefaultApiResultHandler.cs b/src/backend/NetAdmin.Host/Filters/DefaultApiResultHandler.cs new file mode 100644 index 00000000..77c31aa7 --- /dev/null +++ b/src/backend/NetAdmin.Host/Filters/DefaultApiResultHandler.cs @@ -0,0 +1,19 @@ +using NetAdmin.Domain.Dto; + +namespace NetAdmin.Host.Filters; + +/// +/// Api结果格式化处理器 +/// +/// +/// 约定: +/// 1、业务异常需要设置HttpStatusCode与成功请求区分,不要统一返回200( 为了方便前端调试:在浏览器F12中快速观察失败请求【红色高亮】) +/// 2、不得占用常见HttpStatusCode,例如4xx、5xx,以免与传输层错误混淆,干扰运维。 +/// 实现: +/// 1、本系统代码覆盖范围内占用4个HttpStatusCode:200(表示业务成功)、401(身份未确认)、403(权限不足)、900(其他所有业务异常) +/// 2、当HttpStatusCode为900时,通过子码(JsonBody里面的Code区分具体异常),同时将子码写入RspHeader中,方便日志系统快速筛选归类。 +/// 3、子码定义,见枚举 +/// +[SuppressSniffer] +[UnifyModel(typeof(RestfulInfo<>))] +public sealed class DefaultApiResultHandler : ApiResultHandler>, IUnifyResultProvider { } \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs b/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs new file mode 100644 index 00000000..70fa549f --- /dev/null +++ b/src/backend/NetAdmin.Host/Filters/GlobalExceptionHandler.cs @@ -0,0 +1,33 @@ +using Furion.FriendlyException; + +namespace NetAdmin.Host.Filters; + +/// +/// 全局捕异常 +/// +public sealed class GlobalExceptionHandler : IGlobalExceptionHandler, ISingleton +{ + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + public GlobalExceptionHandler(ILogger logger) + { + _logger = logger; + } + + /// + /// 异常拦截 + /// + public Task OnExceptionAsync(ExceptionContext context) + { + _logger.Error(context.Exception); + + // 将异常设置到HttpContext.Features中 以便中间件能获取到他 + context.HttpContext.Features.Set( + new ExceptionHandlerFeature { Error = context.Exception }); + + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Filters/TransactionInterceptor.cs b/src/backend/NetAdmin.Host/Filters/TransactionInterceptor.cs new file mode 100644 index 00000000..4865f325 --- /dev/null +++ b/src/backend/NetAdmin.Host/Filters/TransactionInterceptor.cs @@ -0,0 +1,41 @@ +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Extensions; + +namespace NetAdmin.Host.Filters; + +/// +/// 事务拦截器 +/// +[SuppressSniffer] +public sealed class TransactionInterceptor : IAsyncActionFilter +{ + private readonly UnitOfWorkManager _uowManager; + + /// + /// Initializes a new instance of the class. + /// 事务拦截器 + /// + public TransactionInterceptor(UnitOfWorkManager uowManager) + { + _uowManager = uowManager; + } + + /// + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + // 跳过没有事务特性标记的方法 + if (context.HttpContext.GetControllerActionDescriptor().MethodInfo.GetCustomAttribute() == + null) { + _ = await next(); + return; + } + + // 事务操作 + await _uowManager.AtomicOperateAsync(async () => { + var result = await next(); + if (result.Exception != null) { + throw result.Exception; + } + }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Middlewares/RemoveNullNodeMiddleware.cs b/src/backend/NetAdmin.Host/Middlewares/RemoveNullNodeMiddleware.cs new file mode 100644 index 00000000..301335b8 --- /dev/null +++ b/src/backend/NetAdmin.Host/Middlewares/RemoveNullNodeMiddleware.cs @@ -0,0 +1,34 @@ +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Extensions; + +namespace NetAdmin.Host.Middlewares; + +/// +/// 删除 response json body 中value 为null的节点 +/// +public sealed class RemoveNullNodeMiddleware +{ + private readonly RequestDelegate _next; + + /// + /// Initializes a new instance of the class. + /// + public RemoveNullNodeMiddleware(RequestDelegate next) + { + _next = next; + } + + /// + /// InvokeAsync + /// + public async Task InvokeAsync(HttpContext context) + { + await _next(context); + + if (context.GetMetadata() is null) { + return; + } + + await context.RemoveJsonNodeWithNullValueAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs b/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs new file mode 100644 index 00000000..b5552e6d --- /dev/null +++ b/src/backend/NetAdmin.Host/Middlewares/RequestAuditMiddleware.cs @@ -0,0 +1,72 @@ +using NetAdmin.Host.Utils; + +namespace NetAdmin.Host.Middlewares; + +/// +/// 请求审计中间件 +/// +/// +/// 放在所有中间件最前面 +/// +public sealed class RequestAuditMiddleware +{ + private readonly PathString _defaultRoutePrefix; + private readonly PathString _healthCheckRoutePrefix; + private readonly RequestDelegate _next; + private readonly RequestLogger _requestLogger; + + /// + /// Initializes a new instance of the class. + /// + public RequestAuditMiddleware( // + RequestDelegate next, IOptions dynamicApiControllerSettingsOptions + , RequestLogger requestLogger) + { + _next = next; + _requestLogger = requestLogger; + _defaultRoutePrefix = new PathString($"/{dynamicApiControllerSettingsOptions.Value.DefaultRoutePrefix}"); + _healthCheckRoutePrefix + = new PathString($"/{dynamicApiControllerSettingsOptions.Value.DefaultRoutePrefix}/health/check"); + } + + /// + /// InvokeAsync + /// + public async Task InvokeAsync(HttpContext context) + { + // 跳过处理的情况: + if (!context.Request.Path.StartsWithSegments(_defaultRoutePrefix) // 非api请求 + || context.Request.Path.StartsWithSegments(_healthCheckRoutePrefix) // 健康检查 + || context.Request.Method == Chars.FLG_HTTP_METHOD_OPTIONS) { // is options 请求 + await _next(context); + return; + } + + // Response.Body流默认是不可读的,将Response.Body流替换成MemoryStream 使其可读 + using var ms = new MemoryStream(); + var stream = context.Response.Body; + context.Response.Body = ms; + + // 在控制台上输出分割线,区分不同请求 + + // 调用下一个中间件 + var sw = Stopwatch.StartNew(); + await _next(context); + sw.Stop(); + + _ = ms.Seek(0, SeekOrigin.Begin); + using var sr = new StreamReader(ms); + var responseBody = await sr.ReadToEndAsync(); + _ = ms.Seek(0, SeekOrigin.Begin); + await ms.CopyToAsync(stream); + context.Response.Body = stream; + + var exception = context.Features.Get(); + var errorCode = context.Response.Headers[nameof(ErrorCodes)] // + .FirstOrDefault() + ?.Enum() ?? 0; + + _ = await _requestLogger.LogAsync(context, (long)sw.Elapsed.TotalMicroseconds, responseBody, errorCode + , exception); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/NetAdmin.Host.csproj b/src/backend/NetAdmin.Host/NetAdmin.Host.csproj new file mode 100644 index 00000000..706d4416 --- /dev/null +++ b/src/backend/NetAdmin.Host/NetAdmin.Host.csproj @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Startup.cs b/src/backend/NetAdmin.Host/Startup.cs new file mode 100644 index 00000000..b581124f --- /dev/null +++ b/src/backend/NetAdmin.Host/Startup.cs @@ -0,0 +1,34 @@ +using Spectre.Console; + +namespace NetAdmin.Host; + +/// +/// 启动类 +/// +public abstract class Startup : AppStartup +{ + /// + /// 打印Banner + /// + protected static void ShowBanner() + { + AnsiConsole.WriteLine(); + var gridInfo = new Grid().AddColumn(new GridColumn().NoWrap().PadRight(10)) + .AddColumn(new GridColumn().NoWrap()) + .Expand(); + foreach (var kv in ApplicationHelper.GetEnvironmentInfo()) { + _ = gridInfo.AddRow(kv.Key, kv.Value.ToString()!.EscapeMarkup()); + } + + var gridWrap = new Grid().AddColumn(); + var entryAssembly = Assembly.GetEntryAssembly(); + var assemblyName = entryAssembly!.GetName(); + foreach (var str in assemblyName.Name!.Split('.')) { + _ = gridWrap.AddRow(new FigletText(str).Color(Color.Green)); + } + + _ = gridWrap.AddRow(gridInfo); + AnsiConsole.Write(new Panel(gridWrap).Header(Global.ProductVersion).Expand()); + AnsiConsole.WriteLine(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Subscribers/SqlProfiler.cs b/src/backend/NetAdmin.Host/Subscribers/SqlProfiler.cs new file mode 100644 index 00000000..d2b73956 --- /dev/null +++ b/src/backend/NetAdmin.Host/Subscribers/SqlProfiler.cs @@ -0,0 +1,63 @@ +using NetAdmin.Domain.Events; + +namespace NetAdmin.Host.Subscribers; + +/// +/// Sql性能分析 +/// +public sealed class SqlProfiler : IEventSubscriber +{ + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + public SqlProfiler(ILogger logger) + { + _logger = logger; + } + + /// + /// Sql命令执行后 + /// + [EventSubscribe(nameof(SqlCommandAfterEvent))] + public Task CommandAfterAsync(EventHandlerExecutingContext context) + { + var source = context.Source as SqlCommandAfterEvent; + _logger.Info(source); + return Task.CompletedTask; + } + + /// + /// Sql命令执行前 + /// + [EventSubscribe(nameof(SqlCommandBeforeEvent))] + public Task CommandBeforeAsync(EventHandlerExecutingContext context) + { + var source = context.Source as SqlCommandBeforeEvent; + _logger.Debug(source); + return Task.CompletedTask; + } + + /// + /// 同步数据库结构之后 + /// + [EventSubscribe(nameof(SyncStructureAfterEvent))] + public Task SyncStructureAfterAsync(EventHandlerExecutingContext context) + { + var source = context.Source as SyncStructureAfterEvent; + _logger.Info(source); + return Task.CompletedTask; + } + + /// + /// 同步数据库结构之前 + /// + [EventSubscribe(nameof(SyncStructureBeforeEvent))] + public Task SyncStructureBeforeAsync(EventHandlerExecutingContext context) + { + var source = context.Source as SyncStructureBeforeEvent; + _logger.Info(source); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Utils/CollectionJsonTypeInfoResolver.cs b/src/backend/NetAdmin.Host/Utils/CollectionJsonTypeInfoResolver.cs new file mode 100644 index 00000000..dfd3e462 --- /dev/null +++ b/src/backend/NetAdmin.Host/Utils/CollectionJsonTypeInfoResolver.cs @@ -0,0 +1,92 @@ +namespace NetAdmin.Host.Utils; + +/// +/// 处理集合类型的Json解析器 +/// +public sealed class CollectionJsonTypeInfoResolver : DefaultJsonTypeInfoResolver +{ + /// + /// Initializes a new instance of the class. + /// + public CollectionJsonTypeInfoResolver() + { + Modifiers.Add(CollectionValueModifier); + } + + private static void CollectionValueModifier(JsonTypeInfo typeInfo) + { + foreach (var property in typeInfo.Properties) { + // 跳过非集合属性 + if (!property.PropertyType.GetInterfaces().Contains(typeof(IEnumerable))) { + continue; + } + + // 跳过字符串 + if (property.PropertyType == typeof(string)) { + continue; + } + + var memberName = GetMemberName(property); + + // object->json 只在count>0时返回其值,否则返回null + property.Get = PropertyGet(memberName); + + // json->object 时 为对象分配属性, 改为只在count>0分配 ,否则分配null,而不是分配[] + property.Set = PropertySet(memberName); + } + } + + private static string GetMemberName(JsonPropertyInfo property) + { + return property.GetType() + .GetRuntimeProperties() + .First(x => x.Name == "MemberName") + .GetValue(property) as string; + } + + /// + /// 这里处理子类new隐藏父类同名属性, 取得多个同名属性的问题 + /// + private static PropertyInfo GetNewProperty(string memberName, object obj) + { + return obj.GetType() + .GetProperties() + .Where(x => x.Name == memberName) + .First(x => x.DeclaringType == x.ReflectedType); + } + + /// + /// object->json 只在count>0时返回其值,否则返回null + /// + private static Func PropertyGet(string memberName) + { + return obj => { + object prop; + try { + prop = obj.GetType().GetProperty(memberName!)?.GetValue(obj); + } + catch (AmbiguousMatchException) { + // 这里处理子类new隐藏父类同名属性, 取得多个同名属性的问题 + prop = GetNewProperty(memberName, obj).GetValue(obj); + } + + return prop switch { string => prop, ICollection { Count: > 0 } => prop, _ => null }; + }; + } + + /// + /// json->object 时 为对象分配属性, 改为只在count>0分配 ,否则分配null,而不是分配[] + /// + private static Action PropertySet(string memberName) + { + return (obj, val) => { + val = val switch { string => val, ICollection { Count: > 0 } => val, _ => null }; + try { + obj.GetType().GetProperty(memberName!)?.SetValue(obj, val); + } + catch (AmbiguousMatchException) { + GetNewProperty(memberName, obj).SetValue(obj, val); + } + }; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Utils/RequestLogger.cs b/src/backend/NetAdmin.Host/Utils/RequestLogger.cs new file mode 100644 index 00000000..8c9a1913 --- /dev/null +++ b/src/backend/NetAdmin.Host/Utils/RequestLogger.cs @@ -0,0 +1,95 @@ +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.Dto.Sys.RequestLog; +using NetAdmin.Domain.Events.Sys; + +namespace NetAdmin.Host.Utils; + +/// +/// 请求日志记录器 +/// +public sealed class RequestLogger : ISingleton +{ + private static readonly string[] _textContentTypes = { "text", "json", "xml", "urlencoded" }; + private readonly IEventPublisher _eventPublisher; + private readonly ILogger _logger; + private readonly int _tokenPrefixLength; + + /// + /// Initializes a new instance of the class. + /// + public RequestLogger( // + ILogger logger + , IOptions specificationDocumentSettingsOptions + , IEventPublisher eventPublisher) + { + _logger = logger; + _eventPublisher = eventPublisher; + _tokenPrefixLength = specificationDocumentSettingsOptions?.Value.SecurityDefinitions?[0]?.Scheme?.Length + 1 ?? + 0; // eg. "Bearer " + } + + /// + /// 生成审计数据 + /// + public async Task LogAsync(HttpContext context, long duration, string responseBody + , ErrorCodes errorCode, IExceptionHandlerFeature exception) + { + // 从请求头中读取用户信息 + var associatedUser = GetAssociatedUser(context); + + var auditData = new CreateRequestLogReq { + Duration = duration + , Method = context.Request.Method + , ReferUrl = context.Request.GetRefererUrlAddress() + , RequestContentType = context.Request.ContentType + , RequestBody = Array.Exists( // + _textContentTypes + , x => context.Request.ContentType?.Contains( + x, StringComparison.OrdinalIgnoreCase) ?? false) + ? await context.ReadBodyContentAsync() + : string.Empty + , RequestUrl = context.Request.GetRequestUrlAddress() + , ResponseBody = responseBody + , ServerIp = context.GetLocalIpAddressToIPv4()?.IpV4ToInt32() + , ApiId = context.Request.Path.Value?.TrimStart('/') + , RequestHeaders = context.Request.Headers.ToJson() + , ResponseContentType = context.Response.ContentType + , ResponseHeaders = context.Response.Headers.ToJson() + , HttpStatusCode = context.Response.StatusCode + , ErrorCode = errorCode + , Exception = exception?.Error.ToString() + , CreatedUserId = associatedUser?.UserId + , CreatedUserName = associatedUser?.UserName + , CreatedUserAgent = context.Request.Headers.UserAgent.ToString() + , CreatedClientIp = context.GetRemoteIpAddressToIPv4()?.IpV4ToInt32() + }; + + // 打印日志 + _logger.Info(auditData); + + // 发布请求日志事件 + await _eventPublisher.PublishAsync(new RequestLogEvent(auditData)); + + return auditData; + } + + private (long UserId, string UserName)? GetAssociatedUser(HttpContext context) + { + var token = context.Request.Headers.Authorization.FirstOrDefault(); + if (token == null) { + return null; + } + + ContextUserToken userToken = null; + try { + var jsonWebToken = JWTEncryption.ReadJwtToken(token[_tokenPrefixLength..]); + var claim = jsonWebToken?.Claims.FirstOrDefault(y => y.Type == nameof(ContextUserToken)); + userToken = claim?.Value.ToObject(); + } + catch (Exception ex) { + _logger.Warn($"{Ln.读取用户令牌出错}: {ex}"); + } + + return userToken == null ? null : (userToken.Id, userToken.UserName); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs b/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs new file mode 100644 index 00000000..b25a3574 --- /dev/null +++ b/src/backend/NetAdmin.Host/Utils/SqlAuditor.cs @@ -0,0 +1,181 @@ +using NetAdmin.Domain.Attributes; +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using Yitter.IdGenerator; + +namespace NetAdmin.Host.Utils; + +/// +/// Sql审核器 +/// +public sealed class SqlAuditor : ISingleton +{ + /// + /// 数据库服务器时钟偏移 + /// + #pragma warning disable S1450 + + // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable + private readonly TimeSpan _timeOffset; + #pragma warning restore S1450 + + /// + /// Initializes a new instance of the class. + /// + public SqlAuditor(ILogger logger) + { + // 设置服务器时间偏差 + _timeOffset = DateTime.UtcNow.Subtract(App.GetService().Ado.QuerySingle(() => DateTime.UtcNow)); + + logger.Info($"{Ln.数据库服务器时钟偏移} {_timeOffset}"); + } + + /// + /// 对Insert/Update的数据加工 + /// + /// e + public void DataAuditHandler(object sender, AuditValueEventArgs e) + { + // SetServerTime(e); + SetSnowflake(e); + + // 设置创建者、修改者信息 + var user = App.GetService(); + switch (e.AuditValueType) { + case AuditValueType.Insert: + SetCreator(e, user); + SetOwner(e, user); + break; + case AuditValueType.Update: + SetUpdater(e, user); + break; + case AuditValueType.InsertOrUpdate: + break; + default: + throw new ArgumentOutOfRangeException(nameof(e)); + } + } + + /// + /// 设置创建者 + /// + private static void SetCreator(AuditValueEventArgs e, ContextUserInfo userInfo) + { + switch (e.Property.Name) { + case nameof(IFieldCreatedTime.CreatedTime): + if (e.Value == null || (e.Value is DateTime val && val == default)) { + e.Value = DateTime.Now; + } + + break; + case nameof(IFieldCreatedUser.CreatedUserId): + if (userInfo != null && e.Value is null or (long and 0)) { + e.Value = userInfo.Id; + } + + break; + + case nameof(IFieldCreatedUser.CreatedUserName): + if (userInfo != null && e.Value is null or "") { + e.Value = userInfo.UserName; + } + + break; + case nameof(IFieldCreatedClient.CreatedClientIp): + if (e.Value is null or 0) { + e.Value = App.HttpContext?.GetRemoteIpAddressToIPv4().IpV4ToInt32(); + } + + break; + case nameof(IFieldCreatedClient.CreatedUserAgent): + if (e.Value is null or "") { + e.Value = App.HttpContext?.Request.Headers[Chars.FLG_HTTP_HEADER_USER_AGENT].ToString(); + } + + break; + case nameof(IFieldCreatedClient.CreatedReferer): + if (e.Value is null or "") { + e.Value = App.HttpContext?.Request.GetRefererUrlAddress(); + } + + break; + default: + return; + } + } + + /// + /// 设置拥有者 + /// + private static void SetOwner(AuditValueEventArgs e, ContextUserInfo userInfo) + { + switch (e.Property.Name) { + case nameof(IFieldOwner.OwnerId): + if (userInfo != null && e.Value is null or (long and 0)) { + e.Value = userInfo.Id; + } + + break; + case nameof(IFieldOwner.OwnerDeptId): + if (userInfo != null && e.Value is null or "") { + e.Value = userInfo.Dept.Id; + } + + break; + default: + return; + } + } + + /// + /// 设置雪花编号字段 + /// + private static void SetSnowflake(AuditValueEventArgs e) + { + var isSnowflake = e.Property.GetCustomAttribute(false) != null; + var isLongType = e.Column.CsType == typeof(long); + var isNoValue = e.Value is null or (long and 0); + if (isSnowflake && isLongType && isNoValue) { + e.Value = YitIdHelper.NextId(); + } + } + + /// + /// 设置更新人 + /// + private static void SetUpdater(AuditValueEventArgs e, ContextUserInfo userInfo) + { + switch (e.Property.Name) { + // case nameof(IFieldModifiedTime.ModifiedTime): + // e.Value = DateTime.Now; + // break; + case nameof(IFieldModifiedUser.ModifiedUserId): + if (userInfo != null && e.Value is null or (long and 0)) { + e.Value = userInfo.Id; + } + + break; + + case nameof(IFieldModifiedUser.ModifiedUserName): + if (userInfo != null && e.Value is null or "") { + e.Value = userInfo.UserName; + } + + break; + } + } + + // /// + // /// 设置服务器时间字段 + // /// + // private void SetServerTime(AuditValueEventArgs e) + // #pragma warning restore RCS1213, IDE0051 + // { + // var isServerTime = e.Property.GetCustomAttribute(false) is { Enable: true }; + // var isDateType = e.Column.CsType == typeof(DateTime) || e.Column.CsType == typeof(DateTime?); + // var hasValue = e.Value is DateTime val && val != default; + // if (isServerTime && isDateType && hasValue) { + // e.Value = ((DateTime)e.Value).Subtract(_timeOffset); + // } + // } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Utils/SwaggerEnumSchemaFixer.cs b/src/backend/NetAdmin.Host/Utils/SwaggerEnumSchemaFixer.cs new file mode 100644 index 00000000..b2f9e105 --- /dev/null +++ b/src/backend/NetAdmin.Host/Utils/SwaggerEnumSchemaFixer.cs @@ -0,0 +1,40 @@ +using Microsoft.OpenApi.Any; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace NetAdmin.Host.Utils; + +/// +/// 修正 规范化文档 Enum 提示 +/// +[SuppressSniffer] +public sealed class SwaggerEnumSchemaFixer : ISchemaFilter +{ + /// + /// 实现过滤器方法 + /// + public void Apply(OpenApiSchema schema, SchemaFilterContext context) + { + // 非枚举退出 + if (!context.Type.IsEnum) { + return; + } + + const string wrap = "
    "; + schema.Enum.Clear(); + schema.Type = context.Type.Name; + var sb = new StringBuilder(); + _ = sb.Append(schema.Description); + + foreach (var e in Enum.GetValues(context.Type).Cast()) { + var value = Convert.ToInt64(e, CultureInfo.InvariantCulture); + schema.Enum.Add(new OpenApiLong(value)); + _ = sb.Append(wrap) + .Append( // + CultureInfo.InvariantCulture + , $"{Enum.GetName(context.Type, e).ToLowerCamelCase()} = {value} ({e.ResDesc()})"); + } + + schema.Description = sb.ToString(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Host/Utils/ToNullIfEmptyStringConverter.cs b/src/backend/NetAdmin.Host/Utils/ToNullIfEmptyStringConverter.cs new file mode 100644 index 00000000..ccb819aa --- /dev/null +++ b/src/backend/NetAdmin.Host/Utils/ToNullIfEmptyStringConverter.cs @@ -0,0 +1,25 @@ +namespace NetAdmin.Host.Utils; + +/// +/// "" -> null 转换器 +/// +public sealed class ToNullIfEmptyStringConverter : JsonConverter +{ + /// + public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + if (reader.TokenType == JsonTokenType.Number) { + var success = reader.TryGetDecimal(out var dec); + return success ? dec.ToString(CultureInfo.InvariantCulture) : "0"; + } + + var ret = reader.GetString(); + return ret?.Length == 0 ? null : ret; + } + + /// + public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.Length == 0 ? null : value); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Attributes/ExportAttribute.cs b/src/backend/NetAdmin.Infrastructure/Attributes/ExportAttribute.cs new file mode 100644 index 00000000..8114df34 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Attributes/ExportAttribute.cs @@ -0,0 +1,7 @@ +namespace NetAdmin.Infrastructure.Attributes; + +/// +/// 标记一个此字段(枚举)将通过接口暴露到前端 +/// +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Enum)] +public sealed class ExportAttribute : Attribute { } \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs new file mode 100644 index 00000000..b3fe85f3 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/CaptchaOptions.cs @@ -0,0 +1,28 @@ +namespace NetAdmin.Infrastructure.Configuration.Options; + +/// +/// 人机验证配置 +/// +public sealed record CaptchaOptions : OptionAbstraction +{ + private static readonly double _seed + = BitConverter.ToInt32(Chars.TPL_DATE_YYYYMMDD[..4].Select(x => (byte)x).ToArray()); + + #pragma warning disable S3963 + static CaptchaOptions() + #pragma warning restore S3963 + { + var rtn = new char[32]; + for (var i = 0; i != 32; i++) { + rtn[i] = Chars.FLG_VISIBLE_ASCIIS[ + (int)(Math.Abs(Math.Sin(_seed * (i + 1))) * Chars.FLG_VISIBLE_ASCIIS.Length)]; + } + + SecretKey = new string(rtn); + } + + /// + /// 密钥 + /// + public static string SecretKey { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/DatabaseOptions.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/DatabaseOptions.cs new file mode 100644 index 00000000..469449f6 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/DatabaseOptions.cs @@ -0,0 +1,24 @@ +using DataType = FreeSql.DataType; + +namespace NetAdmin.Infrastructure.Configuration.Options; + +/// +/// 数据库连接字符串配置 +/// +public sealed record DatabaseOptions : OptionAbstraction +{ + /// + /// 链接字符串 + /// + public string ConnStr { get; init; } + + /// + /// 数据库类型 + /// + public DataType DbType { get; init; } + + /// + /// 种子数据路径(相对) + /// + public string SeedDataRelativePath { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/OptionAbstraction.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/OptionAbstraction.cs new file mode 100644 index 00000000..bf9cca15 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/OptionAbstraction.cs @@ -0,0 +1,6 @@ +namespace NetAdmin.Infrastructure.Configuration.Options; + +/// +/// 选项抽象基类 +/// +public abstract record OptionAbstraction : IConfigurableOptions; \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/RedisOptions.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/RedisOptions.cs new file mode 100644 index 00000000..e7ce70e6 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/RedisOptions.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.Infrastructure.Configuration.Options; + +/// +/// Redis配置 +/// +public sealed record RedisOptions : OptionAbstraction +{ + /// + /// 实例列表 + /// + public InstanceNode[] Instances { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Redis/InstanceNode.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Redis/InstanceNode.cs new file mode 100644 index 00000000..d6196da8 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Redis/InstanceNode.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Infrastructure.Configuration.Options.SubNodes.Redis; + +/// +/// Redis实例 +/// +public sealed record InstanceNode +{ + /// + /// 链接字符串 + /// + public string ConnStr { get; init; } + + /// + /// 数据库 + /// + public int Database { get; set; } + + /// + /// 实例名称 + /// + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Upload/MinioNode.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Upload/MinioNode.cs new file mode 100644 index 00000000..f1f8b61a --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/SubNodes/Upload/MinioNode.cs @@ -0,0 +1,37 @@ +namespace NetAdmin.Infrastructure.Configuration.Options.SubNodes.Upload; + +/// +/// Minio 节点 +/// +public sealed record MinioNode +{ + /// + /// 访问令牌 + /// + public string AccessKey { get; init; } + + /// + /// 文件访问Url地址 + /// + public string AccessUrl { get; init; } + + /// + /// 使用的存储桶名称 + /// + public string BucketName { get; init; } + + /// + /// 安全码 + /// + public string SecretKey { get; init; } + + /// + /// 是否启用ssl + /// + public bool Secure { get; init; } + + /// + /// 服务器地址 + /// + public string ServerAddress { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Configuration/Options/UploadOptions.cs b/src/backend/NetAdmin.Infrastructure/Configuration/Options/UploadOptions.cs new file mode 100644 index 00000000..2d4256b0 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Configuration/Options/UploadOptions.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Infrastructure.Configuration.Options; + +/// +/// 上传配置 +/// +public sealed record UploadOptions : OptionAbstraction +{ + /// + /// 允许的文件类型 + /// + public IReadOnlyCollection ContentTypes { get; init; } + + /// + /// 允许的文件大小(字节) + /// + public long MaxSize { get; init; } + + /// + /// Minio 配置 + /// + public MinioNode Minio { get; init; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs b/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs new file mode 100644 index 00000000..fa2c0561 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Constant/Chars.cs @@ -0,0 +1,91 @@ +#pragma warning disable CS1591 + +namespace NetAdmin.Infrastructure.Constant; + +/// +/// 字符串常量表 +/// +/// +/// public类型会通过接口暴露给前端 +/// +public static class Chars +{ + public const string FLG_ACCESS_TOKEN = "ACCESS-TOKEN"; + public const string FLG_APPLICATION_JSON = "application/json"; + public const string FLG_CONSUL_REG_HOSTNAME = "CONSUL_REG_HOSTNAME"; + public const string FLG_CONSUL_REG_PORT = "CONSUL_REG_PORT"; + public const string FLG_CONTEXT_MEMBER_INFO = nameof(FLG_CONTEXT_MEMBER_INFO); + public const string FLG_CONTEXT_OWNER_DEPT_ID = nameof(FLG_CONTEXT_OWNER_DEPT_ID); + public const string FLG_CONTEXT_USER_ID = nameof(FLG_CONTEXT_USER_ID); + public const string FLG_CONTEXT_USER_INFO = nameof(FLG_CONTEXT_USER_INFO); + public const string FLG_DB_FIELD_TYPE_NVARCHAR = "nvarchar"; + public const string FLG_DB_FIELD_TYPE_NVARCHAR_255 = "nvarchar(255)"; + public const string FLG_DB_FIELD_TYPE_NVARCHAR_MAX = "nvarchar(max)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR = "varchar"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_1022 = "varchar(1022)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_127 = "varchar(127)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_15 = "varchar(15)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_255 = "varchar(255)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_31 = "varchar(31)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_4094 = "varchar(4094)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_510 = "varchar(510)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_63 = "varchar(63)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_7 = "varchar(7)"; + public const string FLG_DB_FIELD_TYPE_VARCHAR_MAX = "varchar(max)"; + public const string FLG_GLOBAL_FILTER_DATA = nameof(FLG_GLOBAL_FILTER_DATA); + public const string FLG_GLOBAL_FILTER_DELETE = nameof(FLG_GLOBAL_FILTER_DELETE); + public const string FLG_GLOBAL_FILTER_MEMBER = nameof(FLG_GLOBAL_FILTER_MEMBER); + public const string FLG_GLOBAL_FILTER_SELF = nameof(FLG_GLOBAL_FILTER_SELF); + public const string FLG_GLOBAL_FILTER_TENANT = nameof(FLG_GLOBAL_FILTER_TENANT); + public const string FLG_HEALTH_CHECK_PATH_PREFIX = "health/check"; + public const string FLG_HTTP_HEADER_REFERER = "Referer"; + public const string FLG_HTTP_HEADER_USER_AGENT = "User-Agent"; + public const string FLG_HTTP_METHOD_CONNECT = "CONNECT"; + public const string FLG_HTTP_METHOD_DELETE = "DELETE"; + public const string FLG_HTTP_METHOD_GET = "GET"; + public const string FLG_HTTP_METHOD_HEAD = "HEAD"; + public const string FLG_HTTP_METHOD_OPTIONS = "OPTIONS"; + public const string FLG_HTTP_METHOD_PATCH = "PATCH"; + public const string FLG_HTTP_METHOD_POST = "POST"; + public const string FLG_HTTP_METHOD_PUT = "PUT"; + public const string FLG_HTTP_METHOD_TRACE = "TRACE"; + public const string FLG_RANDOM_UNAME_PWD = "VcXlp7WY"; + public const string FLG_REDIS_INSTANCE_DATA_CACHE = "DataCache"; + public const string FLG_SYSTEM_PREFIX = "sc_"; + public const string FLG_TABLE_NAME_PREFIX = ""; + + public const string FLG_UA_MOBILE + = "Mozilla/5.0 (Linux; Android 9; Redmi Note 8 Pro Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.96 Mobile Safari/537.36"; + + public const string FLG_UA_PC + = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"; + + public const string FLG_VISIBLE_ASCIIS + = """!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"""; + + public const string FLG_X_ACCESS_TOKEN = "X-ACCESS-TOKEN"; + + public const string RGX_CERTIFICATE = """^[a-zA-Z0-9-_]+$"""; + + public const string RGX_CHINESE_NAME + = """^(?:赵|钱|孙|李|周|吴|郑|王|冯|陈|褚|卫|蒋|沈|韩|杨|朱|秦|尤|许|何|吕|施|张|孔|曹|严|华|金|魏|陶|姜|戚|谢|邹|喻|柏|水|窦|章|云|苏|潘|葛|奚|范|彭|郎|鲁|韦|昌|马|苗|凤|花|方|俞|任|袁|柳|酆|鲍|史|唐|费|廉|岑|薛|雷|贺|倪|汤|滕|殷|罗|毕|郝|邬|安|常|乐|于|时|傅|皮|卞|齐|康|伍|余|元|卜|顾|孟|平|黄|和|穆|萧|尹|姚|邵|湛|汪|祁|毛|禹|狄|米|贝|明|臧|计|伏|成|戴|谈|宋|茅|庞|熊|纪|舒|屈|项|祝|董|梁|杜|阮|蓝|闵|席|季|麻|强|贾|路|娄|危|江|童|颜|郭|梅|盛|林|刁|钟|徐|邱|骆|高|夏|蔡|田|樊|胡|凌|霍|虞|万|支|柯|昝|管|卢|莫|经|房|裘|缪|干|解|应|宗|丁|宣|贲|邓|郁|单|杭|洪|包|诸|左|石|崔|吉|钮|龚|程|嵇|邢|滑|裴|陆|荣|翁|荀|羊|於|惠|甄|曲|家|封|芮|羿|储|靳|汲|邴|糜|松|井|段|富|巫|乌|焦|巴|弓|牧|隗|山|谷|车|侯|宓|蓬|全|郗|班|仰|秋|仲|伊|宫|宁|仇|栾|暴|甘|钭|厉|戎|祖|武|符|刘|景|詹|束|龙|叶|幸|司|韶|郜|黎|蓟|薄|印|宿|白|怀|蒲|邰|从|鄂|索|咸|籍|赖|卓|蔺|屠|蒙|池|乔|阴|胥|能|苍|双|闻|莘|党|翟|谭|贡|劳|逄|姬|申|扶|堵|冉|宰|郦|雍|郤|璩|桑|桂|濮|牛|寿|通|边|扈|燕|冀|郏|浦|尚|农|温|别|庄|晏|柴|瞿|阎|充|慕|连|茹|习|宦|艾|鱼|容|向|古|易|慎|戈|廖|庾|终|暨|居|衡|步|都|耿|满|弘|匡|国|文|寇|广|禄|阙|东|欧|殳|沃|利|蔚|越|夔|隆|师|巩|厍|聂|晁|勾|敖|融|冷|訾|辛|阚|那|简|饶|空|曾|毋|沙|乜|养|鞠|须|丰|巢|关|蒯|相|查|後|荆|红|游|竺|权|逯|盖|益|桓|公|万俟|司马|上官|欧阳|夏侯|诸葛|闻人|东方|赫连|皇甫|尉迟|公羊|澹台|公冶|宗政|濮阳|淳于|单于|太叔|申屠|公孙|仲孙|轩辕|令狐|钟离|宇文|长孙|慕容|鲜于|闾丘|司徒|司空|亓官|司寇|仉|督|子车|颛孙|端木|巫马|公西|漆雕|乐正|壤驷|公良|拓跋|夹谷|宰父|谷梁|晋|楚|闫|法|汝|鄢|涂|钦|段干|百里|东郭|南门|呼延|归|海|羊舌|微生|岳|帅|缑|亢|况|后|有|琴|梁丘|左丘|东门|西门|商|牟|佘|佴|伯|赏|南宫|墨|哈|谯|笪|年|爱|阳|佟|第五|言|福)[\u4e00-\u9fa5]{1,3}$"""; + + public const string RGX_EMAIL + = """^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$"""; + + public const string RGX_INVITE_CODE = """^\d{8}$"""; + + public const string RGX_MOBILE = """^1(3\d|4[5-9]|5[0-35-9]|6[6]|7[2-8]|8\d|9[0-35-9])\d{8}$"""; + public const string RGX_PASSWORD = """^(?![0-9]+$)(?![a-zA-Z]+$).{8,16}$"""; + public const string RGX_PAY_PASSWORD = """^\d{6}$"""; + public const string RGX_TELEPHONE = """^((\d{3,4}\-)|)\d{7,8}(|([-\u8f6c]{1}\d{1,5}))$"""; + public const string RGX_URL = """^(https?|ftp):\/\/[^\s/$.?#].[^\s]*\.[^\s]{2,}$"""; + public const string RGX_USERNAME = """^[a-zA-Z0-9_]{4,16}$"""; + public const string RGX_VERIFY_CODE = """^\d{4}$"""; + + public const string TPL_DATE_HH_MM_SS_FFFFFF = "HH:mm:ss.ffffff"; + public const string TPL_DATE_YYYY_MM_DD = "yyyy-MM-dd"; + public const string TPL_DATE_YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; + public const string TPL_DATE_YYYYMMDD = "yyyyMMdd"; + public const string TPL_DATE_YYYYMMDDHHMMSSFFFZZZZ = "yyyyMMddHHmmssfffzzz"; +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs b/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs new file mode 100644 index 00000000..c7db970d --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Constant/Numbers.cs @@ -0,0 +1,25 @@ +#pragma warning disable CS1591 + +namespace NetAdmin.Infrastructure.Constant; + +/// +/// 数字常量表 +/// +/// +/// public类型会通过接口暴露给前端 +/// +public static class Numbers +{ + public const int BULK_REQ_LIMIT = 100; // 批量请求允许的最大数量 + public const long DEF_SORT_VAL = 100; // 排序默认值 + public const long DIC_CATALOG_ID_GEO_AREA = 379794295185413; // 字典目录编号-行政区划字典 + public const int HEART_TIMEOUT_SECS = 600; // 心跳超时时间 + public const int HTTP_STATUS_BIZ_FAIL = 900; // Http状态码-业务异常 + public const int QUERY_DEF_PAGE_SIZE = 20; // 分页查询默认的页容量 + public const int QUERY_LIMIT = 100; // 非分页查询允许返回的最大条数 + public const int QUERY_MAX_PAGE_NO = 1000; // 分页查询允许最大的页码 + public const int QUERY_MAX_PAGE_SIZE = 100; // 分页查询允许最大的页容量 + public const int RED_LOCK_EXPIRY_TIME_SECS = 30; // red lock 锁锁定过期时间,锁区域内的逻辑执行如果超过过期时间,锁将被释放 + public const int RED_LOCK_RETRY_TIME_SECS = 1; // red lock 锁等待时间内,多久尝试获取一次 + public const int RED_LOCK_WAIT_TIME_SECS = 10; // red lock 锁等待时间,相同的 resource 如果当前的锁被其他线程占用,最多等待时间 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/CertificateTypes.cs b/src/backend/NetAdmin.Infrastructure/Enums/CertificateTypes.cs new file mode 100644 index 00000000..659b4a25 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/CertificateTypes.cs @@ -0,0 +1,46 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 证件类型 +/// +[Export] +public enum CertificateTypes +{ + /// + /// 身份证 + /// + [ResourceDescription(nameof(Ln.身份证))] + IdentityCard = 1 + + , + + /// + /// 护照 + /// + [ResourceDescription(nameof(Ln.护照))] + Passport = 2 + + , + + /// + /// 外国人居留证 + /// + [ResourceDescription(nameof(Ln.外国人居留证))] + ForeignerResidencePermit = 3 + + , + + /// + /// 港澳台通行证 + /// + [ResourceDescription(nameof(Ln.港澳台通行证))] + HKorMacauPermit = 4 + + , + + /// + /// 出生证 + /// + [ResourceDescription(nameof(Ln.出生证))] + BirthCertificate = 5 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/Educations.cs b/src/backend/NetAdmin.Infrastructure/Enums/Educations.cs new file mode 100644 index 00000000..cf88e935 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/Educations.cs @@ -0,0 +1,78 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 学历 +/// +[Export] +public enum Educations +{ + /// + /// 小学 + /// + [ResourceDescription(nameof(Ln.小学))] + Primary = 1 + + , + + /// + /// 初中 + /// + [ResourceDescription(nameof(Ln.初中))] + Junior = 2 + + , + + /// + /// 高中 + /// + [ResourceDescription(nameof(Ln.高中))] + Higher = 3 + + , + + /// + /// 中专 + /// + [ResourceDescription(nameof(Ln.中专))] + Technical = 4 + + , + + /// + /// 大专 + /// + [ResourceDescription(nameof(Ln.大专))] + College = 5 + + , + + /// + /// 本科 + /// + [ResourceDescription(nameof(Ln.本科))] + Bachelor = 6 + + , + + /// + /// 硕士 + /// + [ResourceDescription(nameof(Ln.硕士))] + Master = 7 + + , + + /// + /// 博士 + /// + [ResourceDescription(nameof(Ln.博士))] + Doctor = 8 + + , + + /// + /// 博士后 + /// + [ResourceDescription(nameof(Ln.博士后))] + Post = 9 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/ErrorCodes.cs b/src/backend/NetAdmin.Infrastructure/Enums/ErrorCodes.cs new file mode 100644 index 00000000..12749243 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/ErrorCodes.cs @@ -0,0 +1,46 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 错误码 +/// +[Export] +public enum ErrorCodes +{ + /// + /// 成功 + /// + [ResourceDescription(nameof(Ln.成功))] + Succeed = 0 + + , + + /// + /// 意外错误 + /// + [ResourceDescription(nameof(Ln.意外错误))] + Unhandled = 9000 + + , + + /// + /// 结果非预期 + /// + [ResourceDescription(nameof(Ln.结果非预期))] + Unexpected = 9100 + + , + + /// + /// 无效输入 + /// + [ResourceDescription(nameof(Ln.无效输入))] + InvalidInput = 9200 + + , + + /// + /// 无效操作 + /// + [ResourceDescription(nameof(Ln.无效操作))] + InvalidOperation = 9300 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/FreeSqlInitOptions.cs b/src/backend/NetAdmin.Infrastructure/Enums/FreeSqlInitOptions.cs new file mode 100644 index 00000000..3243ca6a --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/FreeSqlInitOptions.cs @@ -0,0 +1,34 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 初始化选项 +/// +[Flags] +public enum FreeSqlInitOptions +{ + /// + /// 无 + /// + None = 0 + + , + + /// + /// 同步数据库结构 + /// + SyncStructure = 1 + + , + + /// + /// 插入种子数据 + /// + InsertSeedData = 1 << 1 + + , + + /// + /// 比较数据库结构 + /// + CompareStructure = 1 << 2 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/LogLevels.cs b/src/backend/NetAdmin.Infrastructure/Enums/LogLevels.cs new file mode 100644 index 00000000..449053bb --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/LogLevels.cs @@ -0,0 +1,53 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 日志等级 +/// +public enum LogLevels +{ + /// + /// Trace + /// + [Display(Name = "[gray]TCE[/]", ShortName = "TCE")] + Trace = 0 + + , + + /// + /// Debug + /// + [Display(Name = "[gray]DBG[/]", ShortName = "DBG")] + Debug = 1 + + , + + /// + /// Information + /// + [Display(Name = "[green]INF[/]", ShortName = "INF")] + Information = 2 + + , + + /// + /// Warning + /// + [Display(Name = "[yellow]WRN[/]", ShortName = "WRN")] + Warning = 3 + + , + + /// + /// Error + /// + [Display(Name = "[red]ERR[/]", ShortName = "ERR")] + Error = 4 + + , + + /// + /// Critical + /// + [Display(Name = "[red]CTL[/]", ShortName = "CTL")] + Critical = 5 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/MarriageStatues.cs b/src/backend/NetAdmin.Infrastructure/Enums/MarriageStatues.cs new file mode 100644 index 00000000..0153174b --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/MarriageStatues.cs @@ -0,0 +1,38 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 婚姻状况 +/// +[Export] +public enum MarriageStatues +{ + /// + /// 未婚 + /// + [ResourceDescription(nameof(Ln.未婚))] + Unmarried = 1 + + , + + /// + /// 已婚 + /// + [ResourceDescription(nameof(Ln.已婚))] + Married = 2 + + , + + /// + /// 离异 + /// + [ResourceDescription(nameof(Ln.离异))] + Divorced = 3 + + , + + /// + /// 丧偶 + /// + [ResourceDescription(nameof(Ln.丧偶))] + Bereft = 4 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/ModuleTypes.cs b/src/backend/NetAdmin.Infrastructure/Enums/ModuleTypes.cs new file mode 100644 index 00000000..903b7b1b --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/ModuleTypes.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 模块类型 +/// +[Export] +public enum ModuleTypes +{ + /// + /// 系统模块 + /// + [ResourceDescription(nameof(Ln.系统模块))] + SysComponent = 1 + + , + + /// + /// 业务模块 + /// + [ResourceDescription(nameof(Ln.业务模块))] + BizServer = 2 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/Nations.cs b/src/backend/NetAdmin.Infrastructure/Enums/Nations.cs new file mode 100644 index 00000000..d1e5feda --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/Nations.cs @@ -0,0 +1,456 @@ +// ReSharper disable IdentifierTypo + +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 民族 +/// +[Export] +public enum Nations +{ + /// + /// 汉族 + /// + [ResourceDescription(nameof(Ln.汉族))] + Han = 1 + + , + + /// + /// 壮族 + /// + [ResourceDescription(nameof(Ln.壮族))] + Zhuang = 2 + + , + + /// + /// 满族 + /// + [ResourceDescription(nameof(Ln.满族))] + Manchu = 3 + + , + + /// + /// 回族 + /// + [ResourceDescription(nameof(Ln.回族))] + Hui = 4 + + , + + /// + /// 苗族 + /// + [ResourceDescription(nameof(Ln.苗族))] + Miao = 5 + + , + + /// + /// 维吾尔族 + /// + [ResourceDescription(nameof(Ln.维吾尔族))] + Uyghur = 6 + + , + + /// + /// 土家族 + /// + [ResourceDescription(nameof(Ln.土家族))] + Tujia = 7 + + , + + /// + /// 彝族 + /// + [ResourceDescription(nameof(Ln.彝族))] + Yi = 8 + + , + + /// + /// 蒙古族 + /// + [ResourceDescription(nameof(Ln.蒙古族))] + Mongolian = 9 + + , + + /// + /// 藏族 + /// + [ResourceDescription(nameof(Ln.藏族))] + Tibetan = 10 + + , + + /// + /// 布依族 + /// + [ResourceDescription(nameof(Ln.布依族))] + Buyei = 11 + + , + + /// + /// 侗族 + /// + [ResourceDescription(nameof(Ln.侗族))] + Dong = 12 + + , + + /// + /// 瑶族 + /// + [ResourceDescription(nameof(Ln.瑶族))] + Yao = 13 + + , + + /// + /// 朝鲜族 + /// + [ResourceDescription(nameof(Ln.朝鲜族))] + Korean = 14 + + , + + /// + /// 白族 + /// + [ResourceDescription(nameof(Ln.白族))] + Bai = 15 + + , + + /// + /// 哈尼族 + /// + [ResourceDescription(nameof(Ln.哈尼族))] + Hani = 16 + + , + + /// + /// 哈萨克族 + /// + [ResourceDescription(nameof(Ln.哈萨克族))] + Kazakh = 17 + + , + + /// + /// 黎族 + /// + [ResourceDescription(nameof(Ln.黎族))] + Li = 18 + + , + + /// + /// 傣族 + /// + [ResourceDescription(nameof(Ln.傣族))] + Dai = 19 + + , + + /// + /// 畲族 + /// + [ResourceDescription(nameof(Ln.畲族))] + She = 20 + + , + + /// + /// 傈僳族 + /// + [ResourceDescription(nameof(Ln.傈僳族))] + Lisu = 21 + + , + + /// + /// 仡佬族 + /// + [ResourceDescription(nameof(Ln.仡佬族))] + Gelao = 22 + + , + + /// + /// 东乡族 + /// + [ResourceDescription(nameof(Ln.东乡族))] + Dongxiang = 23 + + , + + /// + /// 高山族 + /// + [ResourceDescription(nameof(Ln.高山族))] + Gaoshan = 24 + + , + + /// + /// 拉祜族族 + /// + [ResourceDescription(nameof(Ln.拉祜族族))] + Lahu = 25 + + , + + /// + /// 水族 + /// + [ResourceDescription(nameof(Ln.水族))] + Shui = 26 + + , + + /// + /// 佤族 + /// + [ResourceDescription(nameof(Ln.佤族))] + Va = 27 + + , + + /// + /// 纳西族 + /// + [ResourceDescription(nameof(Ln.纳西族))] + Nakhi = 28 + + , + + /// + /// 羌族 + /// + [ResourceDescription(nameof(Ln.羌族))] + Qiang = 29 + + , + + /// + /// 土族 + /// + [ResourceDescription(nameof(Ln.土族))] + Monguor = 30 + + , + + /// + /// 仫佬族 + /// + [ResourceDescription(nameof(Ln.仫佬族))] + Mulao = 31 + + , + + /// + /// 锡伯族 + /// + [ResourceDescription(nameof(Ln.锡伯族))] + Xibe = 32 + + , + + /// + /// 柯尔克孜族 + /// + [ResourceDescription(nameof(Ln.柯尔克孜族))] + Kyrgyz = 33 + + , + + /// + /// 达斡尔族 + /// + [ResourceDescription(nameof(Ln.达斡尔族))] + Daur = 34 + + , + + /// + /// 景颇族 + /// + [ResourceDescription(nameof(Ln.景颇族))] + Jingpo = 35 + + , + + /// + /// 毛南族 + /// + [ResourceDescription(nameof(Ln.毛南族))] + Maonan = 36 + + , + + /// + /// 撒拉族 + /// + [ResourceDescription(nameof(Ln.撒拉族))] + Salar = 37 + + , + + /// + /// 布朗族 + /// + [ResourceDescription(nameof(Ln.布朗族))] + Blang = 38 + + , + + /// + /// 塔吉克族 + /// + [ResourceDescription(nameof(Ln.塔吉克族))] + Tajik = 39 + + , + + /// + /// 阿昌族 + /// + [ResourceDescription(nameof(Ln.阿昌族))] + Achang = 40 + + , + + /// + /// 普米族 + /// + [ResourceDescription(nameof(Ln.普米族))] + Pumi = 41 + + , + + /// + /// 鄂温克族 + /// + [ResourceDescription(nameof(Ln.鄂温克族))] + Evenk = 42 + + , + + /// + /// 怒族 + /// + [ResourceDescription(nameof(Ln.怒族))] + Nu = 43 + + , + + /// + /// 京族 + /// + [ResourceDescription(nameof(Ln.京族))] + Kinh = 44 + + , + + /// + /// 基诺族 + /// + [ResourceDescription(nameof(Ln.基诺族))] + Jino = 45 + + , + + /// + /// 德昂族 + /// + [ResourceDescription(nameof(Ln.德昂族))] + Deang = 46 + + , + + /// + /// 保安族 + /// + [ResourceDescription(nameof(Ln.保安族))] + Bonan = 47 + + , + + /// + /// 俄罗斯族 + /// + [ResourceDescription(nameof(Ln.俄罗斯族))] + Russian = 48 + + , + + /// + /// 裕固族 + /// + [ResourceDescription(nameof(Ln.裕固族))] + Yughur = 49 + + , + + /// + /// 乌孜别克族 + /// + [ResourceDescription(nameof(Ln.乌孜别克族))] + Uzbek = 50 + + , + + /// + /// 门巴族 + /// + [ResourceDescription(nameof(Ln.门巴族))] + Monpa = 51 + + , + + /// + /// 鄂伦春族 + /// + [ResourceDescription(nameof(Ln.鄂伦春族))] + Oroqen = 52 + + , + + /// + /// 独龙族 + /// + [ResourceDescription(nameof(Ln.独龙族))] + Derung = 53 + + , + + /// + /// 塔塔尔族 + /// + [ResourceDescription(nameof(Ln.塔塔尔族))] + Tatar = 54 + + , + + /// + /// 赫哲族 + /// + [ResourceDescription(nameof(Ln.赫哲族))] + Nanai = 55 + + , + + /// + /// 珞巴族 + /// + [ResourceDescription(nameof(Ln.珞巴族))] + Lhoba = 56 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs b/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs new file mode 100644 index 00000000..b14dee5f --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/Orders.cs @@ -0,0 +1,22 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 排序方式 +/// +[Export] +public enum Orders +{ + /// + /// 顺序 + /// + [ResourceDescription(nameof(Ln.顺序排序))] + Ascending = 1 + + , + + /// + /// 倒序 + /// + [ResourceDescription(nameof(Ln.倒序排序))] + Descending = 2 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/PoliticalStatues.cs b/src/backend/NetAdmin.Infrastructure/Enums/PoliticalStatues.cs new file mode 100644 index 00000000..62b1be2e --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/PoliticalStatues.cs @@ -0,0 +1,30 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 政治面貌 +/// +[Export] +public enum PoliticalStatues +{ + /// + /// 中共党员 + /// + [ResourceDescription(nameof(Ln.中共党员))] + MemberOfCommunistParty = 1 + + , + + /// + /// 共青团员 + /// + [ResourceDescription(nameof(Ln.共青团员))] + MemberOfCommunistYouthLeague = 2 + + , + + /// + /// 群众 + /// + [ResourceDescription(nameof(Ln.群众))] + CommonPeople = 3 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Enums/Sexes.cs b/src/backend/NetAdmin.Infrastructure/Enums/Sexes.cs new file mode 100644 index 00000000..9abb48a6 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Enums/Sexes.cs @@ -0,0 +1,30 @@ +namespace NetAdmin.Infrastructure.Enums; + +/// +/// 性别 +/// +[Export] +public enum Sexes +{ + /// + /// 男 + /// + [ResourceDescription(nameof(Ln.男))] + Male = 1 + + , + + /// + /// 女 + /// + [ResourceDescription(nameof(Ln.女))] + Female = 2 + + , + + /// + /// 保密 + /// + [ResourceDescription(nameof(Ln.保密))] + Secrecy = 3 +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Exceptions/InvalidInput/NetAdminInvalidInputException.cs b/src/backend/NetAdmin.Infrastructure/Exceptions/InvalidInput/NetAdminInvalidInputException.cs new file mode 100644 index 00000000..c4e11bda --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Exceptions/InvalidInput/NetAdminInvalidInputException.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Infrastructure.Exceptions.InvalidInput; + +/// +/// 无效输入异常 +/// +/// +/// 参数格式错误、内容校验错误等 +/// +#pragma warning disable RCS1194 +public sealed class NetAdminInvalidInputException : NetAdminException + #pragma warning restore RCS1194 +{ + /// + /// Initializes a new instance of the class. + /// + public NetAdminInvalidInputException(string message = null, Exception innerException = null) // + : base(ErrorCodes.InvalidInput, message, innerException) { } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Exceptions/InvalidOperation/NetAdminInvalidOperationException.cs b/src/backend/NetAdmin.Infrastructure/Exceptions/InvalidOperation/NetAdminInvalidOperationException.cs new file mode 100644 index 00000000..fb8f47e8 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Exceptions/InvalidOperation/NetAdminInvalidOperationException.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Infrastructure.Exceptions.InvalidOperation; + +/// +/// 无效操作异常 +/// +/// +/// 非正常的业务流程或逻辑 +/// +#pragma warning disable RCS1194, DesignedForInheritance +public class NetAdminInvalidOperationException : NetAdminException + #pragma warning restore DesignedForInheritance, RCS1194 +{ + /// + /// Initializes a new instance of the class. + /// + public NetAdminInvalidOperationException(string message = null, Exception innerException = null) // + : base(ErrorCodes.InvalidOperation, message, innerException) { } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminException.cs b/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminException.cs new file mode 100644 index 00000000..6d436145 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Exceptions/NetAdminException.cs @@ -0,0 +1,23 @@ +namespace NetAdmin.Infrastructure.Exceptions; + +/// +/// Line异常基类 +/// +#pragma warning disable RCS1194 +public abstract class NetAdminException : Exception + #pragma warning restore RCS1194 +{ + /// + /// Initializes a new instance of the class. + /// + protected NetAdminException(ErrorCodes code, string message = null, Exception innerException = null) // + : base(message, innerException) + { + Code = code; + } + + /// + /// 错误码 + /// + public ErrorCodes Code { get; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminGetLockerException.cs b/src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminGetLockerException.cs new file mode 100644 index 00000000..b391aa01 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminGetLockerException.cs @@ -0,0 +1,9 @@ +namespace NetAdmin.Infrastructure.Exceptions.Unexpected; + +/// +/// 加锁失败异常 +/// +#pragma warning disable RCS1194 +public sealed class NetAdminGetLockerException : NetAdminUnexpectedException + #pragma warning restore RCS1194 +{ } \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminUnexpectedException.cs b/src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminUnexpectedException.cs new file mode 100644 index 00000000..f22f21d6 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Exceptions/Unexpected/NetAdminUnexpectedException.cs @@ -0,0 +1,18 @@ +namespace NetAdmin.Infrastructure.Exceptions.Unexpected; + +/// +/// 非预期结果异常 +/// +/// +/// 运行结果是非预期的,例如事务失败回滚 +/// +#pragma warning disable RCS1194, DesignedForInheritance +public class NetAdminUnexpectedException : NetAdminException + #pragma warning restore DesignedForInheritance, RCS1194 +{ + /// + /// Initializes a new instance of the class. + /// + public NetAdminUnexpectedException(string message = null, Exception innerException = null) // + : base(ErrorCodes.Unexpected, message, innerException) { } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs new file mode 100644 index 00000000..eec19fb7 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestMessageExtensions.cs @@ -0,0 +1,25 @@ +namespace NetAdmin.Infrastructure.Extensions; + +/// +/// HttpRequestMessage 扩展方法 +/// +public static class HttpRequestMessageExtensions +{ + /// + /// 将Http请求的Uri、Header、Body打包成Json字符串 + /// + public static async Task BuildJsonAsync(this HttpRequestMessage me) + { + var body = me?.Content == null ? null : await me.Content!.ReadAsStringAsync(); + return new { Uri = me?.RequestUri, Header = me?.ToString(), Body = body }.ToJson(); + } + + /// + /// 记录日志 + /// + public static async Task LogAsync(this HttpRequestMessage me, ILogger logger) + { + logger.Info($"{Ln.请求}: {await me.BuildJsonAsync()}"); + return me; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestPartExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestPartExtensions.cs new file mode 100644 index 00000000..1b577a1a --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Extensions/HttpRequestPartExtensions.cs @@ -0,0 +1,35 @@ +using Furion.RemoteRequest; + +namespace NetAdmin.Infrastructure.Extensions; + +/// +/// HttpRequestPart 扩展方法 +/// +public static class HttpRequestPartExtensions +{ + /// + /// 设置日志 + /// + public static HttpRequestPart SetLog(this HttpRequestPart me, ILogger logger + , Func bodyHandle = null) + { + async void RequestHandle(HttpClient _, HttpRequestMessage req) + { + #pragma warning disable IDE0058 + await req.LogAsync(logger); + #pragma warning restore IDE0058 + } + + async void ResponseHandle(HttpClient _, HttpResponseMessage rsp) + { + await rsp.LogAsync(logger, bodyHandle); + } + + async void ExceptionHandle(HttpClient _, HttpResponseMessage rsp, string errors) + { + await rsp.LogExceptionAsync(errors, logger, bodyHandle); + } + + return me.OnRequesting(RequestHandle).OnResponsing(ResponseHandle).OnException(ExceptionHandle); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs new file mode 100644 index 00000000..3297ce62 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Extensions/HttpResponseMessageExtensions.cs @@ -0,0 +1,35 @@ +namespace NetAdmin.Infrastructure.Extensions; + +/// +/// HttpResponseMessage 扩展方法 +/// +public static class HttpResponseMessageExtensions +{ + /// + /// 记录日志 + /// + public static async Task LogAsync(this HttpResponseMessage me, ILogger logger + , Func bodyPreHandle = null) + { + logger.Info(await me.BuildJsonAsync(bodyPreHandle)); + } + + /// + /// 记录异常日志 + /// + public static async Task LogExceptionAsync(this HttpResponseMessage me, string errors, ILogger logger + , Func bodyHandle = null) + { + logger.Warn($"{errors}: {await me.BuildJsonAsync(bodyHandle)}"); + } + + /// + /// 将Http请求的Uri、Header、Body打包成Json字符串 + /// + private static async Task BuildJsonAsync( // + this HttpResponseMessage me, Func bodyHandle = null) + { + var body = me?.Content is null ? null : await me.Content!.ReadAsStringAsync(); + return new { Header = me?.ToString(), Body = bodyHandle is null ? body : bodyHandle(body) }.ToJson(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/ObjectExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/ObjectExtensions.cs new file mode 100644 index 00000000..b7545d96 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Extensions/ObjectExtensions.cs @@ -0,0 +1,15 @@ +namespace NetAdmin.Infrastructure.Extensions; + +/// +/// Object 扩展类 +/// +public static class ObjectExtensions +{ + /// + /// object -> json + /// + public static string ToJson(this object me) + { + return me.Json(Global.JsonSerializerOptions); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Extensions/StringExtensions.cs b/src/backend/NetAdmin.Infrastructure/Extensions/StringExtensions.cs new file mode 100644 index 00000000..033a7a0a --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Extensions/StringExtensions.cs @@ -0,0 +1,31 @@ +namespace NetAdmin.Infrastructure.Extensions; + +/// +/// String 扩展类 +/// +public static class StringExtensions +{ + /// + /// object -> json + /// + public static T ToObject(this string me) + { + return me.Object(Global.JsonSerializerOptions); + } + + /// + /// object -> json + /// + public static object ToObject(this string me, Type toType) + { + return me.Object(toType, Global.JsonSerializerOptions); + } + + /// + /// 去掉尾部字符串“Options” + /// + public static string TrimEndOptions(this string me) + { + return Regex.Replace(me, "Options$", string.Empty); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Global.cs b/src/backend/NetAdmin.Infrastructure/Global.cs new file mode 100644 index 00000000..5492a96f --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Global.cs @@ -0,0 +1,23 @@ +namespace NetAdmin.Infrastructure; + +/// +/// 全局静态类 +/// +public static class Global +{ + /// + /// 产品版本 + /// + public static readonly string ProductVersion + = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly()!.Location).ProductVersion; + + /// + /// 系统内部密钥 + /// + public static string SecretKey => "{6C4922D3-499A-46db-BFC4-0B51A9C4395F}"; + + /// + /// Json序列化选项 + /// + public static JsonSerializerOptions JsonSerializerOptions { get; set; } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj b/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj new file mode 100644 index 00000000..d39dcd14 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/NetAdmin.Infrastructure.csproj @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/ApplicationHelper.cs b/src/backend/NetAdmin.Infrastructure/Utils/ApplicationHelper.cs new file mode 100644 index 00000000..b30f415a --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/ApplicationHelper.cs @@ -0,0 +1,20 @@ +namespace NetAdmin.Infrastructure.Utils; + +/// +/// 应用程序帮助类 +/// +public static class ApplicationHelper +{ + /// + /// 获取系统环境 + /// + public static Dictionary GetEnvironmentInfo() + { + var ret = typeof(Environment).GetProperties(BindingFlags.Public | BindingFlags.Static) + .Where(x => x.Name != nameof(Environment.StackTrace)) + .ToDictionary(x => x.Name, x => x.GetValue(null)); + _ = ret.TryAdd( // + "Environment", Environment.GetEnvironmentVariables().ToJson()); + return ret; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/CaptchaImageHelper.cs b/src/backend/NetAdmin.Infrastructure/Utils/CaptchaImageHelper.cs new file mode 100644 index 00000000..637d3437 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/CaptchaImageHelper.cs @@ -0,0 +1,176 @@ +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Drawing; +using SixLabors.ImageSharp.Drawing.Processing; +using SixLabors.ImageSharp.Formats.Png; +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; + +namespace NetAdmin.Infrastructure.Utils; + +/// +/// 验证码图片工具类 +/// +public static class CaptchaImageHelper +{ + /// + /// 创建一个缺口滑块验证码图片 + /// + /// 包含资源的程序集 + /// 背景图路径 + /// 滑块模板小图路径 + /// 背景图随机序号范围(1-x) + /// 模板图随机序号范围(1-x) + /// 滑块尺寸 + /// 背景图(base64),滑块图(base64),缺口坐标 + #pragma warning disable SA1414 + public static async Task<(string BackgroundImage, string SliderImage, Point OffsetSaw)> CreateSawSliderImageAsync( + Assembly resAsm, string bgPath, string tempPath, (int, int) bgIndexScope, (int, int) tempIndexScope + , Size sliderSize) + #pragma warning restore SA1414 + { + // 深色模板图 + var templateIndex = new[] { tempIndexScope.Item1, tempIndexScope.Item2 }.Rand(); + + await using var bgStream = resAsm.GetManifestResourceStream( + $"{bgPath}.{new[] { bgIndexScope.Item1, bgIndexScope.Item2 }.Rand()}.jpg"); + await using var darkStream = resAsm.GetManifestResourceStream($"{tempPath}._{templateIndex}.dark.png"); + await using var tranStream = resAsm.GetManifestResourceStream($"{tempPath}._{templateIndex}.transparent.png"); + + // 底图 + using var backgroundImage = await Image.LoadAsync(bgStream); + + using var darkTemplateImage = await Image.LoadAsync(darkStream); + + // 透明模板图 + using var transparentTemplateImage = await Image.LoadAsync(tranStream); + + // 调整模板图大小 + darkTemplateImage.Mutate(x => x.Resize(sliderSize)); + transparentTemplateImage.Mutate(x => x.Resize(sliderSize)); + + // 新建拼图 + using var blockImage = new Image(sliderSize.Width, sliderSize.Height); + + // 新建滑块拼图 + using var sliderBlockImage = new Image(sliderSize.Width, backgroundImage.Height); + + // 随机生成拼图坐标 + var offsetRand = GeneratePoint(backgroundImage.Width, backgroundImage.Height, sliderSize.Width + , sliderSize.Height); + + // 根据深色模板图计算轮廓形状 + var blockShape = CalcBlockShape(darkTemplateImage); + + // 生成拼图 + blockImage.Mutate(x => { + // ReSharper disable once AccessToDisposedClosure + _ = x.Clip(blockShape, p => p.DrawImage(backgroundImage, new Point(-offsetRand.X, -offsetRand.Y), 1)); + }); + + // 拼图叠加透明模板图层 + // ReSharper disable once AccessToDisposedClosure + blockImage.Mutate(x => x.DrawImage(transparentTemplateImage, new Point(0, 0), 1)); + + // 生成滑块拼图 + // ReSharper disable once AccessToDisposedClosure + sliderBlockImage.Mutate(x => x.DrawImage(blockImage, new Point(0, offsetRand.Y), 1)); + + var opacity = (float)(new[] { 70, 100 }.Rand() * 0.01); + + // 底图叠加深色模板图 + // ReSharper disable once AccessToDisposedClosure + backgroundImage.Mutate(x => x.DrawImage(darkTemplateImage, new Point(offsetRand.X, offsetRand.Y), opacity)); + + // 生成干扰图坐标 + var interferencePoint = GenerateInterferencePoint(backgroundImage.Width, backgroundImage.Height + , sliderSize.Width, sliderSize.Height, offsetRand.X + , offsetRand.Y); + + // 底图叠加深色干扰模板图 + // ReSharper disable once AccessToDisposedClosure + backgroundImage.Mutate(x => x.DrawImage(darkTemplateImage, new Point(interferencePoint.X, interferencePoint.Y) + , opacity)); + return (backgroundImage.ToBase64String(PngFormat.Instance), sliderBlockImage.ToBase64String(PngFormat.Instance) + , offsetRand); + } + + private static ComplexPolygon CalcBlockShape(Image templateDarkImage) + { + var temp = 0; + var pathList = new List(); + templateDarkImage.ProcessPixelRows(accessor => { + for (var y = 0; y < templateDarkImage.Height; y++) { + var rowSpan = accessor.GetRowSpan(y); + for (var x = 0; x < rowSpan.Length; x++) { + ref var pixel = ref rowSpan[x]; + if (pixel.A != 0) { + temp = temp switch { 0 => x, _ => temp }; + } + else { + if (temp == 0) { + continue; + } + + pathList.Add(new RectangularPolygon(temp, y, x - temp, 1)); + temp = 0; + } + } + } + }); + + return new ComplexPolygon(new PathCollection(pathList)); + } + + /// + /// 随机生成干扰图坐标 + /// + private static Point GenerateInterferencePoint(int originalWidth, int originalHeight, int templateWidth + , int templateHeight, int blockX, int blockY) + { + var x = + + // 在原扣图右边插入干扰图 + originalWidth - blockX - 5 > templateWidth * 2 + ? GetRandomInt(blockX + templateWidth + 5, originalWidth - templateWidth) + : + + // 在原扣图左边插入干扰图 + GetRandomInt(100, blockX - templateWidth - 5); + + var y = + + // 在原扣图下边插入干扰图 + originalHeight - blockY - 5 > templateHeight * 2 + ? GetRandomInt(blockY + templateHeight + 5, originalHeight - templateHeight) + : + + // 在原扣图上边插入干扰图 + GetRandomInt(5, blockY - templateHeight - 5); + + return new Point(x, y); + } + + /// + /// 随机生成拼图坐标 + /// + private static Point GeneratePoint(int originalWidth, int originalHeight, int templateWidth, int templateHeight) + { + var widthDifference = originalWidth - templateWidth; + var heightDifference = originalHeight - templateHeight; + var x = widthDifference switch { + <= 0 => 5, _ => new[] { 0, originalWidth - templateWidth - 100 }.Rand() + 100 + }; + + var y = heightDifference switch { <= 0 => 5, _ => new[] { 0, originalHeight - templateHeight - 5 }.Rand() + 5 }; + + return new Point(x, y); + } + + /// + /// 随机范围内数字 + /// + private static int GetRandomInt(int startNum, int endNum) + { + return (endNum > startNum ? new[] { 0, endNum - startNum }.Rand() : 0) + startNum; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/FreeSqlBuilder.cs b/src/backend/NetAdmin.Infrastructure/Utils/FreeSqlBuilder.cs new file mode 100644 index 00000000..3d7c6e40 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/FreeSqlBuilder.cs @@ -0,0 +1,145 @@ +using Newtonsoft.Json; +using DataType = FreeSql.DataType; + +namespace NetAdmin.Infrastructure.Utils; + +/// +/// FreeSqlBuilder +/// +public sealed class FreeSqlBuilder +{ + private readonly DatabaseOptions _databaseOptions; + + /// + /// Initializes a new instance of the class. + /// + public FreeSqlBuilder(DatabaseOptions databaseOptions) + { + _databaseOptions = databaseOptions; + } + + /// + /// 构建freeSql对象 + /// + public IFreeSql Build(FreeSqlInitOptions initOptions) + { + var freeSql = new FreeSql.FreeSqlBuilder() + .UseConnectionString(_databaseOptions.DbType, _databaseOptions.ConnStr) + .UseAutoSyncStructure(false) + .Build(); + + _ = InitDbAsync(freeSql, initOptions); // 初始化数据库 ,异步 + return freeSql; + } + + private static void CompareStructure(IFreeSql freeSql, Type[] entityTypes) + { + File.WriteAllText( // + $"{nameof(CompareStructure)}.sql", freeSql.CodeFirst.GetComparisonDDLStatements(entityTypes)); + } + + /// + /// 获取所有实体类型定义 + /// + private static Type[] GetEntityTypes() + { + return (from type in App.EffectiveTypes + from attr in type.GetCustomAttributes() + where attr is TableAttribute { DisableSyncStructure: false } + select type).ToArray(); + } + + private static MethodInfo MakeGetRepositoryMethod(Type entityType) + { + return typeof(FreeSqlDbContextExtensions).GetMethods() + .Where(x => x.Name == nameof(FreeSqlDbContextExtensions.GetRepository)) + .FirstOrDefault(x => x.GetGenericArguments().Length == 1) + ?.MakeGenericMethod(entityType); + } + + private static MethodInfo MakeInsertMethod(Type entityType) + { + return typeof(IBaseRepository<>).MakeGenericType(entityType) + .GetMethod( // + nameof(IBaseRepository.Insert) + , BindingFlags.Public | BindingFlags.Instance, null + , CallingConventions.Any + , new[] { typeof(IEnumerable<>).MakeGenericType(entityType) }, null); + } + + /// + /// 初始化数据库 + /// + private Task InitDbAsync(IFreeSql freeSql, FreeSqlInitOptions initOptions) + { + return Task.Run(() => { + if (initOptions == FreeSqlInitOptions.None) { + return; + } + + var entityTypes = GetEntityTypes(); + if (initOptions.HasFlag(FreeSqlInitOptions.SyncStructure)) { + SyncStructure(freeSql, entityTypes); + } + + if (initOptions.HasFlag(FreeSqlInitOptions.InsertSeedData)) { + InsertSeedData(freeSql, entityTypes); + } + + if (initOptions.HasFlag(FreeSqlInitOptions.CompareStructure)) { + CompareStructure(freeSql, entityTypes); + } + }); + } + + /// + /// 插入种子数据 + /// + private void InsertSeedData(IFreeSql freeSql, IEnumerable entityTypes) + { + foreach (var entityType in entityTypes) { + var file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _databaseOptions.SeedDataRelativePath + , $"{entityType.Name}.json"); + if (!File.Exists(file)) { + continue; + } + + var fileContent = File.ReadAllText(file); + + dynamic entities = JsonConvert.DeserializeObject( // + fileContent, typeof(IEnumerable<>).MakeGenericType(entityType)); + + // 如果表存在数据,跳过 + var select = typeof(IFreeSql).GetMethod(nameof(freeSql.Select), 1, Type.EmptyTypes) + ?.MakeGenericMethod(entityType) + .Invoke(freeSql, null); + if (select?.GetType() + .GetMethod(nameof(ISelect.Any), 0, Type.EmptyTypes) + ?.Invoke(select, null) as bool? ?? true) { + continue; + } + + var rep = MakeGetRepositoryMethod(entityType)?.Invoke(null, new object[] { freeSql, null }); + if (rep?.GetType().GetProperty(nameof(DbContextOptions))?.GetValue(rep) is DbContextOptions options) { + options.EnableCascadeSave = true; + options.NoneParameter = true; + } + + var insert = MakeInsertMethod(entityType); + + _ = insert?.Invoke(rep, new[] { entities }); + } + } + + /// + /// 同步数据库结构 + /// + private void SyncStructure(IFreeSql freeSql, Type[] entityTypes) + { + if (_databaseOptions.DbType == DataType.Oracle) { + freeSql.CodeFirst.IsSyncStructureToUpper = true; + } + + freeSql.CodeFirst.SyncStructure(entityTypes); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/LogHelper.cs b/src/backend/NetAdmin.Infrastructure/Utils/LogHelper.cs new file mode 100644 index 00000000..5ac74075 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/LogHelper.cs @@ -0,0 +1,15 @@ +namespace NetAdmin.Infrastructure.Utils; + +/// +/// 日志帮助类 +/// +public static class LogHelper +{ + /// + /// 获取ILogger + /// + public static ILogger Get() + { + return App.GetService>(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/MinioHelper.cs b/src/backend/NetAdmin.Infrastructure/Utils/MinioHelper.cs new file mode 100644 index 00000000..f90fd219 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/MinioHelper.cs @@ -0,0 +1,52 @@ +using Minio; + +namespace NetAdmin.Infrastructure.Utils; + +/// +/// MinioHelper +/// +public sealed class MinioHelper : IScoped +{ + private readonly UploadOptions _uploadOptions; + + /// + /// Initializes a new instance of the class. + /// + public MinioHelper(IOptions uploadOptions) + { + _uploadOptions = uploadOptions.Value; + } + + /// + /// 上传文件 + /// + /// 对象名称 + /// 文件流 + /// 文件类型 + /// 文件大小 + /// 可访问的url地址 + public async Task UploadAsync(string objectName, Stream fileStream, string contentType, long fileSize) + { + using var minio = new MinioClient().WithEndpoint(_uploadOptions.Minio.ServerAddress) + .WithCredentials( // + _uploadOptions.Minio.AccessKey, _uploadOptions.Minio.SecretKey) + .WithSSL(_uploadOptions.Minio.Secure) + .Build(); + + var beArgs = new BucketExistsArgs().WithBucket(_uploadOptions.Minio.BucketName); + + if (!await minio.BucketExistsAsync(beArgs)) { + var mbArgs = new MakeBucketArgs().WithBucket(_uploadOptions.Minio.BucketName); + await minio.MakeBucketAsync(mbArgs); + } + + var putArgs = new PutObjectArgs().WithBucket(_uploadOptions.Minio.BucketName) + .WithObject(objectName) + .WithStreamData(fileStream) + .WithObjectSize(fileSize) + .WithContentType(contentType); + _ = await minio.PutObjectAsync(putArgs); + + return $"{_uploadOptions.Minio.AccessUrl}/{_uploadOptions.Minio.BucketName}/{objectName}"; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/RedLocker.cs b/src/backend/NetAdmin.Infrastructure/Utils/RedLocker.cs new file mode 100644 index 00000000..26dbbb64 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/RedLocker.cs @@ -0,0 +1,98 @@ +using RedLockNet.SERedis; +using RedLockNet.SERedis.Configuration; +using StackExchange.Redis; + +namespace NetAdmin.Infrastructure.Utils; + +/// +/// Redis锁 +/// +#pragma warning disable DesignedForInheritance +public class RedLocker : IDisposable, ISingleton + #pragma warning restore DesignedForInheritance +{ + // Track whether Dispose has been called. + private bool _disposed; + + /// + /// Initializes a new instance of the class. + /// + public RedLocker(IOptions redisOptions) + { + RedlockFactory = RedLockFactory.Create( // + new List // + { + ConnectionMultiplexer.Connect( // + redisOptions.Value.Instances.First(x => x.Name == Chars.FLG_REDIS_INSTANCE_DATA_CACHE).ConnStr) + }); + } + + /// + /// Finalizes an instance of the class. + /// Use C# finalizer syntax for finalization code. + /// This finalizer will run only if the Dispose method + /// does not get called. + /// It gives your base class the opportunity to finalize. + /// Do not provide finalizer in types derived from this class. + /// + ~RedLocker() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(disposing: false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + /// + /// RedlockFactory + /// + public RedLockFactory RedlockFactory { get; } + + /// + /// Implement IDisposable. + /// Do not make this method virtual. + /// A derived class should not be able to override this method. + /// + public void Dispose() + { + Dispose(true); + + // This object will be cleaned up by the Dispose method. + // Therefore, you should call GC.SuppressFinalize to + // take this object off the finalization queue + // and prevent finalization code for this object + // from executing a second time. + GC.SuppressFinalize(this); + } + + /// + /// Dispose(bool disposing) executes in two distinct scenarios. + /// If disposing equals true, the method has been called directly + /// or indirectly by a user's code. Managed and unmanaged resources + /// can be disposed. + /// If disposing equals false, the method has been called by the + /// runtime from inside the finalizer and you should not reference + /// other objects. Only unmanaged resources can be disposed. + /// + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (_disposed) { + return; + } + + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) { + RedlockFactory.Dispose(); + } + + // Call the appropriate methods to clean up + // unmanaged resources here. + // If disposing is false, + // only the following code is executed. + + // Note disposing has been done. + _disposed = true; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs b/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs new file mode 100644 index 00000000..52d9695e --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/UserAgentParser.cs @@ -0,0 +1,347 @@ +// ReSharper disable StringLiteralTypo + +namespace NetAdmin.Infrastructure.Utils; + +/// +/// 解析用户代理字符串 +/// +public sealed class UserAgentParser +{ + private static readonly Dictionary _browsers = new() { + { "OPR", "Opera" } + , { "Flock", "Flock" } + , { "Edge", "Spartan" } + , { "Chrome", "Chrome" } + , { "Opera.*?Version", "Opera" } + , { "Opera", "Opera" } + , { "MSIE", "Internet Explorer" } + , { + "Internet Explorer" + , "Internet Explorer" + } + , { "Trident.* rv", "Internet Explorer" } + , { "Shiira", "Shiira" } + , { "Firefox", "Firefox" } + , { "Chimera", "Chimera" } + , { "Phoenix", "Phoenix" } + , { "Firebird", "Firebird" } + , { "Camino", "Camino" } + , { "Netscape", "Netscape" } + , { "OmniWeb", "OmniWeb" } + , { "Safari", "Safari" } + , { "Mozilla", "Mozilla" } + , { "Konqueror", "Konqueror" } + , { "icab", "iCab" } + , { "Lynx", "Lynx" } + , { "Links", "Links" } + , { "hotjava", "HotJava" } + , { "amaya", "Amaya" } + , { "IBrowse", "IBrowse" } + , { "Maxthon", "Maxthon" } + , { "Ubuntu", "Ubuntu Web Browser" } + }; + + private static readonly Dictionary _mobiles = new() { + // Legacy + { "mobileexplorer", "Mobile Explorer" } + , { "palmsource", "Palm" } + , { "palmscape", "Palmscape" } + , + + // Phones and Manufacturers + { "motorola", "Motorola" } + , { "nokia", "Nokia" } + , { "palm", "Palm" } + , { "iphone", "Apple iPhone" } + , { "ipad", "iPad" } + , { "ipod", "Apple iPod Touch" } + , { "sony", "Sony Ericsson" } + , { "ericsson", "Sony Ericsson" } + , { "blackberry", "BlackBerry" } + , { "cocoon", "O2 Cocoon" } + , { "blazer", "Treo" } + , { "lg", "LG" } + , { "amoi", "Amoi" } + , { "xda", "XDA" } + , { "mda", "MDA" } + , { "vario", "Vario" } + , { "htc", "HTC" } + , { "samsung", "Samsung" } + , { "sharp", "Sharp" } + , { "sie-", "Siemens" } + , { "alcatel", "Alcatel" } + , { "benq", "BenQ" } + , { "ipaq", "HP iPaq" } + , { "mot-", "Motorola" } + , { + "playstation portable" + , "PlayStation Portable" + } + , { "playstation 3", "PlayStation 3" } + , { "playstation vita", "PlayStation Vita" } + , { "hiptop", "Danger Hiptop" } + , { "nec-", "NEC" } + , { "panasonic", "Panasonic" } + , { "philips", "Philips" } + , { "sagem", "Sagem" } + , { "sanyo", "Sanyo" } + , { "spv", "SPV" } + , { "zte", "ZTE" } + , { "sendo", "Sendo" } + , { "nintendo dsi", "Nintendo DSi" } + , { "nintendo ds", "Nintendo DS" } + , { "nintendo 3ds", "Nintendo 3DS" } + , { "wii", "Nintendo Wii" } + , { "open web", "Open Web" } + , { "openweb", "OpenWeb" } + , + + // Operating Systems + { "android", "Android" } + , { "symbian", "Symbian" } + , { "SymbianOS", "SymbianOS" } + , { "elaine", "Palm" } + , { "series60", "Symbian S60" } + , { "windows ce", "Windows CE" } + , + + // Browsers + { "obigo", "Obigo" } + , { "netfront", "Netfront Browser" } + , { "openwave", "Openwave Browser" } + , { "mobilexplorer", "Mobile Explorer" } + , { "operamini", "Opera Mini" } + , { "opera mini", "Opera Mini" } + , { "opera mobi", "Opera Mobile" } + , { "fennec", "Firefox Mobile" } + , + + // Other + { "digital paths", "Digital Paths" } + , { "avantgo", "AvantGo" } + , { "xiino", "Xiino" } + , { "novarra", "Novarra Transcoder" } + , { "vodafone", "Vodafone" } + , { "docomo", "NTT DoCoMo" } + , { "o2", "O2" } + , + + // Fallback + { "mobile", "Generic Mobile" } + , { "wireless", "Generic Mobile" } + , { "j2me", "Generic Mobile" } + , { "midp", "Generic Mobile" } + , { "cldc", "Generic Mobile" } + , { "up.link", "Generic Mobile" } + , { "up.browser", "Generic Mobile" } + , { "smartphone", "Generic Mobile" } + , { "cellphone", "Generic Mobile" } + }; + + private static readonly Dictionary _platforms = new() { + { "windows nt 10.0", "Windows 10" } + , { "windows nt 6.3", "Windows 8.1" } + , { "windows nt 6.2", "Windows 8" } + , { "windows nt 6.1", "Windows 7" } + , { "windows nt 6.0", "Windows Vista" } + , { "windows nt 5.2", "Windows 2003" } + , { "windows nt 5.1", "Windows XP" } + , { "windows nt 5.0", "Windows 2000" } + , { "windows nt 4.0", "Windows NT 4.0" } + , { "winnt4.0", "Windows NT 4.0" } + , { "winnt 4.0", "Windows NT" } + , { "winnt", "Windows NT" } + , { "windows 98", "Windows 98" } + , { "win98", "Windows 98" } + , { "windows 95", "Windows 95" } + , { "win95", "Windows 95" } + , { "windows phone", "Windows Phone" } + , { "windows", "Unknown Windows OS" } + , { "android", "Android" } + , { "blackberry", "BlackBerry" } + , { "iphone", "iOS" } + , { "ipad", "iOS" } + , { "ipod", "iOS" } + , { "os x", "Mac OS X" } + , { "ppc mac", "Power PC Mac" } + , { "freebsd", "FreeBSD" } + , { "ppc", "Macintosh" } + , { "linux", "Linux" } + , { "debian", "Debian" } + , { "sunos", "Sun Solaris" } + , { "beos", "BeOS" } + , { "apachebench", "ApacheBench" } + , { "aix", "AIX" } + , { "irix", "Irix" } + , { "osf", "DEC OSF" } + , { "hp-ux", "HP-UX" } + , { "netbsd", "NetBSD" } + , { "bsdi", "BSDi" } + , { "openbsd", "OpenBSD" } + , { "gnu", "GNU/Linux" } + , { "unix", "Unknown Unix OS" } + , { "symbian", "Symbian OS" } + }; + + private static readonly Dictionary _robots = new() { + { "googlebot", "Googlebot" } + , { "msnbot", "MSNBot" } + , { "baiduspider", "Baiduspider" } + , { "bingbot", "Bing" } + , { "slurp", "Inktomi Slurp" } + , { "yahoo", "Yahoo" } + , { "ask jeeves", "Ask Jeeves" } + , { "fastcrawler", "FastCrawler" } + , { "infoseek", "InfoSeek Robot 1.0" } + , { "lycos", "Lycos" } + , { "yandex", "YandexBot" } + , { + "mediapartners-google" + , "MediaPartners Google" + } + , { "CRAZYWEBCRAWLER", "Crazy Webcrawler" } + , { "adsbot-google", "AdsBot Google" } + , { + "feedfetcher-google" + , "Feedfetcher Google" + } + , { "curious george", "Curious George" } + , { "ia_archiver", "Alexa Crawler" } + , { "MJ12bot", "Majestic-12" } + , { "Uptimebot", "Uptimebot" } + }; + + private readonly string _agent; + + /// + /// Initializes a new instance of the class. + /// + private UserAgentParser(string userAgentString) + { + _agent = userAgentString.Trim(); + _ = SetPlatform(); + if (SetRobot()) { + return; + } + + if (SetBrowser()) { + return; + } + + if (SetMobile()) { + // + } + } + + /// + /// 浏览器 + /// + public string Browser { get; set; } = string.Empty; + + /// + /// 浏览器版本 + /// + public string BrowserVersion { get; set; } = string.Empty; + + /// + /// 是浏览器 + /// + public bool IsBrowser { get; set; } + + /// + /// 是手机 + /// + public bool IsMobile { get; set; } + + /// + /// 是机器人 + /// + public bool IsRobot { get; set; } + + /// + /// 手机 + /// + public string Mobile { get; set; } = string.Empty; + + /// + /// 平台 + /// + public string Platform { get; set; } = string.Empty; + + /// + /// 机器人 + /// + public string Robot { get; set; } = string.Empty; + + /// + /// 创建 UserAgentParser + /// + public static UserAgentParser Create(string userAgentString) + { + return new UserAgentParser(userAgentString); + } + + private bool SetBrowser() + { + foreach (var item in _browsers) { + var match = Regex.Match(_agent, $@"{item.Key}.*?([0-9\.]+)", RegexOptions.IgnoreCase); + if (!match.Success) { + continue; + } + + IsBrowser = true; + BrowserVersion = match.Groups[1].Value; + Browser = item.Value; + _ = SetMobile(); + return true; + } + + return false; + } + + private bool SetMobile() + { + foreach (var item in _mobiles) { + if (_agent.IndexOf(item.Key, StringComparison.OrdinalIgnoreCase) != -1) { + IsMobile = true; + Mobile = item.Value; + return true; + } + } + + return false; + } + + private bool SetPlatform() + { + #pragma warning disable S3267 + foreach (var item in _platforms) { + #pragma warning restore S3267 + if (!Regex.IsMatch(_agent, $"{Regex.Escape(item.Key)}", RegexOptions.IgnoreCase)) { + continue; + } + + Platform = item.Value; + return true; + } + + Platform = "Unknown Platform"; + return false; + } + + private bool SetRobot() + { + #pragma warning disable S3267 + foreach (var item in _robots) { + #pragma warning restore S3267 + if (Regex.IsMatch(_agent, $"{Regex.Escape(item.Key)}", RegexOptions.IgnoreCase)) { + IsRobot = true; + Robot = item.Value; + _ = SetMobile(); + return true; + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs b/src/backend/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs new file mode 100644 index 00000000..42873e02 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/Utils/XmlCommentReader.cs @@ -0,0 +1,95 @@ +using System.Xml; + +namespace NetAdmin.Infrastructure.Utils; + +/// +/// 程序集注释文档读取工具 +/// +public sealed class XmlCommentReader : ISingleton +{ + private const string _XPATH = "//doc/members/member[@name=\"{0}\"]"; + private readonly List _xmlDocuments = new(); + + /// + /// Initializes a new instance of the class. + /// + public XmlCommentReader(IOptions specificationDocumentSettings) + { + var xmlComments = specificationDocumentSettings.Value.XmlComments // + ?? App.GetConfig( + nameof(SpecificationDocumentSettingsOptions).TrimEndOptions()) + .XmlComments; + foreach (var commentFile in xmlComments.Where(x => x.Contains(nameof(NetAdmin)))) { + var xmlDoc = new XmlDocument(); + try { + xmlDoc.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, commentFile)); + _xmlDocuments.Add(xmlDoc); + } + catch (FileNotFoundException) { + LogHelper.Get().Warn(Ln.Xml注释文件不存在); + } + } + } + + /// + /// 获取指定类型的注释 + /// + /// InvalidCastException + public string GetComments(MemberInfo memberInfo) + { + var node = memberInfo switch { + MethodInfo method => GetNodeByMethod(method) + , Type type => GetNodeByType(type) + , _ => throw new InvalidCastException() + }; + + if (node?.FirstChild?.Name != "inheritdoc") { + return node?.FirstChild?.InnerText.Trim(); + } + + var cref = node.FirstChild.Attributes?["cref"]?.Value; + if (cref != null) { + return GetComments(App.EffectiveTypes.Single(x => x.FullName == cref[2..])); + } + + var methodFromBaseType = memberInfo.DeclaringType?.BaseType?.GetMethod(memberInfo.Name); + + if (methodFromBaseType != null) { + return GetComments(methodFromBaseType); + } + + var methodFromInterface = memberInfo.DeclaringType?.GetInterfaces() + .Select(x => x.GetMethod(memberInfo.Name)) + .FirstOrDefault(x => x != null); + return methodFromInterface == null ? null : GetComments(methodFromInterface); + } + + private XmlNode GetNodeByMethod(MethodInfo method) + { + static string Replace(ParameterInfo parameterInfo) + { + return Regex.Replace(parameterInfo.ParameterType.ToString(), @"`\d+", string.Empty) + .Replace("[", "{") + .Replace("]", "}"); + } + + var nodeName = $"M:{method.DeclaringType}.{method.Name}"; + var parameters = method.GetParameters(); + if (parameters.Length != 0) { + nodeName += $"({string.Join(',', parameters.Select(Replace))})"; + } + + return _xmlDocuments + .Select(xmlDoc => xmlDoc.SelectSingleNode( + string.Format(NumberFormatInfo.InvariantInfo, _XPATH, nodeName))) + .FirstOrDefault(ret => ret != null); + } + + private XmlNode GetNodeByType(Type type) + { + return _xmlDocuments + .Select(xmlDoc => xmlDoc.SelectSingleNode( + string.Format(NumberFormatInfo.InvariantInfo, _XPATH, $"T:{type.FullName}"))) + .FirstOrDefault(ret => ret != null); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/commonSettings.Development.json b/src/backend/NetAdmin.Infrastructure/commonSettings.Development.json new file mode 100644 index 00000000..4874d4e4 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/commonSettings.Development.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + "AppSettings": { + "InjectSpecificationDocument": true, + "InjectMiniProfiler": true + }, + "Redis": { + "Instances": [ + // 数据缓存 + { + "Name": "DataCache", + "ConnStr": "localhost:6379", + "Database": 0 + } + ] + }, + "JWTSettings": { + "ExpiredTime": 20000 + }, + "Logging": { + "LogLevel": { + "Default": "Debug", + }, + }, +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/commonSettings.Test.json b/src/backend/NetAdmin.Infrastructure/commonSettings.Test.json new file mode 100644 index 00000000..cbd707f3 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/commonSettings.Test.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + "AppSettings": { + "InjectSpecificationDocument": true, + "InjectMiniProfiler": true + }, + "Redis": { + "Instances": [ + // 数据缓存 + { + "Name": "DataCache", + "ConnStr": "localhost:6379", + "Database": 0 + } + ] + }, + "JWTSettings": { + "ExpiredTime": 20000 + }, + "Logging": { + "LogLevel": { + "Default": "Debug", + }, + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.Infrastructure/commonSettings.json b/src/backend/NetAdmin.Infrastructure/commonSettings.json new file mode 100644 index 00000000..bc205704 --- /dev/null +++ b/src/backend/NetAdmin.Infrastructure/commonSettings.json @@ -0,0 +1,332 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + // App基本配置 + "AppSettings": { + // AppSettings:配置根节点 + // InjectMiniProfiler:是否注入 MiniProfiler,bool 类型,默认 true,关闭 Swagger 左上角监听 + // InjectSpecificationDocument:是否启用 Swagger 文档,bool 类型,默认 true,生产环境可关闭 + // EnabledReferenceAssemblyScan:是否启用通过 dll 方式添加的引用程序集扫描,bool 类型,默认 false + // ExternalAssemblies:配置外部程序集完整路径,支持动态加载,string[] 类型,默认 [] + // PrintDbConnectionInfo:是否打印数据库连接信息到 MiniProfiler 中,bool 类型,默认 true + // SupportPackageNamePrefixs:配置支持的包前缀名,string[] 类型,默认 [] + // OutputOriginalSqlExecuteLog:是否输出原始 Sql 执行日志(ADO.NET),默认 true + // VirtualPath:配置虚拟目录,必须以 / 开头 + "InjectSpecificationDocument": false, + "InjectMiniProfiler": false + }, + // Swagger文档配置 ------------------------------------------------------------------------------ + "SpecificationDocumentSettings": { + // DocumentTitle:文档标题,string,默认 Specification Api Document + // DefaultGroupName:默认分组名,string,默认 Default + // EnableAuthorized:是否启用权限控制,bool,默认 true + // FormatAsV2:采用 Swagger 2.0 版本,bool,默认 false 已弃用 + // RoutePrefix:规范化文档地址,string,默认 api,如果希望在首页,改为空字符串即可。 + // DocExpansionState:文档显示方式,DocExpansion,默认 List,取值: + // List:列表式(展开子类),默认值 + // Full:完全展开 + // None:列表式(不展开子类) + // XmlComments:程序集注释描述文件名(可带 .xml,string,默认 Furion.Application, Furion.Web.Entry, Furion.Web.Core + // GroupOpenApiInfos:分组信息配置,SpecificationOpenApiInfo[],默认 { 'Group': 'Default'} + // SecurityDefinitions:安全策略定义配置,SpecificationOpenApiSecurityScheme[],默认 [] + // Servers:配置 Server 下拉列表,OpenApiServer[] 类型,默认 [],如:{Servers:[ { Url:"地址", Description:"描述"} ]} + // HideServers:是否隐藏 Server 下拉列表,bool 类型,默认 true + // RouteTemplate:配置文档 swagger.json 路由模板,默认模板:swagger/{documentName}/swagger.json, {documentName} 代表分组名,必须保留原样 + // PackagesGroups:配置模块化内置分组名称,string[] 类型,默认 [] + // EnableEnumSchemaFilter:启用枚举 Schema 筛选器,bool 类型,默认 true + // EnableTagsOrderDocumentFilter:启用标签排序筛选器,bool 类型,默认 true + // ServerDir:配置 IIS 添加 Application 部署名,string 类型,默认空,仅在 Furion v3.2.0+` 有效 + // LoginInfo:配置 Swagger 是否需要登录才能访问,SpecificationLoginInfo 类型,默认 null,仅在 Furion v3.3.3+` 有效 + // Enabled:是否启用登录授权,默认 false + // CheckUrl:检查登录状态的 Url 地址,该地址必须是 POST 请求,已授权返回 200,否则返回 401 + // SubmitUrl:提交登录的 Url 地址,该地址必须是 POST 请求且只有一个 SpecificationAuth 类型参数,成功登录返回 200,否则返回 401,支持相对地址,以 / 开头 + // EnableAllGroups:启用 Swagger 总分组功能,自动将所有分组的接口合并到 All Groups 中,bool 类型,默认 false,仅在 Furion v3.3.4+` 有效 + // 另外 SpecificationOpenApiInfo 内置配置如下: + // + // Group:分组唯一标识,string 类型,必填 + // Order:分组排序,int 类型,数字越大排前面,默认 0 + // Visible:配置分组是否可见,bool 类型,默认 true + // Title:配置分组标题,string 类型 + // Description:配置分组描述,string 类型 + // Version:配置分组版本,默认 1.0 + // TermsOfService:配置相关链接地址,Uri 类型 + // Contact:配置联系方式,OpenApiContact 类型 + // License:配置协议,OpenApiLicense 类型 + "EnableEnumSchemaFilter": false, + "EnableAuthorized": false, + "RoutePrefix": "swagger", + "XmlComments": [ + "FreeSql.xml", + "NetAdmin.Application.xml", + "NetAdmin.BizServer.Application.xml", + "NetAdmin.BizServer.Cache.xml", + "NetAdmin.BizServer.Host.xml", + "NetAdmin.Cache.xml", + "NetAdmin.Domain.xml", + "NetAdmin.Host.xml", + "NetAdmin.Infrastructure.xml", + "NetAdmin.ScheduledService.xml", + "NetAdmin.SysComponent.Application.xml", + "NetAdmin.SysComponent.Cache.xml", + "NetAdmin.SysComponent.Host.xml", + ] + }, + // 验证码配置 -------------------------------------------------------------------------------------------------------- + "Captcha": { + "ImageRelativePath": ".data/captcha", + "SecretKey": "1Z?f(2)%v?:X5NYRl+]PSi.rDf7Ip#lB" + }, + // 跨域配置 ---------------------------------------------------------------------------------------------------------- + "CorsAccessorSettings": { + // CorsAccessorSettings + // PolicyName:跨域策略名,string 类型,必填,默认 App.Cors.Policy + // WithOrigins:允许跨域的域名列表,string[] 类型,默认 * + // WithHeaders:请求表头,没有配置则允许所有表头,string[] 类型 + // WithExposedHeaders:设置客户端可获取的响应标头,string[] 类型,默认 ["access-token", "x-access-token"] + // WithMethods:设置跨域允许请求谓词,没有配置则允许所有,string[] 类型 + // AllowCredentials:是否允许跨域请求中的凭据,bool 类型,默认值 true + // SetPreflightMaxAge:设置预检过期时间,int 类型,默认值 24小时 + // FixedClientToken:是否默认配置 WithExposedHeaders,bool 类型,默认 true + // SignalRSupport:是否启用 SignalR 跨域支持,bool 类型,默认 false + "WithExposedHeaders": [ + "access-token", + "x-access-token", + "content-disposition" + ] + }, + // 数据库配置 -------------------------------------------------------------------------------------------------------- + "Database": { + "DbType": "Sqlite", + "ConnStr": "data source=../../../assets/NetAdmin.db", + "SeedDataRelativePath": "SeedData" + }, + // 动态webapi配置 ---------------------------------------------------------------------------------------------------- + "DynamicApiControllerSettings": { + // 5.1.10 DynamicApiControllerSettings 配置 + // Furion 还提供动态 WebAPI 接口一些全局配置选项,如: + // + // DefaultRoutePrefix:默认路由前缀,string,默认 api + // DefaultHttpMethod:默认请求谓词,string,默认:POST + // DefaultModule:默认模块名称(区域),可用作接口版本,string,默认:v1 + // LowercaseRoute:小写路由格式,bool,默认:true + // AsLowerCamelCase:启用小驼峰命名(首字母小写),默认 false + // KeepVerb:是否保留动作谓词,bool,默认:false + // KeepName:是否保留默认名称,bool,默认:fasle + // CamelCaseSeparator:骆驼(驼峰)/帕斯卡命名分隔符,string,默认:- + // VersionSeparator:版本分隔符,string,默认:@ + // ModelToQuery:GET/HEAD 请求将 类类型参数转查询参数,bool,默认 false + // SupportedMvcController:是否支持 Mvc Controller 动态配置,bool,默认 false + // UrlParameterization:路由参数采用 [FromQuery] 化,默认 false([FromRoute] 方式) + // DefaultArea:配置默认区域,默认 null + // ForceWithRoutePrefix:配置是否强制添加 DefaultRoutePrefix,当控制器自定义了 [Route] 有效,仅限 v3.4.1+版本有效 + // AbandonControllerAffixes:默认去除控制器名称前后缀列表名,string[],默认: + // AppServices + // AppService + // ApiController + // Controller + // Services + // Service + // AbandonActionAffixes:默认去除动作方法名称前后缀列表名,string[],默认: + // Async + // VerbToHttpMethods:复写默认方法名转 [HttpMethod] 规则,string[][] 二维数组类型,内置匹配规则为: + // ["post"] = "POST", + // ["add"] = "POST", + // ["create"] = "POST", + // ["insert"] = "POST", + // ["submit"] = "POST", + // ["get"] = "GET", + // ["find"] = "GET", + // ["fetch"] = "GET", + // ["query"] = "GET", + // ["getlist"] = "GET", + // ["getall"] = "GET", + // ["put"] = "PUT", + // ["update"] = "PUT", + // ["delete"] = "DELETE", + // ["remove"] = "DELETE", + // ["clear"] = "DELETE", + // ["patch"] = "PATCH" + // + // 复写示例 + // "DynamicApiControllerSettings": { + // "VerbToHttpMethods": [ + // [ "getall", "HEAD" ], // => getall 会被复写为 `[HttpHead]` + // [ "other", "PUT" ] // => 新增一条新规则,比如,一 `[other]` 开头会转换为 `[HttpPut]` 请求 + // ] + // } + // "DefaultRoutePrefix": "rest", + "VerbToHttpMethods": [ + [ + "post", + "POST" + ], + [ + "add", + "POST" + ], + [ + "create", + "POST" + ], + [ + "insert", + "POST" + ], + [ + "submit", + "POST" + ], + [ + "get", + "POST" + ], + [ + "find", + "POST" + ], + [ + "fetch", + "POST" + ], + [ + "query", + "POST" + ], + [ + "getlist", + "POST" + ], + [ + "getall", + "POST" + ], + [ + "put", + "POST" + ], + [ + "update", + "POST" + ], + [ + "delete", + "POST" + ], + [ + "remove", + "POST" + ], + [ + "clear", + "POST" + ], + [ + "patch", + "POST" + ] + ], + "CamelCaseSeparator": ".", + "UrlParameterization": true, + "KeepVerb": true, + "AbandonControllerAffixes": [ + "Controller" + ], + }, + // 友好异常配置 ------------------------------------------------------------------------------------------------------- + "FriendlyExceptionSettings": { + // 7.15 FriendlyExceptionSettings 配置 + // HideErrorCode:隐藏错误码,bool 类型,默认 false + // DefaultErrorCode:默认错误码,string 类型 + // DefaultErrorMessage:默认错误消息,string 类型 + // ThrowBah:是否将 Oops.Oh 默认抛出为业务异常,bool 类型,默认 false,设置 true 之后 Oops.Oh 默认进入 OnValidateFailed 处理,而不是 OnException + // LogError:是否输出异常日志,bool 类型,默认 true + "LogError": false + }, + // JWT鉴权配置 ------------------------------------------------------------------------------------------------------- + "JWTSettings": { + "ValidateIssuerSigningKey": true, + // 是否验证密钥,bool 类型,默认true + "IssuerSigningKey": "bO0BCAGxpxYnm6AE4XpgO25T27NayFzjGgfDqBuzUzD6ROpFiZUi3KjVg93bdGek", + // 密钥,string 类型,必须是复杂密钥,长度大于16 + "ValidateIssuer": true, + // 是否验证签发方,bool 类型,默认true + "ValidIssuer": "签发方", + // 签发方,string 类型 + "ValidateAudience": true, + // 是否验证签收方,bool 类型,默认true + "ValidAudience": "签收方", + // 签收方,string 类型 + "ValidateLifetime": true, + // 是否验证过期时间,bool 类型,默认true,建议true + "ExpiredTime": 20, + // 过期时间,long 类型,单位分钟,默认20分钟 + "ClockSkew": 5, + // 过期时间容错值,long 类型,单位秒,默认 5秒 + "Algorithm": "HS256" + // 加密算法,string 类型,默认 HS256 + }, + // 日志配置 ---------------------------------------------------------------------------------------------------------- + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning", + "System.Logging.EventBusService": "Error" + }, + "Monitor": { + "GlobalEnabled": true, + // 是否启用全局拦截,默认 `false` + // "IncludeOfMethods": [], // 是否指定拦截特定方法,当 GlobalEnabled: false 有效 + // "ExcludeOfMethods": [], // 是否指定排除特定方法,当 GlobalEnabled: true 有效 + // "BahLogLevel": "Information", // 配置 Oops.Oh 和 Oops.Bah 业务日志输出级别,默认 Information + // "WithReturnValue": true, // 配置是否包含返回值,默认 `true`,Furion 4.3.9+ 有效 + "ReturnValueThreshold": 1000 + // 配置返回值字符串阈值,默认 0,全量输出,Furion 4.3.9+ 有效 + // "JsonBehavior": "None", // 配置 LoggingMonitor Json 输出行为,默认 None,Furion 4.5.2+ 有效 + // "MethodsSettings": [ + // // 配置被监视方法更多信息,Furion 4.3.9+ 有效 + // { + // "FullName": "Furion.Application.TestLoggerServices.MethodName", // 方法完全限定名 + // "WithReturnValue": true, // 配置是否包含返回值,默认 `true`,Furion 4.3.9+ 有效 + // "ReturnValueThreshold": 0 // 配置返回值字符串阈值,默认 0,全量输出,Furion 4.3.9+ 有效 + // } + // ] + } + }, + // Redis配置 -------------------------------------------------------------------------------------------------------- + "Redis": { + "Instances": [ + // 数据缓存 + { + "Name": "DataCache", + "ConnStr": "localhost:6379", + "Database": 0 + } + ] + }, + // UnifyResultSettings 规范化配置 ------------------------------------------------------------------------------------ + "UnifyResultSettings": { + // Return200StatusCodes:配置返回 200 状态码的请求,int[] 类型,只支持 400+(404除外) 状态码篡改 + // AdaptStatusCodes:配置篡改状态码规则,int[][] 类型,只支持 400+(404除外) 状态码篡改 + // SupportMvcController:是否支持 MVC 控制台规范化处理,bool 类型,默认 false + "Return200StatusCodes": [ + 999 + ], + }, + // 文件上传配置 ------------------------------------------------------------------------------------------------------- + "Upload": { + "ContentTypes": [ + "image/jpg", + "image/png", + "image/jpeg", + "image/gif" + ], + "MaxSize": 1073741824, + "Minio": { + "ServerAddress": "vm-ubt-1:9000", + "AccessKey": "nVMM0gSqwyIjM8iZ", + "SecretKey": "F8OZngGrNsZSYn4MP9swwMSf5rfm61EC", + "BucketName": "net-admin", + "AccessUrl": "http://vm-ubt-1:9000", + "Secure": false, + } + }, +} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/Extensions/ServiceCollectionExtensions.cs b/src/backend/NetAdmin.ScheduledService/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..d8825491 --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,50 @@ +using Furion.Schedule; +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.Enums.Sys; +using NetAdmin.Host.Extensions; +using NetAdmin.ScheduledService.Jobs; + +namespace NetAdmin.ScheduledService.Extensions; + +/// +/// ServiceCollection 扩展方法 +/// +[SuppressSniffer] +public static class ServiceCollectionExtensions +{ + /// + /// 注册FreeSql + /// + public static IServiceCollection AddFreeSql(this IServiceCollection me) + { + _ = me.AddFreeSql( // + FreeSqlInitOptions.SyncStructure | FreeSqlInitOptions.InsertSeedData, freeSql => { + // 数据权限过滤器 + _ = freeSql.GlobalFilter.ApplyOnlyIf( // + Chars.FLG_GLOBAL_FILTER_DATA + , () => ContextUserInfo.Create()?.Roles.All(x => x.DataScope == DataScopes.Self) ?? false + , a => a.OwnerId == ContextUserInfo.Create().Id); + }); + return me; + } + + /// + /// 注册定时任务 + /// + public static IServiceCollection AddSchedules(this IServiceCollection me) + { + _ = me.AddSchedule( // + builder => builder // + .AddJob(false, Triggers.Minutely().SetRunOnStart(true)) + + // .AddJob(false, Triggers.PeriodSeconds(10).SetRunOnStart(true)) + // .AddJob(false, Triggers.PeriodSeconds(10).SetRunOnStart(true)) + + // + #pragma warning disable SA1009, SA1111 + ); + #pragma warning restore SA1111, SA1009 + return me; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/Jobs/ExampleJob.cs b/src/backend/NetAdmin.ScheduledService/Jobs/ExampleJob.cs new file mode 100644 index 00000000..50044e5c --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/Jobs/ExampleJob.cs @@ -0,0 +1,34 @@ +using Furion.Schedule; +using NetAdmin.Host.BackgroundRunning; + +namespace NetAdmin.ScheduledService.Jobs; + +/// +/// 示例Job +/// +public sealed class ExampleJob : WorkBase, IJob +{ + /// + /// Initializes a new instance of the class. + /// + public ExampleJob() { } + + /// + /// 具体处理逻辑 + /// + /// 作业执行前上下文 + /// 取消任务 Token + /// 加锁失败异常 + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + await WorkflowAsync(stoppingToken); + } + + /// + /// 通用工作流 + /// + protected override ValueTask WorkflowAsync(CancellationToken cancelToken) + { + return ValueTask.CompletedTask; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/NetAdmin.ScheduledService.csproj b/src/backend/NetAdmin.ScheduledService/NetAdmin.ScheduledService.csproj new file mode 100644 index 00000000..cb796d2f --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/NetAdmin.ScheduledService.csproj @@ -0,0 +1,15 @@ + + + + + + + + + + + + PreserveNewest + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/Properties/launchSettings.json b/src/backend/NetAdmin.ScheduledService/Properties/launchSettings.json new file mode 100644 index 00000000..be13b02f --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/Properties/launchSettings.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "NetAdmin.ScheduledService": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchUrl": "http://localhost:65080", + "applicationUrl": "http://[::]:65080", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/Startup.cs b/src/backend/NetAdmin.ScheduledService/Startup.cs new file mode 100644 index 00000000..f7428792 --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/Startup.cs @@ -0,0 +1,68 @@ +using NetAdmin.Host.Extensions; +using NetAdmin.Host.Middlewares; +using NetAdmin.ScheduledService.Extensions; +using Prometheus; + +namespace NetAdmin.ScheduledService; + +/// +/// 启动类 +/// +public sealed class Startup : Host.Startup +{ + /// + /// 程序入口 + /// + public static void Main(string[] args) + { + ShowBanner(); + _ = Serve.Run(RunOptions.Default.WithArgs(args)); + } + + /// + /// 配置应用程序中间件 + /// + public void Configure(IApplicationBuilder app) + { + _ = app // + .UseRealIp() // 获取真实IP + .EnableBuffering() // / 启用 Body 重读 + .UseMiddleware() // 请求审计 + #if DEBUG + .UseOpenApiSkin() // / Swagger皮肤 + #endif + .UseInject(string.Empty) // / Furion脚手架 + .UseUnifyResultStatusCodes() // 状态码拦截 + .UseCorsAccessor() // 跨域访问 + .UseRouting() // 路由映射 + .UseHttpMetrics() // 性能监控 + .UseMiddleware() // 删除json空节点 + .UseEndpoints() // / 执行匹配的端点 + + // + ; + } + + /// + /// 配置服务容器 + /// + public void ConfigureServices(IServiceCollection services) + { + _ = services.AddConsoleFormatter() // / 控制台日志模板 + .AddAllOptions() // / 注册配置项 + .AddSnowflake() // / 雪花编号生成器 + .AddEventBus() // 事件总线 + .AddFreeSql() // freeSql + .AddRemoteRequest() // 注册远程请求 + .AddCorsAccessor() // 支持跨域访问 + .AddRedisCache() // Redis缓存 + .AddContextUser() // 上下文用户 + .AddSchedules() // 计划任务 + + // IMvcBuilder + .AddControllers() // 注册控制器 + .AddJsonSerializer() // json序列化配置 + .AddDefaultApiResultHandler() // Api结果处理器 + ; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/settings.Development.json b/src/backend/NetAdmin.ScheduledService/settings.Development.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/settings.Development.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/settings.Test.json b/src/backend/NetAdmin.ScheduledService/settings.Test.json new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/settings.Test.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/backend/NetAdmin.ScheduledService/settings.json b/src/backend/NetAdmin.ScheduledService/settings.json new file mode 100644 index 00000000..496930a9 --- /dev/null +++ b/src/backend/NetAdmin.ScheduledService/settings.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", + "SpecificationDocumentSettings": { + "GroupOpenApiInfos": [ + { + "Group": "Default", + "Title": "计划任务服务", + "Description": "NetAdmin - 计划任务服务", + }, + { + "Group": "Health", + "Visible": false + } + ] + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs new file mode 100644 index 00000000..d31a9946 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IApiModule.cs @@ -0,0 +1,20 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Api; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 接口模块 +/// +public interface IApiModule : ICrudModule +{ + /// + /// 同步接口 + /// + Task SyncAsync(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICacheModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICacheModule.cs new file mode 100644 index 00000000..4d164684 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICacheModule.cs @@ -0,0 +1,20 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Cache; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 缓存模块 +/// +public interface ICacheModule +{ + /// + /// 缓存统计 + /// + Task CacheStatisticsAsync(); + + /// + /// 获取所有缓存项 + /// + PagedQueryRsp GetAllEntries(PagedQueryReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICaptchaModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICaptchaModule.cs new file mode 100644 index 00000000..a37af239 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/ICaptchaModule.cs @@ -0,0 +1,19 @@ +using NetAdmin.Domain.Dto.Sys.Captcha; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 人机验证模块 +/// +public interface ICaptchaModule +{ + /// + /// 获取人机校验图 + /// + Task GetCaptchaImageAsync(); + + /// + /// 完成人机校验 + /// + Task VerifyCaptchaAsync(VerifyCaptchaReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConfigModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConfigModule.cs new file mode 100644 index 00000000..37871bcd --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConfigModule.cs @@ -0,0 +1,20 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Config; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 配置模块 +/// +public interface IConfigModule : ICrudModule +{ + /// + /// 获取最新有效配置 + /// + Task GetLatestConfigAsync(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConstantModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConstantModule.cs new file mode 100644 index 00000000..57057bff --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IConstantModule.cs @@ -0,0 +1,27 @@ +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 常量模块 +/// +public interface IConstantModule +{ + /// + /// 获得常量字符串 + /// + IDictionary GetCharsDic(); + + /// + /// 获得公共枚举值 + /// + IDictionary> GetEnums(); + + /// + /// 获得本地化字符串 + /// + IDictionary GetLocalizedStrings(); + + /// + /// 获得数字常量表 + /// + IDictionary GetNumbersDic(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDeptModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDeptModule.cs new file mode 100644 index 00000000..91290f93 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDeptModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dept; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 部门模块 +/// +public interface IDeptModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDevModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDevModule.cs new file mode 100644 index 00000000..cb3c2092 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDevModule.cs @@ -0,0 +1,24 @@ +using NetAdmin.Domain.Dto.Sys.Dev; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 开发模块 +/// +public interface IDevModule +{ + /// + /// 生成后端代码 + /// + Task GenerateCsCodeAsync(GenerateCsCodeReq req); + + /// + /// 生成图标代码 + /// + Task GenerateIconCodeAsync(GenerateIconCodeReq req); + + /// + /// 生成接口代码 + /// + Task GenerateJsCodeAsync(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicCatalogModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicCatalogModule.cs new file mode 100644 index 00000000..167dcc21 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicCatalogModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 字典目录模块 +/// +public interface IDicCatalogModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicContentModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicContentModule.cs new file mode 100644 index 00000000..acda7e03 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicContentModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Content; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 字典内容模块 +/// +public interface IDicContentModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs new file mode 100644 index 00000000..82e8b029 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IDicModule.cs @@ -0,0 +1,71 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; +using NetAdmin.Domain.Dto.Sys.Dic.Content; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 字典模块 +/// +public interface IDicModule +{ + /// + /// 批量删除字典目录 + /// + Task BulkDeleteCatalogAsync(BulkReq req); + + /// + /// 批量删除字典内容 + /// + Task BulkDeleteContentAsync(BulkReq req); + + /// + /// 创建字典目录 + /// + Task CreateCatalogAsync(CreateDicCatalogReq req); + + /// + /// 创建字典内容 + /// + Task CreateContentAsync(CreateDicContentReq req); + + /// + /// 删除字典目录 + /// + Task DeleteCatalogAsync(DelReq req); + + /// + /// 删除字典内容 + /// + Task DeleteContentAsync(DelReq req); + + /// + /// 分页查询字典目录 + /// + Task> PagedQueryCatalogAsync(PagedQueryReq req); + + /// + /// 分页查询字典内容 + /// + Task> PagedQueryContentAsync(PagedQueryReq req); + + /// + /// 查询字典目录 + /// + Task> QueryCatalogAsync(QueryReq req); + + /// + /// 查询字典内容 + /// + Task> QueryContentAsync(QueryReq req); + + /// + /// 更新字典目录 + /// + Task UpdateCatalogAsync(UpdateDicCatalogReq req); + + /// + /// 更新字典内容 + /// + Task UpdateContentAsync(UpdateDicContentReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs new file mode 100644 index 00000000..c6c54631 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IFileModule.cs @@ -0,0 +1,12 @@ +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 文件模块 +/// +public interface IFileModule +{ + /// + /// 文件上传 + /// + Task UploadAsync(IFormFile file); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IMenuModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IMenuModule.cs new file mode 100644 index 00000000..a48668da --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IMenuModule.cs @@ -0,0 +1,20 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Menu; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 菜单模块 +/// +public interface IMenuModule : ICrudModule +{ + /// + /// 当前用户菜单 + /// + Task> UserMenusAsync(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRequestLogModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRequestLogModule.cs new file mode 100644 index 00000000..5b5e32c8 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRequestLogModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.RequestLog; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 请求日志模块 +/// +public interface IRequestLogModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRoleModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRoleModule.cs new file mode 100644 index 00000000..ff9fe37c --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IRoleModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Role; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 角色模块 +/// +public interface IRoleModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IToolsModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IToolsModule.cs new file mode 100644 index 00000000..56d88f39 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IToolsModule.cs @@ -0,0 +1,17 @@ +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 工具模块 +/// +public interface IToolsModule +{ + /// + /// 服务器时间 + /// + DateTime GetServerUtcTime(); + + /// + /// 版本信息 + /// + string Version(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserModule.cs new file mode 100644 index 00000000..c848034a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserModule.cs @@ -0,0 +1,76 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserProfile; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 用户模块 +/// +public interface IUserModule : ICrudModule +{ + /// + /// 检查手机号是否可用 + /// + Task CheckMobileAvailableAsync(CheckMobileAvailableReq req); + + /// + /// 检查用户名是否可用 + /// + Task CheckUserNameAvailableAsync(CheckUserNameAvailableReq req); + + /// + /// 密码登录 + /// + Task LoginByPwdAsync(LoginByPwdReq req); + + /// + /// 短信登录 + /// + Task LoginBySmsAsync(LoginBySmsReq req); + + /// + /// 查询用户档案 + /// + Task> QueryProfileAsync(QueryReq req); + + /// + /// 注册用户 + /// + Task RegisterAsync(RegisterUserReq req); + + /// + /// 重设密码 + /// + Task ResetPasswordAsync(ResetPasswordReq req); + + /// + /// 设置用户头像 + /// + Task SetAvatarAsync(SetAvatarReq req); + + /// + /// 设置邮箱 + /// + Task SetEmailAsync(SetEmailReq req); + + /// + /// 设置手机号 + /// + Task SetMobileAsync(SetMobileReq req); + + /// + /// 设置密码 + /// + Task SetPasswordAsync(SetPasswordReq req); + + /// + /// 当前用户信息 + /// + Task UserInfoAsync(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserProfileModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserProfileModule.cs new file mode 100644 index 00000000..8f85c38f --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IUserProfileModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.UserProfile; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 用户档案模块 +/// +public interface IUserProfileModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IVerifyCodeModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IVerifyCodeModule.cs new file mode 100644 index 00000000..aa6bf83a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Sys/IVerifyCodeModule.cs @@ -0,0 +1,28 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.VerifyCode; + +namespace NetAdmin.SysComponent.Application.Modules.Sys; + +/// +/// 验证码模块 +/// +public interface IVerifyCodeModule : ICrudModule +{ + /// + /// 发送验证码 + /// + Task SendVerifyCodeAsync(SendVerifyCodeReq req); + + /// + /// 完成验证 + /// + /// + /// 对于验证失败的,不主动删除缓存,通过防火墙来应对暴力破解 + /// + Task VerifyAsync(VerifyCodeReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Modules/Tpl/IExampleModule.cs b/src/backend/NetAdmin.SysComponent.Application/Modules/Tpl/IExampleModule.cs new file mode 100644 index 00000000..7d71660a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Modules/Tpl/IExampleModule.cs @@ -0,0 +1,14 @@ +using NetAdmin.Application.Modules; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Tpl.Example; + +namespace NetAdmin.SysComponent.Application.Modules.Tpl; + +/// +/// 示例模块 +/// +public interface IExampleModule : ICrudModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj b/src/backend/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj new file mode 100644 index 00000000..1124ffb6 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/NetAdmin.SysComponent.Application.csproj @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs new file mode 100644 index 00000000..03378b3f --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ApiService.cs @@ -0,0 +1,160 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Api; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class ApiService : RepositoryService, IApiService +{ + private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider; + private readonly XmlCommentReader _xmlCommentReader; + + /// + /// Initializes a new instance of the class. + /// + public ApiService(Repository rpo, XmlCommentReader xmlCommentReader + , IActionDescriptorCollectionProvider actionDescriptorCollectionProvider) // + : base(rpo) + { + _xmlCommentReader = xmlCommentReader; + _actionDescriptorCollectionProvider = actionDescriptorCollectionProvider; + } + + /// + /// 批量删除接口 + /// + /// NotImplementedException + public Task BulkDeleteAsync(BulkReq req) + { + throw new NotImplementedException(); + } + + /// + /// 创建接口 + /// + /// NotImplementedException + public Task CreateAsync(CreateApiReq req) + { + throw new NotImplementedException(); + } + + /// + /// 删除接口 + /// + /// NotImplementedException + public Task DeleteAsync(DelReq req) + { + throw new NotImplementedException(); + } + + /// + /// 判断接口是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个接口 + /// + /// NotImplementedException + public Task GetAsync(QueryApiReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询接口 + /// + /// NotImplementedException + public Task> PagedQueryAsync(PagedQueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 查询接口 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await Rpo.Select.WhereDynamicFilter(req.DynamicFilter).WhereDynamic(req.Filter).ToTreeListAsync(); + return ret.Adapt>(); + } + + /// + /// 反射接口列表 + /// + public IEnumerable ReflectionList(bool excludeAnonymous = true) + { + var regex = new Regex(@"\.(\w+)$", RegexOptions.Compiled); + + QueryApiRsp SelectQueryApiRsp(IGrouping group) + { + var first = group.First()!; + return new QueryApiRsp { + Summary = _xmlCommentReader.GetComments(group.Key) + , Name = first.ControllerName + , Id = Regex.Replace( // + first.AttributeRouteInfo!.Template!, $"/{first.ActionName}$", string.Empty) + , Children = GetChildren(group) + , Namespace = regex.Match(group.Key.Namespace!).Groups[1].Value.ToLowerInvariant() + }; + } + + var actionDescriptors // + = _actionDescriptorCollectionProvider.ActionDescriptors.Items.Cast(); + + if (excludeAnonymous) { + actionDescriptors = actionDescriptors.Where(x => x.EndpointMetadata.All(y => y is AllowAnonymousAttribute)); + } + + var actionGroup // + = actionDescriptors.GroupBy(x => x.ControllerTypeInfo); + + return actionGroup.Select(SelectQueryApiRsp); + } + + /// + /// 同步接口 + /// + public async Task SyncAsync() + { + _ = await Rpo.DeleteAsync(_ => true); + + var list = ReflectionList(false); + + EnableCascadeSave = true; + foreach (var item in list) { + var entity = item.Adapt(); + _ = await Rpo.InsertAsync(entity); + } + } + + /// + /// 更新接口 + /// + /// NotImplementedException + public Task UpdateAsync(NopReq req) + { + throw new NotImplementedException(); + } + + private IEnumerable GetChildren(IEnumerable actionDescriptors) + { + return actionDescriptors // + .Select(x => new QueryApiRsp { + Summary = _xmlCommentReader.GetComments(x.MethodInfo) + , Name = x.ActionName + , Id = x.AttributeRouteInfo!.Template + , Method = x.ActionConstraints?.OfType() + .FirstOrDefault() + ?.HttpMethods.First() + }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs new file mode 100644 index 00000000..b76bbbf0 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CacheService.cs @@ -0,0 +1,49 @@ +using NetAdmin.Application.Services; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Cache; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using StackExchange.Redis; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class CacheService : ServiceBase, ICacheService +{ + private readonly IConnectionMultiplexer _connectionMultiplexer; + + /// + /// Initializes a new instance of the class. + /// + public CacheService(IConnectionMultiplexer connectionMultiplexer) + { + _connectionMultiplexer = connectionMultiplexer; + } + + /// + /// 缓存统计 + /// + public Task CacheStatisticsAsync() + { + var database = _connectionMultiplexer.GetDatabase(); + return Task.FromResult( + new CacheStatisticsRsp((string)database.Execute("info")) { DbSize = (long)database.Execute("dbSize") }); + } + + /// + public PagedQueryRsp GetAllEntries(PagedQueryReq req) + { + var database = _connectionMultiplexer.GetDatabase((int?)req.Filter?.DbIndex ?? 0); + var redisResults + = (RedisResult[])database.Execute("scan", (req.Page - 1) * req.PageSize, "count", req.PageSize); + + var list = ((string[])redisResults![1])!.Where(x => database.KeyType(x) == RedisType.Hash) + .Select(x => database.HashGetAll(x) + .Append(new HashEntry("key", x)) + .ToArray() + .ToStringDictionary()) + .ToList() + .ConvertAll(x => x.Adapt()); + + return new PagedQueryRsp(req.Page, req.PageSize, 10000, list); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CaptchaService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CaptchaService.cs new file mode 100644 index 00000000..7db65f72 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/CaptchaService.cs @@ -0,0 +1,58 @@ +using NetAdmin.Application.Services; +using NetAdmin.Domain.Dto.Sys.Captcha; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using SixLabors.ImageSharp; +using Yitter.IdGenerator; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class CaptchaService : ServiceBase, ICaptchaService +{ + private static readonly Assembly _entryAsm = Assembly.GetEntryAssembly(); + private static readonly string _entryAsmName = _entryAsm.FullName![.._entryAsm.FullName.IndexOf(',')]; + + /// + /// Initializes a new instance of the class. + /// + public CaptchaService() { } + + /// + /// 获取人机校验图 + /// + public async Task GetCaptchaImageAsync() + { + var (backgroundImage, sliderImage, offsetSaw) = await CaptchaImageHelper.CreateSawSliderImageAsync( + _entryAsm, $"{_entryAsmName}.Assets.Captcha.background", $"{_entryAsmName}.Assets.Captcha.template" + , (1, 101), (1, 7), new Size(50, 50)); + + var id = $"{nameof(GetCaptchaImageAsync)}_{YitIdHelper.NextId()}"; + return new GetCaptchaRsp { + Id = id + , BackgroundImage = backgroundImage + , SliderImage = sliderImage + , SawOffsetX = offsetSaw.X + }; + } + + /// + /// 完成人机校验 + /// + public Task VerifyCaptchaAsync(VerifyCaptchaReq req) + { + if (req.SawOffsetX == null) { + return Task.FromResult(false); + } + + bool ret; + try { + var aesKey = req.Id.Aes(CaptchaOptions.SecretKey)[..32]; + ret = Math.Abs(req.SawOffsetX.Value - req.VerifyData.AesDe(aesKey).Float()) < 5f; + } + catch { + ret = false; + } + + return Task.FromResult(ret); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs new file mode 100644 index 00000000..6d8d7b6c --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConfigService.cs @@ -0,0 +1,132 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Config; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using DataType = FreeSql.DataType; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class ConfigService : RepositoryService, IConfigService +{ + /// + /// Initializes a new instance of the class. + /// + public ConfigService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除配置 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建配置 + /// + public async Task CreateAsync(CreateConfigReq req) + { + var ret = await Rpo.InsertAsync(req); + return ret.Adapt(); + } + + /// + /// 删除配置 + /// + public Task DeleteAsync(DelReq req) + { + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断配置是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个配置 + /// + /// NotImplementedException + public async Task GetAsync(QueryConfigReq req) + { + var ret = await QueryInternal(new QueryReq { Filter = req }).ToOneAsync(); + return ret.Adapt(); + } + + /// + /// 获取最新有效配置 + /// + public async Task GetLatestConfigAsync() + { + var ret = await QueryAsync( + new QueryReq { Count = 1, Filter = new QueryConfigReq { Enabled = true } }); + return ret.FirstOrDefault(); + } + + /// + /// 分页查询配置 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req).Page(req.Page, req.PageSize).Count(out var total).ToListAsync(); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.Adapt>()); + } + + /// + /// 查询配置 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).Take(req.Count).ToListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新配置 + /// + public async Task UpdateAsync(UpdateConfigReq req) + { + if (Rpo.Orm.Ado.DataType == DataType.Sqlite) { + return await UpdateForSqliteAsync(req); + } + + var ret = await Rpo.UpdateDiy.SetSource(req).ExecuteUpdatedAsync(); + return ret.FirstOrDefault()?.Adapt(); + } + + private ISelect QueryInternal(QueryReq req) + { + return Rpo.Select.Include(a => a.UserRegisterDept) + .Include(a => a.UserRegisterRole) + .WhereDynamicFilter(req.DynamicFilter) + .WhereIf( // + req.Filter?.Enabled.HasValue ?? false, a => a.Enabled == req.Filter.Enabled.Value) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Id); + } + + /// + /// 非sqlite数据库请删掉 + /// + private async Task UpdateForSqliteAsync(Sys_Config req) + { + return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0 + ? null + : await GetAsync(new QueryConfigReq { Id = req.Id }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs new file mode 100644 index 00000000..3c53ec5e --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ConstantService.cs @@ -0,0 +1,58 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class ConstantService : ServiceBase, IConstantService +{ + /// + /// 获得常量字符串 + /// + public IDictionary GetCharsDic() + { + return typeof(Chars).GetFields(BindingFlags.Public | BindingFlags.Static) + .Where(x => x.FieldType == typeof(string)) + .ToImmutableSortedDictionary( // + x => x.Name, x => x.GetValue(null)?.ToString()); + } + + /// + /// 获得公共枚举值 + /// + public IDictionary> GetEnums() + { + return App.EffectiveTypes.Where(x => x.IsEnum && x.GetCustomAttribute(false) != null) + .ToDictionary(x => x.Name, x => // + x.GetEnumValues() + .Cast() + .ToDictionary( // + y => y.ToString() + , y => new[] { + Convert.ToInt64(y, CultureInfo.InvariantCulture) + .ToString(CultureInfo.InvariantCulture) + , y.ResDesc() + })); + } + + /// + /// 获得本地化字符串 + /// + public IDictionary GetLocalizedStrings() + { + return typeof(Ln).GetProperties(BindingFlags.Public | BindingFlags.Static) + .Where(x => x.PropertyType == typeof(string)) + .ToImmutableSortedDictionary(x => x.Name, x => x.GetValue(null)?.ToString()); + } + + /// + /// 获得数字常量表 + /// + public IDictionary GetNumbersDic() + { + return typeof(Numbers).GetFields(BindingFlags.Public | BindingFlags.Static) + .Where(x => x.FieldType == typeof(int) || x.FieldType == typeof(long)) + .ToImmutableSortedDictionary( // + x => x.Name, x => Convert.ToInt64(x.GetValue(null), CultureInfo.InvariantCulture)); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IApiService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IApiService.cs new file mode 100644 index 00000000..3d4a8234 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IApiService.cs @@ -0,0 +1,16 @@ +using NetAdmin.Application.Services; +using NetAdmin.Domain.Dto.Sys.Api; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 接口服务 +/// +public interface IApiService : IService, IApiModule +{ + /// + /// 反射接口列表 + /// + IEnumerable ReflectionList(bool excludeAnonymous = true); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICacheService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICacheService.cs new file mode 100644 index 00000000..78d6b48f --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICacheService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 缓存服务 +/// +public interface ICacheService : IService, ICacheModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICaptchaService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICaptchaService.cs new file mode 100644 index 00000000..46fd43d6 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/ICaptchaService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 人机验证服务 +/// +public interface ICaptchaService : IService, ICaptchaModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConfigService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConfigService.cs new file mode 100644 index 00000000..f26c43e2 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConfigService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 配置服务 +/// +public interface IConfigService : IService, IConfigModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConstantService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConstantService.cs new file mode 100644 index 00000000..fe260225 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IConstantService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 常量服务 +/// +public interface IConstantService : IService, IConstantModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDeptService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDeptService.cs new file mode 100644 index 00000000..6b391409 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDeptService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 部门服务 +/// +public interface IDeptService : IService, IDeptModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDevService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDevService.cs new file mode 100644 index 00000000..0da0592a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDevService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 开发服务 +/// +public interface IDevService : IService, IDevModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicCatalogService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicCatalogService.cs new file mode 100644 index 00000000..c8dca8fe --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicCatalogService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 字典目录服务 +/// +public interface IDicCatalogService : IService, IDicCatalogModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicContentService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicContentService.cs new file mode 100644 index 00000000..dca7b15b --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicContentService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 字典内容服务 +/// +public interface IDicContentService : IService, IDicContentModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicService.cs new file mode 100644 index 00000000..578b0f39 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IDicService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 字典服务 +/// +public interface IDicService : IService, IDicModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IFileService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IFileService.cs new file mode 100644 index 00000000..1c5dd427 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IFileService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 文件服务 +/// +public interface IFileService : IService, IFileModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IMenuService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IMenuService.cs new file mode 100644 index 00000000..ad1f11bb --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IMenuService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 菜单服务 +/// +public interface IMenuService : IService, IMenuModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRequestLogService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRequestLogService.cs new file mode 100644 index 00000000..d5f2d5ec --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRequestLogService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 请求日志服务 +/// +public interface IRequestLogService : IService, IRequestLogModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRoleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRoleService.cs new file mode 100644 index 00000000..61fcbca5 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IRoleService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 角色服务 +/// +public interface IRoleService : IService, IRoleModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IToolsService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IToolsService.cs new file mode 100644 index 00000000..6adf6859 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IToolsService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 工具服务 +/// +public interface IToolsService : IService, IToolsModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserProfileService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserProfileService.cs new file mode 100644 index 00000000..4af0aae9 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserProfileService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 用户档案服务 +/// +public interface IUserProfileService : IService, IUserProfileModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserService.cs new file mode 100644 index 00000000..23cf0b5a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IUserService.cs @@ -0,0 +1,21 @@ +using NetAdmin.Application.Services; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 用户服务 +/// +public interface IUserService : IService, IUserModule +{ + /// + /// 获取单个用户(带更新锁) + /// + Task GetForUpdateAsync(QueryUserReq req); + + /// + /// 单体更新 + /// + Task UpdateSingleAsync(UpdateUserReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IVerifyCodeService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IVerifyCodeService.cs new file mode 100644 index 00000000..347f49f1 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/Dependency/IVerifyCodeService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Sys; + +namespace NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +/// +/// 验证码服务 +/// +public interface IVerifyCodeService : IService, IVerifyCodeModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs new file mode 100644 index 00000000..768da1f3 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DeptService.cs @@ -0,0 +1,139 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dept; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class DeptService : RepositoryService, IDeptService +{ + /// + /// Initializes a new instance of the class. + /// + public DeptService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除部门 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建部门 + /// + /// Parent_department_does_not_exist + public async Task CreateAsync(CreateDeptReq req) + { + if (req.ParentId != 0 && !await Rpo.Select.AnyAsync(a => a.Id == req.ParentId)) { + throw new NetAdminInvalidOperationException(Ln.父节点不存在); + } + + var ret = await Rpo.InsertAsync(req); + + return ret.Adapt(); + } + + /// + /// 删除部门 + /// + /// 该部门下存在用户 + /// 该部门下存在子部门 + public async Task DeleteAsync(DelReq req) + { + if (await Rpo.Orm.Select().AnyAsync(a => a.DeptId == req.Id)) { + throw new NetAdminInvalidOperationException(Ln.该部门下存在用户); + } + + #pragma warning disable IDE0046 + if (await Rpo.Select.AnyAsync(a => a.ParentId == req.Id)) { + #pragma warning restore IDE0046 + throw new NetAdminInvalidOperationException(Ln.该部门下存在子部门); + } + + return await Rpo.DeleteAsync(x => x.Id == req.Id); + } + + /// + /// 判断部门是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个部门 + /// + /// NotImplementedException + public Task GetAsync(QueryDeptReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询部门 + /// + /// NotImplementedException + public Task> PagedQueryAsync(PagedQueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 查询部门 + /// + public async Task> QueryAsync(QueryReq req) + { + return (await QueryInternal(req).ToTreeListAsync()).Adapt>(); + } + + /// + /// 更新部门 + /// + /// NetAdminUnexpectedException + public async Task UpdateAsync(UpdateDeptReq req) + { + return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0 + ? throw new NetAdminUnexpectedException() + : (await QueryInternal(new QueryReq { Filter = new QueryDeptReq { Id = req.Id } }, true) + .ToTreeListAsync())[0] + .Adapt(); + } + + private ISelect QueryInternal(QueryReq req, bool asTreeCte = false) + { + var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .WhereIf( // + req.Keywords?.Length > 0 + , a => a.Name.Contains(req.Keywords) || a.Summary.Contains(req.Keywords) || + a.Id == req.Keywords.Int64Try(0)); + if (asTreeCte) { + ret = ret.AsTreeCte(); + } + + ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); + + if (!req.Prop?.Equals(nameof(req.Filter.Sort), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.Sort); + } + + if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.CreatedTime); + } + + return ret; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs new file mode 100644 index 00000000..aa8635bd --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DevService.cs @@ -0,0 +1,215 @@ +using NetAdmin.Application.Services; +using NetAdmin.Domain.Dto.Sys.Api; +using NetAdmin.Domain.Dto.Sys.Dev; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class DevService : ServiceBase, IDevService +{ + private const string _REPLACE_TO_EMPTY = "//~"; + + private static readonly string _clientProjectPath = Path.Combine( // + Environment.CurrentDirectory, "../../frontend/admin"); + + private static readonly string[] _projectDirs + = Directory.GetDirectories(Path.Combine(Environment.CurrentDirectory, "../")); + + private readonly IApiService _apiService; + + /// + /// Initializes a new instance of the class. + /// + public DevService(IApiService apiService) + { + _apiService = apiService; + } + + /// + /// 生成后端代码 + /// + public async Task GenerateCsCodeAsync(GenerateCsCodeReq req) + { + // 模块类型(Sys、Biz、等) + var moduleType = Enum.GetName(req.Type)!; + + // 模板层目录 + var tplHostDir = GetDir("SysComponent.Host"); + var tplCacheDir = GetDir("SysComponent.Cache"); + var tplAppDir = GetDir("SysComponent.Application"); + + // 主机层目录 + var hostControllerDir = Path.Combine(GetDir($"{moduleType}.Host"), "Controllers", moduleType[..3]); + + // 缓存层目录 + var cacheDir = Path.Combine(GetDir($"{moduleType}.Cache"), moduleType[..3]); + var cacheDependencyDir = Path.Combine(cacheDir, "Dependency"); + + // 业务逻辑层目录 + var appDir = GetDir($"{moduleType}.Application"); + var appModulesDir = Path.Combine(appDir, "Modules", moduleType[..3]); + var appServicesDir = Path.Combine(appDir, "Services", moduleType[..3]); + var appServicesDependencyDir = Path.Combine(appServicesDir, "Dependency"); + + // 数据契约层目录 + var dataDir = GetDir("NetAdmin.Domain"); + var dtoDir = Path.Combine(dataDir, "Dto", moduleType[..3], req.ModuleName); + var entityDir = Path.Combine(dataDir, "DbMaps", moduleType[..3]); + + // 创建缺少的目录 + CreateDir(hostControllerDir, cacheDir, cacheDependencyDir, appDir, appModulesDir, appServicesDir +, appServicesDependencyDir, dataDir, dtoDir, entityDir); + + // Controller + await WriteCodeFileAsync(req, Path.Combine(tplHostDir, "Controllers", "Tpl", "ExampleController.cs") + , Path.Combine(hostControllerDir, $"{req.ModuleName}Controller.cs")); + + // CreateReq + await WriteCodeFileAsync(req, Path.Combine(dataDir, "Dto", "Tpl", "Example", "CreateExampleReq.cs") + , Path.Combine(dtoDir, $"Create{req.ModuleName}Req.cs")); + + // UpdateReq + await WriteCodeFileAsync(req, Path.Combine(dataDir, "Dto", "Tpl", "Example", "UpdateExampleReq.cs") + , Path.Combine(dtoDir, $"Update{req.ModuleName}Req.cs")); + + // QueryReq + await WriteCodeFileAsync(req, Path.Combine(dataDir, "Dto", "Tpl", "Example", "QueryExampleReq.cs") + , Path.Combine(dtoDir, $"Query{req.ModuleName}Req.cs")); + + // QueryRsp + await WriteCodeFileAsync(req, Path.Combine(dataDir, "Dto", "Tpl", "Example", "QueryExampleRsp.cs") + , Path.Combine(dtoDir, $"Query{req.ModuleName}Rsp.cs")); + + // ICache + await WriteCodeFileAsync(req, Path.Combine(tplCacheDir, "Tpl", "Dependency", "IExampleCache.cs") + , Path.Combine(cacheDependencyDir, $"I{req.ModuleName}Cache.cs")); + + // Cache + await WriteCodeFileAsync(req, Path.Combine(tplCacheDir, "Tpl", "ExampleCache.cs") + , Path.Combine(cacheDir, $"{req.ModuleName}Cache.cs")); + + // IModule + await WriteCodeFileAsync(req, Path.Combine(tplAppDir, "Modules", "Tpl", "IExampleModule.cs") + , Path.Combine(appModulesDir, $"I{req.ModuleName}Module.cs")); + + // IService + await WriteCodeFileAsync(req, Path.Combine(tplAppDir, "Services", "Tpl", "Dependency", "IExampleService.cs") + , Path.Combine(appServicesDependencyDir, $"I{req.ModuleName}Service.cs")); + + // Service + await WriteCodeFileAsync(req, Path.Combine(tplAppDir, "Services", "Tpl", "ExampleService.cs") + , Path.Combine(appServicesDir, $"{req.ModuleName}Service.cs")); + + // Entity + await WriteCodeFileAsync(req, Path.Combine(dataDir, "DbMaps", "Tpl", "Tpl_Example.cs") + , Path.Combine(entityDir, $"{moduleType[..3]}_{req.ModuleName}.cs")); + } + + /// + /// 生成图标代码 + /// + public async Task GenerateIconCodeAsync(GenerateIconCodeReq req) + { + var tplSvg = await File.ReadAllTextAsync( + Path.Combine(_clientProjectPath, "src", "assets", "icons", "tpl", "Svg.vue")); + var tplExport + = await File.ReadAllTextAsync( + Path.Combine(_clientProjectPath, "src", "assets", "icons", "tpl", "export.js")); + + var vueContent = tplSvg.Replace("$svgCode$", req.SvgCode).Replace(_REPLACE_TO_EMPTY, string.Empty); + + var dir = Path.Combine(_clientProjectPath, "src", "assets", "icons"); + if (!Directory.Exists(dir)) { + _ = Directory.CreateDirectory(dir); + } + + var vueFile = Path.Combine(dir, $"{req.IconName}.vue"); + await File.WriteAllTextAsync(vueFile, vueContent); + + var indexJsFile = Path.Combine(dir, "index.js"); + + await File.AppendAllTextAsync( + indexJsFile + , Environment.NewLine + + tplExport.Replace("$iconName$", req.IconName).Replace(_REPLACE_TO_EMPTY, string.Empty)); + + // 修改iconSelect.js + var iconSelectFile = Path.Combine(_clientProjectPath, "src", "config", "iconSelect.js"); + var iconSelectContent = await File.ReadAllTextAsync(iconSelectFile); + iconSelectContent = iconSelectContent.Replace("export default", "exportDefault:").Replace("'", "\""); + iconSelectContent = Regex.Replace(iconSelectContent, "([a-zA-Z]+):", "\"$1\":"); + iconSelectContent = "{" + iconSelectContent + "}"; + var iconExportJsInfo = iconSelectContent.ToObject(); + iconExportJsInfo.ExportDefault.Icons.Last().Icons.Add($"sc-icon-{req.IconName.ToLowerInvariant()}"); + var newContent = iconExportJsInfo.ToJson().TrimStart('{')[..^1].Replace("\"exportDefault\":", "export default"); + + await File.WriteAllTextAsync(iconSelectFile, newContent); + } + + /// + /// 生成接口代码 + /// + public async Task GenerateJsCodeAsync() + { + // 模板文件 + var tplOuter = await File.ReadAllTextAsync(Path.Combine(_clientProjectPath, "src", "api", "tpl", "outer.js")); + var tplInner = await File.ReadAllTextAsync(Path.Combine(_clientProjectPath, "src", "api", "tpl", "inner.js")); + + IEnumerable Select(QueryApiRsp item) + { + return item.Children.Select(x => tplInner.Replace("$actionDesc$", x.Summary) + .Replace( // + "$actionName$" + , Regex.Replace(x.Name, @"\.(\w)" + , y => y.Groups[1].Value.ToUpperInvariant())) + .Replace("$actionPath$", x.Id) + .Replace( // + "$actionMethod$", x.Method?.ToLowerInvariant()) + .Replace(_REPLACE_TO_EMPTY, string.Empty)); // + } + + foreach (var item in _apiService.ReflectionList(false)) { + var dir = Path.Combine(_clientProjectPath, "src", "api", item.Namespace); + if (!Directory.Exists(dir)) { + _ = Directory.CreateDirectory(dir); + } + + var file = Path.Combine(dir, $"{item.Name.Replace(".", string.Empty)}.js"); + + var content = tplOuter.Replace("$controllerDesc$", item.Summary) + .Replace("$controllerPath$", item.Id) + .Replace( // + "$inner$" + , string.Join(Environment.NewLine + Environment.NewLine, Select(item))) + .Replace(_REPLACE_TO_EMPTY, string.Empty); + + await File.WriteAllTextAsync(file, content); + } + } + + private static void CreateDir(params string[] dirs) + { + foreach (var dir in dirs) { + if (!Directory.Exists(dir)) { + _ = Directory.CreateDirectory(dir); + } + } + } + + private static string GetDir(string key) + { + return _projectDirs.First(x => x.EndsWith(key, true, CultureInfo.InvariantCulture)); + } + + private static async Task WriteCodeFileAsync(GenerateCsCodeReq req, string tplFile, string writeFile) + { + var tplContent = await File.ReadAllTextAsync(tplFile); + tplContent = tplContent.Replace("Tpl", Enum.GetName(req.Type)![..3]) + .Replace("示例", req.ModuleRemark) + .Replace("Example", req.ModuleName) + .Replace("NetAdmin.SysComponent", "SysComponent"); + + await File.WriteAllTextAsync(writeFile, tplContent); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs new file mode 100644 index 00000000..8f17d9ec --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicCatalogService.cs @@ -0,0 +1,119 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class DicCatalogService : RepositoryService, IDicCatalogService +{ + /// + /// Initializes a new instance of the class. + /// + public DicCatalogService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除字典目录 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建字典目录 + /// + /// The_parent_node_does_not_exist + public async Task CreateAsync(CreateDicCatalogReq req) + { + if (req.ParentId != 0 && !await Rpo.Select.Where(a => a.Id == req.ParentId).ForUpdate().AnyAsync()) { + throw new NetAdminInvalidOperationException(Ln.父节点不存在); + } + + var ret = await Rpo.InsertAsync(req); + return ret.Adapt(); + } + + /// + /// 删除字典目录 + /// + public async Task DeleteAsync(DelReq req) + { + var ret = await Rpo.DeleteCascadeByDatabaseAsync(a => a.Id == req.Id); + return ret.Count; + } + + /// + /// 判断字典目录是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个字典目录 + /// + /// NotImplementedException + public Task GetAsync(QueryDicCatalogReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询字典目录 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req).Page(req.Page, req.PageSize).Count(out var total).ToListAsync(); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.Adapt>()); + } + + /// + /// 查询字典目录 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).ToTreeListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新字典目录 + /// + /// The_parent_node_does_not_exist + /// NetAdminUnexpectedException + public async Task UpdateAsync(UpdateDicCatalogReq req) + { + if (req.ParentId != 0 && !await Rpo.Select.Where(a => a.Id == req.ParentId).ForUpdate().AnyAsync()) { + throw new NetAdminInvalidOperationException(Ln.父节点不存在); + } + + if (await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0) { + throw new NetAdminUnexpectedException(); + } + + var ret = await Rpo.Select.Where(a => a.Id == req.Id).ToOneAsync(); + return ret.Adapt(); + } + + private ISelect QueryInternal(QueryReq req) + { + return Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Id); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs new file mode 100644 index 00000000..05a7c70f --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicContentService.cs @@ -0,0 +1,122 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Content; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class DicContentService : RepositoryService, IDicContentService +{ + /// + /// Initializes a new instance of the class. + /// + public DicContentService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除字典内容 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建字典内容 + /// + /// Dictionary_directory_does_not_exist + public async Task CreateAsync(CreateDicContentReq req) + { + if (!await Rpo.Orm.Select().Where(a => a.Id == req.CatalogId).ForUpdate().AnyAsync()) { + throw new NetAdminInvalidOperationException(Ln.字典目录不存在); + } + + var ret = await Rpo.InsertAsync(req); + return ret.Adapt(); + } + + /// + /// 删除字典内容 + /// + public Task DeleteAsync(DelReq req) + { + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断字典是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个字典 + /// + /// NotImplementedException + public Task GetAsync(QueryDicContentReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询字典内容 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req).Page(req.Page, req.PageSize).Count(out var total).ToListAsync(); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.Adapt>()); + } + + /// + /// 查询字典内容 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).Take(req.Count).ToListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新字典内容 + /// + /// Dictionary_directory_does_not_exist + /// NetAdminUnexpectedException + public async Task UpdateAsync(UpdateDicContentReq req) + { + if (!await Rpo.Orm.Select().Where(a => a.Id == req.CatalogId).ForUpdate().AnyAsync()) { + throw new NetAdminInvalidOperationException(Ln.字典目录不存在); + } + + if (await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0) { + throw new NetAdminUnexpectedException(); + } + + var ret = await Rpo.Select.Where(a => a.Id == req.Id).ToOneAsync(); + return ret.Adapt(); + } + + private ISelect QueryInternal(QueryReq req) + { + var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); + if (!req.Prop?.Equals(nameof(req.Filter.Id), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.Id); + } + + return ret; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs new file mode 100644 index 00000000..a941f06e --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/DicService.cs @@ -0,0 +1,119 @@ +using NetAdmin.Application.Services; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; +using NetAdmin.Domain.Dto.Sys.Dic.Content; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class DicService : ServiceBase, IDicService +{ + private readonly IDicCatalogService _catalogService; + private readonly IDicContentService _contentService; + + /// + /// Initializes a new instance of the class. + /// + public DicService(IDicCatalogService catalogService, IDicContentService contentService) + { + _catalogService = catalogService; + _contentService = contentService; + } + + /// + /// 批量删除字典目录 + /// + public Task BulkDeleteCatalogAsync(BulkReq req) + { + return _catalogService.BulkDeleteAsync(req); + } + + /// + /// 批量删除字典内容 + /// + public Task BulkDeleteContentAsync(BulkReq req) + { + return _contentService.BulkDeleteAsync(req); + } + + /// + /// 创建字典目录 + /// + public Task CreateCatalogAsync(CreateDicCatalogReq req) + { + return _catalogService.CreateAsync(req); + } + + /// + /// 创建字典内容 + /// + public Task CreateContentAsync(CreateDicContentReq req) + { + return _contentService.CreateAsync(req); + } + + /// + /// 删除字典目录 + /// + public Task DeleteCatalogAsync(DelReq req) + { + return _catalogService.DeleteAsync(req); + } + + /// + /// 删除字典内容 + /// + public Task DeleteContentAsync(DelReq req) + { + return _contentService.DeleteAsync(req); + } + + /// + /// 分页查询字典目录 + /// + public Task> PagedQueryCatalogAsync(PagedQueryReq req) + { + return _catalogService.PagedQueryAsync(req); + } + + /// + /// 分页查询字典内容 + /// + public Task> PagedQueryContentAsync(PagedQueryReq req) + { + return _contentService.PagedQueryAsync(req); + } + + /// + /// 查询字典目录 + /// + public Task> QueryCatalogAsync(QueryReq req) + { + return _catalogService.QueryAsync(req); + } + + /// + /// 查询字典内容 + /// + public Task> QueryContentAsync(QueryReq req) + { + return _contentService.QueryAsync(req); + } + + /// + /// 更新字典目录 + /// + public Task UpdateCatalogAsync(UpdateDicCatalogReq req) + { + return _catalogService.UpdateAsync(req); + } + + /// + /// 更新字典内容 + /// + public Task UpdateContentAsync(UpdateDicContentReq req) + { + return _contentService.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs new file mode 100644 index 00000000..872bf1cf --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/FileService.cs @@ -0,0 +1,47 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class FileService : ServiceBase, IFileService +{ + private readonly MinioHelper _minioHelper; + private readonly UploadOptions _uploadOptions; + + /// + /// Initializes a new instance of the class. + /// + public FileService(IOptions uploadOptions, MinioHelper minioHelper) // + { + _minioHelper = minioHelper; + _uploadOptions = uploadOptions.Value; + } + + /// + /// 文件上传 + /// + /// 文件不能为空 + /// 允许上传的文件格式 + /// 允许的文件大小 + public async Task UploadAsync(IFormFile file) + { + if (file == null || file.Length < 1) { + throw new NetAdminInvalidOperationException(Ln.文件不能为空); + } + + if (!_uploadOptions.ContentTypes.Contains(file.ContentType)) { + throw new NetAdminInvalidOperationException( + $"{Ln.允许的文件格式} {string.Join(",", _uploadOptions.ContentTypes)}"); + } + + if (file.Length > _uploadOptions.MaxSize) { + throw new NetAdminInvalidOperationException($"{Ln.允许的文件大小} {_uploadOptions.MaxSize}"); + } + + var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}"; + var objectName = $"{UserToken.Id}/{fileName}"; + await using var fs = file.OpenReadStream(); + return await _minioHelper.UploadAsync(objectName, fs, file.ContentType, file.Length); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs new file mode 100644 index 00000000..a7c942c8 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/MenuService.cs @@ -0,0 +1,144 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Menu; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class MenuService : RepositoryService, IMenuService +{ + private readonly IUserService _userService; + + /// + /// Initializes a new instance of the class. + /// + public MenuService(Repository rpo, IUserService userService) // + : base(rpo) + { + _userService = userService; + } + + /// + /// 批量删除菜单 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建菜单 + /// + public async Task CreateAsync(CreateMenuReq req) + { + var ret = await Rpo.InsertAsync(req); + return ret.Adapt(); + } + + /// + /// 删除菜单 + /// + public Task DeleteAsync(DelReq req) + { + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断菜单是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个菜单 + /// + /// NotImplementedException + public Task GetAsync(QueryMenuReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询菜单 + /// + /// NotImplementedException + public Task> PagedQueryAsync(PagedQueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 查询菜单 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).ToTreeListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新菜单 + /// + /// NetAdminUnexpectedException + public async Task UpdateAsync(UpdateMenuReq req) + { + if (await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0) { + throw new NetAdminUnexpectedException(); + } + + var ret = await Rpo.Select.Where(a => a.Id == req.Id).ToOneAsync(); + return ret.Adapt(); + } + + /// + /// 当前用户菜单 + /// + public async Task> UserMenusAsync() + { + var userInfo = await _userService.UserInfoAsync(); + Task> ret; + var req = new QueryReq(); + + if (userInfo.Roles.Any(x => x.IgnorePermissionControl)) { + // 忽略权限控制 + ret = QueryAsync(req); + } + else { + var ownedMenuIds = userInfo.Roles.SelectMany(x => x.MenuIds); + if (ownedMenuIds.NullOrEmpty()) { + ownedMenuIds = new[] { 0L }; + } + + ret = QueryAsync(req with { + DynamicFilter = new DynamicFilterInfo { + Field = nameof(QueryMenuReq.Id) + , Operator = DynamicFilterOperator.Any + , Value = ownedMenuIds + } + }); + } + + return await ret; + } + + private ISelect QueryInternal(QueryReq req) + { + return Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Sort) + .OrderBy(a => a.Name) + .OrderBy(a => a.Id); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs new file mode 100644 index 00000000..6b51c822 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RequestLogService.cs @@ -0,0 +1,125 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.RequestLog; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class RequestLogService : RepositoryService, IRequestLogService +{ + /// + /// Initializes a new instance of the class. + /// + public RequestLogService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除请求日志 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建请求日志 + /// + public async Task CreateAsync(CreateRequestLogReq req) + { + var ret = await Rpo.InsertAsync(req); + return ret.Adapt(); + } + + /// + /// 删除请求日志 + /// + /// NotImplementedException + public Task DeleteAsync(DelReq req) + { + throw new NotImplementedException(); + } + + /// + /// 判断请求日志是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个请求日志 + /// + /// NotImplementedException + public Task GetAsync(QueryRequestLogReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询请求日志 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req) + .Page(req.Page, req.PageSize) + .Count(out var total) + .ToListAsync(a => new { + a.ApiId + , ApiSummary = a.Api.Summary + , a.ExtraData + , a.CreatedClientIp + , a.CreatedTime + , a.CreatedUserName + , a.Duration + , a.Method + , a.CreatedUserAgent + , a.HttpStatusCode + , a.Id + }); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.Adapt>()); + } + + /// + /// 查询请求日志 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).Take(req.Count).ToListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新请求日志 + /// + /// NotImplementedException + public Task UpdateAsync(NopReq req) + { + throw new NotImplementedException(); + } + + private ISelect QueryInternal(QueryReq req) + { + var ret = Rpo.Select.Include(a => a.Api) + .WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); + + if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.CreatedTime); + } + + return ret; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs new file mode 100644 index 00000000..3bd1db68 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/RoleService.cs @@ -0,0 +1,133 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Role; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class RoleService : RepositoryService, IRoleService +{ + /// + /// Initializes a new instance of the class. + /// + public RoleService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除角色 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建角色 + /// + public async Task CreateAsync(CreateRoleReq req) + { + var entity = req.Adapt(); + var ret = await Rpo.InsertAsync(entity); + + await Rpo.SaveManyAsync(entity, nameof(entity.Depts)); + await Rpo.SaveManyAsync(entity, nameof(entity.Menus)); + await Rpo.SaveManyAsync(entity, nameof(entity.Apis)); + + entity = entity with { Id = ret.Id }; + return entity.Adapt(); + } + + /// + /// 删除角色 + /// + /// Users_exist_under_this_role_and_deletion_is_not_allowed + public async Task DeleteAsync(DelReq req) + { + return await Rpo.Orm.Select().ForUpdate().AnyAsync(a => a.RoleId == req.Id) + ? throw new NetAdminInvalidOperationException(Ln.该角色下存在用户) + : await Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断角色是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个角色 + /// + /// NotImplementedException + public Task GetAsync(QueryRoleReq req) + { + throw new NotImplementedException(); + } + + /// + /// 分页查询角色 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req).Page(req.Page, req.PageSize).Count(out var total).ToListAsync(); + + return new PagedQueryRsp(req.Page, req.PageSize, total, list.Adapt>()); + } + + /// + /// 查询角色 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).ToListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新角色 + /// + public async Task UpdateAsync(UpdateRoleReq req) + { + var entity = req.Adapt(); + _ = await Rpo.UpdateAsync(entity); + await Rpo.SaveManyAsync(entity, nameof(entity.Depts)); + await Rpo.SaveManyAsync(entity, nameof(entity.Menus)); + await Rpo.SaveManyAsync(entity, nameof(entity.Apis)); + + return (await QueryAsync(new QueryReq { Filter = new QueryRoleReq { Id = req.Id } })).First(); + } + + private ISelect QueryInternal(QueryReq req) + { + var ret = Rpo.Select.IncludeMany(a => a.Depts.Select(b => new Sys_Dept { Id = b.Id })) + .IncludeMany(a => a.Menus.Select(b => new Sys_Menu { Id = b.Id })) + .IncludeMany(a => a.Apis.Select(b => new Sys_Api { Id = b.Id })) + .WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .WhereIf( // + req.Keywords?.Length > 0 + , a => a.Name.Contains(req.Keywords) || a.Summary.Contains(req.Keywords) || + a.Id == req.Keywords.Int64Try(0)) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); + + if (!req.Prop?.Equals(nameof(req.Filter.Sort), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.Sort); + } + + if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.CreatedTime); + } + + return ret; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ToolsService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ToolsService.cs new file mode 100644 index 00000000..00d27f5a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/ToolsService.cs @@ -0,0 +1,24 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class ToolsService : ServiceBase, IToolsService +{ + /// + /// 服务器时间 + /// + public DateTime GetServerUtcTime() + { + return DateTime.UtcNow; + } + + /// + /// 版本信息 + /// + public string Version() + { + return Global.ProductVersion; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs new file mode 100644 index 00000000..8ca8926c --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserProfileService.cs @@ -0,0 +1,171 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Content; +using NetAdmin.Domain.Dto.Sys.UserProfile; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using DataType = FreeSql.DataType; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class UserProfileService : RepositoryService, IUserProfileService +{ + /// + /// Initializes a new instance of the class. + /// + public UserProfileService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除用户档案 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建用户档案 + /// + public async Task CreateAsync(CreateUserProfileReq req) + { + var entity = req.Adapt(); + var ret = await Rpo.InsertAsync(entity); + return ret.Adapt(); + } + + /// + /// 删除用户档案 + /// + public Task DeleteAsync(DelReq req) + { + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断用户档案是否存在 + /// + /// NotImplementedException + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个用户档案 + /// + /// NotImplementedException + public async Task GetAsync(QueryUserProfileReq req) + { + var ret = await QueryInternal(new QueryReq { Filter = req }).ToOneAsync(); + return ret.Adapt(); + } + + /// + /// 分页查询用户档案 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req) + .Page(req.Page, req.PageSize) + .Count(out var total) + .ToListAsync((a, b, c, d, e) => new { + a + , b = new { b.Key, b.Value } + , c = new { c.Key, c.Value } + , d = new { d.Key, d.Value } + , e = new { e.Key, e.Value } + }); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.ConvertAll( + x => x.a.Adapt() with { + NationArea = x.b.Adapt() + , CompanyArea = x.c.Adapt() + , HomeArea = x.d.Adapt() + , EmergencyContactArea + = x.e.Adapt() + })); + } + + /// + /// 查询用户档案 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req) + .Take(req.Count) + .ToListAsync((a, b, c, d, e) => new { + a + , b = new { b.Key, b.Value } + , c = new { c.Key, c.Value } + , d = new { d.Key, d.Value } + , e = new { e.Key, e.Value } + }); + return ret.ConvertAll(x => x.a.Adapt() with { + NationArea + = x.b.Key == null + ? null + : x.b.Adapt() + , CompanyArea + = x.c.Key == null + ? null + : x.c.Adapt() + , HomeArea + = x.d.Key == null + ? null + : x.d.Adapt() + , EmergencyContactArea = x.e.Key == null + ? null + : x.e.Adapt() + }); + } + + /// + /// 更新用户档案 + /// + public async Task UpdateAsync(UpdateUserProfileReq req) + { + var entity = req.Adapt(); + if (Rpo.Orm.Ado.DataType == DataType.Sqlite) { + return await UpdateForSqliteAsync(entity); + } + + var ret = await Rpo.UpdateDiy.SetSource(entity).ExecuteUpdatedAsync(); + return ret.FirstOrDefault()?.Adapt(); + } + + private ISelect QueryInternal( + QueryReq req) + { + return Rpo.Orm.Select() + .LeftJoin((a, b, _, __, ___) => + a.NationArea.ToString() == b.Value && b.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA) + .LeftJoin((a, _, c, __, ___) => + a.CompanyArea.ToString() == c.Value && c.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA) + .LeftJoin((a, _, __, d, ___) => + a.HomeArea.ToString() == d.Value && d.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA) + .LeftJoin((a, _, __, ___, e) => a.EmergencyContactArea.ToString() == e.Value && + e.CatalogId == Numbers.DIC_CATALOG_ID_GEO_AREA) + .WhereDynamicFilter(req.DynamicFilter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending((a, _, __, ___, ____) => a.Id); + } + + /// + /// 非sqlite数据库请删掉 + /// + private async Task UpdateForSqliteAsync(Sys_UserProfile req) + { + return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0 + ? null + : await GetAsync(new QueryUserProfileReq { Id = req.Id }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs new file mode 100644 index 00000000..20a1066f --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/UserService.cs @@ -0,0 +1,487 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.Attributes.DataValidation; +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.DbMaps.Dependency.Fields; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserProfile; +using NetAdmin.Domain.Dto.Sys.VerifyCode; +using NetAdmin.Domain.Events.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class UserService : RepositoryService, IUserService +{ + private readonly IEventPublisher _eventPublisher; + + private readonly Expression> _selectUserFields = a => new Sys_User { + Id = a.Id + , Avatar = a.Avatar + , Email = a.Email + , Mobile = a.Mobile + , Enabled = a.Enabled + , UserName = a.UserName + , Summary = a.Summary + , Version = a.Version + , CreatedTime = a.CreatedTime + , Dept = new Sys_Dept { Id = a.Dept.Id, Name = a.Dept.Name } + , Roles = a.Roles + }; + + private readonly IUserProfileService _userProfileService; + + private readonly IVerifyCodeService _verifyCodeService; + + /// + /// Initializes a new instance of the class. + /// + public UserService(Repository rpo, IUserProfileService userProfileService + , IVerifyCodeService verifyCodeService, IEventPublisher eventPublisher) // + : base(rpo) + { + _userProfileService = userProfileService; + _verifyCodeService = verifyCodeService; + _eventPublisher = eventPublisher; + } + + /// + /// 批量删除用户 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 检查手机号是否可用 + /// + public async Task CheckMobileAvailableAsync(CheckMobileAvailableReq req) + { + return !await Rpo.Select.Where(a => a.Mobile == req.Mobile && a.Id != req.Id).AnyAsync(); + } + + /// + /// 检查用户名是否可用 + /// + public async Task CheckUserNameAvailableAsync(CheckUserNameAvailableReq req) + { + return !await Rpo.Select.Where(a => a.UserName == req.UserName && a.Id != req.Id).AnyAsync(); + } + + /// + /// 创建用户 + /// + public async Task CreateAsync(CreateUserReq req) + { + await CreateUpdateCheckAsync(req); + + // 主表 + var entity = req.Adapt(); + var dbUser = await Rpo.InsertAsync(entity); + + // 分表 + await Rpo.SaveManyAsync(entity, nameof(entity.Roles)); + + // 档案表 + _ = await _userProfileService.CreateAsync(req.Profile with { Id = dbUser.Id }); + var ret = await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = dbUser.Id } }); + return ret.First(); + } + + /// + /// 删除用户 + /// + public async Task DeleteAsync(DelReq req) + { + var effect = 0; + + // 删除主表 + effect += await Rpo.DeleteAsync(req.Id); + + // 删除分表 + effect += await Rpo.Orm.Delete(new { UserId = req.Id }).ExecuteAffrowsAsync(); + + // 删除档案表 + effect += await _userProfileService.DeleteAsync(req); + + return effect; + } + + /// + /// 判断用户是否存在 + /// + public async Task ExistAsync(QueryReq req) + { + return await (await QueryInternalAsync(req)).AnyAsync(); + } + + /// + /// 获取单个用户 + /// + /// NotImplementedException + public Task GetAsync(QueryUserReq req) + { + throw new NotImplementedException(); + } + + /// + /// 获取单个用户(带更新锁) + /// + public async Task GetForUpdateAsync(QueryUserReq req) + { + // ReSharper disable once MethodHasAsyncOverload + return (await QueryInternal(new QueryReq { Filter = req }).ForUpdate().ToOneAsync()) + .Adapt(); + } + + /// + /// 密码登录 + /// + /// 用户名或密码错误 + public async Task LoginByPwdAsync(LoginByPwdReq req) + { + var pwd = req.Password.Pwd().Guid(); + + Sys_User dbUser; + #pragma warning disable IDE0045 + if (new MobileAttribute().IsValid(req.Account)) { + #pragma warning restore IDE0045 + dbUser = await Rpo.GetAsync(a => a.Mobile == req.Account && a.Password == pwd); + } + else { + dbUser = new EmailAddressAttribute().IsValid(req.Account) + ? await Rpo.GetAsync(a => a.Email == req.Account && a.Password == pwd) + : await Rpo.GetAsync(a => a.UserName == req.Account && a.Password == pwd); + } + + return dbUser == null ? throw new NetAdminInvalidOperationException(Ln.用户名或密码错误) : LoginInternal(dbUser); + } + + /// + /// 短信登录 + /// + /// 验证码不正确 + /// 用户不存在 + public async Task LoginBySmsAsync(LoginBySmsReq req) + { + if (!await _verifyCodeService.VerifyAsync(req.Adapt())) { + throw new NetAdminInvalidOperationException(Ln.验证码不正确); + } + + var dbUser = await Rpo.GetAsync(a => a.Mobile == req.DestDevice); + return dbUser == null ? throw new NetAdminInvalidOperationException(Ln.用户不存在) : LoginInternal(dbUser); + } + + /// + /// 分页查询用户 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await (await QueryInternalAsync(req)).Page(req.Page, req.PageSize) + .Count(out var total) + .ToListAsync(_selectUserFields); + return new PagedQueryRsp(req.Page, req.PageSize, total, list.Adapt>()); + } + + /// + /// 查询用户 + /// + public async Task> QueryAsync(QueryReq req) + { + var list = await (await QueryInternalAsync(req)).Take(req.Count).ToListAsync(_selectUserFields); + return list.Adapt>(); + } + + /// + /// 查询用户档案 + /// + public Task> QueryProfileAsync(QueryReq req) + { + return _userProfileService.QueryAsync(req); + } + + /// + /// 注册用户 + /// + /// 验证码不正确 + public async Task RegisterAsync(RegisterUserReq req) + { + if (!await _verifyCodeService.VerifyAsync(req.VerifySmsCodeReq)) { + throw new NetAdminInvalidOperationException(Ln.验证码不正确); + } + + var createReq = req.Adapt() with { Profile = new CreateUserProfileReq() }; + return (await CreateAsync(createReq)).Adapt(); + } + + /// + /// 重设密码 + /// + /// 验证码不正确 + /// 用户不存在 + public async Task ResetPasswordAsync(ResetPasswordReq req) + { + return !await _verifyCodeService.VerifyAsync(req.VerifySmsCodeReq) + ? throw new NetAdminInvalidOperationException(Ln.验证码不正确) + : (uint)await Rpo.UpdateDiy + .SetSource((await Rpo.Where(a => a.Mobile == req.VerifySmsCodeReq.DestDevice) + .ToOneAsync(a => new { a.Version, a.Id })).Adapt() with { + Password = req.PasswordText.Pwd().Guid() + }) + .UpdateColumns(a => a.Password) + .ExecuteAffrowsAsync(); + } + + /// + public async Task SetAvatarAsync(SetAvatarReq req) + { + if (await Rpo.UpdateDiy + .SetSource(req with { + Id = UserToken.Id + , Version = Rpo.Where(a => a.Id == UserToken.Id).ToOne(a => a.Version) + }) + .UpdateColumns(a => a.Avatar) + .ExecuteAffrowsAsync() <= 0) { + throw new NetAdminUnexpectedException(); + } + + var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = UserToken.Id } })) + .First() + .Adapt(); + + // 发布用户更新事件 + await _eventPublisher.PublishAsync(new UserUpdatedEvent(ret)); + return ret; + } + + /// + public async Task SetEmailAsync(SetEmailReq req) + { + var user = Rpo.Where(a => a.Id == UserToken.Id).ToOne(a => new { a.Mobile, a.Version, a.Email }); + + // 如果已绑定手机号、需要手机安全验证 + if (!user.Mobile.NullOrEmpty()) { + if (!await _verifyCodeService.VerifyAsync(req.VerifySmsCodeReq)) { + throw new NetAdminInvalidOperationException(Ln.验证码不正确); + } + + if (user.Mobile != req.VerifySmsCodeReq.DestDevice) { + throw new NetAdminInvalidOperationException($"{Ln.手机号码} {Ln.不正确}"); + } + } + + if (await Rpo.UpdateDiy + .SetSource(new Sys_User { Email = req.DestDevice, Id = UserToken.Id, Version = user.Version }) + .UpdateColumns(a => a.Email) + .ExecuteAffrowsAsync() <= 0) { + throw new NetAdminUnexpectedException(); + } + + var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = UserToken.Id } })) + .First() + .Adapt(); + + // 发布用户更新事件 + await _eventPublisher.PublishAsync(new UserUpdatedEvent(ret)); + return ret; + } + + /// + public async Task SetMobileAsync(SetMobileReq req) + { + var user = await Rpo.Where(a => a.Id == UserToken.Id).ToOneAsync(a => new { a.Version, a.Mobile }); + + if (!user.Mobile.NullOrEmpty()) { + // 已有手机号,需验证旧手机 + if (!await _verifyCodeService.VerifyAsync(req.OriginVerifySmsCodeReq)) { + throw new NetAdminInvalidOperationException($"{Ln.旧手机号码} {Ln.验证码不正确}"); + } + + if (user.Mobile != req.OriginVerifySmsCodeReq.DestDevice) { + throw new NetAdminInvalidOperationException($"{Ln.旧手机号码} {Ln.不正确}"); + } + } + + // 验证新手机号 + if (!await _verifyCodeService.VerifyAsync(req.NewVerifySmsCodeReq)) { + throw new NetAdminInvalidOperationException($"{Ln.新手机号码} {Ln.验证码不正确}"); + } + + if (await Rpo.UpdateDiy + .SetSource(new Sys_User { + Version = user.Version + , Id = UserToken.Id + , Mobile = req.NewVerifySmsCodeReq.DestDevice + }) + .UpdateColumns(a => a.Mobile) + .ExecuteAffrowsAsync() <= 0) { + throw new NetAdminUnexpectedException(); + } + + var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = UserToken.Id } })) + .First() + .Adapt(); + + // 发布用户更新事件 + await _eventPublisher.PublishAsync(new UserUpdatedEvent(ret)); + return ret; + } + + /// + public async Task SetPasswordAsync(SetPasswordReq req) + { + var version = await Rpo.Where(a => a.Id == UserToken.Id && a.Password == req.OldPassword.Pwd().Guid()) + .ToOneAsync(a => new long?(a.Version)); + if (version == null) { + throw new NetAdminInvalidInputException($"{Ln.旧密码} {Ln.不正确}"); + } + + var ret = await Rpo.UpdateDiy + .SetSource(new Sys_User { + Id = UserToken.Id + , Password = req.NewPassword.Pwd().Guid() + , Version = version.Value + }) + .UpdateColumns(a => a.Password) + .ExecuteAffrowsAsync(); + return ret <= 0 ? throw new NetAdminUnexpectedException() : (uint)ret; + } + + /// + /// 更新用户 + /// + public async Task UpdateAsync(UpdateUserReq req) + { + await CreateUpdateCheckAsync(req); + + // 主表 + var entity = req.Adapt(); + var ignoreCols = new List { nameof(Sys_User.Token) }; + if (entity.Password == Guid.Empty) { + ignoreCols.Add(nameof(Sys_User.Password)); + } + + _ = await Rpo.UpdateDiy.SetSource(entity).IgnoreColumns(ignoreCols.ToArray()).ExecuteAffrowsAsync(); + + // 档案表 + _ = await _userProfileService.UpdateAsync(req.Profile); + + // 分表 + await Rpo.SaveManyAsync(entity, nameof(entity.Roles)); + + var ret = (await QueryAsync(new QueryReq { Filter = new QueryUserReq { Id = req.Id } })).First(); + + // 发布用户更新事件 + await _eventPublisher.PublishAsync(new UserUpdatedEvent(ret.Adapt())); + return ret; + } + + /// + /// 单体更新 + /// + public Task UpdateSingleAsync(UpdateUserReq req) + { + return Rpo.UpdateAsync(req); + } + + /// + /// 当前用户信息 + /// + public async Task UserInfoAsync() + { + var dbUser = await Rpo.Where(a => a.Token == UserToken.Token && a.Enabled) + .Include(a => a.Dept) + .IncludeMany( // + a => a.Roles + , then => then.Where(a => a.Enabled) + .IncludeMany(a => a.Menus) + .IncludeMany(a => a.Depts) + .IncludeMany(a => a.Apis)) + .ToOneAsync(); + return dbUser.Adapt(); + } + + private static LoginRsp LoginInternal(IFieldEnabled dbUser) + { + if (!dbUser.Enabled) { + throw new NetAdminInvalidOperationException(Ln.请联系管理员激活账号); + } + + var tokenPayload + = new Dictionary { { nameof(ContextUserToken), dbUser.Adapt() } }; + + var accessToken = JWTEncryption.Encrypt(tokenPayload); + return new LoginRsp { + AccessToken = accessToken + , RefreshToken = JWTEncryption.GenerateRefreshToken(accessToken) + }; + } + + private async Task CreateUpdateCheckAsync(CreateUpdateUserReq req) + { + // 检查角色是否存在 + var roles = await Rpo.Orm.Select() + .ForUpdate() + .Where(a => req.RoleIds.Contains(a.Id)) + .ToListAsync(a => a.Id); + if (roles.Count != req.RoleIds.Count) { + throw new NetAdminInvalidOperationException(Ln.角色不存在); + } + + // 检查部门是否存在 + var dept = await Rpo.Orm.Select().ForUpdate().Where(a => req.DeptId == a.Id).ToListAsync(a => a.Id); + + if (dept.Count != 1) { + throw new NetAdminInvalidOperationException(Ln.部门不存在); + } + } + + private ISelect QueryInternal(QueryReq req) + { + return Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Id); + } + + private async Task> QueryInternalAsync(QueryReq req) + { + IEnumerable deptIds = null; + if (req.Filter?.DeptId > 0) { + deptIds = await Rpo.Orm.Select() + .Where(a => a.Id == req.Filter.DeptId) + .AsTreeCte() + .ToListAsync(a => a.Id); + } + + var ret = Rpo.Select.Include(a => a.Dept) + .IncludeMany(a => a.Roles.Select(b => new Sys_Role { Id = b.Id, Name = b.Name })) + .WhereDynamicFilter(req.DynamicFilter) + .WhereIf(deptIds != null, a => deptIds.Contains(a.DeptId)) + .WhereIf( // + req.Filter?.Id > 0, a => a.Id == req.Filter.Id) + .WhereIf( // + req.Filter?.RoleId > 0, a => a.Roles.Any(b => b.Id == req.Filter.RoleId)) + .WhereIf( // + req.Keywords?.Length > 0 + , a => a.UserName.Contains(req.Keywords) || a.Id == req.Keywords.Int64Try(0) || + a.Mobile.Contains(req.Keywords) || a.Email.Contains(req.Keywords) || + a.Summary.Contains(req.Keywords)) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); + + if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { + ret = ret.OrderByDescending(a => a.CreatedTime); + } + + return ret; + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs new file mode 100644 index 00000000..c8c9c00d --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Sys/VerifyCodeService.cs @@ -0,0 +1,194 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Sys; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.VerifyCode; +using NetAdmin.Domain.Enums.Sys; +using NetAdmin.Domain.Events.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using DataType = FreeSql.DataType; + +namespace NetAdmin.SysComponent.Application.Services.Sys; + +/// +public sealed class VerifyCodeService : RepositoryService, IVerifyCodeService +{ + private readonly IEventPublisher _eventPublisher; + + /// + /// Initializes a new instance of the class. + /// + public VerifyCodeService(Repository rpo, IEventPublisher eventPublisher) // + : base(rpo) + { + _eventPublisher = eventPublisher; + } + + /// + /// 批量删除验证码 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建验证码 + /// + public async Task CreateAsync(CreateVerifyCodeReq req) + { + var entity = await Rpo.InsertAsync(req); + + var ret = entity.Adapt(); + + // 发布验证码创建事件 + await _eventPublisher.PublishAsync(new VerifyCodeCreatedEvent(ret)); + + return ret; + } + + /// + /// 删除验证码 + /// + public Task DeleteAsync(DelReq req) + { + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断验证码是否存在 + /// + public Task ExistAsync(QueryReq req) + { + return QueryInternal(req).AnyAsync(); + } + + /// + /// 获取单个验证码 + /// + public async Task GetAsync(QueryVerifyCodeReq req) + { + var ret = await QueryInternal(new QueryReq { Filter = req }).ToOneAsync(); + return ret.Adapt(); + } + + /// + /// 分页查询验证码 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req).Page(req.Page, req.PageSize).Count(out var total).ToListAsync(); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.Adapt>()); + } + + /// + /// 查询验证码 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).Take(req.Count).ToListAsync(); + return ret.Adapt>(); + } + + /// + public async Task SendVerifyCodeAsync(SendVerifyCodeReq req) + { + var lastSent = await GetLastSentAsync(req.DestDevice); + + QueryVerifyCodeRsp ret; + + #if !DEBUG + // 有发送记录,且小于1分钟,不允许 + if (lastSent != null && (DateTime.UtcNow - lastSent.CreatedTime).TotalMinutes < 1) { + throw new NetAdminInvalidOperationException(Ln._1分钟内只能发送1次); + } + #endif + + if (lastSent != null && lastSent.Status != VerifyCodeStatues.Verified) { // 上次发送未验证,生成相同code + ret = await CreateAsync(req.Adapt() with { Code = lastSent.Code }); + } + else { // 生成新的code + var code = new[] { 0, 10000 }.Rand().ToString(CultureInfo.InvariantCulture).PadLeft(4, '0'); + ret = await CreateAsync(req.Adapt() with { Code = code }); + } + + return ret.Adapt(); + } + + /// + /// 更新验证码 + /// + public async Task UpdateAsync(UpdateVerifyCodeReq req) + { + if (Rpo.Orm.Ado.DataType == DataType.Sqlite) { + return await UpdateForSqliteAsync(req); + } + + var ret = await Rpo.UpdateDiy.SetSource(req).ExecuteUpdatedAsync(); + return ret.FirstOrDefault()?.Adapt(); + } + + /// + public async Task VerifyAsync(VerifyCodeReq req) + { + #if DEBUG + if (req.Code == "8888") { + return true; + } + #endif + if (req.Code == Global.SecretKey) { + return true; + } + + var lastSent = await GetLastSentAsync(req.DestDevice); + + if (lastSent is not { Status: VerifyCodeStatues.Sent } || req.Code != lastSent.Code || + (DateTime.UtcNow - lastSent.CreatedTime).TotalMinutes > 10) { + return false; + } + + _ = await UpdateAsync((lastSent with { Status = VerifyCodeStatues.Verified }).Adapt()); + + return true; + } + + private Task GetLastSentAsync(string destDevice) + { + return QueryInternal(new QueryReq { + Count = 1 + , DynamicFilter + = new DynamicFilterInfo { + Field = nameof( + Sys_VerifyCode.DestDevice) + , Operator = DynamicFilterOperator.Eq + , Value = destDevice + } + }) + .ToOneAsync(); + } + + private ISelect QueryInternal(QueryReq req) + { + return Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Id); + } + + /// + /// 非sqlite数据库请删掉 + /// + private async Task UpdateForSqliteAsync(Sys_VerifyCode req) + { + return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0 + ? null + : await GetAsync(new QueryVerifyCodeReq { Id = req.Id }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/Dependency/IExampleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/Dependency/IExampleService.cs new file mode 100644 index 00000000..6a74fa86 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/Dependency/IExampleService.cs @@ -0,0 +1,9 @@ +using NetAdmin.Application.Services; +using NetAdmin.SysComponent.Application.Modules.Tpl; + +namespace NetAdmin.SysComponent.Application.Services.Tpl.Dependency; + +/// +/// 示例服务 +/// +public interface IExampleService : IService, IExampleModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs b/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs new file mode 100644 index 00000000..07956af2 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Application/Services/Tpl/ExampleService.cs @@ -0,0 +1,117 @@ +using NetAdmin.Application.Repositories; +using NetAdmin.Application.Services; +using NetAdmin.Domain.DbMaps.Tpl; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Tpl.Example; +using NetAdmin.SysComponent.Application.Services.Tpl.Dependency; +using DataType = FreeSql.DataType; + +namespace NetAdmin.SysComponent.Application.Services.Tpl; + +/// +public sealed class ExampleService : RepositoryService, IExampleService +{ + /// + /// Initializes a new instance of the class. + /// + public ExampleService(Repository rpo) // + : base(rpo) { } + + /// + /// 批量删除示例 + /// + public async Task BulkDeleteAsync(BulkReq req) + { + var sum = 0; + foreach (var item in req.Items) { + sum += await DeleteAsync(item); + } + + return sum; + } + + /// + /// 创建示例 + /// + public async Task CreateAsync(CreateExampleReq req) + { + var ret = await Rpo.InsertAsync(req); + return ret.Adapt(); + } + + /// + /// 删除示例 + /// + public Task DeleteAsync(DelReq req) + { + return Rpo.DeleteAsync(a => a.Id == req.Id); + } + + /// + /// 判断示例是否存在 + /// + public Task ExistAsync(QueryReq req) + { + return QueryInternal(req).AnyAsync(); + } + + /// + /// 获取单个示例 + /// + public async Task GetAsync(QueryExampleReq req) + { + var ret = await QueryInternal(new QueryReq { Filter = req }).ToOneAsync(); + return ret.Adapt(); + } + + /// + /// 分页查询示例 + /// + public async Task> PagedQueryAsync(PagedQueryReq req) + { + var list = await QueryInternal(req).Page(req.Page, req.PageSize).Count(out var total).ToListAsync(); + + return new PagedQueryRsp(req.Page, req.PageSize, total + , list.Adapt>()); + } + + /// + /// 查询示例 + /// + public async Task> QueryAsync(QueryReq req) + { + var ret = await QueryInternal(req).Take(req.Count).ToListAsync(); + return ret.Adapt>(); + } + + /// + /// 更新示例 + /// + public async Task UpdateAsync(UpdateExampleReq req) + { + if (Rpo.Orm.Ado.DataType == DataType.Sqlite) { + return await UpdateForSqliteAsync(req); + } + + var ret = await Rpo.UpdateDiy.SetSource(req).ExecuteUpdatedAsync(); + return ret.FirstOrDefault()?.Adapt(); + } + + private ISelect QueryInternal(QueryReq req) + { + return Rpo.Select.WhereDynamicFilter(req.DynamicFilter) + .WhereDynamic(req.Filter) + .OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) + .OrderByDescending(a => a.Id); + } + + /// + /// 非sqlite数据库请删掉 + /// + private async Task UpdateForSqliteAsync(Tpl_Example req) + { + return await Rpo.UpdateDiy.SetSource(req).ExecuteAffrowsAsync() <= 0 + ? null + : await GetAsync(new QueryExampleReq { Id = req.Id }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/NetAdmin.SysComponent.Cache.csproj b/src/backend/NetAdmin.SysComponent.Cache/NetAdmin.SysComponent.Cache.csproj new file mode 100644 index 00000000..fe98ed52 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/NetAdmin.SysComponent.Cache.csproj @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs new file mode 100644 index 00000000..0fece7e5 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/ApiCache.cs @@ -0,0 +1,73 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Api; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 接口缓存 +/// +public sealed class ApiCache : DistributedCache, IScoped, IApiCache +{ + /// + /// Initializes a new instance of the class. + /// + public ApiCache(IDistributedCache cache, IApiService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateApiReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryApiReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task SyncAsync() + { + return Service.SyncAsync(); + } + + /// + public Task UpdateAsync(NopReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs new file mode 100644 index 00000000..532aefde --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/CacheCache.cs @@ -0,0 +1,32 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Cache; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 缓存缓存 +/// +public sealed class CacheCache : DistributedCache, IScoped, ICacheCache +{ + /// + /// Initializes a new instance of the class. + /// + public CacheCache(IDistributedCache cache, ICacheService service) // + : base(cache, service) { } + + /// + public Task CacheStatisticsAsync() + { + return GetOrCreateAsync( // + GetCacheKey(string.Empty), Service.CacheStatisticsAsync, TimeSpan.FromMinutes(1)); + } + + /// + public PagedQueryRsp GetAllEntries(PagedQueryReq req) + { + return Service.GetAllEntries(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs new file mode 100644 index 00000000..2167e619 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/CaptchaCache.cs @@ -0,0 +1,52 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Sys.Captcha; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +public sealed class CaptchaCache : DistributedCache, IScoped, ICaptchaCache +{ + /// + /// Initializes a new instance of the class. + /// + public CaptchaCache(IDistributedCache cache, ICaptchaService service) // + : base(cache, service) { } + + /// + /// 获取人机校验图 + /// + public async Task GetCaptchaImageAsync() + { + var captchaRsp = await Service.GetCaptchaImageAsync(); + await CreateAsync(GetCacheKey(captchaRsp.Id, nameof(CaptchaCache)), captchaRsp.SawOffsetX +, TimeSpan.FromMinutes(1)); + return captchaRsp; + } + + /// + /// 完成人机校验 ,并删除缓存项 + /// + /// 人机验证未通过 + public async Task VerifyCaptchaAndRemoveAsync(VerifyCaptchaReq req) + { + var ret = await VerifyCaptchaAsync(req); + if (ret) { + // 人机验证通过,删除人机验证缓存 + await RemoveAsync(GetCacheKey(req.Id, nameof(CaptchaCache))); + } + else { + throw new NetAdminInvalidOperationException(Ln.人机验证未通过); + } + } + + /// + /// 完成人机校验 + /// + public async Task VerifyCaptchaAsync(VerifyCaptchaReq req) + { + var val = await GetAsync(GetCacheKey(req.Id, nameof(CaptchaCache))); + return await Service.VerifyCaptchaAsync(req with { SawOffsetX = val }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs new file mode 100644 index 00000000..8e95172a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/ConfigCache.cs @@ -0,0 +1,73 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Config; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 配置缓存 +/// +public sealed class ConfigCache : DistributedCache, IScoped, IConfigCache +{ + /// + /// Initializes a new instance of the class. + /// + public ConfigCache(IDistributedCache cache, IConfigService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateConfigReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryConfigReq req) + { + return Service.GetAsync(req); + } + + /// + public Task GetLatestConfigAsync() + { + return Service.GetLatestConfigAsync(); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateConfigReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/ConstantCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/ConstantCache.cs new file mode 100644 index 00000000..20396bc7 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/ConstantCache.cs @@ -0,0 +1,41 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 常量缓存 +/// +public sealed class ConstantCache : DistributedCache, IScoped, IConstantCache +{ + /// + /// Initializes a new instance of the class. + /// + public ConstantCache(IDistributedCache cache, IConstantService service) // + : base(cache, service) { } + + /// + public IDictionary GetCharsDic() + { + return Service.GetCharsDic(); + } + + /// + public IDictionary> GetEnums() + { + return Service.GetEnums(); + } + + /// + public IDictionary GetLocalizedStrings() + { + return Service.GetLocalizedStrings(); + } + + /// + public IDictionary GetNumbersDic() + { + return Service.GetNumbersDic(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IApiCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IApiCache.cs new file mode 100644 index 00000000..d4b25cd3 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IApiCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 接口缓存 +/// +public interface IApiCache : ICache, IApiModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICacheCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICacheCache.cs new file mode 100644 index 00000000..fc5e43ca --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICacheCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 缓存缓存 +/// +public interface ICacheCache : ICache, ICacheModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICaptchaCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICaptchaCache.cs new file mode 100644 index 00000000..36d29411 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/ICaptchaCache.cs @@ -0,0 +1,17 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Sys.Captcha; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 人机验证缓存 +/// +public interface ICaptchaCache : ICache, ICaptchaModule +{ + /// + /// 完成人机校验 ,并删除缓存项 + /// + Task VerifyCaptchaAndRemoveAsync(VerifyCaptchaReq req); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConfigCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConfigCache.cs new file mode 100644 index 00000000..3ca9fad0 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConfigCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 配置缓存 +/// +public interface IConfigCache : ICache, IConfigModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConstantCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConstantCache.cs new file mode 100644 index 00000000..5054a9ef --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IConstantCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 常量缓存 +/// +public interface IConstantCache : ICache, IConstantModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDeptCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDeptCache.cs new file mode 100644 index 00000000..f8d8359a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDeptCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 部门缓存 +/// +public interface IDeptCache : ICache, IDeptModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDevCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDevCache.cs new file mode 100644 index 00000000..14bf26db --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDevCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 开发缓存 +/// +public interface IDevCache : ICache, IDevModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCache.cs new file mode 100644 index 00000000..8914955b --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 字典缓存 +/// +public interface IDicCache : ICache, IDicModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCatalogCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCatalogCache.cs new file mode 100644 index 00000000..c395f3ab --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicCatalogCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 字典目录缓存 +/// +public interface IDicCatalogCache : ICache, IDicCatalogModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicContentCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicContentCache.cs new file mode 100644 index 00000000..3a847448 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IDicContentCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 字典内容缓存 +/// +public interface IDicContentCache : ICache, IDicContentModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IFileCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IFileCache.cs new file mode 100644 index 00000000..2fd9acc2 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IFileCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 文件缓存 +/// +public interface IFileCache : ICache, IFileModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IMenuCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IMenuCache.cs new file mode 100644 index 00000000..191bd4ed --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IMenuCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 菜单缓存 +/// +public interface IMenuCache : ICache, IMenuModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRequestLogCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRequestLogCache.cs new file mode 100644 index 00000000..024eb64b --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRequestLogCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 请求日志缓存 +/// +public interface IRequestLogCache : ICache, IRequestLogModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRoleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRoleCache.cs new file mode 100644 index 00000000..3ff1ba85 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IRoleCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 角色缓存 +/// +public interface IRoleCache : ICache, IRoleModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IToolsCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IToolsCache.cs new file mode 100644 index 00000000..0efcf351 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IToolsCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 工具缓存 +/// +public interface IToolsCache : ICache, IToolsModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserCache.cs new file mode 100644 index 00000000..fd41193e --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserCache.cs @@ -0,0 +1,54 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserProfile; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 用户缓存 +/// +public interface IUserCache : ICache, IUserModule +{ + /// + /// 删除缓存 CheckMobileAvailableAsync + /// + Task RemoveCheckMobileAvailableAsync(CheckMobileAvailableReq req); + + /// + /// 删除缓存 CheckUserNameAvailableAsync + /// + Task RemoveCheckUserNameAvailableAsync(CheckUserNameAvailableReq req); + + /// + /// 删除缓存 LoginByPwdAsync + /// + Task RemoveLoginByPwdAsync(LoginByPwdReq req); + + /// + /// 删除缓存 LoginBySmsAsync + /// + Task RemoveLoginBySmsAsync(LoginBySmsReq req); + + /// + /// 删除缓存 QueryProfileAsync + /// + Task RemoveQueryProfileAsync(QueryReq req); + + /// + /// 删除缓存 RegisterAsync + /// + Task RemoveRegisterAsync(RegisterUserReq userReq); + + /// + /// 删除缓存 ResetPasswordAsync + /// + Task RemoveResetPasswordAsync(ResetPasswordReq req); + + /// + /// 删除缓存 UserInfoAsync + /// + Task RemoveUserInfoAsync(); +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserProfileCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserProfileCache.cs new file mode 100644 index 00000000..e59b7558 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IUserProfileCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 用户档案缓存 +/// +public interface IUserProfileCache : ICache, IUserProfileModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IVerifyCodeCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IVerifyCodeCache.cs new file mode 100644 index 00000000..acac07ff --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/Dependency/IVerifyCodeCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys.Dependency; + +/// +/// 验证码缓存 +/// +public interface IVerifyCodeCache : ICache, IVerifyCodeModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs new file mode 100644 index 00000000..89b9d6f1 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DeptCache.cs @@ -0,0 +1,67 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dept; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 部门缓存 +/// +public sealed class DeptCache : DistributedCache, IScoped, IDeptCache +{ + /// + /// Initializes a new instance of the class. + /// + public DeptCache(IDistributedCache cache, IDeptService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateDeptReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryDeptReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateDeptReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DevCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DevCache.cs new file mode 100644 index 00000000..9dfac095 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DevCache.cs @@ -0,0 +1,36 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Sys.Dev; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 开发缓存 +/// +public sealed class DevCache : DistributedCache, IScoped, IDevCache +{ + /// + /// Initializes a new instance of the class. + /// + public DevCache(IDistributedCache cache, IDevService service) // + : base(cache, service) { } + + /// + public Task GenerateCsCodeAsync(GenerateCsCodeReq req) + { + return Service.GenerateCsCodeAsync(req); + } + + /// + public Task GenerateIconCodeAsync(GenerateIconCodeReq req) + { + return Service.GenerateIconCodeAsync(req); + } + + /// + public Task GenerateJsCodeAsync() + { + return Service.GenerateJsCodeAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs new file mode 100644 index 00000000..a61194b0 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCache.cs @@ -0,0 +1,92 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; +using NetAdmin.Domain.Dto.Sys.Dic.Content; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 字典缓存 +/// +public sealed class DicCache : DistributedCache, IScoped, IDicCache +{ + /// + /// Initializes a new instance of the class. + /// + public DicCache(IDistributedCache cache, IDicService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteCatalogAsync(BulkReq req) + { + return Service.BulkDeleteCatalogAsync(req); + } + + /// + public Task BulkDeleteContentAsync(BulkReq req) + { + return Service.BulkDeleteContentAsync(req); + } + + /// + public Task CreateCatalogAsync(CreateDicCatalogReq req) + { + return Service.CreateCatalogAsync(req); + } + + /// + public Task CreateContentAsync(CreateDicContentReq req) + { + return Service.CreateContentAsync(req); + } + + /// + public Task DeleteCatalogAsync(DelReq req) + { + return Service.DeleteCatalogAsync(req); + } + + /// + public Task DeleteContentAsync(DelReq req) + { + return Service.DeleteContentAsync(req); + } + + /// + public Task> PagedQueryCatalogAsync(PagedQueryReq req) + { + return Service.PagedQueryCatalogAsync(req); + } + + /// + public Task> PagedQueryContentAsync(PagedQueryReq req) + { + return Service.PagedQueryContentAsync(req); + } + + /// + public Task> QueryCatalogAsync(QueryReq req) + { + return Service.QueryCatalogAsync(req); + } + + /// + public Task> QueryContentAsync(QueryReq req) + { + return Service.QueryContentAsync(req); + } + + /// + public Task UpdateCatalogAsync(UpdateDicCatalogReq req) + { + return Service.UpdateCatalogAsync(req); + } + + /// + public Task UpdateContentAsync(UpdateDicContentReq req) + { + return Service.UpdateContentAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs new file mode 100644 index 00000000..40514917 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicCatalogCache.cs @@ -0,0 +1,67 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 字典目录缓存 +/// +public sealed class DicCatalogCache : DistributedCache, IScoped, IDicCatalogCache +{ + /// + /// Initializes a new instance of the class. + /// + public DicCatalogCache(IDistributedCache cache, IDicCatalogService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateDicCatalogReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryDicCatalogReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateDicCatalogReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs new file mode 100644 index 00000000..0ca5a242 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/DicContentCache.cs @@ -0,0 +1,67 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Content; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 字典内容缓存 +/// +public sealed class DicContentCache : DistributedCache, IScoped, IDicContentCache +{ + /// + /// Initializes a new instance of the class. + /// + public DicContentCache(IDistributedCache cache, IDicContentService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateDicContentReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryDicContentReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateDicContentReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/FileCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/FileCache.cs new file mode 100644 index 00000000..cebde69b --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/FileCache.cs @@ -0,0 +1,23 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 文件缓存 +/// +public sealed class FileCache : DistributedCache, IScoped, IFileCache +{ + /// + /// Initializes a new instance of the class. + /// + public FileCache(IDistributedCache cache, IFileService service) // + : base(cache, service) { } + + /// + public Task UploadAsync(IFormFile file) + { + return Service.UploadAsync(file); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs new file mode 100644 index 00000000..b960eba1 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/MenuCache.cs @@ -0,0 +1,73 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Menu; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 菜单缓存 +/// +public sealed class MenuCache : DistributedCache, IScoped, IMenuCache +{ + /// + /// Initializes a new instance of the class. + /// + public MenuCache(IDistributedCache cache, IMenuService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateMenuReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryMenuReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateMenuReq req) + { + return Service.UpdateAsync(req); + } + + /// + public Task> UserMenusAsync() + { + return Service.UserMenusAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs new file mode 100644 index 00000000..cd9add4c --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/RequestLogCache.cs @@ -0,0 +1,67 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.RequestLog; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 请求日志缓存 +/// +public sealed class RequestLogCache : DistributedCache, IScoped, IRequestLogCache +{ + /// + /// Initializes a new instance of the class. + /// + public RequestLogCache(IDistributedCache cache, IRequestLogService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateRequestLogReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryRequestLogReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(NopReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs new file mode 100644 index 00000000..800d68fd --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/RoleCache.cs @@ -0,0 +1,67 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Role; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 角色缓存 +/// +public sealed class RoleCache : DistributedCache, IScoped, IRoleCache +{ + /// + /// Initializes a new instance of the class. + /// + public RoleCache(IDistributedCache cache, IRoleService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateRoleReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryRoleReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateRoleReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/ToolsCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/ToolsCache.cs new file mode 100644 index 00000000..6d17aeb8 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/ToolsCache.cs @@ -0,0 +1,29 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 工具缓存 +/// +public sealed class ToolsCache : DistributedCache, IScoped, IToolsCache +{ + /// + /// Initializes a new instance of the class. + /// + public ToolsCache(IDistributedCache cache, IToolsService service) // + : base(cache, service) { } + + /// + public DateTime GetServerUtcTime() + { + return Service.GetServerUtcTime(); + } + + /// + public string Version() + { + return Service.Version(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs new file mode 100644 index 00000000..21f24a50 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserCache.cs @@ -0,0 +1,196 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserProfile; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +public sealed class UserCache : DistributedCache, IScoped, IUserCache +{ + private readonly IVerifyCodeCache _verifyCodeCache; + + /// + /// Initializes a new instance of the class. + /// + public UserCache(IDistributedCache cache, IUserService service, IVerifyCodeCache verifyCodeCache) // + : base(cache, service) + { + _verifyCodeCache = verifyCodeCache; + } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CheckMobileAvailableAsync(CheckMobileAvailableReq req) + { + return Service.CheckMobileAvailableAsync(req); + } + + /// + public Task CheckUserNameAvailableAsync(CheckUserNameAvailableReq req) + { + return Service.CheckUserNameAvailableAsync(req); + } + + /// + public Task CreateAsync(CreateUserReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryUserReq req) + { + return Service.GetAsync(req); + } + + /// + public Task LoginByPwdAsync(LoginByPwdReq req) + { + return Service.LoginByPwdAsync(req); + } + + /// + public Task LoginBySmsAsync(LoginBySmsReq req) + { + return Service.LoginBySmsAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task> QueryProfileAsync(QueryReq req) + { + return Service.QueryProfileAsync(req); + } + + /// + public Task RegisterAsync(RegisterUserReq req) + { + return Service.RegisterAsync(req); + } + + /// + public Task RemoveCheckMobileAvailableAsync(CheckMobileAvailableReq req) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveCheckUserNameAvailableAsync(CheckUserNameAvailableReq req) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveLoginByPwdAsync(LoginByPwdReq req) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveLoginBySmsAsync(LoginBySmsReq req) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveQueryProfileAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveRegisterAsync(RegisterUserReq userReq) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveResetPasswordAsync(ResetPasswordReq req) + { + throw new NotImplementedException(); + } + + /// + public Task RemoveUserInfoAsync() + { + return RemoveAsync(GetCacheKey( // + Service.UserToken.Id.ToString(CultureInfo.InvariantCulture), nameof(UserInfoAsync))); + } + + /// + public Task ResetPasswordAsync(ResetPasswordReq req) + { + return Service.ResetPasswordAsync(req); + } + + /// + public Task SetAvatarAsync(SetAvatarReq req) + { + return Service.SetAvatarAsync(req); + } + + /// + public async Task SetEmailAsync(SetEmailReq req) + { + return !await _verifyCodeCache.VerifyAsync(req) + ? throw new NetAdminInvalidOperationException(Ln.邮箱验证码不正确) + : await Service.SetEmailAsync(req); + } + + /// + public Task SetMobileAsync(SetMobileReq req) + { + return Service.SetMobileAsync(req); + } + + /// + public Task SetPasswordAsync(SetPasswordReq req) + { + return Service.SetPasswordAsync(req); + } + + /// + public Task UpdateAsync(UpdateUserReq req) + { + return Service.UpdateAsync(req); + } + + /// + public Task UserInfoAsync() + { + return GetOrCreateAsync( // + GetCacheKey(Service.UserToken.Id.ToString(CultureInfo.InvariantCulture)), Service.UserInfoAsync +, TimeSpan.FromMinutes(1)); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs new file mode 100644 index 00000000..015a3b0a --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/UserProfileCache.cs @@ -0,0 +1,67 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.UserProfile; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +/// 用户档案缓存 +/// +public sealed class UserProfileCache : DistributedCache, IScoped, IUserProfileCache +{ + /// + /// Initializes a new instance of the class. + /// + public UserProfileCache(IDistributedCache cache, IUserProfileService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateUserProfileReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryUserProfileReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateUserProfileReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs new file mode 100644 index 00000000..7865cce6 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Sys/VerifyCodeCache.cs @@ -0,0 +1,78 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.VerifyCode; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Cache.Sys; + +/// +public sealed class VerifyCodeCache : DistributedCache, IScoped, IVerifyCodeCache +{ + /// + /// Initializes a new instance of the class. + /// + public VerifyCodeCache(IDistributedCache cache, IVerifyCodeService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateVerifyCodeReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryVerifyCodeReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task SendVerifyCodeAsync(SendVerifyCodeReq req) + { + return Service.SendVerifyCodeAsync(req); + } + + /// + public Task UpdateAsync(UpdateVerifyCodeReq req) + { + return Service.UpdateAsync(req); + } + + /// + public Task VerifyAsync(VerifyCodeReq req) + { + return Service.VerifyAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Tpl/Dependency/IExampleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Tpl/Dependency/IExampleCache.cs new file mode 100644 index 00000000..a371b185 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Tpl/Dependency/IExampleCache.cs @@ -0,0 +1,10 @@ +using NetAdmin.Cache; +using NetAdmin.SysComponent.Application.Modules.Tpl; +using NetAdmin.SysComponent.Application.Services.Tpl.Dependency; + +namespace NetAdmin.SysComponent.Cache.Tpl.Dependency; + +/// +/// 示例缓存 +/// +public interface IExampleCache : ICache, IExampleModule { } \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs b/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs new file mode 100644 index 00000000..1c20eaa5 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Cache/Tpl/ExampleCache.cs @@ -0,0 +1,65 @@ +using NetAdmin.Cache; +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Tpl.Example; +using NetAdmin.SysComponent.Application.Services.Tpl.Dependency; +using NetAdmin.SysComponent.Cache.Tpl.Dependency; + +namespace NetAdmin.SysComponent.Cache.Tpl; + +/// +public sealed class ExampleCache : DistributedCache, IScoped, IExampleCache +{ + /// + /// Initializes a new instance of the class. + /// + public ExampleCache(IDistributedCache cache, IExampleService service) // + : base(cache, service) { } + + /// + public Task BulkDeleteAsync(BulkReq req) + { + return Service.BulkDeleteAsync(req); + } + + /// + public Task CreateAsync(CreateExampleReq req) + { + return Service.CreateAsync(req); + } + + /// + public Task DeleteAsync(DelReq req) + { + return Service.DeleteAsync(req); + } + + /// + public Task ExistAsync(QueryReq req) + { + return Service.ExistAsync(req); + } + + /// + public Task GetAsync(QueryExampleReq req) + { + return Service.GetAsync(req); + } + + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Service.PagedQueryAsync(req); + } + + /// + public Task> QueryAsync(QueryReq req) + { + return Service.QueryAsync(req); + } + + /// + public Task UpdateAsync(UpdateExampleReq req) + { + return Service.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs new file mode 100644 index 00000000..8e7cc8ef --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ApiController.cs @@ -0,0 +1,105 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Api; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 接口服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class ApiController : ControllerBase, IApiModule +{ + /// + /// Initializes a new instance of the class. + /// + public ApiController(IApiCache cache) // + : base(cache) { } + + /// + /// 批量删除接口 + /// + [NonAction] + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建接口 + /// + [NonAction] + [Transaction] + public Task CreateAsync(CreateApiReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除接口 + /// + [NonAction] + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 接口是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个接口 + /// + [NonAction] + public Task GetAsync(QueryApiReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询接口 + /// + [NonAction] + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询接口 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 同步接口 + /// + [Transaction] + public Task SyncAsync() + { + return Cache.SyncAsync(); + } + + /// + /// 更新接口 + /// + [NonAction] + public Task UpdateAsync(NopReq req) + { + return Cache.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CacheController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CacheController.cs new file mode 100644 index 00000000..dc9e8491 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CacheController.cs @@ -0,0 +1,37 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Cache; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 缓存服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class CacheController : ControllerBase, ICacheModule +{ + /// + /// Initializes a new instance of the class. + /// + public CacheController(ICacheCache cache) // + : base(cache) { } + + /// + /// 缓存统计 + /// + public Task CacheStatisticsAsync() + { + return Cache.CacheStatisticsAsync(); + } + + /// + /// 获取所有缓存项 + /// + public PagedQueryRsp GetAllEntries(PagedQueryReq req) + { + return Cache.GetAllEntries(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CaptchaController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CaptchaController.cs new file mode 100644 index 00000000..e2c2994d --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/CaptchaController.cs @@ -0,0 +1,38 @@ +using NetAdmin.Domain.Dto.Sys.Captcha; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 人机验证服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class CaptchaController : ControllerBase, ICaptchaModule +{ + /// + /// Initializes a new instance of the class. + /// + public CaptchaController(ICaptchaCache cache) // + : base(cache) { } + + /// + /// 获取人机校验图 + /// + [AllowAnonymous] + public Task GetCaptchaImageAsync() + { + return Cache.GetCaptchaImageAsync(); + } + + /// + /// 完成人机校验 + /// + [AllowAnonymous] + public Task VerifyCaptchaAsync(VerifyCaptchaReq req) + { + return Cache.VerifyCaptchaAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs new file mode 100644 index 00000000..eb4f6668 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConfigController.cs @@ -0,0 +1,100 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Config; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 配置服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class ConfigController : ControllerBase, IConfigModule +{ + /// + /// Initializes a new instance of the class. + /// + public ConfigController(IConfigCache cache) // + : base(cache) { } + + /// + /// 批量删除配置 + /// + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建配置 + /// + [Transaction] + public Task CreateAsync(CreateConfigReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除配置 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 配置是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个配置 + /// + [NonAction] + public Task GetAsync(QueryConfigReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 获取最新有效配置 + /// + public Task GetLatestConfigAsync() + { + return Cache.GetLatestConfigAsync(); + } + + /// + /// 分页查询配置 + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询配置 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 更新配置 + /// + [Transaction] + public Task UpdateAsync(UpdateConfigReq req) + { + return Cache.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConstantController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConstantController.cs new file mode 100644 index 00000000..ba54dde2 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ConstantController.cs @@ -0,0 +1,87 @@ +using NetAdmin.Domain.Dto; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 常量服务 +/// +[AllowAnonymous] +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class ConstantController : ControllerBase, IConstantModule +{ + private readonly JsonOptions _jsonOptions; + + /// + /// Initializes a new instance of the class. + /// + public ConstantController(IConstantCache cache, IOptions jsonOptions) // + : base(cache) + { + _jsonOptions = jsonOptions.Value; + } + + /// + /// 获得常量字符串 + /// + [NonUnify] + public IActionResult GetChars() + { + var ret = GetCharsDic(); + return OriginNamingResult(ret); + } + + /// + /// 获得常量字符串 + /// + [NonAction] + public IDictionary GetCharsDic() + { + return Cache.GetCharsDic(); + } + + /// + /// 获得公共枚举值 + /// + public IDictionary> GetEnums() + { + return Cache.GetEnums(); + } + + /// + /// 获得本地化字符串 + /// + public IDictionary GetLocalizedStrings() + { + return Cache.GetLocalizedStrings(); + } + + /// + /// 获得数字常量表 + /// + [NonUnify] + public IActionResult GetNumbers() + { + var ret = GetNumbersDic(); + return OriginNamingResult(ret); + } + + /// + /// 获得数字常量表 + /// + [NonAction] + public IDictionary GetNumbersDic() + { + return Cache.GetNumbersDic(); + } + + private IActionResult OriginNamingResult(T data) + { + return new JsonResult( // + new RestfulInfo { Code = 0, Data = data } + , new JsonSerializerOptions(_jsonOptions.JsonSerializerOptions) { DictionaryKeyPolicy = null }); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs new file mode 100644 index 00000000..fe383861 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DeptController.cs @@ -0,0 +1,93 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dept; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 部门服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class DeptController : ControllerBase, IDeptModule +{ + /// + /// Initializes a new instance of the class. + /// + public DeptController(IDeptCache cache) // + : base(cache) { } + + /// + /// 批量删除部门 + /// + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建部门 + /// + [Transaction] + public Task CreateAsync(CreateDeptReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除部门 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 部门是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个部门 + /// + [NonAction] + public Task GetAsync(QueryDeptReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询部门 + /// + [NonAction] + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询部门 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 更新部门 + /// + [Transaction] + public Task UpdateAsync(UpdateDeptReq req) + { + return Cache.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DevController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DevController.cs new file mode 100644 index 00000000..4f2d38dc --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DevController.cs @@ -0,0 +1,44 @@ +using NetAdmin.Domain.Dto.Sys.Dev; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 开发服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class DevController : ControllerBase, IDevModule +{ + /// + /// Initializes a new instance of the class. + /// + public DevController(IDevCache cache) // + : base(cache) { } + + /// + /// 生成后端代码 + /// + public Task GenerateCsCodeAsync(GenerateCsCodeReq req) + { + return Cache.GenerateCsCodeAsync(req); + } + + /// + /// 生成图标代码 + /// + public Task GenerateIconCodeAsync(GenerateIconCodeReq req) + { + return Cache.GenerateIconCodeAsync(req); + } + + /// + /// 生成接口代码 + /// + public Task GenerateJsCodeAsync() + { + return Cache.GenerateJsCodeAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs new file mode 100644 index 00000000..aca077b6 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/DicController.cs @@ -0,0 +1,127 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Dic.Catalog; +using NetAdmin.Domain.Dto.Sys.Dic.Content; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 字典服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class DicController : ControllerBase, IDicModule +{ + /// + /// Initializes a new instance of the class. + /// + public DicController(IDicCache cache) // + : base(cache) { } + + /// + /// 批量删除字典目录 + /// + [Transaction] + public Task BulkDeleteCatalogAsync(BulkReq req) + { + return Cache.BulkDeleteCatalogAsync(req); + } + + /// + /// 批量删除字典内容 + /// + [Transaction] + public Task BulkDeleteContentAsync(BulkReq req) + { + return Cache.BulkDeleteContentAsync(req); + } + + /// + /// 创建字典目录 + /// + [Transaction] + public Task CreateCatalogAsync(CreateDicCatalogReq req) + { + return Cache.CreateCatalogAsync(req); + } + + /// + /// 创建字典内容 + /// + [Transaction] + public Task CreateContentAsync(CreateDicContentReq req) + { + return Cache.CreateContentAsync(req); + } + + /// + /// 删除字典目录 + /// + [Transaction] + public Task DeleteCatalogAsync(DelReq req) + { + return Cache.DeleteCatalogAsync(req); + } + + /// + /// 删除字典内容 + /// + [Transaction] + public Task DeleteContentAsync(DelReq req) + { + return Cache.DeleteContentAsync(req); + } + + /// + /// 分页查询字典目录 + /// + public Task> PagedQueryCatalogAsync(PagedQueryReq req) + { + return Cache.PagedQueryCatalogAsync(req); + } + + /// + /// 分页查询字典内容 + /// + public Task> PagedQueryContentAsync(PagedQueryReq req) + { + return Cache.PagedQueryContentAsync(req); + } + + /// + /// 查询字典目录 + /// + public Task> QueryCatalogAsync(QueryReq req) + { + return Cache.QueryCatalogAsync(req); + } + + /// + /// 查询字典内容 + /// + public Task> QueryContentAsync(QueryReq req) + { + return Cache.QueryContentAsync(req); + } + + /// + /// 更新字典目录 + /// + [Transaction] + public Task UpdateCatalogAsync(UpdateDicCatalogReq req) + { + return Cache.UpdateCatalogAsync(req); + } + + /// + /// 更新字典内容 + /// + [Transaction] + public Task UpdateContentAsync(UpdateDicContentReq req) + { + return Cache.UpdateContentAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs new file mode 100644 index 00000000..e910d652 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/FileController.cs @@ -0,0 +1,27 @@ +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 文件服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class FileController : ControllerBase, IFileModule +{ + /// + /// Initializes a new instance of the class. + /// + public FileController(IFileCache cache) // + : base(cache) { } + + /// + /// 文件上传 + /// + public Task UploadAsync(IFormFile file) + { + return Cache.UploadAsync(file); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs new file mode 100644 index 00000000..f6e4474d --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/LogController.cs @@ -0,0 +1,96 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.RequestLog; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 请求日志服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class LogController : ControllerBase, IRequestLogModule +{ + /// + /// Initializes a new instance of the class. + /// + public LogController(IRequestLogCache cache) // + : base(cache) { } + + /// + /// 批量删除请求日志 + /// + [NonAction] + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建请求日志 + /// + [NonAction] + [Transaction] + public Task CreateAsync(CreateRequestLogReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除请求日志 + /// + [NonAction] + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 请求日志是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个请求日志 + /// + [NonAction] + public Task GetAsync(QueryRequestLogReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询请求日志 + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询请求日志 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 更新请求日志 + /// + [NonAction] + [Transaction] + public Task UpdateAsync(NopReq req) + { + return Cache.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs new file mode 100644 index 00000000..df200d8d --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/MenuController.cs @@ -0,0 +1,101 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Menu; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 菜单服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class MenuController : ControllerBase, IMenuModule +{ + /// + /// Initializes a new instance of the class. + /// + public MenuController(IMenuCache cache) // + : base(cache) { } + + /// + /// 批量删除菜单 + /// + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建菜单 + /// + [Transaction] + public Task CreateAsync(CreateMenuReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除菜单 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 菜单是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个菜单 + /// + [NonAction] + public Task GetAsync(QueryMenuReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询菜单 + /// + [NonAction] + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询菜单 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 更新菜单 + /// + [Transaction] + public Task UpdateAsync(UpdateMenuReq req) + { + return Cache.UpdateAsync(req); + } + + /// + /// 当前用户菜单 + /// + public Task> UserMenusAsync() + { + return Cache.UserMenusAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs new file mode 100644 index 00000000..daadf439 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/RoleController.cs @@ -0,0 +1,92 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.Role; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 角色服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class RoleController : ControllerBase, IRoleModule +{ + /// + /// Initializes a new instance of the class. + /// + public RoleController(IRoleCache cache) // + : base(cache) { } + + /// + /// 批量删除角色 + /// + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建角色 + /// + [Transaction] + public Task CreateAsync(CreateRoleReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除角色 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 角色是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个角色 + /// + [NonAction] + public Task GetAsync(QueryRoleReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询角色 + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询角色 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 更新角色 + /// + [Transaction] + public Task UpdateAsync(UpdateRoleReq req) + { + return Cache.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ToolsController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ToolsController.cs new file mode 100644 index 00000000..e7649b7d --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/ToolsController.cs @@ -0,0 +1,37 @@ +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 工具服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class ToolsController : ControllerBase, IToolsModule +{ + /// + /// Initializes a new instance of the class. + /// + public ToolsController(IToolsCache cache) // + : base(cache) { } + + /// + /// 服务器时间 + /// + [AllowAnonymous] + public DateTime GetServerUtcTime() + { + return Cache.GetServerUtcTime(); + } + + /// + /// 版本信息 + /// + [AllowAnonymous] + public string Version() + { + return Cache.Version(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs new file mode 100644 index 00000000..e7519410 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/UserController.cs @@ -0,0 +1,221 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Dto.Sys.UserProfile; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 用户服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class UserController : ControllerBase, IUserModule +{ + private readonly IConfigCache _configCache; + + /// + /// Initializes a new instance of the class. + /// + public UserController(IUserCache cache, IConfigCache configCache) // + : base(cache) + { + _configCache = configCache; + } + + /// + /// 批量删除用户 + /// + [NonAction] + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 检查手机号是否可用 + /// + [AllowAnonymous] + public Task CheckMobileAvailableAsync(CheckMobileAvailableReq req) + { + return Cache.CheckMobileAvailableAsync(req); + } + + /// + /// 检查用户名是否可用 + /// + [AllowAnonymous] + public Task CheckUserNameAvailableAsync(CheckUserNameAvailableReq req) + { + return Cache.CheckUserNameAvailableAsync(req); + } + + /// + /// 创建用户 + /// + [Transaction] + public Task CreateAsync(CreateUserReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除用户 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 用户是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个用户 + /// + [NonAction] + public Task GetAsync(QueryUserReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 密码登录 + /// + [AllowAnonymous] + [Transaction] + public async Task LoginByPwdAsync(LoginByPwdReq req) + { + var ret = await Cache.LoginByPwdAsync(req); + ret.SetToRspHeader(); + return ret; + } + + /// + /// 短信登录 + /// + [AllowAnonymous] + [Transaction] + public async Task LoginBySmsAsync(LoginBySmsReq req) + { + var ret = await Cache.LoginBySmsAsync(req); + ret.SetToRspHeader(); + return ret; + } + + /// + /// 分页查询用户 + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询用户 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 查询用户档案 + /// + public Task> QueryProfileAsync(QueryReq req) + { + return Cache.QueryProfileAsync(req); + } + + /// + /// 注册用户 + /// + [Transaction] + [AllowAnonymous] + public async Task RegisterAsync(RegisterUserReq req) + { + var config = await _configCache.GetLatestConfigAsync(); + + return await Cache.RegisterAsync(req with { + DeptId = config.UserRegisterDeptId + , RoleIds = new[] { config.UserRegisterRoleId } + , Profile = new CreateUserProfileReq() + , Enabled = !config.UserRegisterConfirm + , Mobile = req.VerifySmsCodeReq.DestDevice + }); + } + + /// + /// 重设密码 + /// + [AllowAnonymous] + [Transaction] + public Task ResetPasswordAsync(ResetPasswordReq req) + { + return Cache.ResetPasswordAsync(req); + } + + /// + /// 更新用户头像 + /// + [Transaction] + public Task SetAvatarAsync(SetAvatarReq req) + { + return Cache.SetAvatarAsync(req); + } + + /// + /// 设置邮箱 + /// + [Transaction] + public Task SetEmailAsync(SetEmailReq req) + { + return Cache.SetEmailAsync(req); + } + + /// + /// 设置手机号 + /// + [Transaction] + public Task SetMobileAsync(SetMobileReq req) + { + return Cache.SetMobileAsync(req); + } + + /// + /// 设置密码 + /// + [Transaction] + public Task SetPasswordAsync(SetPasswordReq req) + { + return Cache.SetPasswordAsync(req); + } + + /// + /// 更新用户 + /// + [Transaction] + public Task UpdateAsync(UpdateUserReq req) + { + return Cache.UpdateAsync(req); + } + + /// + /// 当前用户信息 + /// + public Task UserInfoAsync() + { + return Cache.UserInfoAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs new file mode 100644 index 00000000..066e1a78 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Sys/VerifyCodeController.cs @@ -0,0 +1,104 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Sys.VerifyCode; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Sys; + +/// +/// 验证码服务 +/// +[ApiDescriptionSettings(nameof(Sys), Module = nameof(Sys))] +public sealed class VerifyCodeController : ControllerBase, IVerifyCodeModule +{ + private readonly ICaptchaCache _captchaCache; + + /// + /// Initializes a new instance of the class. + /// + public VerifyCodeController(IVerifyCodeCache cache, ICaptchaCache captchaCache) // + : base(cache) + { + _captchaCache = captchaCache; + } + + /// + [NonAction] + public Task BulkDeleteAsync(BulkReq req) + { + throw new NotImplementedException(); + } + + /// + [NonAction] + public Task CreateAsync(CreateVerifyCodeReq req) + { + throw new NotImplementedException(); + } + + /// + [NonAction] + public Task DeleteAsync(DelReq req) + { + throw new NotImplementedException(); + } + + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + [NonAction] + public Task GetAsync(QueryVerifyCodeReq req) + { + throw new NotImplementedException(); + } + + /// + [NonAction] + public Task> PagedQueryAsync(PagedQueryReq req) + { + throw new NotImplementedException(); + } + + /// + [NonAction] + public Task> QueryAsync(QueryReq req) + { + throw new NotImplementedException(); + } + + /// + /// 发送验证码 + /// + [Transaction] + [AllowAnonymous] + public async Task SendVerifyCodeAsync(SendVerifyCodeReq req) + { + await _captchaCache.VerifyCaptchaAndRemoveAsync(req.VerifyCaptchaReq); + return await Cache.SendVerifyCodeAsync(req); + } + + /// + [NonAction] + public Task UpdateAsync(UpdateVerifyCodeReq req) + { + throw new NotImplementedException(); + } + + /// + /// 完成验证 + /// + [Transaction] + [AllowAnonymous] + public Task VerifyAsync(VerifyCodeReq req) + { + return Cache.VerifyAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs b/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs new file mode 100644 index 00000000..7610c70b --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Controllers/Tpl/ExampleController.cs @@ -0,0 +1,92 @@ +using NetAdmin.Domain.Dto.Dependency; +using NetAdmin.Domain.Dto.Tpl.Example; +using NetAdmin.Host.Attributes; +using NetAdmin.Host.Controllers; +using NetAdmin.SysComponent.Application.Modules.Tpl; +using NetAdmin.SysComponent.Application.Services.Tpl.Dependency; +using NetAdmin.SysComponent.Cache.Tpl.Dependency; + +namespace NetAdmin.SysComponent.Host.Controllers.Tpl; + +/// +/// 示例服务 +/// +[ApiDescriptionSettings(nameof(Tpl), Module = nameof(Tpl))] +public sealed class ExampleController : ControllerBase, IExampleModule +{ + /// + /// Initializes a new instance of the class. + /// + public ExampleController(IExampleCache cache) // + : base(cache) { } + + /// + /// 批量删除示例 + /// + [Transaction] + public Task BulkDeleteAsync(BulkReq req) + { + return Cache.BulkDeleteAsync(req); + } + + /// + /// 创建示例 + /// + [Transaction] + public Task CreateAsync(CreateExampleReq req) + { + return Cache.CreateAsync(req); + } + + /// + /// 删除示例 + /// + [Transaction] + public Task DeleteAsync(DelReq req) + { + return Cache.DeleteAsync(req); + } + + /// + /// 示例是否存在 + /// + [NonAction] + public Task ExistAsync(QueryReq req) + { + return Cache.ExistAsync(req); + } + + /// + /// 获取单个示例 + /// + [NonAction] + public Task GetAsync(QueryExampleReq req) + { + return Cache.GetAsync(req); + } + + /// + /// 分页查询示例 + /// + public Task> PagedQueryAsync(PagedQueryReq req) + { + return Cache.PagedQueryAsync(req); + } + + /// + /// 查询示例 + /// + public Task> QueryAsync(QueryReq req) + { + return Cache.QueryAsync(req); + } + + /// + /// 更新示例 + /// + [Transaction] + public Task UpdateAsync(UpdateExampleReq req) + { + return Cache.UpdateAsync(req); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/NetAdmin.SysComponent.Host.csproj b/src/backend/NetAdmin.SysComponent.Host/NetAdmin.SysComponent.Host.csproj new file mode 100644 index 00000000..e89eea5c --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/NetAdmin.SysComponent.Host.csproj @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Subscribers/ApiSynchronizer.cs b/src/backend/NetAdmin.SysComponent.Host/Subscribers/ApiSynchronizer.cs new file mode 100644 index 00000000..0c50c043 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Subscribers/ApiSynchronizer.cs @@ -0,0 +1,31 @@ +using NetAdmin.Domain.Events; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Subscribers; + +/// +/// Api接口同步器 +/// +public sealed class ApiSynchronizer : IEventSubscriber +{ + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + public ApiSynchronizer(ILogger logger) + { + _logger = logger; + } + + /// + /// 同步Api接口 + /// + [EventSubscribe(nameof(SyncStructureAfterEvent))] + public async Task SyncApiAsync(EventHandlerExecutingContext _) + { + var logService = App.GetService(); + await logService.SyncAsync(); + _logger.Info($"{nameof(IApiService)}.{nameof(IApiService.SyncAsync)} {Ln.已完成}"); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Subscribers/CacheCleaner.cs b/src/backend/NetAdmin.SysComponent.Host/Subscribers/CacheCleaner.cs new file mode 100644 index 00000000..94c50866 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Subscribers/CacheCleaner.cs @@ -0,0 +1,31 @@ +using NetAdmin.Domain.Contexts; +using NetAdmin.Domain.Events.Sys; +using NetAdmin.SysComponent.Cache.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Subscribers; + +/// +/// 缓存清理器 +/// +public sealed class CacheCleaner : IEventSubscriber +{ + /// + /// Initializes a new instance of the class. + /// + public CacheCleaner() { } + + /// + /// 用户缓存清理 + /// + [EventSubscribe(nameof(UserUpdatedEvent))] + public async Task RemoveUserInfoAsync(EventHandlerExecutingContext context) + { + if (context.Source is not UserUpdatedEvent userUpdatedEvent) { + return; + } + + var cache = App.GetService(); + cache.Service.UserToken = ContextUserToken.Create(userUpdatedEvent.Data); + await cache.RemoveUserInfoAsync(); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Subscribers/EmailCodeSender.cs b/src/backend/NetAdmin.SysComponent.Host/Subscribers/EmailCodeSender.cs new file mode 100644 index 00000000..f8560124 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Subscribers/EmailCodeSender.cs @@ -0,0 +1,40 @@ +using NetAdmin.Domain.Dto.Sys.VerifyCode; +using NetAdmin.Domain.Enums.Sys; +using NetAdmin.Domain.Events.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Subscribers; + +/// +/// 邮件验证码发送器 +/// +public sealed class EmailCodeSender : IEventSubscriber +{ + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + public EmailCodeSender(ILogger logger) + { + _logger = logger; + } + + /// + /// 发送邮件 + /// + [EventSubscribe(nameof(VerifyCodeCreatedEvent))] + public async Task SendEmailAsync(EventHandlerExecutingContext context) + { + if (context.Source is not VerifyCodeCreatedEvent verifyCodeCreatedEvent || + verifyCodeCreatedEvent.Data.DeviceType != VerifyCodeDeviceTypes.Email) { + return; + } + + // 发送... + var verifyCodeService = App.GetService(); + _ = await verifyCodeService.UpdateAsync( + verifyCodeCreatedEvent.Data.Adapt() with { Status = VerifyCodeStatues.Sent }); + _logger.Info($"{nameof(IVerifyCodeService)}.{nameof(IVerifyCodeService.UpdateAsync)} {Ln.已完成}"); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs b/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs new file mode 100644 index 00000000..b9473359 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Subscribers/OperationLogger.cs @@ -0,0 +1,46 @@ +using NetAdmin.Domain.Dto.Sys.RequestLog; +using NetAdmin.Domain.Dto.Sys.User; +using NetAdmin.Domain.Events.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Subscribers; + +/// +/// 操作日志记录 +/// +public sealed class OperationLogger : IEventSubscriber +{ + /// + /// 保存请求日志到数据库 + /// + [EventSubscribe(nameof(RequestLogEvent))] + public async Task OperationEventDbRecordAsync(EventHandlerExecutingContext context) + { + if (context.Source is not RequestLogEvent operationEvent) { + return; + } + + // 跳过心跳请求 + if (operationEvent.Data.ApiId.Equals("api/health/check", StringComparison.OrdinalIgnoreCase)) { + return; + } + + CreateRequestLogReq logReq = null; + + // 登录日志特殊处理 + if (operationEvent.Data.ApiId.Equals("api/user/login", StringComparison.OrdinalIgnoreCase)) { + try { + var loginReq = operationEvent.Data.RequestBody.ToObject(); + logReq = operationEvent.Data with { ExtraData = loginReq.Account }; + } + catch { + // ignored + } + } + + logReq ??= operationEvent.Data; + var logService = App.GetService(); + logReq.TruncateStrings(); + _ = await logService.CreateAsync(logReq); + } +} \ No newline at end of file diff --git a/src/backend/NetAdmin.SysComponent.Host/Subscribers/SmsCodeSender.cs b/src/backend/NetAdmin.SysComponent.Host/Subscribers/SmsCodeSender.cs new file mode 100644 index 00000000..3309a729 --- /dev/null +++ b/src/backend/NetAdmin.SysComponent.Host/Subscribers/SmsCodeSender.cs @@ -0,0 +1,40 @@ +using NetAdmin.Domain.Dto.Sys.VerifyCode; +using NetAdmin.Domain.Enums.Sys; +using NetAdmin.Domain.Events.Sys; +using NetAdmin.SysComponent.Application.Services.Sys.Dependency; + +namespace NetAdmin.SysComponent.Host.Subscribers; + +/// +/// 短信验证码发送器 +/// +public sealed class SmsCodeSender : IEventSubscriber +{ + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + public SmsCodeSender(ILogger logger) + { + _logger = logger; + } + + /// + /// 发送短信 + /// + [EventSubscribe(nameof(VerifyCodeCreatedEvent))] + public async Task SendSmsAsync(EventHandlerExecutingContext context) + { + if (context.Source is not VerifyCodeCreatedEvent verifyCodeCreatedEvent || + verifyCodeCreatedEvent.Data.DeviceType != VerifyCodeDeviceTypes.Mobile) { + return; + } + + // 发送... + var verifyCodeService = App.GetService(); + _ = await verifyCodeService.UpdateAsync( + verifyCodeCreatedEvent.Data.Adapt() with { Status = VerifyCodeStatues.Sent }); + _logger.Info($"{nameof(IVerifyCodeService)}.{nameof(IVerifyCodeService.UpdateAsync)} {Ln.已完成}"); + } +} \ No newline at end of file diff --git a/src/frontend/admin/.editorconfig b/src/frontend/admin/.editorconfig new file mode 100644 index 00000000..b79317dd --- /dev/null +++ b/src/frontend/admin/.editorconfig @@ -0,0 +1,11 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +ij_xml_attribute_wrap = off +ij_xml_text_wrap = off +indent_size = 4 +indent_style = space +insert_final_newline = false +trim_trailing_whitespace = true \ No newline at end of file diff --git a/src/frontend/admin/.eslintrc.js b/src/frontend/admin/.eslintrc.js new file mode 100644 index 00000000..20c5028f --- /dev/null +++ b/src/frontend/admin/.eslintrc.js @@ -0,0 +1,47 @@ +module.exports = { + root: true, + extends: ['plugin:vue/vue3-essential', 'eslint:recommended', '@vue/eslint-config-prettier'], + rules: { + 'vue/multi-word-component-names': [ + 'off', + { + ignores: [], + }, + ], + 'vue/attributes-order': [ + 'error', + { + order: [ + 'DEFINITION', + 'LIST_RENDERING', + 'CONDITIONALS', + 'RENDER_MODIFIERS', + 'GLOBAL', + ['UNIQUE', 'SLOT'], + 'TWO_WAY_BINDING', + 'OTHER_DIRECTIVES', + 'OTHER_ATTR', + 'EVENTS', + 'CONTENT', + ], + alphabetical: false, + }, + ], + 'vue/no-unused-vars': ['warn'], + 'no-return-await': ['warn'], + 'no-multiple-empty-lines': ['warn'], + 'no-inner-declarations': ['off'], + eqeqeq: 'error', + }, + env: { + browser: true, + es2021: true, + node: true, + 'vue/setup-compiler-macros': true, + }, + globals: { + defineOptions: 'writable', + defineProps: 'readonly', + NodeJS: true, + }, +} \ No newline at end of file diff --git a/src/frontend/admin/.gitignore b/src/frontend/admin/.gitignore new file mode 100644 index 00000000..403adbc1 --- /dev/null +++ b/src/frontend/admin/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/src/frontend/admin/.prettierignore b/src/frontend/admin/.prettierignore new file mode 100644 index 00000000..7bf12a5a --- /dev/null +++ b/src/frontend/admin/.prettierignore @@ -0,0 +1,3 @@ +# 忽略格式化文件 (根据项目需要自行添加) +node_modules +dist \ No newline at end of file diff --git a/src/frontend/admin/.prettierrc b/src/frontend/admin/.prettierrc new file mode 100644 index 00000000..2df9eb10 --- /dev/null +++ b/src/frontend/admin/.prettierrc @@ -0,0 +1,10 @@ +{ + "tabWidth": 4, + "useTabs": false, + "semi": false, + "singleQuote": true, + "trailingComma": "all", + "bracketSameLine": true, + "printWidth": 150, + "endOfLine": "auto" +} \ No newline at end of file diff --git a/src/frontend/admin/LICENSE b/src/frontend/admin/LICENSE new file mode 100644 index 00000000..596e09bb --- /dev/null +++ b/src/frontend/admin/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 sakuya + +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/src/frontend/admin/README.md b/src/frontend/admin/README.md new file mode 100644 index 00000000..ec4a0b4f --- /dev/null +++ b/src/frontend/admin/README.md @@ -0,0 +1,30 @@ +原版仓库 [SCUI](https://gitee.com/lolicode/scui) + +1. 本仓库只是将 vue-cli 替换为 vite(vite版本与官网),只做了为适配 vite 的必要修改,其它仍与原版一致(除部分静态资源)。 +2. 和原SCUI不同的一点就是加入了eslint和prettier,stylelint没必要 + +### 使用 yarn + +``` +# 进入项目目录 +cd ./scui_vite + +# 安装依赖 +yarn + +# 启动项目(开发模式) +yarn dev +``` + +### 使用 npm + +``` +# 进入项目目录 +cd ./scui_vite + +# 安装依赖 +npm i + +# 启动项目(开发模式) +npm run dev +``` \ No newline at end of file diff --git a/src/frontend/admin/babel.config.js b/src/frontend/admin/babel.config.js new file mode 100644 index 00000000..e813dbcb --- /dev/null +++ b/src/frontend/admin/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: ['@vue/cli-plugin-babel/preset'], +} \ No newline at end of file diff --git a/src/frontend/admin/index.html b/src/frontend/admin/index.html new file mode 100644 index 00000000..e8e3f08d --- /dev/null +++ b/src/frontend/admin/index.html @@ -0,0 +1,191 @@ + + + + + + + + SCUI + + + + + +
    +
    + +
    +
    SCUI
    +
    + +
    + + +
    +

    当前使用的浏览器内核版本过低 :(

    +

    + 当前版本:-- -- +

    +

    + 最低版本要求:Chrome 71+、Firefox 65+、Safari 12+、Edge 97+。 +

    +

    + 请升级浏览器版本,或更换现代浏览器,如果你使用的是双核浏览器,请切换到极速/高速模式。 +

    +
    + + + \ No newline at end of file diff --git a/src/frontend/admin/jsconfig.json b/src/frontend/admin/jsconfig.json new file mode 100644 index 00000000..8f62680f --- /dev/null +++ b/src/frontend/admin/jsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "baseUrl": "./", + "moduleResolution": "node", + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + } +} \ No newline at end of file diff --git a/src/frontend/admin/package.json b/src/frontend/admin/package.json new file mode 100644 index 00000000..bbdf2775 --- /dev/null +++ b/src/frontend/admin/package.json @@ -0,0 +1,53 @@ +{ + "name": "scui", + "version": "1.6.6", + "private": true, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "prettier": "prettier --write ." + }, + "dependencies": { + "@element-plus/icons-vue": "^2.1.0", + "@tinymce/tinymce-vue": "^5.1.0", + "axios": "^1.4.0", + "codemirror": "^5.65.5", + "core-js": "^3.32.0", + "cropperjs": "^1.5.13", + "crypto-js": "^4.1.1", + "echarts": "^5.4.3", + "element-plus": "^2.3.8", + "json-bigint": "^1.0.0", + "json5-to-table": "^0.1.8", + "nprogress": "^0.2.0", + "pinyin-match": "^1.2.4", + "qrcodejs2": "^0.0.2", + "sortablejs": "^1.15.0", + "tinymce": "^6.6.0", + "vue": "^3.3.4", + "vue-i18n": "^9.2.2", + "vue-json-viewer": "^3.0.4", + "vue-router": "^4.2.4", + "vuedraggable": "^4.0.3", + "vuex": "^4.1.0", + "xgplayer": "^3.0.7", + "xgplayer-hls": "^3.0.7" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.2.3", + "@vue/eslint-config-prettier": "^8.0.0", + "eslint": "^8.46.0", + "eslint-plugin-vue": "^9.16.1", + "prettier": "^3.0.0", + "sass": "^1.64.2", + "terser": "^5.19.2", + "vite": "^4.4.7" + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead", + "not ie 11" + ] +} \ No newline at end of file diff --git a/src/frontend/admin/public/code/list/index.vue b/src/frontend/admin/public/code/list/index.vue new file mode 100644 index 00000000..842c1b0c --- /dev/null +++ b/src/frontend/admin/public/code/list/index.vue @@ -0,0 +1,185 @@ + + + + + + + \ No newline at end of file diff --git a/src/frontend/admin/public/code/list/save.vue b/src/frontend/admin/public/code/list/save.vue new file mode 100644 index 00000000..733122b5 --- /dev/null +++ b/src/frontend/admin/public/code/list/save.vue @@ -0,0 +1,87 @@ + + + + + + + \ No newline at end of file diff --git a/src/frontend/admin/public/config.js b/src/frontend/admin/public/config.js new file mode 100644 index 00000000..c7956d6c --- /dev/null +++ b/src/frontend/admin/public/config.js @@ -0,0 +1,9 @@ +// 此文件非必要,在生产环境下此文件配置可覆盖运行配置,开发环境下不起效 +// 详情见 src/config/index.js + +const APP_CONFIG = { + //标题 + //APP_NAME: "SCUI", + //接口地址,如遇跨域需使用nginx代理 + //API_URL: "https://www.fastmock.site/mock/5039c4361c39a7e3252c5b55971f1bd3/api" +} \ No newline at end of file diff --git a/src/frontend/admin/public/favicon.ico b/src/frontend/admin/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..23156d86854c1f13310dc40bffdbce46cecebb4c GIT binary patch literal 4286 zcmc&&U2IfE6rNI{*s2hNHBm_$HI&4MY6yv#pf&Nu_+fe`u!l!B$TKlGo<$M@~r>E31c-o4xSGtJq1ch1cD zzBzNwnb{hX!@uHUqfhhgdSeQWF`FsuGG!F?#~XD~8V(ub$zyz$Q(~0Ul$(?#3Iaqr zjnP=m(OlVx+sgtwpL5=#oTSW9g77l+Yp!g_mTU$#={(uQX9H!HlF5Ely==*52_?lB zu8+@BN*5)n-E7CnwlI=7c;Ce>JM4qxnNGs_3nT6aZH9+kz^D9^#d=l&N1g+I{|Gq$ z1*H<`ssMg^6{vp5@(Q*mEMYqQxA{I789%lbXn!A=8bnH4oCbQ20>?_pAtz`(!V;$N z3n_}xps~sQ@^|xgU~V)4y*LGoUk2vK6Md8YK+Bt9eh{Xxm7~*<@x`;c0O;Oh@%oO@ z=Vd_Mlfd^c0%!ICvo|e|nPH%{JcxrZU2RETV-#P+9t3`T8K_wYRFczj9Mb2t%zYVCe*!t{T4@9O{gHDX`09Im$mhYQnj5cZ9UzWzVhA-yim_ zIh{K!{@o?U>$~ajg&kbaW#h}$z)|LzV(GiB^!LNoj&zyuzj>DX&}TXH9-*z=`{#sX z*F6QCI{?hw0RFzic>4>u-T|Ea7-)JPsA3+5`6ZSQ4F78JhdHmBF%!nwud8{)=CPf9 z-{)QC-z}?erC(~fw}%*a;^J(`KMhX<6U0&Qo)7f_T4Lhnl9@Y{#U{QX$=Jv9fEW2zZy;}_|VqHy0ipD4eyKTTV#Zxjo`XOPw)?9}=r zd)i~=oZ25eU$qD7PvxK77x#($5@D>xPG5h&BKNB;7GHaKsv>c&I}Ft(#X%-c!FplG z(#{t~(+kY4GaiQp=3qT*AbqP^-uMj9z)#6*7h`M19E2Tw{yGlIsd)41&e(Z-wy3Tv z=X4fFtt|;(xbrvs{vi&Ho4EGcmO%y!;82|lC_|fj4;-P$salhqny{j*~b!+_c{nK{`E@8j! z#w)Rx%^YC}Yq{y&lmF%ShtCJ%A#U=IelumWuCTGPC7bbe^BLHrqx|Q;KmCL}4&w2z q|NdSw=9PJ4iYAO%H)u>=hcUUk`7Z;B`G=ab*FoEZ#1NJ+g?$f$;Y{cN literal 0 HcmV?d00001 diff --git a/src/frontend/admin/public/tinymce/langs/zh_CN.js b/src/frontend/admin/public/tinymce/langs/zh_CN.js new file mode 100644 index 00000000..0eee2a79 --- /dev/null +++ b/src/frontend/admin/public/tinymce/langs/zh_CN.js @@ -0,0 +1,426 @@ +tinymce.addI18n('zh_CN', { + Redo: '\u91cd\u505a', + Undo: '\u64a4\u9500', + Cut: '\u526a\u5207', + Copy: '\u590d\u5236', + Paste: '\u7c98\u8d34', + 'Select all': '\u5168\u9009', + 'New document': '\u65b0\u6587\u4ef6', + Ok: '\u786e\u5b9a', + Cancel: '\u53d6\u6d88', + 'Visual aids': '\u7f51\u683c\u7ebf', + Bold: '\u7c97\u4f53', + Italic: '\u659c\u4f53', + Underline: '\u4e0b\u5212\u7ebf', + Strikethrough: '\u5220\u9664\u7ebf', + Superscript: '\u4e0a\u6807', + Subscript: '\u4e0b\u6807', + 'Clear formatting': '\u6e05\u9664\u683c\u5f0f', + 'Align left': '\u5de6\u8fb9\u5bf9\u9f50', + 'Align center': '\u4e2d\u95f4\u5bf9\u9f50', + 'Align right': '\u53f3\u8fb9\u5bf9\u9f50', + Justify: '\u4e24\u7aef\u5bf9\u9f50', + 'Bullet list': '\u9879\u76ee\u7b26\u53f7', + 'Numbered list': '\u7f16\u53f7\u5217\u8868', + 'Decrease indent': '\u51cf\u5c11\u7f29\u8fdb', + 'Increase indent': '\u589e\u52a0\u7f29\u8fdb', + Close: '\u5173\u95ed', + Formats: '\u683c\u5f0f', + "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.": + '\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u6253\u5f00\u526a\u8d34\u677f\uff0c\u8bf7\u4f7f\u7528Ctrl+X/C/V\u7b49\u5feb\u6377\u952e\u3002', + Headers: '\u6807\u9898', + 'Header 1': '\u6807\u98981', + 'Header 2': '\u6807\u98982', + 'Header 3': '\u6807\u98983', + 'Header 4': '\u6807\u98984', + 'Header 5': '\u6807\u98985', + 'Header 6': '\u6807\u98986', + Headings: '\u6807\u9898', + 'Heading 1': '\u6807\u98981', + 'Heading 2': '\u6807\u98982', + 'Heading 3': '\u6807\u98983', + 'Heading 4': '\u6807\u98984', + 'Heading 5': '\u6807\u98985', + 'Heading 6': '\u6807\u98986', + Preformatted: '\u9884\u5148\u683c\u5f0f\u5316\u7684', + Div: 'Div', + Pre: 'Pre', + Code: '\u4ee3\u7801', + Paragraph: '\u6bb5\u843d', + Blockquote: '\u5f15\u6587\u533a\u5757', + Inline: '\u6587\u672c', + Blocks: '\u57fa\u5757', + 'Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.': + '\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002', + Fonts: '\u5b57\u4f53', + 'Font Sizes': '\u5b57\u53f7', + Class: '\u7c7b\u578b', + 'Browse for an image': '\u6d4f\u89c8\u56fe\u50cf', + OR: '\u6216', + 'Drop an image here': '\u62d6\u653e\u4e00\u5f20\u56fe\u50cf\u81f3\u6b64', + Upload: '\u4e0a\u4f20', + Block: '\u5757', + Align: '\u5bf9\u9f50', + Default: '\u9ed8\u8ba4', + Circle: '\u7a7a\u5fc3\u5706', + Disc: '\u5b9e\u5fc3\u5706', + Square: '\u65b9\u5757', + 'Lower Alpha': '\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd', + 'Lower Greek': '\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd', + 'Lower Roman': '\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd', + 'Upper Alpha': '\u5927\u5199\u82f1\u6587\u5b57\u6bcd', + 'Upper Roman': '\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd', + 'Anchor...': '\u951a\u70b9...', + Name: '\u540d\u79f0', + Id: '\u6807\u8bc6\u7b26', + 'Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.': + '\u6807\u8bc6\u7b26\u5e94\u8be5\u4ee5\u5b57\u6bcd\u5f00\u5934\uff0c\u540e\u8ddf\u5b57\u6bcd\u3001\u6570\u5b57\u3001\u7834\u6298\u53f7\u3001\u70b9\u3001\u5192\u53f7\u6216\u4e0b\u5212\u7ebf\u3002', + 'You have unsaved changes are you sure you want to navigate away?': + '\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f', + 'Restore last draft': '\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f', + 'Special character...': '\u7279\u6b8a\u5b57\u7b26...', + 'Source code': '\u6e90\u4ee3\u7801', + 'Insert/Edit code sample': '\u63d2\u5165/\u7f16\u8f91\u4ee3\u7801\u793a\u4f8b', + Language: '\u8bed\u8a00', + 'Code sample...': '\u793a\u4f8b\u4ee3\u7801...', + 'Color Picker': '\u9009\u8272\u5668', + R: 'R', + G: 'G', + B: 'B', + 'Left to right': '\u4ece\u5de6\u5230\u53f3', + 'Right to left': '\u4ece\u53f3\u5230\u5de6', + 'Emoticons...': '\u8868\u60c5\u7b26\u53f7...', + 'Metadata and Document Properties': '\u5143\u6570\u636e\u548c\u6587\u6863\u5c5e\u6027', + Title: '\u6807\u9898', + Keywords: '\u5173\u952e\u8bcd', + Description: '\u63cf\u8ff0', + Robots: '\u673a\u5668\u4eba', + Author: '\u4f5c\u8005', + Encoding: '\u7f16\u7801', + Fullscreen: '\u5168\u5c4f', + Action: '\u64cd\u4f5c', + Shortcut: '\u5feb\u6377\u952e', + Help: '\u5e2e\u52a9', + Address: '\u5730\u5740', + 'Focus to menubar': '\u79fb\u52a8\u7126\u70b9\u5230\u83dc\u5355\u680f', + 'Focus to toolbar': '\u79fb\u52a8\u7126\u70b9\u5230\u5de5\u5177\u680f', + 'Focus to element path': '\u79fb\u52a8\u7126\u70b9\u5230\u5143\u7d20\u8def\u5f84', + 'Focus to contextual toolbar': '\u79fb\u52a8\u7126\u70b9\u5230\u4e0a\u4e0b\u6587\u83dc\u5355', + 'Insert link (if link plugin activated)': '\u63d2\u5165\u94fe\u63a5 (\u5982\u679c\u94fe\u63a5\u63d2\u4ef6\u5df2\u6fc0\u6d3b)', + 'Save (if save plugin activated)': '\u4fdd\u5b58(\u5982\u679c\u4fdd\u5b58\u63d2\u4ef6\u5df2\u6fc0\u6d3b)', + 'Find (if searchreplace plugin activated)': '\u67e5\u627e(\u5982\u679c\u67e5\u627e\u66ff\u6362\u63d2\u4ef6\u5df2\u6fc0\u6d3b)', + 'Plugins installed ({0}):': '\u5df2\u5b89\u88c5\u63d2\u4ef6 ({0}):', + 'Premium plugins:': '\u4f18\u79c0\u63d2\u4ef6\uff1a', + 'Learn more...': '\u4e86\u89e3\u66f4\u591a...', + 'You are using {0}': '\u4f60\u6b63\u5728\u4f7f\u7528 {0}', + Plugins: '\u63d2\u4ef6', + 'Handy Shortcuts': '\u5feb\u6377\u952e', + 'Horizontal line': '\u6c34\u5e73\u5206\u5272\u7ebf', + 'Insert/edit image': '\u63d2\u5165/\u7f16\u8f91\u56fe\u7247', + 'Image description': '\u56fe\u7247\u63cf\u8ff0', + Source: '\u5730\u5740', + Dimensions: '\u5927\u5c0f', + 'Constrain proportions': '\u4fdd\u6301\u7eb5\u6a2a\u6bd4', + General: '\u666e\u901a', + Advanced: '\u9ad8\u7ea7', + Style: '\u6837\u5f0f', + 'Vertical space': '\u5782\u76f4\u8fb9\u8ddd', + 'Horizontal space': '\u6c34\u5e73\u8fb9\u8ddd', + Border: '\u8fb9\u6846', + 'Insert image': '\u63d2\u5165\u56fe\u7247', + 'Image...': '\u56fe\u7247...', + 'Image list': '\u56fe\u7247\u5217\u8868', + 'Rotate counterclockwise': '\u9006\u65f6\u9488\u65cb\u8f6c', + 'Rotate clockwise': '\u987a\u65f6\u9488\u65cb\u8f6c', + 'Flip vertically': '\u5782\u76f4\u7ffb\u8f6c', + 'Flip horizontally': '\u6c34\u5e73\u7ffb\u8f6c', + 'Edit image': '\u7f16\u8f91\u56fe\u7247', + 'Image options': '\u56fe\u7247\u9009\u9879', + 'Zoom in': '\u653e\u5927', + 'Zoom out': '\u7f29\u5c0f', + Crop: '\u88c1\u526a', + Resize: '\u8c03\u6574\u5927\u5c0f', + Orientation: '\u65b9\u5411', + Brightness: '\u4eae\u5ea6', + Sharpen: '\u9510\u5316', + Contrast: '\u5bf9\u6bd4\u5ea6', + 'Color levels': '\u989c\u8272\u5c42\u6b21', + Gamma: '\u4f3d\u9a6c\u503c', + Invert: '\u53cd\u8f6c', + Apply: '\u5e94\u7528', + Back: '\u540e\u9000', + 'Insert date/time': '\u63d2\u5165\u65e5\u671f/\u65f6\u95f4', + 'Date/time': '\u65e5\u671f/\u65f6\u95f4', + 'Insert/Edit Link': '\u63d2\u5165/\u7f16\u8f91\u94fe\u63a5', + 'Insert/edit link': '\u63d2\u5165/\u7f16\u8f91\u94fe\u63a5', + 'Text to display': '\u663e\u793a\u6587\u5b57', + Url: '\u5730\u5740', + 'Open link in...': '\u94fe\u63a5\u6253\u5f00\u4f4d\u7f6e...', + 'Current window': '\u5f53\u524d\u7a97\u53e3', + None: '\u65e0', + 'New window': '\u5728\u65b0\u7a97\u53e3\u6253\u5f00', + 'Remove link': '\u5220\u9664\u94fe\u63a5', + Anchors: '\u951a\u70b9', + 'Link...': '\u94fe\u63a5...', + 'Paste or type a link': '\u7c98\u8d34\u6216\u8f93\u5165\u94fe\u63a5', + 'The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?': + '\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u4e3a\u90ae\u4ef6\u5730\u5740\uff0c\u9700\u8981\u52a0\u4e0amailto:\u524d\u7f00\u5417\uff1f', + 'The URL you entered seems to be an external link. Do you want to add the required http:// prefix?': + '\u4f60\u6240\u586b\u5199\u7684URL\u5730\u5740\u5c5e\u4e8e\u5916\u90e8\u94fe\u63a5\uff0c\u9700\u8981\u52a0\u4e0ahttp://:\u524d\u7f00\u5417\uff1f', + 'Link list': '\u94fe\u63a5\u5217\u8868', + 'Insert video': '\u63d2\u5165\u89c6\u9891', + 'Insert/edit video': '\u63d2\u5165/\u7f16\u8f91\u89c6\u9891', + 'Insert/edit media': '\u63d2\u5165/\u7f16\u8f91\u5a92\u4f53', + 'Alternative source': '\u955c\u50cf', + 'Alternative source URL': '\u66ff\u4ee3\u6765\u6e90\u7f51\u5740', + 'Media poster (Image URL)': '\u5c01\u9762(\u56fe\u7247\u5730\u5740)', + 'Paste your embed code below:': '\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:', + Embed: '\u5185\u5d4c', + 'Media...': '\u591a\u5a92\u4f53...', + 'Nonbreaking space': '\u4e0d\u95f4\u65ad\u7a7a\u683c', + 'Page break': '\u5206\u9875\u7b26', + 'Paste as text': '\u7c98\u8d34\u4e3a\u6587\u672c', + Preview: '\u9884\u89c8', + 'Print...': '\u6253\u5370...', + Save: '\u4fdd\u5b58', + Find: '\u67e5\u627e', + 'Replace with': '\u66ff\u6362\u4e3a', + Replace: '\u66ff\u6362', + 'Replace all': '\u5168\u90e8\u66ff\u6362', + Previous: '\u4e0a\u4e00\u4e2a', + Next: '\u4e0b\u4e00\u4e2a', + 'Find and replace...': '\u67e5\u627e\u5e76\u66ff\u6362...', + 'Could not find the specified string.': '\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.', + 'Match case': '\u533a\u5206\u5927\u5c0f\u5199', + 'Find whole words only': '\u5168\u5b57\u5339\u914d', + 'Spell check': '\u62fc\u5199\u68c0\u67e5', + Ignore: '\u5ffd\u7565', + 'Ignore all': '\u5168\u90e8\u5ffd\u7565', + Finish: '\u5b8c\u6210', + 'Add to Dictionary': '\u6dfb\u52a0\u5230\u5b57\u5178', + 'Insert table': '\u63d2\u5165\u8868\u683c', + 'Table properties': '\u8868\u683c\u5c5e\u6027', + 'Delete table': '\u5220\u9664\u8868\u683c', + Cell: '\u5355\u5143\u683c', + Row: '\u884c', + Column: '\u5217', + 'Cell properties': '\u5355\u5143\u683c\u5c5e\u6027', + 'Merge cells': '\u5408\u5e76\u5355\u5143\u683c', + 'Split cell': '\u62c6\u5206\u5355\u5143\u683c', + 'Insert row before': '\u5728\u4e0a\u65b9\u63d2\u5165', + 'Insert row after': '\u5728\u4e0b\u65b9\u63d2\u5165', + 'Delete row': '\u5220\u9664\u884c', + 'Row properties': '\u884c\u5c5e\u6027', + 'Cut row': '\u526a\u5207\u884c', + 'Copy row': '\u590d\u5236\u884c', + 'Paste row before': '\u7c98\u8d34\u5230\u4e0a\u65b9', + 'Paste row after': '\u7c98\u8d34\u5230\u4e0b\u65b9', + 'Insert column before': '\u5728\u5de6\u4fa7\u63d2\u5165', + 'Insert column after': '\u5728\u53f3\u4fa7\u63d2\u5165', + 'Delete column': '\u5220\u9664\u5217', + Cols: '\u5217', + Rows: '\u884c', + Width: '\u5bbd', + Height: '\u9ad8', + 'Cell spacing': '\u5355\u5143\u683c\u5916\u95f4\u8ddd', + 'Cell padding': '\u5355\u5143\u683c\u5185\u8fb9\u8ddd', + 'Show caption': '\u663e\u793a\u6807\u9898', + Left: '\u5de6\u5bf9\u9f50', + Center: '\u5c45\u4e2d', + Right: '\u53f3\u5bf9\u9f50', + 'Cell type': '\u5355\u5143\u683c\u7c7b\u578b', + Scope: '\u8303\u56f4', + Alignment: '\u5bf9\u9f50\u65b9\u5f0f', + 'H Align': '\u6c34\u5e73\u5bf9\u9f50', + 'V Align': '\u5782\u76f4\u5bf9\u9f50', + Top: '\u9876\u90e8\u5bf9\u9f50', + Middle: '\u5782\u76f4\u5c45\u4e2d', + Bottom: '\u5e95\u90e8\u5bf9\u9f50', + 'Header cell': '\u8868\u5934\u5355\u5143\u683c', + 'Row group': '\u884c\u7ec4', + 'Column group': '\u5217\u7ec4', + 'Row type': '\u884c\u7c7b\u578b', + Header: '\u8868\u5934', + Body: '\u8868\u4f53', + Footer: '\u8868\u5c3e', + 'Border color': '\u8fb9\u6846\u989c\u8272', + 'Insert template...': '\u63d2\u5165\u6a21\u677f...', + Templates: '\u6a21\u677f', + Template: '\u6a21\u677f', + 'Text color': '\u6587\u5b57\u989c\u8272', + 'Background color': '\u80cc\u666f\u8272', + 'Custom...': '\u81ea\u5b9a\u4e49...', + 'Custom color': '\u81ea\u5b9a\u4e49\u989c\u8272', + 'No color': '\u65e0', + 'Remove color': '\u79fb\u9664\u989c\u8272', + 'Table of Contents': '\u5185\u5bb9\u5217\u8868', + 'Show blocks': '\u663e\u793a\u533a\u5757\u8fb9\u6846', + 'Show invisible characters': '\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26', + 'Word count': '\u5b57\u6570', + Count: '\u8ba1\u6570', + Document: '\u6587\u6863', + Selection: '\u9009\u62e9', + Words: '\u5355\u8bcd', + 'Words: {0}': '\u5b57\u6570\uff1a{0}', + '{0} words': '{0} \u5b57', + File: '\u6587\u4ef6', + Edit: '\u7f16\u8f91', + Insert: '\u63d2\u5165', + View: '\u89c6\u56fe', + Format: '\u683c\u5f0f', + Table: '\u8868\u683c', + Tools: '\u5de5\u5177', + 'Powered by {0}': '\u7531{0}\u9a71\u52a8', + 'Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help': + '\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9', + 'Image title': '\u56fe\u7247\u6807\u9898', + 'Border width': '\u8fb9\u6846\u5bbd\u5ea6', + 'Border style': '\u8fb9\u6846\u6837\u5f0f', + Error: '\u9519\u8bef', + Warn: '\u8b66\u544a', + Valid: '\u6709\u6548', + 'To open the popup, press Shift+Enter': '\u6309Shitf+Enter\u952e\u6253\u5f00\u5bf9\u8bdd\u6846', + 'Rich Text Area. Press ALT-0 for help.': '\u7f16\u8f91\u533a\u3002\u6309Alt+0\u952e\u6253\u5f00\u5e2e\u52a9\u3002', + 'System Font': '\u7cfb\u7edf\u5b57\u4f53', + 'Failed to upload image: {0}': '\u56fe\u7247\u4e0a\u4f20\u5931\u8d25: {0}', + 'Failed to load plugin: {0} from url {1}': '\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25: {0} \u6765\u81ea\u94fe\u63a5 {1}', + 'Failed to load plugin url: {0}': '\u63d2\u4ef6\u52a0\u8f7d\u5931\u8d25 \u94fe\u63a5: {0}', + 'Failed to initialize plugin: {0}': '\u63d2\u4ef6\u521d\u59cb\u5316\u5931\u8d25: {0}', + example: '\u793a\u4f8b', + Search: '\u641c\u7d22', + All: '\u5168\u90e8', + Currency: '\u8d27\u5e01', + Text: '\u6587\u5b57', + Quotations: '\u5f15\u7528', + Mathematical: '\u6570\u5b66', + 'Extended Latin': '\u62c9\u4e01\u8bed\u6269\u5145', + Symbols: '\u7b26\u53f7', + Arrows: '\u7bad\u5934', + 'User Defined': '\u81ea\u5b9a\u4e49', + 'dollar sign': '\u7f8e\u5143\u7b26\u53f7', + 'currency sign': '\u8d27\u5e01\u7b26\u53f7', + 'euro-currency sign': '\u6b27\u5143\u7b26\u53f7', + 'colon sign': '\u5192\u53f7', + 'cruzeiro sign': '\u514b\u9c81\u8d5b\u7f57\u5e01\u7b26\u53f7', + 'french franc sign': '\u6cd5\u90ce\u7b26\u53f7', + 'lira sign': '\u91cc\u62c9\u7b26\u53f7', + 'mill sign': '\u5bc6\u5c14\u7b26\u53f7', + 'naira sign': '\u5948\u62c9\u7b26\u53f7', + 'peseta sign': '\u6bd4\u585e\u5854\u7b26\u53f7', + 'rupee sign': '\u5362\u6bd4\u7b26\u53f7', + 'won sign': '\u97e9\u5143\u7b26\u53f7', + 'new sheqel sign': '\u65b0\u8c22\u514b\u5c14\u7b26\u53f7', + 'dong sign': '\u8d8a\u5357\u76fe\u7b26\u53f7', + 'kip sign': '\u8001\u631d\u57fa\u666e\u7b26\u53f7', + 'tugrik sign': '\u56fe\u683c\u91cc\u514b\u7b26\u53f7', + 'drachma sign': '\u5fb7\u62c9\u514b\u9a6c\u7b26\u53f7', + 'german penny symbol': '\u5fb7\u56fd\u4fbf\u58eb\u7b26\u53f7', + 'peso sign': '\u6bd4\u7d22\u7b26\u53f7', + 'guarani sign': '\u74dc\u62c9\u5c3c\u7b26\u53f7', + 'austral sign': '\u6fb3\u5143\u7b26\u53f7', + 'hryvnia sign': '\u683c\u91cc\u592b\u5c3c\u4e9a\u7b26\u53f7', + 'cedi sign': '\u585e\u5730\u7b26\u53f7', + 'livre tournois sign': '\u91cc\u5f17\u5f17\u5c14\u7b26\u53f7', + 'spesmilo sign': 'spesmilo\u7b26\u53f7', + 'tenge sign': '\u575a\u6208\u7b26\u53f7', + 'indian rupee sign': '\u5370\u5ea6\u5362\u6bd4', + 'turkish lira sign': '\u571f\u8033\u5176\u91cc\u62c9', + 'nordic mark sign': '\u5317\u6b27\u9a6c\u514b', + 'manat sign': '\u9a6c\u7eb3\u7279\u7b26\u53f7', + 'ruble sign': '\u5362\u5e03\u7b26\u53f7', + 'yen character': '\u65e5\u5143\u5b57\u6837', + 'yuan character': '\u4eba\u6c11\u5e01\u5143\u5b57\u6837', + 'yuan character, in hong kong and taiwan': '\u5143\u5b57\u6837\uff08\u6e2f\u53f0\u5730\u533a\uff09', + 'yen/yuan character variant one': '\u5143\u5b57\u6837\uff08\u5927\u5199\uff09', + 'Loading emoticons...': '\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7...', + 'Could not load emoticons': '\u4e0d\u80fd\u52a0\u8f7d\u8868\u60c5\u7b26\u53f7', + People: '\u4eba\u7c7b', + 'Animals and Nature': '\u52a8\u7269\u548c\u81ea\u7136', + 'Food and Drink': '\u98df\u7269\u548c\u996e\u54c1', + Activity: '\u6d3b\u52a8', + 'Travel and Places': '\u65c5\u6e38\u548c\u5730\u70b9', + Objects: '\u7269\u4ef6', + Flags: '\u65d7\u5e1c', + Characters: '\u5b57\u7b26', + 'Characters (no spaces)': '\u5b57\u7b26(\u65e0\u7a7a\u683c)', + '{0} characters': '{0} \u4e2a\u5b57\u7b26', + 'Error: Form submit field collision.': '\u9519\u8bef: \u8868\u5355\u63d0\u4ea4\u5b57\u6bb5\u51b2\u7a81\u3002', + 'Error: No form element found.': '\u9519\u8bef: \u6ca1\u6709\u8868\u5355\u63a7\u4ef6\u3002', + Update: '\u66f4\u65b0', + 'Color swatch': '\u989c\u8272\u6837\u672c', + Turquoise: '\u9752\u7eff\u8272', + Green: '\u7eff\u8272', + Blue: '\u84dd\u8272', + Purple: '\u7d2b\u8272', + 'Navy Blue': '\u6d77\u519b\u84dd', + 'Dark Turquoise': '\u6df1\u84dd\u7eff\u8272', + 'Dark Green': '\u6df1\u7eff\u8272', + 'Medium Blue': '\u4e2d\u84dd\u8272', + 'Medium Purple': '\u4e2d\u7d2b\u8272', + 'Midnight Blue': '\u6df1\u84dd\u8272', + Yellow: '\u9ec4\u8272', + Orange: '\u6a59\u8272', + Red: '\u7ea2\u8272', + 'Light Gray': '\u6d45\u7070\u8272', + Gray: '\u7070\u8272', + 'Dark Yellow': '\u6697\u9ec4\u8272', + 'Dark Orange': '\u6df1\u6a59\u8272', + 'Dark Red': '\u6df1\u7ea2\u8272', + 'Medium Gray': '\u4e2d\u7070\u8272', + 'Dark Gray': '\u6df1\u7070\u8272', + 'Light Green': '\u6d45\u7eff\u8272', + 'Light Yellow': '\u6d45\u9ec4\u8272', + 'Light Red': '\u6d45\u7ea2\u8272', + 'Light Purple': '\u6d45\u7d2b\u8272', + 'Light Blue': '\u6d45\u84dd\u8272', + 'Dark Purple': '\u6df1\u7d2b\u8272', + 'Dark Blue': '\u6df1\u84dd\u8272', + Black: '\u9ed1\u8272', + White: '\u767d\u8272', + 'Switch to or from fullscreen mode': '\u5207\u6362\u5168\u5c4f\u6a21\u5f0f', + 'Open help dialog': '\u6253\u5f00\u5e2e\u52a9\u5bf9\u8bdd\u6846', + history: '\u5386\u53f2', + styles: '\u6837\u5f0f', + formatting: '\u683c\u5f0f\u5316', + alignment: '\u5bf9\u9f50', + indentation: '\u7f29\u8fdb', + 'permanent pen': '\u8bb0\u53f7\u7b14', + comments: '\u5907\u6ce8', + 'Format Painter': '\u683c\u5f0f\u5237', + 'Insert/edit iframe': '\u63d2\u5165/\u7f16\u8f91\u6846\u67b6', + Capitalization: '\u5927\u5199', + lowercase: '\u5c0f\u5199', + UPPERCASE: '\u5927\u5199', + 'Title Case': '\u9996\u5b57\u6bcd\u5927\u5199', + 'Permanent Pen Properties': '\u6c38\u4e45\u7b14\u5c5e\u6027', + 'Permanent pen properties...': '\u6c38\u4e45\u7b14\u5c5e\u6027...', + Font: '\u5b57\u4f53', + Size: '\u5b57\u53f7', + 'More...': '\u66f4\u591a...', + 'Spellcheck Language': '\u62fc\u5199\u68c0\u67e5\u8bed\u8a00', + 'Select...': '\u9009\u62e9...', + Preferences: '\u9996\u9009\u9879', + Yes: '\u662f', + No: '\u5426', + 'Keyboard Navigation': '\u952e\u76d8\u6307\u5f15', + Version: '\u7248\u672c', + Anchor: '\u951a\u70b9', + 'Special character': '\u7279\u6b8a\u7b26\u53f7', + 'Code sample': '\u4ee3\u7801\u793a\u4f8b', + Color: '\u989c\u8272', + Emoticons: '\u8868\u60c5', + 'Document properties': '\u6587\u6863\u5c5e\u6027', + Image: '\u56fe\u7247', + 'Insert link': '\u63d2\u5165\u94fe\u63a5', + Target: '\u6253\u5f00\u65b9\u5f0f', + Link: '\u94fe\u63a5', + Poster: '\u5c01\u9762', + Media: '\u5a92\u4f53', + Print: '\u6253\u5370', + Prev: '\u4e0a\u4e00\u4e2a', + 'Find and replace': '\u67e5\u627e\u548c\u66ff\u6362', + 'Whole words': '\u5168\u5b57\u5339\u914d', + Spellcheck: '\u62fc\u5199\u68c0\u67e5', + Caption: '\u6807\u9898', + 'Insert template': '\u63d2\u5165\u6a21\u677f', +}) \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/dark/content.css b/src/frontend/admin/public/tinymce/skins/content/dark/content.css new file mode 100644 index 00000000..507ae6f4 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/dark/content.css @@ -0,0 +1,79 @@ +body { + background-color: #222f3e; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} + +a { + color: #4099ff; +} + +table { + border-collapse: collapse; +} + +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-width']) th, +table[border]:not([border='0']):not([style*='border-width']) td { + border-width: 1px; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-style']) th, +table[border]:not([border='0']):not([style*='border-style']) td { + border-style: solid; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-color']) th, +table[border]:not([border='0']):not([style*='border-color']) td { + border-color: #6d737b; +} + +figure { + display: table; + margin: 1rem auto; +} + +figure figcaption { + color: #8a8f97; + display: block; + margin-top: 0.25rem; + text-align: center; +} + +hr { + border-color: #6d737b; + border-style: solid; + border-width: 1px 0 0 0; +} + +code { + background-color: #6d737b; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} + +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #6d737b; + margin-left: 1.5rem; + padding-left: 1rem; +} + +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #6d737b; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/dark/content.min.css b/src/frontend/admin/public/tinymce/skins/content/dark/content.min.css new file mode 100644 index 00000000..89239689 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/dark/content.min.css @@ -0,0 +1,60 @@ +body { + background-color: #222f3e; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} +a { + color: #4099ff; +} +table { + border-collapse: collapse; +} +table:not([cellpadding]) td, +table:not([cellpadding]) th { + padding: 0.4rem; +} +table[border]:not([border='0']):not([style*='border-width']) td, +table[border]:not([border='0']):not([style*='border-width']) th { + border-width: 1px; +} +table[border]:not([border='0']):not([style*='border-style']) td, +table[border]:not([border='0']):not([style*='border-style']) th { + border-style: solid; +} +table[border]:not([border='0']):not([style*='border-color']) td, +table[border]:not([border='0']):not([style*='border-color']) th { + border-color: #6d737b; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #8a8f97; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #6d737b; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #6d737b; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #6d737b; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #6d737b; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/default/content.css b/src/frontend/admin/public/tinymce/skins/content/default/content.css new file mode 100644 index 00000000..7fe5ff9b --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/default/content.css @@ -0,0 +1,73 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} + +table { + border-collapse: collapse; +} + +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-width']) th, +table[border]:not([border='0']):not([style*='border-width']) td { + border-width: 1px; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-style']) th, +table[border]:not([border='0']):not([style*='border-style']) td { + border-style: solid; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-color']) th, +table[border]:not([border='0']):not([style*='border-color']) td { + border-color: #ccc; +} + +figure { + display: table; + margin: 1rem auto; +} + +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} + +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} + +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} + +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} + +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/default/content.min.css b/src/frontend/admin/public/tinymce/skins/content/default/content.min.css new file mode 100644 index 00000000..cca44e14 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/default/content.min.css @@ -0,0 +1,55 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} +table { + border-collapse: collapse; +} +table:not([cellpadding]) td, +table:not([cellpadding]) th { + padding: 0.4rem; +} +table[border]:not([border='0']):not([style*='border-width']) td, +table[border]:not([border='0']):not([style*='border-width']) th { + border-width: 1px; +} +table[border]:not([border='0']):not([style*='border-style']) td, +table[border]:not([border='0']):not([style*='border-style']) th { + border-style: solid; +} +table[border]:not([border='0']):not([style*='border-color']) td, +table[border]:not([border='0']):not([style*='border-color']) th { + border-color: #ccc; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/document/content.css b/src/frontend/admin/public/tinymce/skins/content/document/content.css new file mode 100644 index 00000000..3d08c023 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/document/content.css @@ -0,0 +1,78 @@ +@media screen { + html { + background: #f4f4f4; + min-height: 100%; + } +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; +} + +@media screen { + body { + background-color: #fff; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); + box-sizing: border-box; + margin: 1rem auto 0; + max-width: 820px; + min-height: calc(100vh - 1rem); + padding: 4rem 6rem 6rem 6rem; + } +} + +table { + border-collapse: collapse; +} + +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-width']) th, +table[border]:not([border='0']):not([style*='border-width']) td { + border-width: 1px; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-style']) th, +table[border]:not([border='0']):not([style*='border-style']) td { + border-style: solid; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-color']) th, +table[border]:not([border='0']):not([style*='border-color']) td { + border-color: #ccc; +} + +figure figcaption { + color: #999; + margin-top: 0.25rem; + text-align: center; +} + +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} + +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} + +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/document/content.min.css b/src/frontend/admin/public/tinymce/skins/content/document/content.min.css new file mode 100644 index 00000000..834df86c --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/document/content.min.css @@ -0,0 +1,60 @@ +@media screen { + html { + background: #f4f4f4; + min-height: 100%; + } +} +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; +} +@media screen { + body { + background-color: #fff; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.15); + box-sizing: border-box; + margin: 1rem auto 0; + max-width: 820px; + min-height: calc(100vh - 1rem); + padding: 4rem 6rem 6rem 6rem; + } +} +table { + border-collapse: collapse; +} +table:not([cellpadding]) td, +table:not([cellpadding]) th { + padding: 0.4rem; +} +table[border]:not([border='0']):not([style*='border-width']) td, +table[border]:not([border='0']):not([style*='border-width']) th { + border-width: 1px; +} +table[border]:not([border='0']):not([style*='border-style']) td, +table[border]:not([border='0']):not([style*='border-style']) th { + border-style: solid; +} +table[border]:not([border='0']):not([style*='border-color']) td, +table[border]:not([border='0']):not([style*='border-color']) th { + border-color: #ccc; +} +figure figcaption { + color: #999; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.css b/src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.css new file mode 100644 index 00000000..2dd6d917 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.css @@ -0,0 +1,79 @@ +body { + background-color: #2f3742; + color: #dfe0e4; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} + +a { + color: #4099ff; +} + +table { + border-collapse: collapse; +} + +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-width']) th, +table[border]:not([border='0']):not([style*='border-width']) td { + border-width: 1px; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-style']) th, +table[border]:not([border='0']):not([style*='border-style']) td { + border-style: solid; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-color']) th, +table[border]:not([border='0']):not([style*='border-color']) td { + border-color: #6d737b; +} + +figure { + display: table; + margin: 1rem auto; +} + +figure figcaption { + color: #8a8f97; + display: block; + margin-top: 0.25rem; + text-align: center; +} + +hr { + border-color: #6d737b; + border-style: solid; + border-width: 1px 0 0 0; +} + +code { + background-color: #6d737b; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} + +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #6d737b; + margin-left: 1.5rem; + padding-left: 1rem; +} + +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #6d737b; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.min.css b/src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.min.css new file mode 100644 index 00000000..3c689eb7 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/tinymce-5-dark/content.min.css @@ -0,0 +1,60 @@ +body { + background-color: #2f3742; + color: #dfe0e4; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} +a { + color: #4099ff; +} +table { + border-collapse: collapse; +} +table:not([cellpadding]) td, +table:not([cellpadding]) th { + padding: 0.4rem; +} +table[border]:not([border='0']):not([style*='border-width']) td, +table[border]:not([border='0']):not([style*='border-width']) th { + border-width: 1px; +} +table[border]:not([border='0']):not([style*='border-style']) td, +table[border]:not([border='0']):not([style*='border-style']) th { + border-style: solid; +} +table[border]:not([border='0']):not([style*='border-color']) td, +table[border]:not([border='0']):not([style*='border-color']) th { + border-color: #6d737b; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #8a8f97; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #6d737b; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #6d737b; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #6d737b; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #6d737b; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.css b/src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.css new file mode 100644 index 00000000..5176f8b2 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.css @@ -0,0 +1,73 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} + +table { + border-collapse: collapse; +} + +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-width']) th, +table[border]:not([border='0']):not([style*='border-width']) td { + border-width: 1px; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-style']) th, +table[border]:not([border='0']):not([style*='border-style']) td { + border-style: solid; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-color']) th, +table[border]:not([border='0']):not([style*='border-color']) td { + border-color: #ccc; +} + +figure { + display: table; + margin: 1rem auto; +} + +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} + +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} + +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} + +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} + +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.min.css b/src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.min.css new file mode 100644 index 00000000..cca44e14 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/tinymce-5/content.min.css @@ -0,0 +1,55 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem; +} +table { + border-collapse: collapse; +} +table:not([cellpadding]) td, +table:not([cellpadding]) th { + padding: 0.4rem; +} +table[border]:not([border='0']):not([style*='border-width']) td, +table[border]:not([border='0']):not([style*='border-width']) th { + border-width: 1px; +} +table[border]:not([border='0']):not([style*='border-style']) td, +table[border]:not([border='0']):not([style*='border-style']) th { + border-style: solid; +} +table[border]:not([border='0']):not([style*='border-color']) td, +table[border]:not([border='0']):not([style*='border-color']) th { + border-color: #ccc; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/writer/content.css b/src/frontend/admin/public/tinymce/skins/content/writer/content.css new file mode 100644 index 00000000..59ca49f6 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/writer/content.css @@ -0,0 +1,74 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem auto; + max-width: 900px; +} + +table { + border-collapse: collapse; +} + +/* Apply a default padding if legacy cellpadding attribute is missing */ +table:not([cellpadding]) th, +table:not([cellpadding]) td { + padding: 0.4rem; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-width']) th, +table[border]:not([border='0']):not([style*='border-width']) td { + border-width: 1px; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-style']) th, +table[border]:not([border='0']):not([style*='border-style']) td { + border-style: solid; +} + +/* Set default table styles if a table has a positive border attribute + and no inline css */ +table[border]:not([border='0']):not([style*='border-color']) th, +table[border]:not([border='0']):not([style*='border-color']) td { + border-color: #ccc; +} + +figure { + display: table; + margin: 1rem auto; +} + +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} + +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} + +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} + +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} + +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/content/writer/content.min.css b/src/frontend/admin/public/tinymce/skins/content/writer/content.min.css new file mode 100644 index 00000000..7dfe636b --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/content/writer/content.min.css @@ -0,0 +1,56 @@ +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', + 'Helvetica Neue', sans-serif; + line-height: 1.4; + margin: 1rem auto; + max-width: 900px; +} +table { + border-collapse: collapse; +} +table:not([cellpadding]) td, +table:not([cellpadding]) th { + padding: 0.4rem; +} +table[border]:not([border='0']):not([style*='border-width']) td, +table[border]:not([border='0']):not([style*='border-width']) th { + border-width: 1px; +} +table[border]:not([border='0']):not([style*='border-style']) td, +table[border]:not([border='0']):not([style*='border-style']) th { + border-style: solid; +} +table[border]:not([border='0']):not([style*='border-color']) td, +table[border]:not([border='0']):not([style*='border-color']) th { + border-color: #ccc; +} +figure { + display: table; + margin: 1rem auto; +} +figure figcaption { + color: #999; + display: block; + margin-top: 0.25rem; + text-align: center; +} +hr { + border-color: #ccc; + border-style: solid; + border-width: 1px 0 0 0; +} +code { + background-color: #e8e8e8; + border-radius: 3px; + padding: 0.1rem 0.2rem; +} +.mce-content-body:not([dir='rtl']) blockquote { + border-left: 2px solid #ccc; + margin-left: 1.5rem; + padding-left: 1rem; +} +.mce-content-body[dir='rtl'] blockquote { + border-right: 2px solid #ccc; + margin-right: 1.5rem; + padding-right: 1rem; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.css new file mode 100644 index 00000000..ca33c5dc --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.css @@ -0,0 +1,848 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * Dracula Theme originally by Zeno Rocha [@zenorocha] + * https://draculatheme.com/ + * + * Ported for PrismJS by Albert Vallverdu [@byverdu] + */ +code[class*='language-'], +pre[class*='language-'] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #282a36; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #6272a4; +} + +.token.punctuation { + color: #f8f8f2; +} + +.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #ff79c6; +} + +.token.boolean, +.token.number { + color: #bd93f9; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #50fa7b; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #f8f8f2; +} + +.token.atrule, +.token.attr-value, +.token.function, +.token.class-name { + color: #f1fa8c; +} + +.token.keyword { + color: #8be9fd; +} + +.token.regex, +.token.important { + color: #ffb86c; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #4099ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #4099ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #4099ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #4099ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #4099ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #4099ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #4099ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid transparent; + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: lighten; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #4099ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} + +body { + font-family: sans-serif; +} + +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.css new file mode 100644 index 00000000..e7acef31 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.css @@ -0,0 +1,861 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*='language-'], +pre[class*='language-'] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.min.css new file mode 100644 index 00000000..882dfd5b --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.inline.min.css @@ -0,0 +1,720 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: 0 0; + text-shadow: 0 1px #fff; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +code[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +pre[class*='language-']::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +code[class*='language-'] ::selection, +code[class*='language-']::selection, +pre[class*='language-'] ::selection, +pre[class*='language-']::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #708090; +} +.token.punctuation { + color: #999; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.constant, +.token.deleted, +.token.number, +.token.property, +.token.symbol, +.token.tag { + color: #905; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #690; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.class-name, +.token.function { + color: #dd4a68; +} +.token.important, +.token.regex, +.token.variable { + color: #e90; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.min.css new file mode 100644 index 00000000..04195ea7 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/content.min.css @@ -0,0 +1,707 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #f8f8f2; + background: 0 0; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-radius: 0.3em; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #282a36; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #6272a4; +} +.token.punctuation { + color: #f8f8f2; +} +.namespace { + opacity: 0.7; +} +.token.constant, +.token.deleted, +.token.property, +.token.symbol, +.token.tag { + color: #ff79c6; +} +.token.boolean, +.token.number { + color: #bd93f9; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #50fa7b; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url, +.token.variable { + color: #f8f8f2; +} +.token.atrule, +.token.attr-value, +.token.class-name, +.token.function { + color: #f1fa8c; +} +.token.keyword { + color: #8be9fd; +} +.token.important, +.token.regex { + color: #ffb86c; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #4099ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #4099ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #4099ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #4099ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #4099ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #4099ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #4099ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid transparent; + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: lighten; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #4099ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.css new file mode 100644 index 00000000..2726e0fc --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.css @@ -0,0 +1,3664 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} + +.tox *:not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} + +.tox *:not(svg):not(rect) { + /* stylelint-disable-line no-duplicate-selectors */ + background: transparent; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} + +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} + +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} + +.tox-tinymce { + border: 2px solid #161f29; + border-radius: 10px; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} + +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #222f3e; + border: 2px solid #161f29; + border-radius: 10px; + box-shadow: none; + overflow: hidden; +} + +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} + +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} + +button::-moz-focus-inner { + border: 0; +} + +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} + +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #161f29; + border-radius: 6px; + display: flex; + justify-content: space-between; +} + +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} + +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #161f29; + border-style: solid; +} + +.tox .accessibility-issue__repair { + margin-top: 16px; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(0, 108, 231, 0.5); + border-color: rgba(0, 108, 231, 0.4); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: rgba(0, 108, 231, 0.4); +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.5); + border-color: rgba(255, 165, 0, 0.8); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.8); +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.5); + border-color: rgba(204, 0, 0, 0.8); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.8); +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.5); + border-color: rgba(120, 171, 70, 0.8); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.8); +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 4px; +} + +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-button { + background-color: #006ce7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #006ce7; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-button[disabled] { + background-color: #006ce7; + background-image: none; + border-color: #006ce7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-button:focus:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:hover:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:active:not(:disabled) { + background-color: #0054b4; + background-image: none; + border-color: #0054b4; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary { + background-color: #3d546f; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #3d546f; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} + +.tox .tox-button--secondary[disabled] { + background-color: #3d546f; + background-image: none; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} + +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #2b3b4e; + background-image: none; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} + +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} + +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.tox .tox-button-link--sm { + font-size: 14px; +} + +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #fff; +} + +.tox .tox-button--naked[disabled] { + background-color: rgba(255, 255, 255, 0.2); + border-color: transparent; + box-shadow: unset; + color: rgba(255, 255, 255, 0.5); +} + +.tox .tox-button--naked:hover:not(:disabled) { + background-color: rgba(255, 255, 255, 0.2); + border-color: transparent; + box-shadow: unset; + color: #fff; +} + +.tox .tox-button--naked:focus:not(:disabled) { + background-color: rgba(255, 255, 255, 0.2); + border-color: transparent; + box-shadow: unset; + color: #fff; +} + +.tox .tox-button--naked:active:not(:disabled) { + background-color: rgba(255, 255, 255, 0.3); + border-color: transparent; + box-shadow: unset; + color: #fff; +} + +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} + +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #fff; +} + +.tox .tox-checkbox { + align-items: center; + border-radius: 6px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} + +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} + +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 6px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(255, 255, 255, 0.2); +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #006ce7; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #006ce7; +} + +.tox .tox-checkbox--disabled { + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} + +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 6px; + box-shadow: inset 0 0 0 1px #006ce7; + padding: calc(4px - 1px); +} + +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} + +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} + +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} + +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} + +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} + +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: rgba(255, 255, 255, 0.15); + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} + +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} + +.tox .tox-collection__group-heading { + background-color: rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.5); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #fff; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} + +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #2b3b4e; + color: #fff; +} + +.tox .tox-collection--list .tox-collection__item--active { + background-color: #3389ec; +} + +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #599fef; + color: #fff; +} + +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #3389ec; +} + +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #599fef; + color: #fff; +} + +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #3389ec; + color: #fff; +} + +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} + +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} + +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} + +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} + +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} + +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} + +.tox .tox-collection__item-accessory { + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} + +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} + +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} + +.tox .tox-collection__item-caret svg { + fill: #fff; +} + +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-checkmark +svg { + display: none; +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-accessory ++ .tox-collection__item-checkmark { + display: none; +} + +.tox .tox-collection--horizontal { + background-color: #2b3b4e; + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} + +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item { + height: 28px; + margin: 6px 1px 5px 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} + +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} + +.tox .tox-collection__item-container { + display: flex; +} + +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} + +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} + +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid transparent; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} + +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid transparent; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} + +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} + +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} + +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} + +.tox .tox-sv-palette-spectrum { + height: 100%; +} + +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} + +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} + +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} + +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} + +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + #f00, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + #f00 + ); + height: 100%; + width: 100%; +} + +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} + +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} + +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} + +.tox .tox-rgb-form input { + width: 6em; +} + +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} + +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} + +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} + +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} + +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} + +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} + +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 5px 0 6px 11px; +} + +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px -4px; +} + +.tox .tox-swatches__row { + display: flex; +} + +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} + +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} + +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} + +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} + +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} + +.tox .tox-swatches__picker-btn svg { + fill: #fff; + height: 24px; + width: 24px; +} + +.tox .tox-swatches__picker-btn:hover { + background: #3389ec; +} + +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} + +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} + +.tox .tox-comment-thread { + background: #2b3b4e; + position: relative; +} + +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} + +.tox .tox-comment { + background: #2b3b4e; + border: 1px solid #161f29; + border-radius: 6px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} + +.tox .tox-comment__header { + align-items: center; + color: #fff; + display: flex; + justify-content: space-between; +} + +.tox .tox-comment__date { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; +} + +.tox .tox-comment__body { + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} + +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} + +.tox .tox-comment__expander { + padding-top: 8px; +} + +.tox .tox-comment__expander p { + color: rgba(255, 255, 255, 0.5); + font-size: 14px; + font-style: normal; +} + +.tox .tox-comment__body p { + margin: 0; +} + +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} + +.tox .tox-comment-thread__overlay::after { + background: #2b3b4e; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} + +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} + +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} + +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} + +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} + +.tox .tox-comment__overlay { + background: #2b3b4e; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} + +.tox .tox-comment__loading-text { + align-items: center; + color: #fff; + display: flex; + flex-direction: column; + position: relative; +} + +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} + +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} + +.tox .tox-comment__overlaytext p { + background-color: #2b3b4e; + box-shadow: 0 0 8px 8px #2b3b4e; + color: #fff; + text-align: center; +} + +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} + +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #2b3b4e; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} + +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} + +.tox .tox-conversations { + margin: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir='rtl']) .tox-comment__edit > *:last-child, +.tox:not([dir='rtl']) .tox-comment__reply > *:last-child { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-comment__buttonspacing > *:last-child, +.tox[dir='rtl'] .tox-comment__edit > *:last-child, +.tox[dir='rtl'] .tox-comment__reply > *:last-child { + margin-right: 8px; +} + +.tox .tox-user { + align-items: center; + display: flex; +} + +.tox .tox-user__avatar svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-user__name { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} + +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} + +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} + +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} + +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} + +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #222f3e; +} + +.tox .tox-dialog { + background-color: #2b3b4e; + border-color: #161f29; + border-radius: 10px; + border-style: solid; + border-width: 0px; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} + +.tox .tox-dialog-inline { + z-index: 1100; +} + +.tox .tox-dialog__header { + align-items: center; + background-color: #2b3b4e; + border-bottom: none; + color: #fff; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} + +.tox .tox-dialog__header .tox-button { + z-index: 1; +} + +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} + +.tox .tox-dialog__dismiss { + margin-left: auto; +} + +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} + +.tox .tox-dialog__body { + color: #fff; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} + +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} + +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} + +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(0, 108, 231, 0.1); +} + +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #006ce7; + color: #006ce7; +} + +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} + +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} + +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog__body-content a { + color: #006ce7; + cursor: pointer; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #0054b4; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:active { + color: #0054b4; + text-decoration: none; +} + +.tox .tox-dialog__body-content svg { + fill: #fff; +} + +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} + +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #fff; + font-size: 20px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #fff; + font-size: 16px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} + +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} + +.tox .tox-dialog--width-md { + max-width: 800px; +} + +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} + +.tox .tox-dialog__body-content--centered { + text-align: center; +} + +.tox .tox-dialog__footer { + align-items: center; + background-color: #2b3b4e; + border-top: none; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} + +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} + +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} + +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} + +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} + +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #161f29; +} + +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} + +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} + +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} + +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} + +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} + +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} + +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 8px; +} + +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} + +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #161f29; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} + +.tox .tox-dropzone p { + color: rgba(255, 255, 255, 0.5); + margin: 0 0 16px 0; +} + +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} + +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} + +.tox.tox-inline-edit-area { + border: 1px dotted #161f29; +} + +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} + +.tox .tox-editor-header { + z-index: 1; +} + +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #222f3e; + border-bottom: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: none; + padding: 4px 0; + transition: box-shadow 0.5s; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: none; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #222f3e; + box-shadow: none; + padding: 4px 0; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: none; +} + +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} + +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} + +.tox .tox-control-wrap { + flex: 1; + position: relative; +} + +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} + +.tox .tox-control-wrap svg { + display: block; +} + +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} + +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} + +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} + +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} + +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} + +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} + +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} + +.tox .tox-autocompleter { + max-width: 25em; +} + +.tox .tox-autocompleter .tox-menu { + border-color: #161f29; + box-shadow: none; + max-width: 25em; +} + +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: bold; +} + +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} + +.tox .tox-color-input .tox-textfield { + z-index: -1; +} + +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} + +.tox .tox-color-input span:hover:not([aria-disabled='true']), +.tox .tox-color-input span:focus:not([aria-disabled='true']) { + border-color: #006ce7; + cursor: pointer; +} + +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #2b3b4e; + border-radius: 6px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} + +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} + +.tox:not([dir='rtl']) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} + +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} + +.tox[dir='rtl'] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} + +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} + +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(255, 255, 255, 0.5); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-toolbar-label { + padding: 0 8px; +} + +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} + +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} + +.tox .tox-form-group--maximize { + flex: 1; +} + +.tox .tox-form__group--error { + color: #c00; +} + +.tox .tox-form__group--collection { + display: flex; +} + +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} + +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} + +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} + +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} + +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} + +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} + +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox:not([dir='rtl']) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} + +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #161f29; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 5.5px; + resize: none; + width: 100%; +} + +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #222f3e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} + +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #2b3b4e; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: none; +} + +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} + +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #006ce7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} + +.tox .tox-naked-btn svg { + display: block; + fill: #fff; +} + +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} + +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} + +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} + +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} + +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-listbox__select-chevron svg { + fill: #fff; +} + +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} + +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} + +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} + +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #161f29; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 5.5px; + resize: none; + width: 100%; +} + +.tox .tox-selectfield select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} + +.tox .tox-selectfield select::-ms-expand { + display: none; +} + +.tox .tox-selectfield select:focus { + background-color: #2b3b4e; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: none; +} + +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} + +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} + +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} + +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} + +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} + +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} + +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} + +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} + +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} + +.tox .tox-image-tools .tox-spacer { + flex: 1; +} + +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} + +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} + +.tox .tox-image-tools .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} + +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} + +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} + +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} + +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} + +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} + +.tox .tox-insert-table-picker > div { + border-color: rgba(255, 255, 255, 0.15); + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px -4px; +} + +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(0, 108, 231, 0.5); + border-color: rgba(0, 108, 231, 0.5); +} + +.tox .tox-insert-table-picker__label { + color: #fff; + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} + +.tox:not([dir='rtl']) { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} + +.tox[dir='rtl'] { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} + +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} + +.tox .tox-menu { + background-color: #2b3b4e; + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 6px; + box-shadow: none; + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} + +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 4px; +} + +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 8px; +} + +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 8px; +} + +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} + +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") left 0 top 0 #222f3e; + background-color: #222f3e; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 11px 0 12px; +} + +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid transparent; +} + +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 28px; + justify-content: center; + margin: 5px 1px 6px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} + +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-mbtn:focus:not(:disabled) { + background: #3389ec; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-mbtn--active { + background: #599fef; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #3389ec; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} + +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} + +.tox .tox-notification { + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: normal; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} + +.tox .tox-notification p { + font-size: 14px; + font-weight: normal; +} + +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} + +.tox .tox-notification--in { + opacity: 1; +} + +.tox .tox-notification--success { + background-color: #334840; + border-color: #3c5440; + color: #fff; +} + +.tox .tox-notification--success p { + color: #fff; +} + +.tox .tox-notification--success a { + color: #b5d199; +} + +.tox .tox-notification--success svg { + fill: #fff; +} + +.tox .tox-notification--error { + background-color: #442632; + border-color: #55212b; + color: #fff; +} + +.tox .tox-notification--error p { + color: #fff; +} + +.tox .tox-notification--error a { + color: #e68080; +} + +.tox .tox-notification--error svg { + fill: #fff; +} + +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #222f3e; + border-color: rgba(255, 255, 255, 0.15); + color: #fff0b3; +} + +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #fff0b3; +} + +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #ffcc00; +} + +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #fff0b3; +} + +.tox .tox-notification--info { + background-color: #254161; + border-color: #264972; + color: #fff; +} + +.tox .tox-notification--info p { + color: #fff; +} + +.tox .tox-notification--info a { + color: #83b7f3; +} + +.tox .tox-notification--info svg { + fill: #fff; +} + +.tox .tox-notification__body { + align-self: center; + color: #fff; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} + +.tox .tox-notification__body > * { + margin: 0; +} + +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} + +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification__icon svg { + display: block; +} + +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} + +.tox .tox-pop { + display: inline-block; + position: relative; +} + +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} + +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} + +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} + +.tox .tox-pop--transition::before, +.tox .tox-pop--transition::after { + transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s; +} + +.tox .tox-pop__dialog { + background-color: #222f3e; + border: 1px solid #161f29; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + min-width: 0; + overflow: hidden; +} + +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} + +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} + +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} + +.tox .tox-pop.tox-pop--inset::before, +.tox .tox-pop.tox-pop--inset::after { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease; +} + +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} + +.tox .tox-pop.tox-pop--bottom::after { + border-color: #222f3e transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} + +.tox .tox-pop.tox-pop--bottom::before { + border-color: #161f29 transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} + +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #222f3e transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} + +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #161f29 transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #222f3e transparent transparent; + border-width: 8px; + margin-left: -15px; +} + +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #161f29 transparent transparent; + border-width: 10px; + margin-left: -19px; +} + +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #222f3e; + border-width: 8px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #161f29; + border-width: 10px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} + +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} + +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} + +.tox .tox-sidebar { + background-color: #222f3e; + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} + +.tox .tox-sidebar__pane-container { + display: flex; +} + +.tox .tox-sidebar__pane { + display: flex; +} + +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} + +.tox .tox-sidebar--sliding-open { + opacity: 1; +} + +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} + +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} + +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} + +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} + +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #161f29; + border-radius: 6px; + height: 10px; + min-width: 120px; + width: 100%; +} + +.tox .tox-slider__handle { + background-color: #006ce7; + border: 2px solid #0054b4; + border-radius: 6px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} + +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} + +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} + +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} + +.tox .tox-source-code { + overflow: auto; +} + +.tox .tox-spinner { + display: flex; +} + +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 100%; + height: 8px; + width: 8px; +} + +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} + +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} + +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} + +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-statusbar { + align-items: center; + background-color: #222f3e; + border-top: 1px solid rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.75); + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-weight: normal; + height: 25px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: none; +} + +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} + +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} + +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} + +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(255, 255, 255, 0.75); + text-decoration: none; +} + +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']) { + color: #fff; + cursor: pointer; +} + +.tox .tox-statusbar__branding svg { + fill: rgba(255, 255, 255, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} + +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg { + fill: #fff; +} + +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} + +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #434e5b; + border-radius: 1px 1px 5px 1px; + box-shadow: 0 0 0 2px #434e5b; +} + +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} + +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} + +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} + +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} + +.tox .tox-throbber { + z-index: 1299; +} + +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 28px; + justify-content: center; + margin: 6px 1px 5px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} + +.tox .tox-tbtn svg { + display: block; + fill: #fff; +} + +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} + +.tox .tox-tbtn:focus { + background: #3389ec; + border: 0; + box-shadow: none; +} + +.tox .tox-tbtn:hover { + background: #3389ec; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-tbtn:hover svg { + fill: #fff; +} + +.tox .tox-tbtn:active { + background: #599fef; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-tbtn:active svg { + fill: #fff; +} + +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #599fef; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} + +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: #fff; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #fff; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #fff; +} + +.tox .tox-tbtn:active > * { + transform: none; +} + +.tox .tox-tbtn--md { + height: 42px; + width: 51px; +} + +.tox .tox-tbtn--lg { + flex-direction: column; + height: 56px; + width: 68px; +} + +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} + +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} + +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} + +.tox .tox-tbtn--select { + margin: 6px 1px 5px 0; + padding: 0 4px; + width: auto; +} + +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-tbtn__select-chevron svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-tbtn--bespoke { + background: #2f4055; +} + +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 4px; +} + +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} + +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 6px 1px 5px 0; + overflow: hidden; +} + +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #3389ec inset; +} + +.tox .tox-split-button:focus { + background: #3389ec; + box-shadow: none; + color: #fff; +} + +.tox .tox-split-button > * { + border-radius: 0; +} + +.tox .tox-split-button__chevron { + width: 16px; +} + +.tox .tox-split-button__chevron svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-split-button .tox-tbtn { + margin: 0; +} + +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0px; +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} + +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} + +.tox .tox-toolbar-overlord { + background-color: #222f3e; +} + +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background-color: #222f3e; + background-image: repeating-linear-gradient(rgba(255, 255, 255, 0.15) 0px 1px, transparent 1px 39px); + background-position: center top 40px; + background-repeat: no-repeat; + background-size: calc(100% - 11px * 2) calc(100% - 41px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0px; + transform: perspective(1px); +} + +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__primary, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow { + background-position: center top 0px; + background-size: calc(100% - 11px * 2) calc(100% - 0px); +} + +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} + +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} + +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} + +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid transparent; + margin-top: 0px; + padding-bottom: 1px; + padding-top: 1px; +} + +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} + +.tox .tox-pop .tox-toolbar { + border-width: 0; +} + +.tox .tox-toolbar--no-divider { + background-image: none; +} + +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} + +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #222f3e; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + padding: 4px 0; +} + +.tox-pop .tox-pop__dialog { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 11px * 2) calc(100% - 51px); + padding: 4px 0; +} + +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 11px 0 12px; +} + +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} + +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} + +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid transparent; +} + +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid transparent; +} + +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} + +.tox .tox-tooltip__body { + background-color: #3d546f; + border-radius: 6px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: none; +} + +.tox .tox-tooltip__arrow { + position: absolute; +} + +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #3d546f; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} + +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #3d546f; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} + +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #3d546f; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #3d546f; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-well { + border: 1px solid #161f29; + border-radius: 6px; + padding: 8px; + width: 100%; +} + +.tox .tox-well > *:first-child { + margin-top: 0; +} + +.tox .tox-well > *:last-child { + margin-bottom: 0; +} + +.tox .tox-well > *:only-child { + margin: 0; +} + +.tox .tox-custom-editor { + border: 1px solid #161f29; + border-radius: 6px; + display: flex; + flex: 1; + position: relative; +} + +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} + +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} + +.tox .tox-tab { + cursor: pointer; +} + +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.15); +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.min.css new file mode 100644 index 00000000..842afba1 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.min.css @@ -0,0 +1,3043 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} +.tox :not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} +.tox :not(svg):not(rect) { + background: 0 0; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} +.tox-tinymce { + border: 2px solid #161f29; + border-radius: 10px; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #222f3e; + border: 2px solid #161f29; + border-radius: 10px; + box-shadow: none; + overflow: hidden; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} +.tox-tinymce :focus, +.tox-tinymce-aux :focus { + outline: 0; +} +button::-moz-focus-inner { + border: 0; +} +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #161f29; + border-radius: 6px; + display: flex; + justify-content: space-between; +} +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description > :last-child:not(:only-child) { + border-color: #161f29; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(0, 108, 231, 0.5); + border-color: rgba(0, 108, 231, 0.4); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > :last-child { + border-color: rgba(0, 108, 231, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.5); + border-color: rgba(255, 165, 0, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > :last-child { + border-color: rgba(255, 165, 0, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.5); + border-color: rgba(204, 0, 0, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > :last-child { + border-color: rgba(204, 0, 0, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.5); + border-color: rgba(120, 171, 70, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > :last-child { + border-color: rgba(120, 171, 70, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-left-width: 1px; + padding-left: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-right: auto; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-right-width: 1px; + padding-right: 4px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #006ce7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #006ce7; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: 0; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #006ce7; + background-image: none; + border-color: #006ce7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #0054b4; + background-image: none; + border-color: #0054b4; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #3d546f; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #3d546f; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + outline: 0; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #3d546f; + background-image: none; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #2b3b4e; + background-image: none; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #fff; +} +.tox .tox-button--naked[disabled] { + background-color: rgba(255, 255, 255, 0.2); + border-color: transparent; + box-shadow: unset; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: rgba(255, 255, 255, 0.2); + border-color: transparent; + box-shadow: unset; + color: #fff; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: rgba(255, 255, 255, 0.2); + border-color: transparent; + box-shadow: unset; + color: #fff; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: rgba(255, 255, 255, 0.3); + border-color: transparent; + box-shadow: unset; + color: #fff; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #fff; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 6px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 6px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(255, 255, 255, 0.2); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #006ce7; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #006ce7; +} +.tox .tox-checkbox--disabled { + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 6px; + box-shadow: inset 0 0 0 1px #006ce7; + padding: calc(4px - 1px); +} +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: rgba(255, 255, 255, 0.15); + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.5); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: 400; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #fff; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #2b3b4e; + color: #fff; +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #3389ec; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #599fef; + color: #fff; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #3389ec; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #599fef; + color: #fff; +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #3389ec; + color: #fff; +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} +.tox .tox-collection__item-checkmark, +.tox .tox-collection__item-icon { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-checkmark svg, +.tox .tox-collection__item-icon svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: #fff; +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-checkmark + svg { + display: none; +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-accessory + + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #2b3b4e; + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 28px; + margin: 6px 1px 5px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid transparent; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid transparent; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: 0 0; + border: 1px solid #000; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid #fff; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + red, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + red + ); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: #fff; + border: 1px solid #000; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid #000; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches { + margin: 5px 0 6px 11px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px -4px; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:focus, +.tox .tox-swatch:hover { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: 0; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + fill: #fff; + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #3389ec; +} +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #2b3b4e; + position: relative; +} +.tox .tox-comment-thread > :not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #2b3b4e; + border: 1px solid #161f29; + border-radius: 6px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #fff; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; +} +.tox .tox-comment__body { + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(255, 255, 255, 0.5); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #2b3b4e; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > :first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #2b3b4e; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #fff; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #2b3b4e; + box-shadow: 0 0 8px 8px #2b3b4e; + color: #fff; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #2b3b4e; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-comment__buttonspacing > :last-child, +.tox:not([dir='rtl']) .tox-comment__edit > :last-child, +.tox:not([dir='rtl']) .tox-comment__reply > :last-child { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-comment__buttonspacing > :last-child, +.tox[dir='rtl'] .tox-comment__edit > :last-child, +.tox[dir='rtl'] .tox-comment__reply > :last-child { + margin-right: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-user__name { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; + font-style: normal; + font-weight: 700; + text-transform: uppercase; +} +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #222f3e; +} +.tox .tox-dialog { + background-color: #2b3b4e; + border-color: #161f29; + border-radius: 10px; + border-style: solid; + border-width: 0; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #2b3b4e; + border-bottom: none; + color: #fff; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: #fff; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(0, 108, 231, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #006ce7; + color: #006ce7; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > :first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > :last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > :only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #006ce7; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:focus, +.tox .tox-dialog__body-content a:hover { + color: #0054b4; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #0054b4; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: #fff; +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #fff; + font-size: 20px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #fff; + font-size: 16px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #2b3b4e; + border-top: none; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} +.tox .tox-dialog__footer-end, +.tox .tox-dialog__footer-start { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: 700; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #161f29; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > * { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > * { + margin-right: 8px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #161f29; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(255, 255, 255, 0.5); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #161f29; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #222f3e; + border-bottom: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: none; + padding: 4px 0; + transition: box-shadow 0.5s; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid rgba(255, 255, 255, 0.15); + box-shadow: none; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #222f3e; + box-shadow: none; + padding: 4px 0; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: none; +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + border-color: #161f29; + box-shadow: none; + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: 700; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:focus:not([aria-disabled='true']), +.tox .tox-color-input span:hover:not([aria-disabled='true']) { + border-color: #006ce7; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #2b3b4e; + border-radius: 6px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(255, 255, 255, 0.5); + display: block; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox:not([dir='rtl']) .tox-form__controls-h-stack > :not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-form__controls-h-stack > :not(:first-child) { + margin-right: 4px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea, +.tox .tox-textfield, +.tox .tox-toolbar-textfield { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #161f29; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 5.5px; + resize: none; + width: 100%; +} +.tox .tox-textarea[disabled], +.tox .tox-textfield[disabled] { + background-color: #222f3e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus, +.tox .tox-textfield:focus { + background-color: #2b3b4e; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: 0; +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #006ce7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #fff; +} +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-listbox__select-chevron svg { + fill: #fff; +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #161f29; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 5.5px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #2b3b4e; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: 0; +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools .tox-spacer { + flex: 1; +} +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} +.tox .tox-image-tools .tox-croprect-block { + background: #000; + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid #fff; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} +.tox .tox-insert-table-picker > div { + border-color: rgba(255, 255, 255, 0.15); + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px -4px; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(0, 108, 231, 0.5); + border-color: rgba(0, 108, 231, 0.5); +} +.tox .tox-insert-table-picker__label { + color: #fff; + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} +.tox .tox-menu { + background-color: #2b3b4e; + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 6px; + box-shadow: none; + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 4px; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 8px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 8px; +} +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code, +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") + left 0 top 0 #222f3e; + background-color: #222f3e; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 11px 0 12px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid transparent; +} +.tox .tox-mbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 28px; + justify-content: center; + margin: 5px 1px 6px 0; + outline: 0; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #3389ec; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn--active { + background: #599fef; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #3389ec; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: 400; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 0.1s ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 14px; + font-weight: 400; +} +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #334840; + border-color: #3c5440; + color: #fff; +} +.tox .tox-notification--success p { + color: #fff; +} +.tox .tox-notification--success a { + color: #b5d199; +} +.tox .tox-notification--success svg { + fill: #fff; +} +.tox .tox-notification--error { + background-color: #442632; + border-color: #55212b; + color: #fff; +} +.tox .tox-notification--error p { + color: #fff; +} +.tox .tox-notification--error a { + color: #e68080; +} +.tox .tox-notification--error svg { + fill: #fff; +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #222f3e; + border-color: rgba(255, 255, 255, 0.15); + color: #fff0b3; +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #fff0b3; +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #fc0; +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #fff0b3; +} +.tox .tox-notification--info { + background-color: #254161; + border-color: #264972; + color: #fff; +} +.tox .tox-notification--info p { + color: #fff; +} +.tox .tox-notification--info a { + color: #83b7f3; +} +.tox .tox-notification--info svg { + fill: #fff; +} +.tox .tox-notification__body { + align-self: center; + color: #fff; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} +.tox .tox-pop--transition::after, +.tox .tox-pop--transition::before { + transition: all 0.15s, visibility 0s, opacity 75ms ease 75ms; +} +.tox .tox-pop__dialog { + background-color: #222f3e; + border: 1px solid #161f29; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > :not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::after, +.tox .tox-pop::before { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--inset::after, +.tox .tox-pop.tox-pop--inset::before { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 75ms ease; +} +.tox .tox-pop.tox-pop--bottom::after, +.tox .tox-pop.tox-pop--bottom::before { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #222f3e transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #161f29 transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::after, +.tox .tox-pop.tox-pop--top::before { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #222f3e transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #161f29 transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::after, +.tox .tox-pop.tox-pop--left::before { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #222f3e transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #161f29 transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::after, +.tox .tox-pop.tox-pop--right::before { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #222f3e; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #161f29; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::after, +.tox .tox-pop.tox-pop--align-left::before { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::after, +.tox .tox-pop.tox-pop--align-right::before { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #222f3e; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #161f29; + border-radius: 6px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #006ce7; + border: 2px solid #0054b4; + border-radius: 6px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 100%, + 80% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #222f3e; + border-top: 1px solid rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.75); + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-weight: 400; + height: 25px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: none; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(255, 255, 255, 0.75); + text-decoration: none; +} +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']) { + color: #fff; + cursor: pointer; +} +.tox .tox-statusbar__branding svg { + fill: rgba(255, 255, 255, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg { + fill: #fff; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #434e5b; + border-radius: 1px 1px 5px 1px; + box-shadow: 0 0 0 2px #434e5b; +} +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 28px; + justify-content: center; + margin: 6px 1px 5px 0; + outline: 0; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #fff; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #3389ec; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #3389ec; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn:hover svg { + fill: #fff; +} +.tox .tox-tbtn:active { + background: #599fef; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn:active svg { + fill: #fff; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: 0 0; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #599fef; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn--enabled:hover > *, +.tox .tox-tbtn--enabled > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + fill: #fff; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #fff; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #fff; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 42px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 56px; + width: 68px; +} +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: 400; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 6px 1px 5px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-tbtn--bespoke { + background: #2f4055; +} +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 4px; +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 6px 1px 5px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #3389ec inset; +} +.tox .tox-split-button:focus { + background: #3389ec; + box-shadow: none; + color: #fff; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled:hover { + background: 0 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} +.tox .tox-toolbar-overlord { + background-color: #222f3e; +} +.tox .tox-toolbar, +.tox .tox-toolbar__overflow, +.tox .tox-toolbar__primary { + background-color: #222f3e; + background-image: repeating-linear-gradient(rgba(255, 255, 255, 0.15) 0 1px, transparent 1px 39px); + background-position: center top 40px; + background-repeat: no-repeat; + background-size: calc(100% - 11px * 2) calc(100% - 41px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; + transform: perspective(1px); +} +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow, +.tox .tox-toolbar-overlord > .tox-toolbar__primary { + background-position: center top 0; + background-size: calc(100% - 11px * 2) calc(100% - 0px); +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid transparent; + margin-top: 0; + padding-bottom: 1px; + padding-top: 1px; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #222f3e; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + padding: 4px 0; +} +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 11px * 2) calc(100% - 51px); + padding: 4px 0; +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 11px 0 12px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid transparent; +} +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid transparent; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #3d546f; + border-radius: 6px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: 400; + padding: 4px 8px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #3d546f; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #3d546f; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #3d546f; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #3d546f; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #161f29; + border-radius: 6px; + padding: 8px; + width: 100%; +} +.tox .tox-well > :first-child { + margin-top: 0; +} +.tox .tox-well > :last-child { + margin-bottom: 0; +} +.tox .tox-well > :only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #161f29; + border-radius: 6px; + display: flex; + flex: 1; + position: relative; +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.15); +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css new file mode 100644 index 00000000..d9ea82a3 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.css @@ -0,0 +1,35 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css new file mode 100644 index 00000000..c1141c55 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css @@ -0,0 +1,30 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/content.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.css new file mode 100644 index 00000000..b81f358d --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.css @@ -0,0 +1,869 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*='language-'], +pre[class*='language-'] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} + +body { + font-family: sans-serif; +} + +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.css new file mode 100644 index 00000000..e7acef31 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.css @@ -0,0 +1,861 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*='language-'], +pre[class*='language-'] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.min.css new file mode 100644 index 00000000..882dfd5b --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.inline.min.css @@ -0,0 +1,720 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: 0 0; + text-shadow: 0 1px #fff; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +code[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +pre[class*='language-']::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +code[class*='language-'] ::selection, +code[class*='language-']::selection, +pre[class*='language-'] ::selection, +pre[class*='language-']::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #708090; +} +.token.punctuation { + color: #999; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.constant, +.token.deleted, +.token.number, +.token.property, +.token.symbol, +.token.tag { + color: #905; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #690; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.class-name, +.token.function { + color: #dd4a68; +} +.token.important, +.token.regex, +.token.variable { + color: #e90; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/content.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.min.css new file mode 100644 index 00000000..6e0034ba --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/content.min.css @@ -0,0 +1,726 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: 0 0; + text-shadow: 0 1px #fff; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +code[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +pre[class*='language-']::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +code[class*='language-'] ::selection, +code[class*='language-']::selection, +pre[class*='language-'] ::selection, +pre[class*='language-']::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #708090; +} +.token.punctuation { + color: #999; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.constant, +.token.deleted, +.token.number, +.token.property, +.token.symbol, +.token.tag { + color: #905; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #690; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.class-name, +.token.function { + color: #dd4a68; +} +.token.important, +.token.regex, +.token.variable { + color: #e90; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.css new file mode 100644 index 00000000..b5a17d78 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.css @@ -0,0 +1,3660 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} + +.tox *:not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} + +.tox *:not(svg):not(rect) { + /* stylelint-disable-line no-duplicate-selectors */ + background: transparent; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} + +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} + +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} + +.tox-tinymce { + border: 2px solid #eeeeee; + border-radius: 10px; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} + +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #fff; + border: 2px solid #eeeeee; + border-radius: 10px; + box-shadow: none; + overflow: hidden; +} + +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} + +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} + +button::-moz-focus-inner { + border: 0; +} + +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} + +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #eeeeee; + border-radius: 6px; + display: flex; + justify-content: space-between; +} + +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} + +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #eeeeee; + border-style: solid; +} + +.tox .accessibility-issue__repair { + margin-top: 16px; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(0, 108, 231, 0.1); + border-color: #006ce7; + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: #006ce7; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #006ce7; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #006ce7; +} + +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #006ce7; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.1); + border-color: rgba(255, 165, 0, 0.5); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.5); +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #cc8500; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #cc8500; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #cc8500; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.1); + border-color: rgba(204, 0, 0, 0.4); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.4); +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #c00; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #c00; +} + +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #c00; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.1); + border-color: rgba(120, 171, 70, 0.4); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.4); +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #78ab46; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #78ab46; +} + +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #78ab46; +} + +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 4px; +} + +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-button { + background-color: #006ce7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #006ce7; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-button[disabled] { + background-color: #006ce7; + background-image: none; + border-color: #006ce7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-button:focus:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:hover:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:active:not(:disabled) { + background-color: #0054b4; + background-image: none; + border-color: #0054b4; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #f0f0f0; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} + +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} + +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} + +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} + +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.tox .tox-button-link--sm { + font-size: 14px; +} + +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} + +.tox .tox-button--naked[disabled] { + background-color: rgba(34, 47, 62, 0.12); + border-color: transparent; + box-shadow: unset; + color: rgba(34, 47, 62, 0.5); +} + +.tox .tox-button--naked:hover:not(:disabled) { + background-color: rgba(34, 47, 62, 0.12); + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} + +.tox .tox-button--naked:focus:not(:disabled) { + background-color: rgba(34, 47, 62, 0.12); + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} + +.tox .tox-button--naked:active:not(:disabled) { + background-color: rgba(34, 47, 62, 0.18); + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} + +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} + +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #222f3e; +} + +.tox .tox-checkbox { + align-items: center; + border-radius: 6px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} + +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} + +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 6px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(34, 47, 62, 0.3); +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #006ce7; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #006ce7; +} + +.tox .tox-checkbox--disabled { + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} + +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 6px; + box-shadow: inset 0 0 0 1px #006ce7; + padding: calc(4px - 1px); +} + +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} + +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} + +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} + +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} + +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} + +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #e3e3e3; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} + +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} + +.tox .tox-collection__group-heading { + background-color: #fcfcfc; + color: rgba(34, 47, 62, 0.7); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #222f3e; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} + +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #fff; + color: #222f3e; +} + +.tox .tox-collection--list .tox-collection__item--active { + background-color: #cce2fa; +} + +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #a6ccf7; + color: #222f3e; +} + +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #cce2fa; +} + +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #a6ccf7; + color: #222f3e; +} + +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #cce2fa; + color: #222f3e; +} + +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} + +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} + +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} + +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} + +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} + +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} + +.tox .tox-collection__item-accessory { + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} + +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} + +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} + +.tox .tox-collection__item-caret svg { + fill: #222f3e; +} + +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-checkmark +svg { + display: none; +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-accessory ++ .tox-collection__item-checkmark { + display: none; +} + +.tox .tox-collection--horizontal { + background-color: #fff; + border: 1px solid #e3e3e3; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} + +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item { + height: 28px; + margin: 6px 1px 5px 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} + +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} + +.tox .tox-collection__item-container { + display: flex; +} + +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} + +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} + +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid transparent; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} + +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid transparent; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} + +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} + +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} + +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} + +.tox .tox-sv-palette-spectrum { + height: 100%; +} + +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} + +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} + +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} + +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} + +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + #f00, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + #f00 + ); + height: 100%; + width: 100%; +} + +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} + +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} + +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} + +.tox .tox-rgb-form input { + width: 6em; +} + +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} + +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} + +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} + +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} + +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} + +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} + +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 5px 0 6px 11px; +} + +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px -4px; +} + +.tox .tox-swatches__row { + display: flex; +} + +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} + +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} + +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} + +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} + +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} + +.tox .tox-swatches__picker-btn svg { + fill: #222f3e; + height: 24px; + width: 24px; +} + +.tox .tox-swatches__picker-btn:hover { + background: #cce2fa; +} + +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} + +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} + +.tox .tox-comment-thread { + background: #fff; + position: relative; +} + +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} + +.tox .tox-comment { + background: #fff; + border: 1px solid #eeeeee; + border-radius: 6px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} + +.tox .tox-comment__header { + align-items: center; + color: #222f3e; + display: flex; + justify-content: space-between; +} + +.tox .tox-comment__date { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; +} + +.tox .tox-comment__body { + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} + +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} + +.tox .tox-comment__expander { + padding-top: 8px; +} + +.tox .tox-comment__expander p { + color: rgba(34, 47, 62, 0.7); + font-size: 14px; + font-style: normal; +} + +.tox .tox-comment__body p { + margin: 0; +} + +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} + +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} + +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} + +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} + +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} + +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} + +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} + +.tox .tox-comment__loading-text { + align-items: center; + color: #222f3e; + display: flex; + flex-direction: column; + position: relative; +} + +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} + +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} + +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: #222f3e; + text-align: center; +} + +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} + +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} + +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} + +.tox .tox-conversations { + margin: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir='rtl']) .tox-comment__edit > *:last-child, +.tox:not([dir='rtl']) .tox-comment__reply > *:last-child { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-comment__buttonspacing > *:last-child, +.tox[dir='rtl'] .tox-comment__edit > *:last-child, +.tox[dir='rtl'] .tox-comment__reply > *:last-child { + margin-right: 8px; +} + +.tox .tox-user { + align-items: center; + display: flex; +} + +.tox .tox-user__avatar svg { + fill: rgba(34, 47, 62, 0.7); +} + +.tox .tox-user__name { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} + +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} + +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} + +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} + +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} + +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #fff; +} + +.tox .tox-dialog { + background-color: #fff; + border-color: #eeeeee; + border-radius: 10px; + border-style: solid; + border-width: 0px; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} + +.tox .tox-dialog-inline { + z-index: 1100; +} + +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: #222f3e; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} + +.tox .tox-dialog__header .tox-button { + z-index: 1; +} + +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} + +.tox .tox-dialog__dismiss { + margin-left: auto; +} + +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} + +.tox .tox-dialog__body { + color: #222f3e; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} + +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} + +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} + +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(0, 108, 231, 0.1); +} + +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #006ce7; + color: #006ce7; +} + +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} + +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} + +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog__body-content a { + color: #006ce7; + cursor: pointer; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #0054b4; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:active { + color: #0054b4; + text-decoration: none; +} + +.tox .tox-dialog__body-content svg { + fill: #222f3e; +} + +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} + +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #222f3e; + font-size: 20px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #222f3e; + font-size: 16px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} + +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} + +.tox .tox-dialog--width-md { + max-width: 800px; +} + +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} + +.tox .tox-dialog__body-content--centered { + text-align: center; +} + +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: none; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} + +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} + +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} + +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} + +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} + +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #eeeeee; +} + +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} + +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} + +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} + +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} + +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} + +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} + +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 8px; +} + +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} + +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #eeeeee; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} + +.tox .tox-dropzone p { + color: rgba(34, 47, 62, 0.7); + margin: 0 0 16px 0; +} + +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} + +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} + +.tox.tox-inline-edit-area { + border: 1px dotted #eeeeee; +} + +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} + +.tox .tox-editor-header { + z-index: 1; +} + +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #fff; + border-bottom: none; + box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.1), 0 8px 8px -4px rgba(34, 47, 62, 0.07); + padding: 4px 0; + transition: box-shadow 0.5s; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid #e3e3e3; + box-shadow: none; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #fff; + box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.2), 0 8px 8px -4px rgba(34, 47, 62, 0.15); + padding: 4px 0; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.2), 0 8px 8px -4px rgba(34, 47, 62, 0.15); +} + +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} + +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} + +.tox .tox-control-wrap { + flex: 1; + position: relative; +} + +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} + +.tox .tox-control-wrap svg { + display: block; +} + +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} + +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} + +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} + +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} + +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} + +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} + +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} + +.tox .tox-autocompleter { + max-width: 25em; +} + +.tox .tox-autocompleter .tox-menu { + border-color: #eeeeee; + box-shadow: none; + max-width: 25em; +} + +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: bold; +} + +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} + +.tox .tox-color-input .tox-textfield { + z-index: -1; +} + +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} + +.tox .tox-color-input span:hover:not([aria-disabled='true']), +.tox .tox-color-input span:focus:not([aria-disabled='true']) { + border-color: #006ce7; + cursor: pointer; +} + +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #fff; + border-radius: 6px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} + +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} + +.tox:not([dir='rtl']) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} + +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} + +.tox[dir='rtl'] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} + +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} + +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-toolbar-label { + padding: 0 8px; +} + +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} + +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} + +.tox .tox-form-group--maximize { + flex: 1; +} + +.tox .tox-form__group--error { + color: #c00; +} + +.tox .tox-form__group--collection { + display: flex; +} + +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} + +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} + +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} + +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} + +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} + +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} + +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox:not([dir='rtl']) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} + +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #eeeeee; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 5.5px; + resize: none; + width: 100%; +} + +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} + +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #fff; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: none; +} + +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} + +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #006ce7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} + +.tox .tox-naked-btn svg { + display: block; + fill: #222f3e; +} + +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} + +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} + +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} + +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} + +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-listbox__select-chevron svg { + fill: #222f3e; +} + +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} + +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} + +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} + +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #eeeeee; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 5.5px; + resize: none; + width: 100%; +} + +.tox .tox-selectfield select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} + +.tox .tox-selectfield select::-ms-expand { + display: none; +} + +.tox .tox-selectfield select:focus { + background-color: #fff; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: none; +} + +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} + +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} + +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} + +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} + +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} + +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} + +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} + +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} + +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} + +.tox .tox-image-tools .tox-spacer { + flex: 1; +} + +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} + +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} + +.tox .tox-image-tools .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} + +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} + +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} + +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} + +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} + +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} + +.tox .tox-insert-table-picker > div { + border-color: #eeeeee; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px -4px; +} + +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(0, 108, 231, 0.5); + border-color: rgba(0, 108, 231, 0.5); +} + +.tox .tox-insert-table-picker__label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} + +.tox:not([dir='rtl']) { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} + +.tox[dir='rtl'] { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} + +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} + +.tox .tox-menu { + background-color: #fff; + border: 1px solid transparent; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} + +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 4px; +} + +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 8px; +} + +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 8px; +} + +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} + +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 11px 0 12px; +} + +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid transparent; +} + +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 28px; + justify-content: center; + margin: 5px 1px 6px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} + +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-mbtn:focus:not(:disabled) { + background: #cce2fa; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-mbtn--active { + background: #a6ccf7; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #cce2fa; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} + +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} + +.tox .tox-notification { + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: normal; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} + +.tox .tox-notification p { + font-size: 14px; + font-weight: normal; +} + +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} + +.tox .tox-notification--in { + opacity: 1; +} + +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: #222f3e; +} + +.tox .tox-notification--success p { + color: #222f3e; +} + +.tox .tox-notification--success a { + color: #517342; +} + +.tox .tox-notification--success svg { + fill: #222f3e; +} + +.tox .tox-notification--error { + background-color: #f5cccc; + border-color: #f0b3b3; + color: #222f3e; +} + +.tox .tox-notification--error p { + color: #222f3e; +} + +.tox .tox-notification--error a { + color: #77181f; +} + +.tox .tox-notification--error svg { + fill: #222f3e; +} + +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fff5cc; + border-color: #fff0b3; + color: #222f3e; +} + +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #222f3e; +} + +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #7a6e25; +} + +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #222f3e; +} + +.tox .tox-notification--info { + background-color: #d6e7fb; + border-color: #c1dbf9; + color: #222f3e; +} + +.tox .tox-notification--info p { + color: #222f3e; +} + +.tox .tox-notification--info a { + color: #2a64a6; +} + +.tox .tox-notification--info svg { + fill: #222f3e; +} + +.tox .tox-notification__body { + align-self: center; + color: #222f3e; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} + +.tox .tox-notification__body > * { + margin: 0; +} + +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} + +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification__icon svg { + display: block; +} + +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} + +.tox .tox-pop { + display: inline-block; + position: relative; +} + +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} + +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} + +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} + +.tox .tox-pop--transition::before, +.tox .tox-pop--transition::after { + transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s; +} + +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #eeeeee; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + min-width: 0; + overflow: hidden; +} + +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} + +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} + +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} + +.tox .tox-pop.tox-pop--inset::before, +.tox .tox-pop.tox-pop--inset::after { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease; +} + +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} + +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} + +.tox .tox-pop.tox-pop--bottom::before { + border-color: #eeeeee transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} + +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} + +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #eeeeee transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} + +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #eeeeee transparent transparent; + border-width: 10px; + margin-left: -19px; +} + +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #eeeeee; + border-width: 10px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} + +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} + +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} + +.tox .tox-sidebar { + background-color: #fff; + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} + +.tox .tox-sidebar__pane-container { + display: flex; +} + +.tox .tox-sidebar__pane { + display: flex; +} + +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} + +.tox .tox-sidebar--sliding-open { + opacity: 1; +} + +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} + +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} + +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} + +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} + +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #eeeeee; + border-radius: 6px; + height: 10px; + min-width: 120px; + width: 100%; +} + +.tox .tox-slider__handle { + background-color: #006ce7; + border: 2px solid #0054b4; + border-radius: 6px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} + +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} + +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} + +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} + +.tox .tox-source-code { + overflow: auto; +} + +.tox .tox-spinner { + display: flex; +} + +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(34, 47, 62, 0.7); + border-radius: 100%; + height: 8px; + width: 8px; +} + +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} + +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} + +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} + +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #e3e3e3; + color: rgba(34, 47, 62, 0.7); + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-weight: normal; + height: 25px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: none; +} + +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} + +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} + +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} + +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(34, 47, 62, 0.7); + text-decoration: none; +} + +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']) { + color: #222f3e; + cursor: pointer; +} + +.tox .tox-statusbar__branding svg { + fill: rgba(34, 47, 62, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} + +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg { + fill: #222f3e; +} + +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} + +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #dee0e2; + border-radius: 1px 1px 5px 1px; + box-shadow: 0 0 0 2px #dee0e2; +} + +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} + +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} + +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} + +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} + +.tox .tox-throbber { + z-index: 1299; +} + +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 28px; + justify-content: center; + margin: 6px 1px 5px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} + +.tox .tox-tbtn svg { + display: block; + fill: #222f3e; +} + +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} + +.tox .tox-tbtn:focus { + background: #cce2fa; + border: 0; + box-shadow: none; +} + +.tox .tox-tbtn:hover { + background: #cce2fa; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-tbtn:hover svg { + fill: #222f3e; +} + +.tox .tox-tbtn:active { + background: #a6ccf7; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-tbtn:active svg { + fill: #222f3e; +} + +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #a6ccf7; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} + +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: #222f3e; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #222f3e; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #222f3e; +} + +.tox .tox-tbtn:active > * { + transform: none; +} + +.tox .tox-tbtn--md { + height: 42px; + width: 51px; +} + +.tox .tox-tbtn--lg { + flex-direction: column; + height: 56px; + width: 68px; +} + +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} + +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} + +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} + +.tox .tox-tbtn--select { + margin: 6px 1px 5px 0; + padding: 0 4px; + width: auto; +} + +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-tbtn__select-chevron svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-tbtn--bespoke { + background: #f7f7f7; +} + +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 4px; +} + +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} + +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 6px 1px 5px 0; + overflow: hidden; +} + +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #cce2fa inset; +} + +.tox .tox-split-button:focus { + background: #cce2fa; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-split-button > * { + border-radius: 0; +} + +.tox .tox-split-button__chevron { + width: 16px; +} + +.tox .tox-split-button__chevron svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-split-button .tox-tbtn { + margin: 0; +} + +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0px; +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} + +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} + +.tox .tox-toolbar-overlord { + background-color: #fff; +} + +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background-color: #fff; + background-image: repeating-linear-gradient(#e3e3e3 0px 1px, transparent 1px 39px); + background-position: center top 40px; + background-repeat: no-repeat; + background-size: calc(100% - 11px * 2) calc(100% - 41px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0px; + transform: perspective(1px); +} + +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__primary, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow { + background-position: center top 0px; + background-size: calc(100% - 11px * 2) calc(100% - 0px); +} + +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} + +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} + +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} + +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid transparent; + margin-top: 0px; + padding-bottom: 1px; + padding-top: 1px; +} + +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} + +.tox .tox-pop .tox-toolbar { + border-width: 0; +} + +.tox .tox-toolbar--no-divider { + background-image: none; +} + +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} + +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #fff; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + padding: 4px 0; +} + +.tox-pop .tox-pop__dialog { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 11px * 2) calc(100% - 51px); + padding: 4px 0; +} + +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 11px 0 12px; +} + +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} + +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} + +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid transparent; +} + +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid transparent; +} + +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} + +.tox .tox-tooltip__body { + background-color: #222f3e; + border-radius: 6px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: none; +} + +.tox .tox-tooltip__arrow { + position: absolute; +} + +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #222f3e; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} + +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #222f3e; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} + +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #222f3e; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #222f3e; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-well { + border: 1px solid #eeeeee; + border-radius: 6px; + padding: 8px; + width: 100%; +} + +.tox .tox-well > *:first-child { + margin-top: 0; +} + +.tox .tox-well > *:last-child { + margin-bottom: 0; +} + +.tox .tox-well > *:only-child { + margin: 0; +} + +.tox .tox-custom-editor { + border: 1px solid #eeeeee; + border-radius: 6px; + display: flex; + flex: 1; + position: relative; +} + +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} + +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} + +.tox .tox-tab { + cursor: pointer; +} + +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.min.css new file mode 100644 index 00000000..3f1bf7ec --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.min.css @@ -0,0 +1,3040 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} +.tox :not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} +.tox :not(svg):not(rect) { + background: 0 0; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} +.tox-tinymce { + border: 2px solid #eee; + border-radius: 10px; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #fff; + border: 2px solid #eee; + border-radius: 10px; + box-shadow: none; + overflow: hidden; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} +.tox-tinymce :focus, +.tox-tinymce-aux :focus { + outline: 0; +} +button::-moz-focus-inner { + border: 0; +} +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #eee; + border-radius: 6px; + display: flex; + justify-content: space-between; +} +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description > :last-child:not(:only-child) { + border-color: #eee; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(0, 108, 231, 0.1); + border-color: #006ce7; + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > :last-child { + border-color: #006ce7; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #006ce7; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #006ce7; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #006ce7; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.1); + border-color: rgba(255, 165, 0, 0.5); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > :last-child { + border-color: rgba(255, 165, 0, 0.5); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.1); + border-color: rgba(204, 0, 0, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > :last-child { + border-color: rgba(204, 0, 0, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.1); + border-color: rgba(120, 171, 70, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > :last-child { + border-color: rgba(120, 171, 70, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #78ab46; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #78ab46; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #78ab46; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-left-width: 1px; + padding-left: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-right: auto; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-right-width: 1px; + padding-right: 4px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #006ce7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #006ce7; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: 0; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #006ce7; + background-image: none; + border-color: #006ce7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #0060ce; + background-image: none; + border-color: #0060ce; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #0054b4; + background-image: none; + border-color: #0054b4; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #f0f0f0; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + outline: 0; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked[disabled] { + background-color: rgba(34, 47, 62, 0.12); + border-color: transparent; + box-shadow: unset; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: rgba(34, 47, 62, 0.12); + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: rgba(34, 47, 62, 0.12); + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: rgba(34, 47, 62, 0.18); + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #222f3e; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 6px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 6px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(34, 47, 62, 0.3); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #006ce7; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #006ce7; +} +.tox .tox-checkbox--disabled { + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 6px; + box-shadow: inset 0 0 0 1px #006ce7; + padding: calc(4px - 1px); +} +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #e3e3e3; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #fcfcfc; + color: rgba(34, 47, 62, 0.7); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: 400; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #222f3e; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #fff; + color: #222f3e; +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #cce2fa; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #a6ccf7; + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #cce2fa; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #a6ccf7; + color: #222f3e; +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #cce2fa; + color: #222f3e; +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} +.tox .tox-collection__item-checkmark, +.tox .tox-collection__item-icon { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-checkmark svg, +.tox .tox-collection__item-icon svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: #222f3e; +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-checkmark + svg { + display: none; +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-accessory + + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #fff; + border: 1px solid #e3e3e3; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 28px; + margin: 6px 1px 5px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid transparent; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid transparent; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: 0 0; + border: 1px solid #000; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid #fff; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + red, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + red + ); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: #fff; + border: 1px solid #000; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid #000; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches { + margin: 5px 0 6px 11px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px -4px; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:focus, +.tox .tox-swatch:hover { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: 0; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + fill: #222f3e; + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #cce2fa; +} +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #fff; + position: relative; +} +.tox .tox-comment-thread > :not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #fff; + border: 1px solid #eee; + border-radius: 6px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #222f3e; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; +} +.tox .tox-comment__body { + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(34, 47, 62, 0.7); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > :first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #222f3e; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: #222f3e; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-comment__buttonspacing > :last-child, +.tox:not([dir='rtl']) .tox-comment__edit > :last-child, +.tox:not([dir='rtl']) .tox-comment__reply > :last-child { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-comment__buttonspacing > :last-child, +.tox[dir='rtl'] .tox-comment__edit > :last-child, +.tox[dir='rtl'] .tox-comment__reply > :last-child { + margin-right: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(34, 47, 62, 0.7); +} +.tox .tox-user__name { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; + font-style: normal; + font-weight: 700; + text-transform: uppercase; +} +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #fff; +} +.tox .tox-dialog { + background-color: #fff; + border-color: #eee; + border-radius: 10px; + border-style: solid; + border-width: 0; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: #222f3e; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: #222f3e; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(0, 108, 231, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #006ce7; + color: #006ce7; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > :first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > :last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > :only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #006ce7; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:focus, +.tox .tox-dialog__body-content a:hover { + color: #0054b4; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #0054b4; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: #222f3e; +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #222f3e; + font-size: 20px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #222f3e; + font-size: 16px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: none; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} +.tox .tox-dialog__footer-end, +.tox .tox-dialog__footer-start { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: 700; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #eee; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > * { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > * { + margin-right: 8px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #eee; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(34, 47, 62, 0.7); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #eee; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #fff; + border-bottom: none; + box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.1), 0 8px 8px -4px rgba(34, 47, 62, 0.07); + padding: 4px 0; + transition: box-shadow 0.5s; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid #e3e3e3; + box-shadow: none; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #fff; + box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.2), 0 8px 8px -4px rgba(34, 47, 62, 0.15); + padding: 4px 0; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 2px 2px -2px rgba(34, 47, 62, 0.2), 0 8px 8px -4px rgba(34, 47, 62, 0.15); +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + border-color: #eee; + box-shadow: none; + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: 700; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:focus:not([aria-disabled='true']), +.tox .tox-color-input span:hover:not([aria-disabled='true']) { + border-color: #006ce7; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #fff; + border-radius: 6px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox:not([dir='rtl']) .tox-form__controls-h-stack > :not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-form__controls-h-stack > :not(:first-child) { + margin-right: 4px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea, +.tox .tox-textfield, +.tox .tox-toolbar-textfield { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #eee; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 5.5px; + resize: none; + width: 100%; +} +.tox .tox-textarea[disabled], +.tox .tox-textfield[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus, +.tox .tox-textfield:focus { + background-color: #fff; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: 0; +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #006ce7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #222f3e; +} +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-listbox__select-chevron svg { + fill: #222f3e; +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #eee; + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 5.5px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #fff; + border-color: #006ce7; + box-shadow: 0 0 0 2px rgba(0, 108, 231, 0.25); + outline: 0; +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools .tox-spacer { + flex: 1; +} +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} +.tox .tox-image-tools .tox-croprect-block { + background: #000; + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid #fff; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} +.tox .tox-insert-table-picker > div { + border-color: #eee; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px -4px; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(0, 108, 231, 0.5); + border-color: rgba(0, 108, 231, 0.5); +} +.tox .tox-insert-table-picker__label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} +.tox .tox-menu { + background-color: #fff; + border: 1px solid transparent; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 4px; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 8px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 8px; +} +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code, +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='transparent'/%3E%3C/svg%3E") + left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 11px 0 12px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid transparent; +} +.tox .tox-mbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 28px; + justify-content: center; + margin: 5px 1px 6px 0; + outline: 0; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #cce2fa; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn--active { + background: #a6ccf7; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #cce2fa; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 6px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: 400; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 0.1s ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 14px; + font-weight: 400; +} +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: #222f3e; +} +.tox .tox-notification--success p { + color: #222f3e; +} +.tox .tox-notification--success a { + color: #517342; +} +.tox .tox-notification--success svg { + fill: #222f3e; +} +.tox .tox-notification--error { + background-color: #f5cccc; + border-color: #f0b3b3; + color: #222f3e; +} +.tox .tox-notification--error p { + color: #222f3e; +} +.tox .tox-notification--error a { + color: #77181f; +} +.tox .tox-notification--error svg { + fill: #222f3e; +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fff5cc; + border-color: #fff0b3; + color: #222f3e; +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #222f3e; +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #7a6e25; +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #222f3e; +} +.tox .tox-notification--info { + background-color: #d6e7fb; + border-color: #c1dbf9; + color: #222f3e; +} +.tox .tox-notification--info p { + color: #222f3e; +} +.tox .tox-notification--info a { + color: #2a64a6; +} +.tox .tox-notification--info svg { + fill: #222f3e; +} +.tox .tox-notification__body { + align-self: center; + color: #222f3e; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} +.tox .tox-pop--transition::after, +.tox .tox-pop--transition::before { + transition: all 0.15s, visibility 0s, opacity 75ms ease 75ms; +} +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #eee; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > :not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::after, +.tox .tox-pop::before { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--inset::after, +.tox .tox-pop.tox-pop--inset::before { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 75ms ease; +} +.tox .tox-pop.tox-pop--bottom::after, +.tox .tox-pop.tox-pop--bottom::before { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #eee transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::after, +.tox .tox-pop.tox-pop--top::before { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #eee transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::after, +.tox .tox-pop.tox-pop--left::before { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #eee transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::after, +.tox .tox-pop.tox-pop--right::before { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #eee; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::after, +.tox .tox-pop.tox-pop--align-left::before { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::after, +.tox .tox-pop.tox-pop--align-right::before { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #fff; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #eee; + border-radius: 6px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #006ce7; + border: 2px solid #0054b4; + border-radius: 6px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(34, 47, 62, 0.7); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 100%, + 80% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #e3e3e3; + color: rgba(34, 47, 62, 0.7); + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-weight: 400; + height: 25px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: none; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(34, 47, 62, 0.7); + text-decoration: none; +} +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']) { + color: #222f3e; + cursor: pointer; +} +.tox .tox-statusbar__branding svg { + fill: rgba(34, 47, 62, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg { + fill: #222f3e; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #dee0e2; + border-radius: 1px 1px 5px 1px; + box-shadow: 0 0 0 2px #dee0e2; +} +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 28px; + justify-content: center; + margin: 6px 1px 5px 0; + outline: 0; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #222f3e; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #cce2fa; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #cce2fa; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:hover svg { + fill: #222f3e; +} +.tox .tox-tbtn:active { + background: #a6ccf7; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:active svg { + fill: #222f3e; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: 0 0; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #a6ccf7; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn--enabled:hover > *, +.tox .tox-tbtn--enabled > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + fill: #222f3e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #222f3e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #222f3e; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 42px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 56px; + width: 68px; +} +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: 400; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 6px 1px 5px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn--bespoke { + background: #f7f7f7; +} +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 4px; +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 6px 1px 5px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #cce2fa inset; +} +.tox .tox-split-button:focus { + background: #cce2fa; + box-shadow: none; + color: #222f3e; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled:hover { + background: 0 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} +.tox .tox-toolbar-overlord { + background-color: #fff; +} +.tox .tox-toolbar, +.tox .tox-toolbar__overflow, +.tox .tox-toolbar__primary { + background-color: #fff; + background-image: repeating-linear-gradient(#e3e3e3 0 1px, transparent 1px 39px); + background-position: center top 40px; + background-repeat: no-repeat; + background-size: calc(100% - 11px * 2) calc(100% - 41px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; + transform: perspective(1px); +} +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow, +.tox .tox-toolbar-overlord > .tox-toolbar__primary { + background-position: center top 0; + background-size: calc(100% - 11px * 2) calc(100% - 0px); +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid transparent; + margin-top: 0; + padding-bottom: 1px; + padding-top: 1px; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #fff; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 6px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + padding: 4px 0; +} +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 11px * 2) calc(100% - 51px); + padding: 4px 0; +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 11px 0 12px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid transparent; +} +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid transparent; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #222f3e; + border-radius: 6px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: 400; + padding: 4px 8px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #222f3e; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #222f3e; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #222f3e; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #222f3e; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #eee; + border-radius: 6px; + padding: 8px; + width: 100%; +} +.tox .tox-well > :first-child { + margin-top: 0; +} +.tox .tox-well > :last-child { + margin-bottom: 0; +} +.tox .tox-well > :only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #eee; + border-radius: 6px; + display: flex; + flex: 1; + position: relative; +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.css new file mode 100644 index 00000000..8bf192d2 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.css @@ -0,0 +1,35 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css new file mode 100644 index 00000000..c1141c55 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/oxide/skin.shadowdom.min.css @@ -0,0 +1,30 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.css new file mode 100644 index 00000000..ca33c5dc --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.css @@ -0,0 +1,848 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * Dracula Theme originally by Zeno Rocha [@zenorocha] + * https://draculatheme.com/ + * + * Ported for PrismJS by Albert Vallverdu [@byverdu] + */ +code[class*='language-'], +pre[class*='language-'] { + color: #f8f8f2; + background: none; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-radius: 0.3em; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #282a36; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #6272a4; +} + +.token.punctuation { + color: #f8f8f2; +} + +.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.constant, +.token.symbol, +.token.deleted { + color: #ff79c6; +} + +.token.boolean, +.token.number { + color: #bd93f9; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #50fa7b; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string, +.token.variable { + color: #f8f8f2; +} + +.token.atrule, +.token.attr-value, +.token.function, +.token.class-name { + color: #f1fa8c; +} + +.token.keyword { + color: #8be9fd; +} + +.token.regex, +.token.important { + color: #ffb86c; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #4099ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #4099ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #4099ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #4099ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #4099ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #4099ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #4099ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid transparent; + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: lighten; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #4099ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} + +body { + font-family: sans-serif; +} + +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css new file mode 100644 index 00000000..761b0a30 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.css @@ -0,0 +1,861 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*='language-'], +pre[class*='language-'] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css new file mode 100644 index 00000000..882dfd5b --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.inline.min.css @@ -0,0 +1,720 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: 0 0; + text-shadow: 0 1px #fff; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +code[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +pre[class*='language-']::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +code[class*='language-'] ::selection, +code[class*='language-']::selection, +pre[class*='language-'] ::selection, +pre[class*='language-']::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #708090; +} +.token.punctuation { + color: #999; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.constant, +.token.deleted, +.token.number, +.token.property, +.token.symbol, +.token.tag { + color: #905; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #690; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.class-name, +.token.function { + color: #dd4a68; +} +.token.important, +.token.regex, +.token.variable { + color: #e90; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.min.css new file mode 100644 index 00000000..04195ea7 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/content.min.css @@ -0,0 +1,707 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%236d737b%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #f8f8f2; + background: 0 0; + text-shadow: 0 1px rgba(0, 0, 0, 0.3); + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; + border-radius: 0.3em; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #282a36; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #6272a4; +} +.token.punctuation { + color: #f8f8f2; +} +.namespace { + opacity: 0.7; +} +.token.constant, +.token.deleted, +.token.property, +.token.symbol, +.token.tag { + color: #ff79c6; +} +.token.boolean, +.token.number { + color: #bd93f9; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #50fa7b; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url, +.token.variable { + color: #f8f8f2; +} +.token.atrule, +.token.attr-value, +.token.class-name, +.token.function { + color: #f1fa8c; +} +.token.keyword { + color: #8be9fd; +} +.token.important, +.token.regex { + color: #ffb86c; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%20fill%3D%22%23cccccc%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #4099ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #4099ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #4099ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #4099ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #4099ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #4099ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #4099ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid transparent; + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: lighten; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #4099ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.css new file mode 100644 index 00000000..67f5befd --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.css @@ -0,0 +1,3764 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #2a3746; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} + +.tox *:not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} + +.tox *:not(svg):not(rect) { + /* stylelint-disable-line no-duplicate-selectors */ + background: transparent; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} + +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} + +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} + +.tox-tinymce { + border: 1px solid #000000; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} + +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #222f3e; + border: 1px solid #000000; + border-radius: 0; + box-shadow: none; + overflow: hidden; +} + +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} + +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} + +button::-moz-focus-inner { + border: 0; +} + +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} + +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #000000; + border-radius: 3px; + display: flex; + justify-content: space-between; +} + +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} + +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #000000; + border-style: solid; +} + +.tox .accessibility-issue__repair { + margin-top: 16px; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(32, 122, 183, 0.5); + border-color: #207ab7; + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: #207ab7; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.5); + border-color: rgba(255, 165, 0, 0.8); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.8); +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.5); + border-color: rgba(204, 0, 0, 0.8); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.8); +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.5); + border-color: rgba(120, 171, 70, 0.8); + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.8); +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #fff; +} + +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 4px; +} + +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-button { + background-color: #207ab7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #207ab7; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-button[disabled] { + background-color: #207ab7; + background-image: none; + border-color: #207ab7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-button:focus:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:hover:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:active:not(:disabled) { + background-color: #185d8c; + background-image: none; + border-color: #185d8c; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary { + background-color: #3d546f; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #3d546f; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} + +.tox .tox-button--secondary[disabled] { + background-color: #3d546f; + background-image: none; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} + +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #2b3b4e; + background-image: none; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} + +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} + +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.tox .tox-button-link--sm { + font-size: 14px; +} + +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #fff; +} + +.tox .tox-button--naked[disabled] { + background-color: #3d546f; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} + +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #34485f; + border-color: #34485f; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #34485f; + border-color: #34485f; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--naked:active:not(:disabled) { + background-color: #2b3b4e; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} + +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #fff; +} + +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} + +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} + +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(255, 255, 255, 0.2); +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #207ab7; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #207ab7; +} + +.tox .tox-checkbox--disabled { + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} + +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #207ab7; + padding: calc(4px - 1px); +} + +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} + +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} + +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} + +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} + +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} + +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #1a1a1a; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} + +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} + +.tox .tox-collection__group-heading { + background-color: #333333; + color: #fff; + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #fff; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} + +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #2b3b4e; + color: #fff; +} + +.tox .tox-collection--list .tox-collection__item--active { + background-color: #4a5562; +} + +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #757d87; + color: #fff; +} + +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #4a5562; +} + +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #757d87; + color: #fff; +} + +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #4a5562; + color: #fff; +} + +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} + +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} + +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} + +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} + +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} + +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} + +.tox .tox-collection__item-accessory { + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} + +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} + +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} + +.tox .tox-collection__item-caret svg { + fill: #fff; +} + +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-checkmark +svg { + display: none; +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-accessory ++ .tox-collection__item-checkmark { + display: none; +} + +.tox .tox-collection--horizontal { + background-color: #2b3b4e; + border: 1px solid #1a1a1a; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} + +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 3px 0 2px 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} + +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} + +.tox .tox-collection__item-container { + display: flex; +} + +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} + +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} + +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #000000; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} + +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #000000; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} + +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} + +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} + +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} + +.tox .tox-sv-palette-spectrum { + height: 100%; +} + +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} + +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} + +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} + +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} + +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + #f00, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + #f00 + ); + height: 100%; + width: 100%; +} + +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} + +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} + +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} + +.tox .tox-rgb-form input { + width: 6em; +} + +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} + +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} + +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} + +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} + +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} + +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} + +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 2px 0 3px 4px; +} + +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px 0; +} + +.tox .tox-swatches__row { + display: flex; +} + +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} + +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} + +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} + +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} + +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} + +.tox .tox-swatches__picker-btn svg { + fill: #fff; + height: 24px; + width: 24px; +} + +.tox .tox-swatches__picker-btn:hover { + background: #4a5562; +} + +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} + +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} + +.tox .tox-comment-thread { + background: #2b3b4e; + position: relative; +} + +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} + +.tox .tox-comment { + background: #2b3b4e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} + +.tox .tox-comment__header { + align-items: center; + color: #fff; + display: flex; + justify-content: space-between; +} + +.tox .tox-comment__date { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; +} + +.tox .tox-comment__body { + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} + +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} + +.tox .tox-comment__expander { + padding-top: 8px; +} + +.tox .tox-comment__expander p { + color: rgba(255, 255, 255, 0.5); + font-size: 14px; + font-style: normal; +} + +.tox .tox-comment__body p { + margin: 0; +} + +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} + +.tox .tox-comment-thread__overlay::after { + background: #2b3b4e; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} + +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} + +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} + +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} + +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} + +.tox .tox-comment__overlay { + background: #2b3b4e; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} + +.tox .tox-comment__loading-text { + align-items: center; + color: #fff; + display: flex; + flex-direction: column; + position: relative; +} + +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} + +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} + +.tox .tox-comment__overlaytext p { + background-color: #2b3b4e; + box-shadow: 0 0 8px 8px #2b3b4e; + color: #fff; + text-align: center; +} + +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} + +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #2b3b4e; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} + +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} + +.tox .tox-conversations { + margin: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir='rtl']) .tox-comment__edit > *:last-child, +.tox:not([dir='rtl']) .tox-comment__reply > *:last-child { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-comment__buttonspacing > *:last-child, +.tox[dir='rtl'] .tox-comment__edit > *:last-child, +.tox[dir='rtl'] .tox-comment__reply > *:last-child { + margin-right: 8px; +} + +.tox .tox-user { + align-items: center; + display: flex; +} + +.tox .tox-user__avatar svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-user__name { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} + +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} + +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} + +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} + +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} + +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #222f3e; +} + +.tox .tox-dialog { + background-color: #2b3b4e; + border-color: #000000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(42, 55, 70, 0.15), 0 0 40px 1px rgba(42, 55, 70, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} + +.tox .tox-dialog-inline { + z-index: 1100; +} + +.tox .tox-dialog__header { + align-items: center; + background-color: #2b3b4e; + border-bottom: none; + color: #fff; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} + +.tox .tox-dialog__header .tox-button { + z-index: 1; +} + +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} + +.tox .tox-dialog__dismiss { + margin-left: auto; +} + +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} + +.tox .tox-dialog__body { + color: #fff; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} + +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} + +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} + +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(32, 122, 183, 0.1); +} + +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #207ab7; + color: #207ab7; +} + +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} + +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} + +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog__body-content a { + color: #207ab7; + cursor: pointer; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #185d8c; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:active { + color: #185d8c; + text-decoration: none; +} + +.tox .tox-dialog__body-content svg { + fill: #fff; +} + +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} + +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #fff; + font-size: 20px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #fff; + font-size: 16px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} + +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} + +.tox .tox-dialog--width-md { + max-width: 800px; +} + +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} + +.tox .tox-dialog__body-content--centered { + text-align: center; +} + +.tox .tox-dialog__footer { + align-items: center; + background-color: #2b3b4e; + border-top: 1px solid #000000; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} + +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} + +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} + +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} + +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} + +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #000000; +} + +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} + +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} + +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} + +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} + +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} + +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} + +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 8px; +} + +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} + +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #000000; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} + +.tox .tox-dropzone p { + color: rgba(255, 255, 255, 0.5); + margin: 0 0 16px 0; +} + +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} + +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} + +.tox.tox-inline-edit-area { + border: 1px dotted #000000; +} + +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} + +.tox .tox-editor-header { + z-index: 1; +} + +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #222f3e; + border-bottom: none; + box-shadow: none; + padding: 4px 0; + transition: box-shadow 0.5s; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid #000000; + box-shadow: none; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #222f3e; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 4px 0; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} + +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} + +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} + +.tox .tox-control-wrap { + flex: 1; + position: relative; +} + +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} + +.tox .tox-control-wrap svg { + display: block; +} + +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} + +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} + +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} + +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} + +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} + +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} + +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} + +.tox .tox-autocompleter { + max-width: 25em; +} + +.tox .tox-autocompleter .tox-menu { + border-color: #000000; + box-shadow: none; + max-width: 25em; +} + +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: bold; +} + +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} + +.tox .tox-color-input .tox-textfield { + z-index: -1; +} + +.tox .tox-color-input span { + border-color: rgba(42, 55, 70, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} + +.tox .tox-color-input span:hover:not([aria-disabled='true']), +.tox .tox-color-input span:focus:not([aria-disabled='true']) { + border-color: #207ab7; + cursor: pointer; +} + +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #2b3b4e; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} + +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} + +.tox:not([dir='rtl']) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} + +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} + +.tox[dir='rtl'] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} + +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} + +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(255, 255, 255, 0.5); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-toolbar-label { + padding: 0 8px; +} + +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} + +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} + +.tox .tox-form-group--maximize { + flex: 1; +} + +.tox .tox-form__group--error { + color: #c00; +} + +.tox .tox-form__group--collection { + display: flex; +} + +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} + +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} + +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} + +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} + +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} + +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} + +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox:not([dir='rtl']) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} + +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #000000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} + +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #222f3e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} + +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #2b3b4e; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} + +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} + +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #207ab7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} + +.tox .tox-naked-btn svg { + display: block; + fill: #fff; +} + +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} + +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} + +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} + +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} + +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-listbox__select-chevron svg { + fill: #fff; +} + +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} + +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} + +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} + +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #000000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} + +.tox .tox-selectfield select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} + +.tox .tox-selectfield select::-ms-expand { + display: none; +} + +.tox .tox-selectfield select:focus { + background-color: #2b3b4e; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} + +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} + +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} + +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} + +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} + +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} + +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} + +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} + +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} + +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} + +.tox .tox-image-tools .tox-spacer { + flex: 1; +} + +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} + +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} + +.tox .tox-image-tools .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} + +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} + +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} + +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} + +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} + +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} + +.tox .tox-insert-table-picker > div { + border-color: #000000; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: 0 -4px; +} + +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(32, 122, 183, 0.5); + border-color: rgba(32, 122, 183, 0.5); +} + +.tox .tox-insert-table-picker__label { + color: #fff; + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} + +.tox:not([dir='rtl']) { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} + +.tox[dir='rtl'] { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} + +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} + +.tox .tox-menu { + background-color: #2b3b4e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} + +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 0; +} + +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} + +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} + +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} + +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0 #222f3e; + background-color: #222f3e; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} + +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #000000; +} + +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} + +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-mbtn:focus:not(:disabled) { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-mbtn--active { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} + +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} + +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: normal; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} + +.tox .tox-notification p { + font-size: 14px; + font-weight: normal; +} + +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} + +.tox .tox-notification--in { + opacity: 1; +} + +.tox .tox-notification--success { + background-color: #334840; + border-color: #3c5440; + color: #fff; +} + +.tox .tox-notification--success p { + color: #fff; +} + +.tox .tox-notification--success a { + color: #b5d199; +} + +.tox .tox-notification--success svg { + fill: #fff; +} + +.tox .tox-notification--error { + background-color: #442632; + border-color: #55212b; + color: #fff; +} + +.tox .tox-notification--error p { + color: #fff; +} + +.tox .tox-notification--error a { + color: #e68080; +} + +.tox .tox-notification--error svg { + fill: #fff; +} + +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #222f3e; + border-color: #000000; + color: #fff0b3; +} + +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #fff0b3; +} + +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #ffcc00; +} + +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #fff0b3; +} + +.tox .tox-notification--info { + background-color: #254161; + border-color: #264972; + color: #fff; +} + +.tox .tox-notification--info p { + color: #fff; +} + +.tox .tox-notification--info a { + color: #83b7f3; +} + +.tox .tox-notification--info svg { + fill: #fff; +} + +.tox .tox-notification__body { + align-self: center; + color: #fff; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} + +.tox .tox-notification__body > * { + margin: 0; +} + +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} + +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification__icon svg { + display: block; +} + +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} + +.tox .tox-pop { + display: inline-block; + position: relative; +} + +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} + +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} + +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} + +.tox .tox-pop--transition::before, +.tox .tox-pop--transition::after { + transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s; +} + +.tox .tox-pop__dialog { + background-color: #222f3e; + border: 1px solid #000000; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15); + min-width: 0; + overflow: hidden; +} + +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} + +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} + +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} + +.tox .tox-pop.tox-pop--inset::before, +.tox .tox-pop.tox-pop--inset::after { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease; +} + +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} + +.tox .tox-pop.tox-pop--bottom::after { + border-color: #222f3e transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} + +.tox .tox-pop.tox-pop--bottom::before { + border-color: #000000 transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} + +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #222f3e transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} + +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #000000 transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #222f3e transparent transparent; + border-width: 8px; + margin-left: -15px; +} + +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #000000 transparent transparent; + border-width: 10px; + margin-left: -19px; +} + +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #222f3e; + border-width: 8px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #000000; + border-width: 10px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} + +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} + +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} + +.tox .tox-sidebar { + background-color: #222f3e; + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} + +.tox .tox-sidebar__pane-container { + display: flex; +} + +.tox .tox-sidebar__pane { + display: flex; +} + +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} + +.tox .tox-sidebar--sliding-open { + opacity: 1; +} + +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} + +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} + +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} + +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} + +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #000000; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} + +.tox .tox-slider__handle { + background-color: #207ab7; + border: 2px solid #185d8c; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} + +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} + +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} + +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} + +.tox .tox-source-code { + overflow: auto; +} + +.tox .tox-spinner { + display: flex; +} + +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 100%; + height: 8px; + width: 8px; +} + +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} + +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} + +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} + +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-statusbar { + align-items: center; + background-color: #222f3e; + border-top: 1px solid #000000; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: normal; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} + +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} + +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} + +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} + +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: #fff; + text-decoration: none; +} + +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']) { + color: #fff; + cursor: pointer; +} + +.tox .tox-statusbar__branding svg { + fill: rgba(255, 255, 255, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} + +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg { + fill: #fff; +} + +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} + +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #4a5562; + border-radius: 1px 1px -4px 1px; + box-shadow: 0 0 0 2px #4a5562; +} + +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} + +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} + +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} + +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} + +.tox .tox-throbber { + z-index: 1299; +} + +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 3px 0 2px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} + +.tox .tox-tbtn svg { + display: block; + fill: #fff; +} + +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} + +.tox .tox-tbtn:focus { + background: #4a5562; + border: 0; + box-shadow: none; +} + +.tox .tox-tbtn:hover { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-tbtn:hover svg { + fill: #fff; +} + +.tox .tox-tbtn:active { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-tbtn:active svg { + fill: #fff; +} + +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} + +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} + +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: #fff; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #fff; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #fff; +} + +.tox .tox-tbtn:active > * { + transform: none; +} + +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} + +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} + +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} + +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} + +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} + +.tox .tox-tbtn--select { + margin: 3px 0 2px 0; + padding: 0 4px; + width: auto; +} + +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-tbtn__select-chevron svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-tbtn--bespoke { + background: transparent; +} + +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 0; +} + +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} + +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 3px 0 2px 0; + overflow: hidden; +} + +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #4a5562 inset; +} + +.tox .tox-split-button:focus { + background: #4a5562; + box-shadow: none; + color: #fff; +} + +.tox .tox-split-button > * { + border-radius: 0; +} + +.tox .tox-split-button__chevron { + width: 16px; +} + +.tox .tox-split-button__chevron svg { + fill: rgba(255, 255, 255, 0.5); +} + +.tox .tox-split-button .tox-tbtn { + margin: 0; +} + +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0px; +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} + +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} + +.tox .tox-toolbar-overlord { + background-color: #222f3e; +} + +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background-color: #222f3e; + background-image: repeating-linear-gradient(#000000 0px 1px, transparent 1px 39px); + background-position: center top 39px; + background-repeat: no-repeat; + background-size: calc(100% - 4px * 2) calc(100% - 39px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0px; + transform: perspective(1px); +} + +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__primary, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow { + background-position: center top 0px; + background-size: calc(100% - 4px * 2) calc(100% - 0px); +} + +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} + +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} + +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} + +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid #000000; + margin-top: 0; + padding-bottom: 0px; + padding-top: 0px; +} + +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} + +.tox .tox-pop .tox-toolbar { + border-width: 0; +} + +.tox .tox-toolbar--no-divider { + background-image: none; +} + +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} + +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #222f3e; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15); + padding: 4px 0; +} + +.tox-pop .tox-pop__dialog { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 4px * 2) calc(100% - 51px); + padding: 4px 0; +} + +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} + +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} + +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} + +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #000000; +} + +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #000000; +} + +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} + +.tox .tox-tooltip__body { + background-color: #3d546f; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(42, 55, 70, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: none; +} + +.tox .tox-tooltip__arrow { + position: absolute; +} + +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #3d546f; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} + +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #3d546f; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} + +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #3d546f; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #3d546f; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-well { + border: 1px solid #000000; + border-radius: 3px; + padding: 8px; + width: 100%; +} + +.tox .tox-well > *:first-child { + margin-top: 0; +} + +.tox .tox-well > *:last-child { + margin-bottom: 0; +} + +.tox .tox-well > *:only-child { + margin: 0; +} + +.tox .tox-custom-editor { + border: 1px solid #000000; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} + +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} + +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} + +.tox .tox-tab { + cursor: pointer; +} + +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} + +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: none; + padding: 0; +} + +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: none; + box-shadow: none; +} + +.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 0; +} + +.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} + +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} + +.tox .tox-pop { + box-shadow: none; +} + +.tox .tox-tbtn, +.tox .tox-tbtn--select, +.tox .tox-split-button { + margin: 2px 0 3px 0; +} + +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") left 0 top 0px #222f3e !important; +} + +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: none; +} + +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #000000; + margin-top: -1px; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + border: 1px solid #000000; + padding: 0; +} + +.tox:not(.tox-tinymce-inline) +.tox-editor-header:not(:first-child) +.tox-toolbar-overlord:first-child +.tox-toolbar__primary, +.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child { + border-top: 1px solid #000000; +} + +.tox .tox-toolbar__group { + padding: 0 4px 0 4px; +} + +.tox .tox-collection__item { + border-radius: 0; + cursor: pointer; +} + +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']) { + color: #fff; + text-decoration: underline; +} + +.tox .tox-statusbar__branding svg { + vertical-align: -0.25em; +} + +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 1ch; +} + +.tox .tox-statusbar__resize-handle { + padding-bottom: 0; + padding-right: 0; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css new file mode 100644 index 00000000..e38e829e --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.min.css @@ -0,0 +1,3125 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #2a3746; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} +.tox :not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} +.tox :not(svg):not(rect) { + background: 0 0; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} +.tox-tinymce { + border: 1px solid #000; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #222f3e; + border: 1px solid #000; + border-radius: 0; + box-shadow: none; + overflow: hidden; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} +.tox-tinymce :focus, +.tox-tinymce-aux :focus { + outline: 0; +} +button::-moz-focus-inner { + border: 0; +} +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #000; + border-radius: 3px; + display: flex; + justify-content: space-between; +} +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description > :last-child:not(:only-child) { + border-color: #000; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(32, 122, 183, 0.5); + border-color: #207ab7; + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > :last-child { + border-color: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.5); + border-color: rgba(255, 165, 0, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > :last-child { + border-color: rgba(255, 165, 0, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.5); + border-color: rgba(204, 0, 0, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > :last-child { + border-color: rgba(204, 0, 0, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.5); + border-color: rgba(120, 171, 70, 0.8); + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > :last-child { + border-color: rgba(120, 171, 70, 0.8); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #fff; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-left-width: 1px; + padding-left: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-right: auto; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-right-width: 1px; + padding-right: 4px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #207ab7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #207ab7; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: 0; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #207ab7; + background-image: none; + border-color: #207ab7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #185d8c; + background-image: none; + border-color: #185d8c; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #3d546f; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #3d546f; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + outline: 0; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #3d546f; + background-image: none; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #34485f; + background-image: none; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #2b3b4e; + background-image: none; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #fff; +} +.tox .tox-button--naked[disabled] { + background-color: #3d546f; + border-color: #3d546f; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #34485f; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #34485f; + border-color: #34485f; + box-shadow: none; + color: #fff; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: #2b3b4e; + border-color: #2b3b4e; + box-shadow: none; + color: #fff; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #fff; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(255, 255, 255, 0.2); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox--disabled { + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #207ab7; + padding: calc(4px - 1px); +} +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #1a1a1a; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #333; + color: #fff; + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: 400; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #fff; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #2b3b4e; + color: #fff; +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #4a5562; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #757d87; + color: #fff; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #4a5562; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #757d87; + color: #fff; +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #4a5562; + color: #fff; +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #fff; +} +.tox .tox-collection__item-checkmark, +.tox .tox-collection__item-icon { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-checkmark svg, +.tox .tox-collection__item-icon svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: #fff; +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-checkmark + svg { + display: none; +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-accessory + + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #2b3b4e; + border: 1px solid #1a1a1a; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 3px 0 2px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #000; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #000; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: 0 0; + border: 1px solid #000; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid #fff; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + red, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + red + ); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: #fff; + border: 1px solid #000; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid #000; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches { + margin: 2px 0 3px 4px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px 0; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:focus, +.tox .tox-swatch:hover { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: 0; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + fill: #fff; + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #4a5562; +} +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #2b3b4e; + position: relative; +} +.tox .tox-comment-thread > :not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #2b3b4e; + border: 1px solid #000; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #fff; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; +} +.tox .tox-comment__body { + color: #fff; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(255, 255, 255, 0.5); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #2b3b4e; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > :first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(43, 59, 78, 0), #2b3b4e); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #2b3b4e; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #fff; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #2b3b4e; + box-shadow: 0 0 8px 8px #2b3b4e; + color: #fff; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #2b3b4e; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-comment__buttonspacing > :last-child, +.tox:not([dir='rtl']) .tox-comment__edit > :last-child, +.tox:not([dir='rtl']) .tox-comment__reply > :last-child { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-comment__buttonspacing > :last-child, +.tox[dir='rtl'] .tox-comment__edit > :last-child, +.tox[dir='rtl'] .tox-comment__reply > :last-child { + margin-right: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-user__name { + color: rgba(255, 255, 255, 0.5); + font-size: 12px; + font-style: normal; + font-weight: 700; + text-transform: uppercase; +} +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #222f3e; +} +.tox .tox-dialog { + background-color: #2b3b4e; + border-color: #000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(42, 55, 70, 0.15), 0 0 40px 1px rgba(42, 55, 70, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #2b3b4e; + border-bottom: none; + color: #fff; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: #fff; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(255, 255, 255, 0.5); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(32, 122, 183, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #207ab7; + color: #207ab7; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > :first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > :last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > :only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #207ab7; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:focus, +.tox .tox-dialog__body-content a:hover { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: #fff; +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #fff; + font-size: 20px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #fff; + font-size: 16px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #2b3b4e; + border-top: 1px solid #000; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} +.tox .tox-dialog__footer-end, +.tox .tox-dialog__footer-start { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: 700; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #000; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > * { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > * { + margin-right: 8px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #000; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(255, 255, 255, 0.5); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #000; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #222f3e; + border-bottom: none; + box-shadow: none; + padding: 4px 0; + transition: box-shadow 0.5s; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid #000; + box-shadow: none; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #222f3e; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 4px 0; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + border-color: #000; + box-shadow: none; + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: 700; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(42, 55, 70, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:focus:not([aria-disabled='true']), +.tox .tox-color-input span:hover:not([aria-disabled='true']) { + border-color: #207ab7; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(255, 255, 255, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(255, 255, 255, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #2b3b4e; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(255, 255, 255, 0.5); + display: block; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox:not([dir='rtl']) .tox-form__controls-h-stack > :not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-form__controls-h-stack > :not(:first-child) { + margin-right: 4px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea, +.tox .tox-textfield, +.tox .tox-toolbar-textfield { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-textarea[disabled], +.tox .tox-textfield[disabled] { + background-color: #222f3e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus, +.tox .tox-textfield:focus { + background-color: #2b3b4e; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #207ab7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #fff; +} +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-listbox__select-chevron svg { + fill: #fff; +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #2b3b4e; + border-color: #000; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #19232e; + color: rgba(255, 255, 255, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #2b3b4e; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools .tox-spacer { + flex: 1; +} +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} +.tox .tox-image-tools .tox-croprect-block { + background: #000; + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid #fff; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} +.tox .tox-insert-table-picker > div { + border-color: #000; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: 0 -4px; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(32, 122, 183, 0.5); + border-color: rgba(32, 122, 183, 0.5); +} +.tox .tox-insert-table-picker__label { + color: #fff; + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} +.tox .tox-menu { + background-color: #2b3b4e; + border: 1px solid #000; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(42, 55, 70, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 0; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code, +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") + left 0 top 0 #222f3e; + background-color: #222f3e; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #000; +} +.tox .tox-mbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: 0; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn--active { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: 400; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 0.1s ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 14px; + font-weight: 400; +} +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #334840; + border-color: #3c5440; + color: #fff; +} +.tox .tox-notification--success p { + color: #fff; +} +.tox .tox-notification--success a { + color: #b5d199; +} +.tox .tox-notification--success svg { + fill: #fff; +} +.tox .tox-notification--error { + background-color: #442632; + border-color: #55212b; + color: #fff; +} +.tox .tox-notification--error p { + color: #fff; +} +.tox .tox-notification--error a { + color: #e68080; +} +.tox .tox-notification--error svg { + fill: #fff; +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #222f3e; + border-color: #000; + color: #fff0b3; +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #fff0b3; +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #fc0; +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #fff0b3; +} +.tox .tox-notification--info { + background-color: #254161; + border-color: #264972; + color: #fff; +} +.tox .tox-notification--info p { + color: #fff; +} +.tox .tox-notification--info a { + color: #83b7f3; +} +.tox .tox-notification--info svg { + fill: #fff; +} +.tox .tox-notification__body { + align-self: center; + color: #fff; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} +.tox .tox-pop--transition::after, +.tox .tox-pop--transition::before { + transition: all 0.15s, visibility 0s, opacity 75ms ease 75ms; +} +.tox .tox-pop__dialog { + background-color: #222f3e; + border: 1px solid #000; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > :not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::after, +.tox .tox-pop::before { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--inset::after, +.tox .tox-pop.tox-pop--inset::before { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 75ms ease; +} +.tox .tox-pop.tox-pop--bottom::after, +.tox .tox-pop.tox-pop--bottom::before { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #222f3e transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #000 transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::after, +.tox .tox-pop.tox-pop--top::before { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #222f3e transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #000 transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::after, +.tox .tox-pop.tox-pop--left::before { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #222f3e transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #000 transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::after, +.tox .tox-pop.tox-pop--right::before { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #222f3e; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #000; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::after, +.tox .tox-pop.tox-pop--align-left::before { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::after, +.tox .tox-pop.tox-pop--align-right::before { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #222f3e; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #000; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #207ab7; + border: 2px solid #185d8c; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(255, 255, 255, 0.5); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 100%, + 80% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #222f3e; + border-top: 1px solid #000; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: 400; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: #fff; + text-decoration: none; +} +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']) { + color: #fff; + cursor: pointer; +} +.tox .tox-statusbar__branding svg { + fill: rgba(255, 255, 255, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg { + fill: #fff; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #4a5562; + border-radius: 1px 1px -4px 1px; + box-shadow: 0 0 0 2px #4a5562; +} +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(34, 47, 62, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #fff; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 34px; + justify-content: center; + margin: 3px 0 2px 0; + outline: 0; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #fff; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #4a5562; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #4a5562; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn:hover svg { + fill: #fff; +} +.tox .tox-tbtn:active { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn:active svg { + fill: #fff; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: 0 0; + border: 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #757d87; + border: 0; + box-shadow: none; + color: #fff; +} +.tox .tox-tbtn--enabled:hover > *, +.tox .tox-tbtn--enabled > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + fill: #fff; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #fff; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #fff; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: 400; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 3px 0 2px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-tbtn--bespoke { + background: 0 0; +} +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 0; +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 3px 0 2px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #4a5562 inset; +} +.tox .tox-split-button:focus { + background: #4a5562; + box-shadow: none; + color: #fff; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(255, 255, 255, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled:hover { + background: 0 0; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} +.tox .tox-toolbar-overlord { + background-color: #222f3e; +} +.tox .tox-toolbar, +.tox .tox-toolbar__overflow, +.tox .tox-toolbar__primary { + background-color: #222f3e; + background-image: repeating-linear-gradient(#000 0 1px, transparent 1px 39px); + background-position: center top 39px; + background-repeat: no-repeat; + background-size: calc(100% - 4px * 2) calc(100% - 39px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; + transform: perspective(1px); +} +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow, +.tox .tox-toolbar-overlord > .tox-toolbar__primary { + background-position: center top 0; + background-size: calc(100% - 4px * 2) calc(100% - 0px); +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid #000; + margin-top: 0; + padding-bottom: 0; + padding-top: 0; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #222f3e; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(42, 55, 70, 0.2), 0 4px 8px 0 rgba(42, 55, 70, 0.15); + padding: 4px 0; +} +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 4px * 2) calc(100% - 51px); + padding: 4px 0; +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #000; +} +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #000; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #3d546f; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(42, 55, 70, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: 400; + padding: 4px 8px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #3d546f; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #3d546f; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #3d546f; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #3d546f; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #000; + border-radius: 3px; + padding: 8px; + width: 100%; +} +.tox .tox-well > :first-child { + margin-top: 0; +} +.tox .tox-well > :last-child { + margin-bottom: 0; +} +.tox .tox-well > :only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #000; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: none; + padding: 0; +} +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: none; + box-shadow: none; +} +.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 0; +} +.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} +.tox .tox-pop { + box-shadow: none; +} +.tox .tox-split-button, +.tox .tox-tbtn, +.tox .tox-tbtn--select { + margin: 2px 0 3px 0; +} +.tox .tox-toolbar, +.tox .tox-toolbar__overflow, +.tox .tox-toolbar__primary { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23000000'/%3E%3C/svg%3E") + left 0 top 0 #222f3e !important; +} +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: none; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #000; + margin-top: -1px; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + border: 1px solid #000; + padding: 0; +} +.tox:not(.tox-tinymce-inline) + .tox-editor-header:not(:first-child) + .tox-toolbar-overlord:first-child + .tox-toolbar__primary, +.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child { + border-top: 1px solid #000; +} +.tox .tox-toolbar__group { + padding: 0 4px 0 4px; +} +.tox .tox-collection__item { + border-radius: 0; + cursor: pointer; +} +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']) { + color: #fff; + text-decoration: underline; +} +.tox .tox-statusbar__branding svg { + vertical-align: -0.25em; +} +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 1ch; +} +.tox .tox-statusbar__resize-handle { + padding-bottom: 0; + padding-right: 0; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css new file mode 100644 index 00000000..8bf192d2 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.css @@ -0,0 +1,35 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css new file mode 100644 index 00000000..c1141c55 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5-dark/skin.shadowdom.min.css @@ -0,0 +1,30 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.css new file mode 100644 index 00000000..b81f358d --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.css @@ -0,0 +1,869 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*='language-'], +pre[class*='language-'] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} + +body { + font-family: sans-serif; +} + +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.css new file mode 100644 index 00000000..e7acef31 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.css @@ -0,0 +1,861 @@ +.mce-content-body .mce-item-anchor { + background: transparent url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") no-repeat center; +} + +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} + +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} + +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} + +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} + +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} + +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} + +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} + +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} + +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} + +/* stylelint-disable */ +/* http://prismjs.com/ */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*='language-'], +pre[class*='language-'] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} + +pre[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +code[class*='language-'] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*='language-']::selection, +pre[class*='language-'] ::selection, +code[class*='language-']::selection, +code[class*='language-'] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} + +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + /* This background color was intended by the author of this theme. */ + background: hsla(0, 0%, 100%, 0.5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #dd4a68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +/* stylelint-enable */ +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} + +.mce-content-body .mce-visual-caret { + background-color: black; + background-color: currentColor; + position: absolute; +} + +.mce-content-body .mce-visual-caret-hidden { + display: none; +} + +.mce-content-body *[data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} + +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} + +.mce-content-body *[contentEditable='false'] { + cursor: default; +} + +.mce-content-body *[contentEditable='true'] { + cursor: text; +} + +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} + +.mce-content-body figure.align-left { + float: left; +} + +.mce-content-body figure.align-right { + float: right; +} + +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} + +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} + +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} + +.mce-object { + background: transparent url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') no-repeat center; + border: 1px dashed #aaa; +} + +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} + +@media print { + .mce-pagebreak { + border: 0; + } +} + +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} + +.tiny-pageembed { + display: inline-block; + position: relative; +} + +.tiny-pageembed--21by9, +.tiny-pageembed--16by9, +.tiny-pageembed--4by3, +.tiny-pageembed--1by1 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} + +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} + +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} + +.tiny-pageembed--4by3 { + padding-top: 75%; +} + +.tiny-pageembed--1by1 { + padding-top: 100%; +} + +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--4by3 iframe, +.tiny-pageembed--1by1 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.mce-content-body[data-mce-placeholder] { + position: relative; +} + +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} + +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} + +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} + +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} + +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} + +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} + +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} + +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed black; + position: absolute; + z-index: 10001; +} + +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td { + border: 0; +} + +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: white; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} + +.tox-rtc-user-selection { + position: relative; +} + +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} + +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} + +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: bold; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} + +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} + +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} + +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} + +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} + +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} + +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} + +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} + +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} + +.tox-rtc-remote-image { + background: #eaeaea url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} + +.mce-match-marker { + background: #aaa; + color: #fff; +} + +.mce-match-marker-selected { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} + +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} + +.mce-content-body img[data-mce-selected], +.mce-content-body video[data-mce-selected], +.mce-content-body audio[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body table[data-mce-selected] { + outline: 3px solid #b4d7ff; +} + +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'] *[contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} + +.mce-content-body *[contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} + +.mce-content-body.mce-content-readonly *[contentEditable='true']:focus, +.mce-content-body.mce-content-readonly *[contentEditable='true']:hover { + outline: none; +} + +.mce-content-body *[data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} + +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} + +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} + +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: none; +} + +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: none; +} + +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} + +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} + +.mce-content-body img::-moz-selection { + background: none; +} + +.mce-content-body img::selection { + background: none; +} + +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.ephox-snooker-resizer-cols { + cursor: col-resize; +} + +.ephox-snooker-resizer-rows { + cursor: row-resize; +} + +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} + +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} + +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} + +.mce-toc { + border: 1px solid gray; +} + +.mce-toc h2 { + margin: 4px; +} + +.mce-toc li { + list-style-type: none; +} + +table[style*='border-width: 0px'], +.mce-item-table:not([border]), +.mce-item-table[border='0'], +table[style*='border-width: 0px'] td, +.mce-item-table:not([border]) td, +.mce-item-table[border='0'] td, +table[style*='border-width: 0px'] th, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'] caption, +.mce-item-table:not([border]) caption, +.mce-item-table[border='0'] caption { + border: 1px dashed #bbb; +} + +.mce-visualblocks p, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks section, +.mce-visualblocks article, +.mce-visualblocks blockquote, +.mce-visualblocks address, +.mce-visualblocks pre, +.mce-visualblocks figure, +.mce-visualblocks figcaption, +.mce-visualblocks hgroup, +.mce-visualblocks aside, +.mce-visualblocks ul, +.mce-visualblocks ol, +.mce-visualblocks dl { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} + +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} + +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} + +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} + +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} + +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} + +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} + +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} + +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} + +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} + +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} + +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} + +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} + +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} + +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} + +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} + +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} + +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} + +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} + +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} + +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} + +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) ul, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) dl { + margin-left: 3px; +} + +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] ul, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] dl { + background-position-x: right; + margin-right: 3px; +} + +.mce-nbsp, +.mce-shy { + background: #aaa; +} + +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.min.css new file mode 100644 index 00000000..882dfd5b --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.inline.min.css @@ -0,0 +1,720 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: 0 0; + text-shadow: 0 1px #fff; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +code[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +pre[class*='language-']::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +code[class*='language-'] ::selection, +code[class*='language-']::selection, +pre[class*='language-'] ::selection, +pre[class*='language-']::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #708090; +} +.token.punctuation { + color: #999; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.constant, +.token.deleted, +.token.number, +.token.property, +.token.symbol, +.token.tag { + color: #905; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #690; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.class-name, +.token.function { + color: #dd4a68; +} +.token.important, +.token.regex, +.token.variable { + color: #e90; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.min.css new file mode 100644 index 00000000..6e0034ba --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/content.min.css @@ -0,0 +1,726 @@ +.mce-content-body .mce-item-anchor { + background: transparent + url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'8'%20height%3D'12'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20d%3D'M0%200L8%200%208%2012%204.09117821%209%200%2012z'%2F%3E%3C%2Fsvg%3E%0A") + no-repeat center; +} +.mce-content-body .mce-item-anchor:empty { + cursor: default; + display: inline-block; + height: 12px !important; + padding: 0 2px; + -webkit-user-modify: read-only; + -moz-user-modify: read-only; + -webkit-user-select: all; + -moz-user-select: all; + user-select: all; + width: 8px !important; +} +.mce-content-body .mce-item-anchor:not(:empty) { + background-position-x: 2px; + display: inline-block; + padding-left: 12px; +} +.mce-content-body .mce-item-anchor[data-mce-selected] { + outline-offset: 1px; +} +.tox-comments-visible .tox-comment { + background-color: #fff0b7; +} +.tox-comments-visible .tox-comment[data-mce-annotation-active='true']:not([data-mce-selected='inline-boundary']) { + background-color: #ffe168; +} +.tox-checklist > li:not(.tox-checklist--hidden) { + list-style: none; + margin: 0.25em 0; +} +.tox-checklist > li:not(.tox-checklist--hidden)::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-unchecked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2215%22%20height%3D%2215%22%20x%3D%22.5%22%20y%3D%22.5%22%20fill-rule%3D%22nonzero%22%20stroke%3D%22%234C4C4C%22%20rx%3D%222%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); + cursor: pointer; + height: 1em; + margin-left: -1.5em; + margin-top: 0.125em; + position: absolute; + width: 1em; +} +.tox-checklist li:not(.tox-checklist--hidden).tox-checklist--checked::before { + content: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cg%20id%3D%22checklist-checked%22%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%3Crect%20id%3D%22Rectangle%22%20width%3D%2216%22%20height%3D%2216%22%20fill%3D%22%234099FF%22%20fill-rule%3D%22nonzero%22%20rx%3D%222%22%2F%3E%3Cpath%20id%3D%22Path%22%20fill%3D%22%23FFF%22%20fill-rule%3D%22nonzero%22%20d%3D%22M11.5703186%2C3.14417309%20C11.8516238%2C2.73724603%2012.4164781%2C2.62829933%2012.83558%2C2.89774797%20C13.260121%2C3.17069355%2013.3759736%2C3.72932262%2013.0909105%2C4.14168582%20L7.7580587%2C11.8560195%20C7.43776896%2C12.3193404%206.76483983%2C12.3852142%206.35607322%2C11.9948725%20L3.02491697%2C8.8138662%20C2.66090143%2C8.46625845%202.65798871%2C7.89594698%203.01850234%2C7.54483354%20C3.373942%2C7.19866177%203.94940006%2C7.19592841%204.30829608%2C7.5386474%20L6.85276923%2C9.9684299%20L11.5703186%2C3.14417309%20Z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E%0A'); +} +[dir='rtl'] .tox-checklist > li:not(.tox-checklist--hidden)::before { + margin-left: 0; + margin-right: -1.5em; +} +code[class*='language-'], +pre[class*='language-'] { + color: #000; + background: 0 0; + text-shadow: 0 1px #fff; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + font-size: 1em; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + -moz-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + hyphens: none; +} +code[class*='language-'] ::-moz-selection, +code[class*='language-']::-moz-selection, +pre[class*='language-'] ::-moz-selection, +pre[class*='language-']::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} +code[class*='language-'] ::selection, +code[class*='language-']::selection, +pre[class*='language-'] ::selection, +pre[class*='language-']::selection { + text-shadow: none; + background: #b3d4fc; +} +@media print { + code[class*='language-'], + pre[class*='language-'] { + text-shadow: none; + } +} +pre[class*='language-'] { + padding: 1em; + margin: 0.5em 0; + overflow: auto; +} +:not(pre) > code[class*='language-'], +pre[class*='language-'] { + background: #f5f2f0; +} +:not(pre) > code[class*='language-'] { + padding: 0.1em; + border-radius: 0.3em; + white-space: normal; +} +.token.cdata, +.token.comment, +.token.doctype, +.token.prolog { + color: #708090; +} +.token.punctuation { + color: #999; +} +.token.namespace { + opacity: 0.7; +} +.token.boolean, +.token.constant, +.token.deleted, +.token.number, +.token.property, +.token.symbol, +.token.tag { + color: #905; +} +.token.attr-name, +.token.builtin, +.token.char, +.token.inserted, +.token.selector, +.token.string { + color: #690; +} +.language-css .token.string, +.style .token.string, +.token.entity, +.token.operator, +.token.url { + color: #9a6e3a; + background: hsla(0, 0%, 100%, 0.5); +} +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} +.token.class-name, +.token.function { + color: #dd4a68; +} +.token.important, +.token.regex, +.token.variable { + color: #e90; +} +.token.bold, +.token.important { + font-weight: 700; +} +.token.italic { + font-style: italic; +} +.token.entity { + cursor: help; +} +.mce-content-body { + overflow-wrap: break-word; + word-wrap: break-word; +} +.mce-content-body .mce-visual-caret { + background-color: #000; + background-color: currentColor; + position: absolute; +} +.mce-content-body .mce-visual-caret-hidden { + display: none; +} +.mce-content-body [data-mce-caret] { + left: -1000px; + margin: 0; + padding: 0; + position: absolute; + right: auto; + top: 0; +} +.mce-content-body .mce-offscreen-selection { + left: -2000000px; + max-width: 1000000px; + position: absolute; +} +.mce-content-body [contentEditable='false'] { + cursor: default; +} +.mce-content-body [contentEditable='true'] { + cursor: text; +} +.tox-cursor-format-painter { + cursor: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%3E%0A%20%20%3Cg%20fill%3D%22none%22%20fill-rule%3D%22evenodd%22%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M15%2C6%20C15%2C5.45%2014.55%2C5%2014%2C5%20L6%2C5%20C5.45%2C5%205%2C5.45%205%2C6%20L5%2C10%20C5%2C10.55%205.45%2C11%206%2C11%20L14%2C11%20C14.55%2C11%2015%2C10.55%2015%2C10%20L15%2C9%20L16%2C9%20L16%2C12%20L9%2C12%20L9%2C19%20C9%2C19.55%209.45%2C20%2010%2C20%20L11%2C20%20C11.55%2C20%2012%2C19.55%2012%2C19%20L12%2C14%20L18%2C14%20L18%2C7%20L15%2C7%20L15%2C6%20Z%22%2F%3E%0A%20%20%20%20%3Cpath%20fill%3D%22%23000%22%20fill-rule%3D%22nonzero%22%20d%3D%22M1%2C1%20L8.25%2C1%20C8.66421356%2C1%209%2C1.33578644%209%2C1.75%20L9%2C1.75%20C9%2C2.16421356%208.66421356%2C2.5%208.25%2C2.5%20L2.5%2C2.5%20L2.5%2C8.25%20C2.5%2C8.66421356%202.16421356%2C9%201.75%2C9%20L1.75%2C9%20C1.33578644%2C9%201%2C8.66421356%201%2C8.25%20L1%2C1%20Z%22%2F%3E%0A%20%20%3C%2Fg%3E%0A%3C%2Fsvg%3E%0A'), + default; +} +.mce-content-body figure.align-left { + float: left; +} +.mce-content-body figure.align-right { + float: right; +} +.mce-content-body figure.image.align-center { + display: table; + margin-left: auto; + margin-right: auto; +} +.mce-preview-object { + border: 1px solid gray; + display: inline-block; + line-height: 0; + margin: 0 2px 0 2px; + position: relative; +} +.mce-preview-object .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-preview-object[data-mce-selected='2'] .mce-shim { + display: none; +} +.mce-object { + background: transparent + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%203h16a1%201%200%200%201%201%201v16a1%201%200%200%201-1%201H4a1%201%200%200%201-1-1V4a1%201%200%200%201%201-1zm1%202v14h14V5H5zm4.79%202.565l5.64%204.028a.5.5%200%200%201%200%20.814l-5.64%204.028a.5.5%200%200%201-.79-.407V7.972a.5.5%200%200%201%20.79-.407z%22%2F%3E%3C%2Fsvg%3E%0A') + no-repeat center; + border: 1px dashed #aaa; +} +.mce-pagebreak { + border: 1px dashed #aaa; + cursor: default; + display: block; + height: 5px; + margin-top: 15px; + page-break-before: always; + width: 100%; +} +@media print { + .mce-pagebreak { + border: 0; + } +} +.tiny-pageembed .mce-shim { + background: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tiny-pageembed[data-mce-selected='2'] .mce-shim { + display: none; +} +.tiny-pageembed { + display: inline-block; + position: relative; +} +.tiny-pageembed--16by9, +.tiny-pageembed--1by1, +.tiny-pageembed--21by9, +.tiny-pageembed--4by3 { + display: block; + overflow: hidden; + padding: 0; + position: relative; + width: 100%; +} +.tiny-pageembed--21by9 { + padding-top: 42.857143%; +} +.tiny-pageembed--16by9 { + padding-top: 56.25%; +} +.tiny-pageembed--4by3 { + padding-top: 75%; +} +.tiny-pageembed--1by1 { + padding-top: 100%; +} +.tiny-pageembed--16by9 iframe, +.tiny-pageembed--1by1 iframe, +.tiny-pageembed--21by9 iframe, +.tiny-pageembed--4by3 iframe { + border: 0; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.mce-content-body[data-mce-placeholder] { + position: relative; +} +.mce-content-body[data-mce-placeholder]:not(.mce-visualblocks)::before { + color: rgba(34, 47, 62, 0.7); + content: attr(data-mce-placeholder); + position: absolute; +} +.mce-content-body:not([dir='rtl'])[data-mce-placeholder]:not(.mce-visualblocks)::before { + left: 1px; +} +.mce-content-body[dir='rtl'][data-mce-placeholder]:not(.mce-visualblocks)::before { + right: 1px; +} +.mce-content-body div.mce-resizehandle { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + height: 10px; + position: absolute; + width: 10px; + z-index: 1298; +} +.mce-content-body div.mce-resizehandle:hover { + background-color: #4099ff; +} +.mce-content-body div.mce-resizehandle:nth-of-type(1) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(2) { + cursor: nesw-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(3) { + cursor: nwse-resize; +} +.mce-content-body div.mce-resizehandle:nth-of-type(4) { + cursor: nesw-resize; +} +.mce-content-body .mce-resize-backdrop { + z-index: 10000; +} +.mce-content-body .mce-clonedresizable { + cursor: default; + opacity: 0.5; + outline: 1px dashed #000; + position: absolute; + z-index: 10001; +} +.mce-content-body .mce-clonedresizable.mce-resizetable-columns td, +.mce-content-body .mce-clonedresizable.mce-resizetable-columns th { + border: 0; +} +.mce-content-body .mce-resize-helper { + background: #555; + background: rgba(0, 0, 0, 0.75); + border: 1px; + border-radius: 3px; + color: #fff; + display: none; + font-family: sans-serif; + font-size: 12px; + line-height: 14px; + margin: 5px 10px; + padding: 5px; + position: absolute; + white-space: nowrap; + z-index: 10002; +} +.tox-rtc-user-selection { + position: relative; +} +.tox-rtc-user-cursor { + bottom: 0; + cursor: default; + position: absolute; + top: 0; + width: 2px; +} +.tox-rtc-user-cursor::before { + background-color: inherit; + border-radius: 50%; + content: ''; + display: block; + height: 8px; + position: absolute; + right: -3px; + top: -3px; + width: 8px; +} +.tox-rtc-user-cursor:hover::after { + background-color: inherit; + border-radius: 100px; + box-sizing: border-box; + color: #fff; + content: attr(data-user); + display: block; + font-size: 12px; + font-weight: 700; + left: -5px; + min-height: 8px; + min-width: 8px; + padding: 0 12px; + position: absolute; + top: -11px; + white-space: nowrap; + z-index: 1000; +} +.tox-rtc-user-selection--1 .tox-rtc-user-cursor { + background-color: #2dc26b; +} +.tox-rtc-user-selection--2 .tox-rtc-user-cursor { + background-color: #e03e2d; +} +.tox-rtc-user-selection--3 .tox-rtc-user-cursor { + background-color: #f1c40f; +} +.tox-rtc-user-selection--4 .tox-rtc-user-cursor { + background-color: #3598db; +} +.tox-rtc-user-selection--5 .tox-rtc-user-cursor { + background-color: #b96ad9; +} +.tox-rtc-user-selection--6 .tox-rtc-user-cursor { + background-color: #e67e23; +} +.tox-rtc-user-selection--7 .tox-rtc-user-cursor { + background-color: #aaa69d; +} +.tox-rtc-user-selection--8 .tox-rtc-user-cursor { + background-color: #f368e0; +} +.tox-rtc-remote-image { + background: #eaeaea + url('data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2236%22%20height%3D%2212%22%20viewBox%3D%220%200%2036%2012%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%3Ccircle%20cx%3D%226%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2218%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.33s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%20%20%3Ccircle%20cx%3D%2230%22%20cy%3D%226%22%20r%3D%223%22%20fill%3D%22rgba(0%2C%200%2C%200%2C%20.2)%22%3E%0A%20%20%20%20%3Canimate%20attributeName%3D%22r%22%20values%3D%223%3B5%3B3%22%20calcMode%3D%22linear%22%20begin%3D%22.66s%22%20dur%3D%221s%22%20repeatCount%3D%22indefinite%22%20%2F%3E%0A%20%20%3C%2Fcircle%3E%0A%3C%2Fsvg%3E%0A') + no-repeat center center; + border: 1px solid #ccc; + min-height: 240px; + min-width: 320px; +} +.mce-match-marker { + background: #aaa; + color: #fff; +} +.mce-match-marker-selected { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::-moz-selection { + background: #39f; + color: #fff; +} +.mce-match-marker-selected::selection { + background: #39f; + color: #fff; +} +.mce-content-body audio[data-mce-selected], +.mce-content-body embed[data-mce-selected], +.mce-content-body img[data-mce-selected], +.mce-content-body object[data-mce-selected], +.mce-content-body table[data-mce-selected], +.mce-content-body video[data-mce-selected] { + outline: 3px solid #b4d7ff; +} +.mce-content-body hr[data-mce-selected] { + outline: 3px solid #b4d7ff; + outline-offset: 1px; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'] [contentEditable='true']:hover { + outline: 3px solid #b4d7ff; +} +.mce-content-body [contentEditable='false'][data-mce-selected] { + cursor: not-allowed; + outline: 3px solid #b4d7ff; +} +.mce-content-body.mce-content-readonly [contentEditable='true']:focus, +.mce-content-body.mce-content-readonly [contentEditable='true']:hover { + outline: 0; +} +.mce-content-body [data-mce-selected='inline-boundary'] { + background-color: #b4d7ff; +} +.mce-content-body .mce-edit-focus { + outline: 3px solid #b4d7ff; +} +.mce-content-body td[data-mce-selected], +.mce-content-body th[data-mce-selected] { + position: relative; +} +.mce-content-body td[data-mce-selected]::-moz-selection, +.mce-content-body th[data-mce-selected]::-moz-selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected]::selection, +.mce-content-body th[data-mce-selected]::selection { + background: 0 0; +} +.mce-content-body td[data-mce-selected] *, +.mce-content-body th[data-mce-selected] * { + outline: 0; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.mce-content-body td[data-mce-selected]::after, +.mce-content-body th[data-mce-selected]::after { + background-color: rgba(180, 215, 255, 0.7); + border: 1px solid rgba(180, 215, 255, 0.7); + bottom: -1px; + content: ''; + left: -1px; + mix-blend-mode: multiply; + position: absolute; + right: -1px; + top: -1px; +} +@media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { + .mce-content-body td[data-mce-selected]::after, + .mce-content-body th[data-mce-selected]::after { + border-color: rgba(0, 84, 180, 0.7); + } +} +.mce-content-body img::-moz-selection { + background: 0 0; +} +.mce-content-body img::selection { + background: 0 0; +} +.ephox-snooker-resizer-bar { + background-color: #b4d7ff; + opacity: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.ephox-snooker-resizer-cols { + cursor: col-resize; +} +.ephox-snooker-resizer-rows { + cursor: row-resize; +} +.ephox-snooker-resizer-bar.ephox-snooker-resizer-bar-dragging { + opacity: 1; +} +.mce-spellchecker-word { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%23ff0000'%20fill%3D'none'%20stroke-linecap%3D'round'%20stroke-opacity%3D'.75'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; + height: 2rem; +} +.mce-spellchecker-grammar { + background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D'4'%20height%3D'4'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%3E%3Cpath%20stroke%3D'%2300A835'%20fill%3D'none'%20stroke-linecap%3D'round'%20d%3D'M0%203L2%201%204%203'%2F%3E%3C%2Fsvg%3E%0A"); + background-position: 0 calc(100% + 1px); + background-repeat: repeat-x; + background-size: auto 6px; + cursor: default; +} +.mce-toc { + border: 1px solid gray; +} +.mce-toc h2 { + margin: 4px; +} +.mce-toc li { + list-style-type: none; +} +.mce-item-table:not([border]), +.mce-item-table:not([border]) caption, +.mce-item-table:not([border]) td, +.mce-item-table:not([border]) th, +.mce-item-table[border='0'], +.mce-item-table[border='0'] caption, +.mce-item-table[border='0'] td, +.mce-item-table[border='0'] th, +table[style*='border-width: 0px'], +table[style*='border-width: 0px'] caption, +table[style*='border-width: 0px'] td, +table[style*='border-width: 0px'] th { + border: 1px dashed #bbb; +} +.mce-visualblocks address, +.mce-visualblocks article, +.mce-visualblocks aside, +.mce-visualblocks blockquote, +.mce-visualblocks div:not([data-mce-bogus]), +.mce-visualblocks dl, +.mce-visualblocks figcaption, +.mce-visualblocks figure, +.mce-visualblocks h1, +.mce-visualblocks h2, +.mce-visualblocks h3, +.mce-visualblocks h4, +.mce-visualblocks h5, +.mce-visualblocks h6, +.mce-visualblocks hgroup, +.mce-visualblocks ol, +.mce-visualblocks p, +.mce-visualblocks pre, +.mce-visualblocks section, +.mce-visualblocks ul { + background-repeat: no-repeat; + border: 1px dashed #bbb; + margin-left: 3px; + padding-top: 10px; +} +.mce-visualblocks p { + background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7); +} +.mce-visualblocks h1 { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==); +} +.mce-visualblocks h2 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==); +} +.mce-visualblocks h3 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7); +} +.mce-visualblocks h4 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==); +} +.mce-visualblocks h5 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==); +} +.mce-visualblocks h6 { + background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==); +} +.mce-visualblocks div:not([data-mce-bogus]) { + background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7); +} +.mce-visualblocks section { + background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=); +} +.mce-visualblocks article { + background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7); +} +.mce-visualblocks blockquote { + background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7); +} +.mce-visualblocks address { + background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=); +} +.mce-visualblocks pre { + background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==); +} +.mce-visualblocks figure { + background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7); +} +.mce-visualblocks figcaption { + border: 1px dashed #bbb; +} +.mce-visualblocks hgroup { + background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7); +} +.mce-visualblocks aside { + background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=); +} +.mce-visualblocks ul { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==); +} +.mce-visualblocks ol { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==); +} +.mce-visualblocks dl { + background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==); +} +.mce-visualblocks:not([dir='rtl']) address, +.mce-visualblocks:not([dir='rtl']) article, +.mce-visualblocks:not([dir='rtl']) aside, +.mce-visualblocks:not([dir='rtl']) blockquote, +.mce-visualblocks:not([dir='rtl']) div:not([data-mce-bogus]), +.mce-visualblocks:not([dir='rtl']) dl, +.mce-visualblocks:not([dir='rtl']) figcaption, +.mce-visualblocks:not([dir='rtl']) figure, +.mce-visualblocks:not([dir='rtl']) h1, +.mce-visualblocks:not([dir='rtl']) h2, +.mce-visualblocks:not([dir='rtl']) h3, +.mce-visualblocks:not([dir='rtl']) h4, +.mce-visualblocks:not([dir='rtl']) h5, +.mce-visualblocks:not([dir='rtl']) h6, +.mce-visualblocks:not([dir='rtl']) hgroup, +.mce-visualblocks:not([dir='rtl']) ol, +.mce-visualblocks:not([dir='rtl']) p, +.mce-visualblocks:not([dir='rtl']) pre, +.mce-visualblocks:not([dir='rtl']) section, +.mce-visualblocks:not([dir='rtl']) ul { + margin-left: 3px; +} +.mce-visualblocks[dir='rtl'] address, +.mce-visualblocks[dir='rtl'] article, +.mce-visualblocks[dir='rtl'] aside, +.mce-visualblocks[dir='rtl'] blockquote, +.mce-visualblocks[dir='rtl'] div:not([data-mce-bogus]), +.mce-visualblocks[dir='rtl'] dl, +.mce-visualblocks[dir='rtl'] figcaption, +.mce-visualblocks[dir='rtl'] figure, +.mce-visualblocks[dir='rtl'] h1, +.mce-visualblocks[dir='rtl'] h2, +.mce-visualblocks[dir='rtl'] h3, +.mce-visualblocks[dir='rtl'] h4, +.mce-visualblocks[dir='rtl'] h5, +.mce-visualblocks[dir='rtl'] h6, +.mce-visualblocks[dir='rtl'] hgroup, +.mce-visualblocks[dir='rtl'] ol, +.mce-visualblocks[dir='rtl'] p, +.mce-visualblocks[dir='rtl'] pre, +.mce-visualblocks[dir='rtl'] section, +.mce-visualblocks[dir='rtl'] ul { + background-position-x: right; + margin-right: 3px; +} +.mce-nbsp, +.mce-shy { + background: #aaa; +} +.mce-shy::after { + content: '-'; +} +body { + font-family: sans-serif; +} +table { + border-collapse: collapse; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.css new file mode 100644 index 00000000..290ce87d --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.css @@ -0,0 +1,3764 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} + +.tox *:not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} + +.tox *:not(svg):not(rect) { + /* stylelint-disable-line no-duplicate-selectors */ + background: transparent; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} + +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} + +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} + +.tox-tinymce { + border: 1px solid #cccccc; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} + +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} + +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 0; + box-shadow: none; + overflow: hidden; +} + +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} + +.tox-tinymce *:focus, +.tox-tinymce-aux *:focus { + outline: none; +} + +button::-moz-focus-inner { + border: 0; +} + +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} + +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #cccccc; + border-radius: 3px; + display: flex; + justify-content: space-between; +} + +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} + +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} + +.tox .accessibility-issue__description > *:last-child:not(:only-child) { + border-color: #cccccc; + border-style: solid; +} + +.tox .accessibility-issue__repair { + margin-top: 16px; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(32, 122, 183, 0.1); + border-color: rgba(32, 122, 183, 0.4); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > *:last-child { + border-color: rgba(32, 122, 183, 0.4); +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #207ab7; +} + +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #207ab7; +} + +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #207ab7; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.1); + border-color: rgba(255, 165, 0, 0.5); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > *:last-child { + border-color: rgba(255, 165, 0, 0.5); +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #cc8500; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #cc8500; +} + +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #cc8500; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.1); + border-color: rgba(204, 0, 0, 0.4); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > *:last-child { + border-color: rgba(204, 0, 0, 0.4); +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #c00; +} + +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #c00; +} + +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #c00; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.1); + border-color: rgba(120, 171, 70, 0.4); + color: #222f3e; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > *:last-child { + border-color: rgba(120, 171, 70, 0.4); +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #78ab46; +} + +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #78ab46; +} + +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #78ab46; +} + +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-left: auto; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} + +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-left-width: 1px; + padding-left: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > *:nth-last-child(2) { + margin-right: auto; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} + +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > *:last-child { + border-right-width: 1px; + padding-right: 4px; +} + +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} + +.tox .tox-button { + background-color: #207ab7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #207ab7; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: none; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-button[disabled] { + background-color: #207ab7; + background-image: none; + border-color: #207ab7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} + +.tox .tox-button:focus:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:hover:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} + +.tox .tox-button:active:not(:disabled) { + background-color: #185d8c; + background-image: none; + border-color: #185d8c; + box-shadow: none; + color: #fff; +} + +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #f0f0f0; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + outline: none; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} + +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} + +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} + +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} + +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: normal; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} + +.tox .tox-button-link--sm { + font-size: 14px; +} + +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} + +.tox .tox-button--naked[disabled] { + background-color: #f0f0f0; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} + +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--naked:active:not(:disabled) { + background-color: #d6d6d6; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} + +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #222f3e; +} + +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} + +.tox .tox-checkbox__input { + /* Hide from view but visible to screen readers */ + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} + +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(34, 47, 62, 0.3); +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #207ab7; +} + +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #207ab7; +} + +.tox .tox-checkbox--disabled { + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} + +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} + +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #207ab7; + padding: calc(4px - 1px); +} + +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} + +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} + +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} + +.tox { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} + +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} + +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #cccccc; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} + +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} + +.tox .tox-collection__group-heading { + background-color: #e6e6e6; + color: rgba(34, 47, 62, 0.7); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: normal; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #222f3e; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} + +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} + +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #fff; + color: #222f3e; +} + +.tox .tox-collection--list .tox-collection__item--active { + background-color: #dee0e2; +} + +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} + +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #dee0e2; +} + +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} + +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #dee0e2; + color: #222f3e; +} + +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} + +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} + +.tox .tox-collection__item-icon, +.tox .tox-collection__item-checkmark { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} + +.tox .tox-collection__item-icon svg, +.tox .tox-collection__item-checkmark svg { + fill: currentColor; +} + +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} + +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 24px; + text-transform: none; + word-break: break-all; +} + +.tox .tox-collection__item-accessory { + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} + +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} + +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} + +.tox .tox-collection__item-caret svg { + fill: #222f3e; +} + +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-checkmark +svg { + display: none; +} + +.tox +.tox-collection--list +.tox-collection__item:not(.tox-collection__item--enabled) +.tox-collection__item-accessory ++ .tox-collection__item-checkmark { + display: none; +} + +.tox .tox-collection--horizontal { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} + +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 3px 0 2px 0; + padding: 0 4px; +} + +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} + +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} + +.tox .tox-collection__item-container { + display: flex; +} + +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} + +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} + +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} + +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} + +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #cccccc; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} + +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} + +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #cccccc; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > *:not(:first-child) { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} + +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} + +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} + +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} + +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} + +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} + +.tox .tox-sv-palette-spectrum { + height: 100%; +} + +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} + +.tox .tox-sv-palette-thumb { + background: none; + border: 1px solid black; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} + +.tox .tox-sv-palette-inner-thumb { + border: 1px solid white; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} + +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} + +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + #f00, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + #f00 + ); + height: 100%; + width: 100%; +} + +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} + +.tox .tox-hue-slider-thumb { + background: white; + border: 1px solid black; + box-sizing: content-box; + height: 4px; + width: 100%; +} + +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} + +.tox .tox-rgb-form input { + width: 6em; +} + +.tox .tox-rgb-form input.tox-invalid { + /* Need !important to override Chrome's focus styling unfortunately */ + border: 1px solid red !important; +} + +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid black; + flex-grow: 2; + margin-bottom: 0; +} + +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} + +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} + +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} + +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} + +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} + +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} + +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches { + margin: 2px 0 3px 4px; +} + +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px 0; +} + +.tox .tox-swatches__row { + display: flex; +} + +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} + +.tox .tox-swatch:hover, +.tox .tox-swatch:focus { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} + +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} + +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} + +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: none; + padding: 0; + width: 30px; +} + +.tox .tox-swatches__picker-btn svg { + fill: #222f3e; + height: 24px; + width: 24px; +} + +.tox .tox-swatches__picker-btn:hover { + background: #dee0e2; +} + +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} + +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} + +.tox .tox-comment-thread { + background: #fff; + position: relative; +} + +.tox .tox-comment-thread > *:not(:first-child) { + margin-top: 8px; +} + +.tox .tox-comment { + background: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} + +.tox .tox-comment__header { + align-items: center; + color: #222f3e; + display: flex; + justify-content: space-between; +} + +.tox .tox-comment__date { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; +} + +.tox .tox-comment__body { + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} + +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} + +.tox .tox-comment__expander { + padding-top: 8px; +} + +.tox .tox-comment__expander p { + color: rgba(34, 47, 62, 0.7); + font-size: 14px; + font-style: normal; +} + +.tox .tox-comment__body p { + margin: 0; +} + +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} + +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} + +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} + +.tox .tox-comment__reply > *:first-child { + margin-bottom: 8px; + width: 100%; +} + +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} + +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} + +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} + +.tox .tox-comment__loading-text { + align-items: center; + color: #222f3e; + display: flex; + flex-direction: column; + position: relative; +} + +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} + +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} + +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: #222f3e; + text-align: center; +} + +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} + +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} + +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} + +.tox .tox-conversations { + margin: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} + +.tox:not([dir='rtl']) .tox-comment__buttonspacing > *:last-child, +.tox:not([dir='rtl']) .tox-comment__edit > *:last-child, +.tox:not([dir='rtl']) .tox-comment__reply > *:last-child { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} + +.tox[dir='rtl'] .tox-comment__buttonspacing > *:last-child, +.tox[dir='rtl'] .tox-comment__edit > *:last-child, +.tox[dir='rtl'] .tox-comment__reply > *:last-child { + margin-right: 8px; +} + +.tox .tox-user { + align-items: center; + display: flex; +} + +.tox .tox-user__avatar svg { + fill: rgba(34, 47, 62, 0.7); +} + +.tox .tox-user__name { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; + font-style: normal; + font-weight: bold; + text-transform: uppercase; +} + +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} + +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} + +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} + +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} + +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #fff; +} + +.tox .tox-dialog { + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} + +.tox .tox-dialog-inline { + z-index: 1100; +} + +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: #222f3e; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} + +.tox .tox-dialog__header .tox-button { + z-index: 1; +} + +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} + +.tox .tox-dialog__dismiss { + margin-left: auto; +} + +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + margin: 0; + text-transform: none; +} + +.tox .tox-dialog__body { + color: #222f3e; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} + +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} + +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} + +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(32, 122, 183, 0.1); +} + +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #207ab7; + color: #207ab7; +} + +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} + +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} + +.tox .tox-dialog__body-content > *:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content > *:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content > *:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog__body-content a { + color: #207ab7; + cursor: pointer; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:hover, +.tox .tox-dialog__body-content a:focus { + color: #185d8c; + text-decoration: none; +} + +.tox .tox-dialog__body-content a:active { + color: #185d8c; + text-decoration: none; +} + +.tox .tox-dialog__body-content svg { + fill: #222f3e; +} + +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} + +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #222f3e; + font-size: 20px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #222f3e; + font-size: 16px; + font-style: normal; + font-weight: bold; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} + +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} + +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} + +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} + +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} + +.tox .tox-dialog--width-md { + max-width: 800px; +} + +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} + +.tox .tox-dialog__body-content--centered { + text-align: center; +} + +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: 1px solid #cccccc; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} + +.tox .tox-dialog__footer-start, +.tox .tox-dialog__footer-end { + display: flex; +} + +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} + +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} + +.tox .tox-dialog__table thead th { + font-weight: bold; + padding-bottom: 8px; +} + +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #cccccc; +} + +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} + +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} + +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} + +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} + +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} + +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > * { + margin-left: 8px; +} + +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} + +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} + +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > * { + margin-right: 8px; +} + +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} + +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #cccccc; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} + +.tox .tox-dropzone p { + color: rgba(34, 47, 62, 0.7); + margin: 0 0 16px 0; +} + +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} + +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} + +.tox.tox-inline-edit-area { + border: 1px dotted #cccccc; +} + +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} + +.tox .tox-editor-header { + z-index: 1; +} + +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #fff; + border-bottom: none; + box-shadow: none; + padding: 4px 0; + transition: box-shadow 0.5s; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid #c1c1c1; + box-shadow: none; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #fff; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 4px 0; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} + +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} + +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} + +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} + +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} + +.tox .tox-control-wrap { + flex: 1; + position: relative; +} + +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} + +.tox .tox-control-wrap svg { + display: block; +} + +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} + +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} + +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} + +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} + +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} + +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} + +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} + +.tox .tox-autocompleter { + max-width: 25em; +} + +.tox .tox-autocompleter .tox-menu { + border-color: #cccccc; + box-shadow: none; + max-width: 25em; +} + +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: bold; +} + +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} + +.tox .tox-color-input .tox-textfield { + z-index: -1; +} + +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} + +.tox .tox-color-input span:hover:not([aria-disabled='true']), +.tox .tox-color-input span:focus:not([aria-disabled='true']) { + border-color: #207ab7; + cursor: pointer; +} + +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #fff; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} + +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} + +.tox:not([dir='rtl']) .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} + +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} + +.tox[dir='rtl'] .tox-color-input { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} + +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} + +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} + +.tox .tox-toolbar-label { + padding: 0 8px; +} + +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} + +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} + +.tox .tox-form-group--maximize { + flex: 1; +} + +.tox .tox-form__group--error { + color: #c00; +} + +.tox .tox-form__group--collection { + display: flex; +} + +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} + +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} + +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} + +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} + +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} + +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} + +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} + +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} + +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} + +.tox:not([dir='rtl']) .tox-form__controls-h-stack > *:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-form__controls-h-stack > *:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} + +.tox .tox-textfield, +.tox .tox-toolbar-textfield, +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} + +.tox .tox-textfield[disabled], +.tox .tox-textarea[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} + +.tox .tox-textfield:focus, +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus { + background-color: #fff; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} + +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} + +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #207ab7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} + +.tox .tox-naked-btn svg { + display: block; + fill: #222f3e; +} + +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} + +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} + +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} + +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} + +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-listbox__select-chevron svg { + fill: #222f3e; +} + +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} + +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} + +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} + +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #cccccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: none; + padding: 5px 4.75px; + resize: none; + width: 100%; +} + +.tox .tox-selectfield select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} + +.tox .tox-selectfield select::-ms-expand { + display: none; +} + +.tox .tox-selectfield select:focus { + background-color: #fff; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} + +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} + +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} + +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} + +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} + +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} + +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} + +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} + +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} + +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} + +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} + +.tox .tox-image-tools .tox-spacer { + flex: 1; +} + +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} + +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} + +.tox .tox-image-tools .tox-croprect-block { + background: black; + filter: alpha(opacity=50); + opacity: 0.5; + position: absolute; + zoom: 1; +} + +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid white; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} + +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} + +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} + +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} + +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} + +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} + +.tox .tox-insert-table-picker > div { + border-color: #cccccc; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: 0 -4px; +} + +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(32, 122, 183, 0.5); + border-color: rgba(32, 122, 183, 0.5); +} + +.tox .tox-insert-table-picker__label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} + +.tox:not([dir='rtl']) { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} + +.tox[dir='rtl'] { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} + +.tox { + /* stylelint-disable */ + /* stylelint-enable */ +} + +.tox .tox-menu { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} + +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 0; +} + +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} + +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} + +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p, +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code { + margin: 0; +} + +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} + +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #cccccc; +} + +/* Deprecated. Remove in next major release */ +.tox .tox-mbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: none; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} + +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-mbtn:focus:not(:disabled) { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-mbtn--active { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} + +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} + +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: normal; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 100ms ease-in, opacity 150ms ease-in; +} + +.tox .tox-notification p { + font-size: 14px; + font-weight: normal; +} + +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} + +.tox .tox-notification--in { + opacity: 1; +} + +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: #222f3e; +} + +.tox .tox-notification--success p { + color: #222f3e; +} + +.tox .tox-notification--success a { + color: #517342; +} + +.tox .tox-notification--success svg { + fill: #222f3e; +} + +.tox .tox-notification--error { + background-color: #f5cccc; + border-color: #f0b3b3; + color: #222f3e; +} + +.tox .tox-notification--error p { + color: #222f3e; +} + +.tox .tox-notification--error a { + color: #77181f; +} + +.tox .tox-notification--error svg { + fill: #222f3e; +} + +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fff5cc; + border-color: #fff0b3; + color: #222f3e; +} + +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #222f3e; +} + +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #7a6e25; +} + +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #222f3e; +} + +.tox .tox-notification--info { + background-color: #d6e7fb; + border-color: #c1dbf9; + color: #222f3e; +} + +.tox .tox-notification--info p { + color: #222f3e; +} + +.tox .tox-notification--info a { + color: #2a64a6; +} + +.tox .tox-notification--info svg { + fill: #222f3e; +} + +.tox .tox-notification__body { + align-self: center; + color: #222f3e; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} + +.tox .tox-notification__body > * { + margin: 0; +} + +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} + +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification__icon svg { + display: block; +} + +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} + +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} + +.tox .tox-pop { + display: inline-block; + position: relative; +} + +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} + +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} + +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} + +.tox .tox-pop--transition::before, +.tox .tox-pop--transition::after { + transition: all 0.15s, visibility 0s, opacity 0.075s ease 0.075s; +} + +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #cccccc; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + min-width: 0; + overflow: hidden; +} + +.tox .tox-pop__dialog > *:not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} + +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} + +.tox .tox-pop::before, +.tox .tox-pop::after { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} + +.tox .tox-pop.tox-pop--inset::before, +.tox .tox-pop.tox-pop--inset::after { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 0.075s ease; +} + +.tox .tox-pop.tox-pop--bottom::before, +.tox .tox-pop.tox-pop--bottom::after { + left: 50%; + top: 100%; +} + +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} + +.tox .tox-pop.tox-pop--bottom::before { + border-color: #cccccc transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--top::before, +.tox .tox-pop.tox-pop--top::after { + left: 50%; + top: 0; + transform: translateY(-100%); +} + +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} + +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #cccccc transparent; + border-width: 9px; + margin-left: -9px; +} + +.tox .tox-pop.tox-pop--left::before, +.tox .tox-pop.tox-pop--left::after { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} + +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #cccccc transparent transparent; + border-width: 10px; + margin-left: -19px; +} + +.tox .tox-pop.tox-pop--right::before, +.tox .tox-pop.tox-pop--right::after { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} + +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #cccccc; + border-width: 10px; + margin-left: -1px; +} + +.tox .tox-pop.tox-pop--align-left::before, +.tox .tox-pop.tox-pop--align-left::after { + left: 20px; +} + +.tox .tox-pop.tox-pop--align-right::before, +.tox .tox-pop.tox-pop--align-right::after { + left: calc(100% - 20px); +} + +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} + +.tox .tox-sidebar { + background-color: #fff; + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} + +.tox .tox-sidebar__pane-container { + display: flex; +} + +.tox .tox-sidebar__pane { + display: flex; +} + +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} + +.tox .tox-sidebar--sliding-open { + opacity: 1; +} + +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} + +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} + +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} + +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} + +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #cccccc; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} + +.tox .tox-slider__handle { + background-color: #207ab7; + border: 2px solid #185d8c; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} + +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} + +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} + +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} + +.tox .tox-source-code { + overflow: auto; +} + +.tox .tox-spinner { + display: flex; +} + +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(34, 47, 62, 0.7); + border-radius: 100%; + height: 8px; + width: 8px; +} + +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} + +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} + +@keyframes tam-bouncing-dots { + 0%, + 80%, + 100% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} + +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} + +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} + +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #cccccc; + color: rgba(34, 47, 62, 0.7); + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: normal; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} + +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} + +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} + +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} + +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(34, 47, 62, 0.7); + text-decoration: none; +} + +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']) { + color: #222f3e; + cursor: pointer; +} + +.tox .tox-statusbar__branding svg { + fill: rgba(34, 47, 62, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} + +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg { + fill: #222f3e; +} + +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} + +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #dee0e2; + border-radius: 1px 1px -4px 1px; + box-shadow: 0 0 0 2px #dee0e2; +} + +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} + +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} + +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} + +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} + +.tox .tox-throbber { + z-index: 1299; +} + +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} + +.tox .tox-tbtn { + align-items: center; + background: transparent; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: normal; + height: 34px; + justify-content: center; + margin: 3px 0 2px 0; + outline: none; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} + +.tox .tox-tbtn svg { + display: block; + fill: #222f3e; +} + +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} + +.tox .tox-tbtn:focus { + background: #dee0e2; + border: 0; + box-shadow: none; +} + +.tox .tox-tbtn:hover { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-tbtn:hover svg { + fill: #222f3e; +} + +.tox .tox-tbtn:active { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-tbtn:active svg { + fill: #222f3e; +} + +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} + +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-tbtn--enabled > *, +.tox .tox-tbtn--enabled:hover > * { + transform: none; +} + +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + /* stylelint-disable-line no-descending-specificity */ + fill: #222f3e; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #222f3e; +} + +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #222f3e; +} + +.tox .tox-tbtn:active > * { + transform: none; +} + +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} + +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} + +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} + +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} + +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: normal; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} + +.tox .tox-tbtn--select { + margin: 3px 0 2px 0; + padding: 0 4px; + width: auto; +} + +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: normal; + margin: 0 4px; +} + +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} + +.tox .tox-tbtn__select-chevron svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-tbtn--bespoke { + background: transparent; +} + +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 0; +} + +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} + +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 3px 0 2px 0; + overflow: hidden; +} + +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #dee0e2 inset; +} + +.tox .tox-split-button:focus { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} + +.tox .tox-split-button > * { + border-radius: 0; +} + +.tox .tox-split-button__chevron { + width: 16px; +} + +.tox .tox-split-button__chevron svg { + fill: rgba(34, 47, 62, 0.5); +} + +.tox .tox-split-button .tox-tbtn { + margin: 0; +} + +.tox .tox-split-button.tox-tbtn--disabled:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus { + background: transparent; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0px; +} + +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} + +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} + +.tox .tox-toolbar-overlord { + background-color: #fff; +} + +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background-color: #fff; + background-image: repeating-linear-gradient(#cccccc 0px 1px, transparent 1px 39px); + background-position: center top 39px; + background-repeat: no-repeat; + background-size: calc(100% - 4px * 2) calc(100% - 39px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0px; + transform: perspective(1px); +} + +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__primary, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow { + background-position: center top 0px; + background-size: calc(100% - 4px * 2) calc(100% - 0px); +} + +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} + +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} + +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} + +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid #cccccc; + margin-top: 0; + padding-bottom: 0px; + padding-top: 0px; +} + +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} + +.tox .tox-pop .tox-toolbar { + border-width: 0; +} + +.tox .tox-toolbar--no-divider { + background-image: none; +} + +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} + +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #fff; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + padding: 4px 0; +} + +.tox-pop .tox-pop__dialog { + /* stylelint-disable-next-line no-descending-specificity */ +} + +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 4px * 2) calc(100% - 51px); + padding: 4px 0; +} + +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} + +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} + +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} + +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #cccccc; +} + +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #cccccc; +} + +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} + +.tox .tox-tooltip__body { + background-color: #222f3e; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: normal; + padding: 4px 8px; + text-transform: none; +} + +.tox .tox-tooltip__arrow { + position: absolute; +} + +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #222f3e; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} + +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #222f3e; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} + +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #222f3e; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #222f3e; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} + +.tox .tox-well { + border: 1px solid #cccccc; + border-radius: 3px; + padding: 8px; + width: 100%; +} + +.tox .tox-well > *:first-child { + margin-top: 0; +} + +.tox .tox-well > *:last-child { + margin-bottom: 0; +} + +.tox .tox-well > *:only-child { + margin: 0; +} + +.tox .tox-custom-editor { + border: 1px solid #cccccc; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} + +/* stylelint-disable */ +.tox { + /* stylelint-enable */ +} + +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} + +.tox .tox-tab { + cursor: pointer; +} + +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} + +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} + +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: none; + padding: 0; +} + +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} + +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: none; + box-shadow: none; +} + +.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 0; +} + +.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} + +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} + +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} + +.tox .tox-pop { + box-shadow: none; +} + +.tox .tox-tbtn, +.tox .tox-tbtn--select, +.tox .tox-split-button { + margin: 2px 0 3px 0; +} + +.tox .tox-toolbar, +.tox .tox-toolbar__primary, +.tox .tox-toolbar__overflow { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") left 0 top 0px #fff !important; +} + +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: none; +} + +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #cccccc; + margin-top: -1px; +} + +.tox.tox-tinymce-aux .tox-toolbar__overflow { + border: 1px solid #cccccc; + padding: 0; +} + +.tox:not(.tox-tinymce-inline) +.tox-editor-header:not(:first-child) +.tox-toolbar-overlord:first-child +.tox-toolbar__primary, +.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child { + border-top: 1px solid #cccccc; +} + +.tox .tox-toolbar__group { + padding: 0 4px 0 4px; +} + +.tox .tox-collection__item { + border-radius: 0; + cursor: pointer; +} + +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']) { + color: rgba(34, 47, 62, 0.7); + text-decoration: underline; +} + +.tox .tox-statusbar__branding svg { + vertical-align: -0.25em; +} + +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 1ch; +} + +.tox .tox-statusbar__resize-handle { + padding-bottom: 0; + padding-right: 0; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.min.css new file mode 100644 index 00000000..62db7f27 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.min.css @@ -0,0 +1,3125 @@ +.tox { + box-shadow: none; + box-sizing: content-box; + color: #222f3e; + cursor: auto; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: normal; + -webkit-tap-highlight-color: transparent; + text-decoration: none; + text-shadow: none; + text-transform: none; + vertical-align: initial; + white-space: normal; +} +.tox :not(svg):not(rect) { + box-sizing: inherit; + color: inherit; + cursor: inherit; + direction: inherit; + font-family: inherit; + font-size: inherit; + font-style: inherit; + font-weight: inherit; + line-height: inherit; + -webkit-tap-highlight-color: inherit; + text-align: inherit; + text-decoration: inherit; + text-shadow: inherit; + text-transform: inherit; + vertical-align: inherit; + white-space: inherit; +} +.tox :not(svg):not(rect) { + background: 0 0; + border: 0; + box-shadow: none; + float: none; + height: auto; + margin: 0; + max-width: none; + outline: 0; + padding: 0; + position: static; + width: auto; +} +.tox:not([dir='rtl']) { + direction: ltr; + text-align: left; +} +.tox[dir='rtl'] { + direction: rtl; + text-align: right; +} +.tox-tinymce { + border: 1px solid #ccc; + border-radius: 0; + box-shadow: none; + box-sizing: border-box; + display: flex; + flex-direction: column; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + overflow: hidden; + position: relative; + visibility: inherit !important; +} +.tox.tox-tinymce-inline { + border: none; + box-shadow: none; + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-container { + overflow: initial; +} +.tox.tox-tinymce-inline .tox-editor-header { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 0; + box-shadow: none; + overflow: hidden; +} +.tox-tinymce-aux { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + z-index: 1300; +} +.tox-tinymce :focus, +.tox-tinymce-aux :focus { + outline: 0; +} +button::-moz-focus-inner { + border: 0; +} +.tox[dir='rtl'] .tox-icon--flip svg { + transform: rotateY(180deg); +} +.tox .accessibility-issue__header { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description { + align-items: stretch; + border: 1px solid #ccc; + border-radius: 3px; + display: flex; + justify-content: space-between; +} +.tox .accessibility-issue__description > div { + padding-bottom: 4px; +} +.tox .accessibility-issue__description > div > div { + align-items: center; + display: flex; + margin-bottom: 4px; +} +.tox .accessibility-issue__description > :last-child:not(:only-child) { + border-color: #ccc; + border-style: solid; +} +.tox .accessibility-issue__repair { + margin-top: 16px; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description { + background-color: rgba(32, 122, 183, 0.1); + border-color: rgba(32, 122, 183, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--info .accessibility-issue__description > :last-child { + border-color: rgba(32, 122, 183, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-form__group h2 { + color: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--info .tox-icon svg { + fill: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--info a .tox-icon { + color: #207ab7; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description { + background-color: rgba(255, 165, 0, 0.1); + border-color: rgba(255, 165, 0, 0.5); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .accessibility-issue__description > :last-child { + border-color: rgba(255, 165, 0, 0.5); +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-form__group h2 { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn .tox-icon svg { + fill: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--warn a .tox-icon { + color: #cc8500; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description { + background-color: rgba(204, 0, 0, 0.1); + border-color: rgba(204, 0, 0, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--error .accessibility-issue__description > :last-child { + border-color: rgba(204, 0, 0, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-form__group h2 { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error .tox-icon svg { + fill: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--error a .tox-icon { + color: #c00; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description { + background-color: rgba(120, 171, 70, 0.1); + border-color: rgba(120, 171, 70, 0.4); + color: #222f3e; +} +.tox .tox-dialog__body-content .accessibility-issue--success .accessibility-issue__description > :last-child { + border-color: rgba(120, 171, 70, 0.4); +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-form__group h2 { + color: #78ab46; +} +.tox .tox-dialog__body-content .accessibility-issue--success .tox-icon svg { + fill: #78ab46; +} +.tox .tox-dialog__body-content .accessibility-issue--success a .tox-icon { + color: #78ab46; +} +.tox .tox-dialog__body-content .accessibility-issue__header h1, +.tox .tox-dialog__body-content .tox-form__group .accessibility-issue__description h2 { + margin-top: 0; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-left: auto; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 4px 4px 8px; +} +.tox:not([dir='rtl']) .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-left-width: 1px; + padding-left: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header .tox-button { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__header > :nth-last-child(2) { + margin-right: auto; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description { + padding: 4px 8px 4px 4px; +} +.tox[dir='rtl'] .tox-dialog__body-content .accessibility-issue__description > :last-child { + border-right-width: 1px; + padding-right: 4px; +} +.tox .tox-anchorbar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-bar { + display: flex; + flex: 0 0 auto; +} +.tox .tox-button { + background-color: #207ab7; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #207ab7; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #fff; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + line-height: 24px; + margin: 0; + outline: 0; + padding: 4px 16px; + text-align: center; + text-decoration: none; + text-transform: none; + white-space: nowrap; +} +.tox .tox-button[disabled] { + background-color: #207ab7; + background-image: none; + border-color: #207ab7; + box-shadow: none; + color: rgba(255, 255, 255, 0.5); + cursor: not-allowed; +} +.tox .tox-button:focus:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:hover:not(:disabled) { + background-color: #1c6ca1; + background-image: none; + border-color: #1c6ca1; + box-shadow: none; + color: #fff; +} +.tox .tox-button:active:not(:disabled) { + background-color: #185d8c; + background-image: none; + border-color: #185d8c; + box-shadow: none; + color: #fff; +} +.tox .tox-button--secondary { + background-color: #f0f0f0; + background-image: none; + background-position: 0 0; + background-repeat: repeat; + border-color: #f0f0f0; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + outline: 0; + padding: 4px 16px; + text-decoration: none; + text-transform: none; +} +.tox .tox-button--secondary[disabled] { + background-color: #f0f0f0; + background-image: none; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--secondary:focus:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:hover:not(:disabled) { + background-color: #e3e3e3; + background-image: none; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--secondary:active:not(:disabled) { + background-color: #d6d6d6; + background-image: none; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--icon, +.tox .tox-button.tox-button--icon, +.tox .tox-button.tox-button--secondary.tox-button--icon { + padding: 4px; +} +.tox .tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--icon .tox-icon svg, +.tox .tox-button.tox-button--secondary.tox-button--icon .tox-icon svg { + display: block; + fill: currentColor; +} +.tox .tox-button-link { + background: 0; + border: none; + box-sizing: border-box; + cursor: pointer; + display: inline-block; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + font-weight: 400; + line-height: 1.3; + margin: 0; + padding: 0; + white-space: nowrap; +} +.tox .tox-button-link--sm { + font-size: 14px; +} +.tox .tox-button--naked { + background-color: transparent; + border-color: transparent; + box-shadow: unset; + color: #222f3e; +} +.tox .tox-button--naked[disabled] { + background-color: #f0f0f0; + border-color: #f0f0f0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox .tox-button--naked:hover:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked:focus:not(:disabled) { + background-color: #e3e3e3; + border-color: #e3e3e3; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked:active:not(:disabled) { + background-color: #d6d6d6; + border-color: #d6d6d6; + box-shadow: none; + color: #222f3e; +} +.tox .tox-button--naked .tox-icon svg { + fill: currentColor; +} +.tox .tox-button--naked.tox-button--icon:hover:not(:disabled) { + color: #222f3e; +} +.tox .tox-checkbox { + align-items: center; + border-radius: 3px; + cursor: pointer; + display: flex; + height: 36px; + min-width: 36px; +} +.tox .tox-checkbox__input { + height: 1px; + overflow: hidden; + position: absolute; + top: auto; + width: 1px; +} +.tox .tox-checkbox__icons { + align-items: center; + border-radius: 3px; + box-shadow: 0 0 0 2px transparent; + box-sizing: content-box; + display: flex; + height: 24px; + justify-content: center; + padding: calc(4px - 1px); + width: 24px; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: block; + fill: rgba(34, 47, 62, 0.3); +} +.tox .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: none; + fill: #207ab7; +} +.tox .tox-checkbox--disabled { + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__checked svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-checkbox--disabled .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:checked + .tox-checkbox__icons .tox-checkbox-icon__checked svg { + display: block; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__unchecked svg { + display: none; +} +.tox input.tox-checkbox__input:indeterminate + .tox-checkbox__icons .tox-checkbox-icon__indeterminate svg { + display: block; +} +.tox input.tox-checkbox__input:focus + .tox-checkbox__icons { + border-radius: 3px; + box-shadow: inset 0 0 0 1px #207ab7; + padding: calc(4px - 1px); +} +.tox:not([dir='rtl']) .tox-checkbox__label { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-checkbox__input { + left: -10000px; +} +.tox:not([dir='rtl']) .tox-bar .tox-checkbox { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-checkbox__label { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-checkbox__input { + right: -10000px; +} +.tox[dir='rtl'] .tox-bar .tox-checkbox { + margin-right: 4px; +} +.tox .tox-collection--toolbar .tox-collection__group { + display: flex; + padding: 0; +} +.tox .tox-collection--grid .tox-collection__group { + display: flex; + flex-wrap: wrap; + max-height: 208px; + overflow-x: hidden; + overflow-y: auto; + padding: 0; +} +.tox .tox-collection--list .tox-collection__group { + border-bottom-width: 0; + border-color: #ccc; + border-left-width: 0; + border-right-width: 0; + border-style: solid; + border-top-width: 1px; + padding: 4px 0; +} +.tox .tox-collection--list .tox-collection__group:first-child { + border-top-width: 0; +} +.tox .tox-collection__group-heading { + background-color: #e6e6e6; + color: rgba(34, 47, 62, 0.7); + cursor: default; + font-size: 12px; + font-style: normal; + font-weight: 400; + margin-bottom: 4px; + margin-top: -4px; + padding: 4px 8px; + text-transform: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection__item { + align-items: center; + border-radius: 3px; + color: #222f3e; + display: flex; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.tox .tox-collection--list .tox-collection__item { + padding: 4px 8px; +} +.tox .tox-collection--toolbar .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--grid .tox-collection__item { + border-radius: 3px; + padding: 4px; +} +.tox .tox-collection--list .tox-collection__item--enabled { + background-color: #fff; + color: #222f3e; +} +.tox .tox-collection--list .tox-collection__item--active { + background-color: #dee0e2; +} +.tox .tox-collection--toolbar .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active { + background-color: #dee0e2; +} +.tox .tox-collection--grid .tox-collection__item--enabled { + background-color: #c8cbcf; + color: #222f3e; +} +.tox .tox-collection--grid .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + background-color: #dee0e2; + color: #222f3e; +} +.tox .tox-collection--list .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} +.tox .tox-collection--toolbar .tox-collection__item--active:not(.tox-collection__item--state-disabled) { + color: #222f3e; +} +.tox .tox-collection__item-checkmark, +.tox .tox-collection__item-icon { + align-items: center; + display: flex; + height: 24px; + justify-content: center; + width: 24px; +} +.tox .tox-collection__item-checkmark svg, +.tox .tox-collection__item-icon svg { + fill: currentColor; +} +.tox .tox-collection--toolbar-lg .tox-collection__item-icon { + height: 48px; + width: 48px; +} +.tox .tox-collection__item-label { + color: currentColor; + display: inline-block; + flex: 1; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 24px; + text-transform: none; + word-break: break-all; +} +.tox .tox-collection__item-accessory { + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + height: 24px; + line-height: 24px; + text-transform: none; +} +.tox .tox-collection__item-caret { + align-items: center; + display: flex; + min-height: 24px; +} +.tox .tox-collection__item-caret::after { + content: ''; + font-size: 0; + min-height: inherit; +} +.tox .tox-collection__item-caret svg { + fill: #222f3e; +} +.tox .tox-collection__item--state-disabled { + background-color: transparent; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-collection__item--state-disabled .tox-collection__item-caret svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-checkmark + svg { + display: none; +} +.tox + .tox-collection--list + .tox-collection__item:not(.tox-collection__item--enabled) + .tox-collection__item-accessory + + .tox-collection__item-checkmark { + display: none; +} +.tox .tox-collection--horizontal { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: nowrap; + margin-bottom: 0; + overflow-x: auto; + padding: 0; +} +.tox .tox-collection--horizontal .tox-collection__group { + align-items: center; + display: flex; + flex-wrap: nowrap; + margin: 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item { + height: 34px; + margin: 3px 0 2px 0; + padding: 0 4px; +} +.tox .tox-collection--horizontal .tox-collection__item-label { + white-space: nowrap; +} +.tox .tox-collection--horizontal .tox-collection__item-caret { + margin-left: 4px; +} +.tox .tox-collection__item-container { + display: flex; +} +.tox .tox-collection__item-container--row { + align-items: center; + flex: 1 1 auto; + flex-direction: row; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-left { + margin-right: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--align-right { + justify-content: flex-end; + margin-left: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-top { + align-items: flex-start; + margin-bottom: auto; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-middle { + align-items: center; +} +.tox .tox-collection__item-container--row.tox-collection__item-container--valign-bottom { + align-items: flex-end; + margin-top: auto; +} +.tox .tox-collection__item-container--column { + align-self: center; + flex: 1 1 auto; + flex-direction: column; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-left { + align-items: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--align-right { + align-items: flex-end; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-top { + align-self: flex-start; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-middle { + align-self: center; +} +.tox .tox-collection__item-container--column.tox-collection__item-container--valign-bottom { + align-self: flex-end; +} +.tox:not([dir='rtl']) .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-right: 1px solid #ccc; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-left: 4px; +} +.tox:not([dir='rtl']) .tox-collection__item-accessory { + margin-left: 16px; + text-align: right; +} +.tox:not([dir='rtl']) .tox-collection .tox-collection__item-caret { + margin-left: 16px; +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__group:not(:last-of-type) { + border-left: 1px solid #ccc; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > :not(:first-child) { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-collection--list .tox-collection__item > .tox-collection__item-label:first-child { + margin-right: 4px; +} +.tox[dir='rtl'] .tox-collection__item-accessory { + margin-right: 16px; + text-align: left; +} +.tox[dir='rtl'] .tox-collection .tox-collection__item-caret { + margin-right: 16px; + transform: rotateY(180deg); +} +.tox[dir='rtl'] .tox-collection--horizontal .tox-collection__item-caret { + margin-right: 4px; +} +.tox .tox-color-picker-container { + display: flex; + flex-direction: row; + height: 225px; + margin: 0; +} +.tox .tox-sv-palette { + box-sizing: border-box; + display: flex; + height: 100%; +} +.tox .tox-sv-palette-spectrum { + height: 100%; +} +.tox .tox-sv-palette, +.tox .tox-sv-palette-spectrum { + width: 225px; +} +.tox .tox-sv-palette-thumb { + background: 0 0; + border: 1px solid #000; + border-radius: 50%; + box-sizing: content-box; + height: 12px; + position: absolute; + width: 12px; +} +.tox .tox-sv-palette-inner-thumb { + border: 1px solid #fff; + border-radius: 50%; + height: 10px; + position: absolute; + width: 10px; +} +.tox .tox-hue-slider { + box-sizing: border-box; + height: 100%; + width: 25px; +} +.tox .tox-hue-slider-spectrum { + background: linear-gradient( + to bottom, + red, + #ff0080, + #f0f, + #8000ff, + #00f, + #0080ff, + #0ff, + #00ff80, + #0f0, + #80ff00, + #ff0, + #ff8000, + red + ); + height: 100%; + width: 100%; +} +.tox .tox-hue-slider, +.tox .tox-hue-slider-spectrum { + width: 20px; +} +.tox .tox-hue-slider-thumb { + background: #fff; + border: 1px solid #000; + box-sizing: content-box; + height: 4px; + width: 100%; +} +.tox .tox-rgb-form { + display: flex; + flex-direction: column; + justify-content: space-between; +} +.tox .tox-rgb-form div { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 5px; + width: inherit; +} +.tox .tox-rgb-form input { + width: 6em; +} +.tox .tox-rgb-form input.tox-invalid { + border: 1px solid red !important; +} +.tox .tox-rgb-form .tox-rgba-preview { + border: 1px solid #000; + flex-grow: 2; + margin-bottom: 0; +} +.tox:not([dir='rtl']) .tox-sv-palette { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider { + margin-right: 15px; +} +.tox:not([dir='rtl']) .tox-hue-slider-thumb { + margin-left: -1px; +} +.tox:not([dir='rtl']) .tox-rgb-form label { + margin-right: 0.5em; +} +.tox[dir='rtl'] .tox-sv-palette { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider { + margin-left: 15px; +} +.tox[dir='rtl'] .tox-hue-slider-thumb { + margin-right: -1px; +} +.tox[dir='rtl'] .tox-rgb-form label { + margin-left: 0.5em; +} +.tox .tox-toolbar .tox-swatches, +.tox .tox-toolbar__overflow .tox-swatches, +.tox .tox-toolbar__primary .tox-swatches { + margin: 2px 0 3px 4px; +} +.tox .tox-collection--list .tox-collection__group .tox-swatches-menu { + border: 0; + margin: -4px 0; +} +.tox .tox-swatches__row { + display: flex; +} +.tox .tox-swatch { + height: 30px; + transition: transform 0.15s, box-shadow 0.15s; + width: 30px; +} +.tox .tox-swatch:focus, +.tox .tox-swatch:hover { + box-shadow: 0 0 0 1px rgba(127, 127, 127, 0.3) inset; + transform: scale(0.8); +} +.tox .tox-swatch--remove { + align-items: center; + display: flex; + justify-content: center; +} +.tox .tox-swatch--remove svg path { + stroke: #e74c3c; +} +.tox .tox-swatches__picker-btn { + align-items: center; + background-color: transparent; + border: 0; + cursor: pointer; + display: flex; + height: 30px; + justify-content: center; + outline: 0; + padding: 0; + width: 30px; +} +.tox .tox-swatches__picker-btn svg { + fill: #222f3e; + height: 24px; + width: 24px; +} +.tox .tox-swatches__picker-btn:hover { + background: #dee0e2; +} +.tox:not([dir='rtl']) .tox-swatches__picker-btn { + margin-left: auto; +} +.tox[dir='rtl'] .tox-swatches__picker-btn { + margin-right: auto; +} +.tox .tox-comment-thread { + background: #fff; + position: relative; +} +.tox .tox-comment-thread > :not(:first-child) { + margin-top: 8px; +} +.tox .tox-comment { + background: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + padding: 8px 8px 16px 8px; + position: relative; +} +.tox .tox-comment__header { + align-items: center; + color: #222f3e; + display: flex; + justify-content: space-between; +} +.tox .tox-comment__date { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; +} +.tox .tox-comment__body { + color: #222f3e; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin-top: 8px; + position: relative; + text-transform: initial; +} +.tox .tox-comment__body textarea { + resize: none; + white-space: normal; + width: 100%; +} +.tox .tox-comment__expander { + padding-top: 8px; +} +.tox .tox-comment__expander p { + color: rgba(34, 47, 62, 0.7); + font-size: 14px; + font-style: normal; +} +.tox .tox-comment__body p { + margin: 0; +} +.tox .tox-comment__buttonspacing { + padding-top: 16px; + text-align: center; +} +.tox .tox-comment-thread__overlay::after { + background: #fff; + bottom: 0; + content: ''; + display: flex; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + top: 0; + z-index: 5; +} +.tox .tox-comment__reply { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 8px; +} +.tox .tox-comment__reply > :first-child { + margin-bottom: 8px; + width: 100%; +} +.tox .tox-comment__edit { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + margin-top: 16px; +} +.tox .tox-comment__gradient::after { + background: linear-gradient(rgba(255, 255, 255, 0), #fff); + bottom: 0; + content: ''; + display: block; + height: 5em; + margin-top: -40px; + position: absolute; + width: 100%; +} +.tox .tox-comment__overlay { + background: #fff; + bottom: 0; + display: flex; + flex-direction: column; + flex-grow: 1; + left: 0; + opacity: 0.9; + position: absolute; + right: 0; + text-align: center; + top: 0; + z-index: 5; +} +.tox .tox-comment__loading-text { + align-items: center; + color: #222f3e; + display: flex; + flex-direction: column; + position: relative; +} +.tox .tox-comment__loading-text > div { + padding-bottom: 16px; +} +.tox .tox-comment__overlaytext { + bottom: 0; + flex-direction: column; + font-size: 14px; + left: 0; + padding: 1em; + position: absolute; + right: 0; + top: 0; + z-index: 10; +} +.tox .tox-comment__overlaytext p { + background-color: #fff; + box-shadow: 0 0 8px 8px #fff; + color: #222f3e; + text-align: center; +} +.tox .tox-comment__overlaytext div:nth-of-type(2) { + font-size: 0.8em; +} +.tox .tox-comment__busy-spinner { + align-items: center; + background-color: #fff; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 20; +} +.tox .tox-comment__scroll { + display: flex; + flex-direction: column; + flex-shrink: 1; + overflow: auto; +} +.tox .tox-conversations { + margin: 8px; +} +.tox:not([dir='rtl']) .tox-comment__edit { + margin-left: 8px; +} +.tox:not([dir='rtl']) .tox-comment__buttonspacing > :last-child, +.tox:not([dir='rtl']) .tox-comment__edit > :last-child, +.tox:not([dir='rtl']) .tox-comment__reply > :last-child { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-comment__edit { + margin-right: 8px; +} +.tox[dir='rtl'] .tox-comment__buttonspacing > :last-child, +.tox[dir='rtl'] .tox-comment__edit > :last-child, +.tox[dir='rtl'] .tox-comment__reply > :last-child { + margin-right: 8px; +} +.tox .tox-user { + align-items: center; + display: flex; +} +.tox .tox-user__avatar svg { + fill: rgba(34, 47, 62, 0.7); +} +.tox .tox-user__name { + color: rgba(34, 47, 62, 0.7); + font-size: 12px; + font-style: normal; + font-weight: 700; + text-transform: uppercase; +} +.tox:not([dir='rtl']) .tox-user__avatar svg { + margin-right: 8px; +} +.tox:not([dir='rtl']) .tox-user__avatar + .tox-user__name { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar svg { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-user__avatar + .tox-user__name { + margin-right: 8px; +} +.tox .tox-dialog-wrap { + align-items: center; + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: fixed; + right: 0; + top: 0; + z-index: 1100; +} +.tox .tox-dialog-wrap__backdrop { + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 1; +} +.tox .tox-dialog-wrap__backdrop--opaque { + background-color: #fff; +} +.tox .tox-dialog { + background-color: #fff; + border-color: #ccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: 0 16px 16px -10px rgba(34, 47, 62, 0.15), 0 0 40px 1px rgba(34, 47, 62, 0.15); + display: flex; + flex-direction: column; + max-height: 100%; + max-width: 480px; + overflow: hidden; + position: relative; + width: 95vw; + z-index: 2; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog { + align-self: flex-start; + margin: 8px auto; + width: calc(100vw - 16px); + } +} +.tox .tox-dialog-inline { + z-index: 1100; +} +.tox .tox-dialog__header { + align-items: center; + background-color: #fff; + border-bottom: none; + color: #222f3e; + display: flex; + font-size: 16px; + justify-content: space-between; + padding: 8px 16px 0 16px; + position: relative; +} +.tox .tox-dialog__header .tox-button { + z-index: 1; +} +.tox .tox-dialog__draghandle { + cursor: grab; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.tox .tox-dialog__draghandle:active { + cursor: grabbing; +} +.tox .tox-dialog__dismiss { + margin-left: auto; +} +.tox .tox-dialog__title { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 20px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + margin: 0; + text-transform: none; +} +.tox .tox-dialog__body { + color: #222f3e; + display: flex; + flex: 1; + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + min-width: 0; + text-align: left; + text-transform: none; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body { + flex-direction: column; + } +} +.tox .tox-dialog__body-nav { + align-items: flex-start; + display: flex; + flex-direction: column; + padding: 16px 16px; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox .tox-dialog__body-nav { + flex-direction: row; + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding-bottom: 0; + } +} +.tox .tox-dialog__body-nav-item { + border-bottom: 2px solid transparent; + color: rgba(34, 47, 62, 0.7); + display: inline-block; + font-size: 14px; + line-height: 1.3; + margin-bottom: 8px; + text-decoration: none; + white-space: nowrap; +} +.tox .tox-dialog__body-nav-item:focus { + background-color: rgba(32, 122, 183, 0.1); +} +.tox .tox-dialog__body-nav-item--active { + border-bottom: 2px solid #207ab7; + color: #207ab7; +} +.tox .tox-dialog__body-content { + box-sizing: border-box; + display: flex; + flex: 1; + flex-direction: column; + max-height: 650px; + overflow: auto; + -webkit-overflow-scrolling: touch; + padding: 16px 16px; +} +.tox .tox-dialog__body-content > * { + margin-bottom: 0; + margin-top: 16px; +} +.tox .tox-dialog__body-content > :first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content > :last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content > :only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog__body-content a { + color: #207ab7; + cursor: pointer; + text-decoration: none; +} +.tox .tox-dialog__body-content a:focus, +.tox .tox-dialog__body-content a:hover { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content a:active { + color: #185d8c; + text-decoration: none; +} +.tox .tox-dialog__body-content svg { + fill: #222f3e; +} +.tox .tox-dialog__body-content ul { + display: block; + list-style-type: disc; + margin-bottom: 16px; + margin-inline-end: 0; + margin-inline-start: 0; + padding-inline-start: 2.5rem; +} +.tox .tox-dialog__body-content .tox-form__group h1 { + color: #222f3e; + font-size: 20px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group h2 { + color: #222f3e; + font-size: 16px; + font-style: normal; + font-weight: 700; + letter-spacing: normal; + margin-bottom: 16px; + margin-top: 2rem; + text-transform: none; +} +.tox .tox-dialog__body-content .tox-form__group p { + margin-bottom: 16px; +} +.tox .tox-dialog__body-content .tox-form__group h1:first-child, +.tox .tox-dialog__body-content .tox-form__group h2:first-child, +.tox .tox-dialog__body-content .tox-form__group p:first-child { + margin-top: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:last-child, +.tox .tox-dialog__body-content .tox-form__group h2:last-child, +.tox .tox-dialog__body-content .tox-form__group p:last-child { + margin-bottom: 0; +} +.tox .tox-dialog__body-content .tox-form__group h1:only-child, +.tox .tox-dialog__body-content .tox-form__group h2:only-child, +.tox .tox-dialog__body-content .tox-form__group p:only-child { + margin-bottom: 0; + margin-top: 0; +} +.tox .tox-dialog--width-lg { + height: 650px; + max-width: 1200px; +} +.tox .tox-dialog--width-md { + max-width: 800px; +} +.tox .tox-dialog--width-md .tox-dialog__body-content { + overflow: auto; +} +.tox .tox-dialog__body-content--centered { + text-align: center; +} +.tox .tox-dialog__footer { + align-items: center; + background-color: #fff; + border-top: 1px solid #ccc; + display: flex; + justify-content: space-between; + padding: 8px 16px; +} +.tox .tox-dialog__footer-end, +.tox .tox-dialog__footer-start { + display: flex; +} +.tox .tox-dialog__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.75); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: 3; +} +.tox .tox-dialog__table { + border-collapse: collapse; + width: 100%; +} +.tox .tox-dialog__table thead th { + font-weight: 700; + padding-bottom: 8px; +} +.tox .tox-dialog__table tbody tr { + border-bottom: 1px solid #ccc; +} +.tox .tox-dialog__table tbody tr:last-child { + border-bottom: none; +} +.tox .tox-dialog__table td { + padding-bottom: 8px; + padding-top: 8px; +} +.tox .tox-dialog__popups { + position: absolute; + width: 100%; + z-index: 1100; +} +.tox .tox-dialog__body-iframe { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-dialog__body-iframe .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-iframe .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox .tox-dialog-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox .tox-dialog-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox .tox-dialog-dock-transition { + transition: visibility 0s linear 0.3s, opacity 0.3s ease; +} +.tox .tox-dialog-dock-transition.tox-dialog-dock-fadein { + transition-delay: 0s; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav { + margin-right: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox:not([dir='rtl']) .tox-dialog__body-nav-item:not(:first-child) { + margin-left: 8px; + } +} +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-end > *, +.tox:not([dir='rtl']) .tox-dialog__footer .tox-dialog__footer-start > * { + margin-left: 8px; +} +.tox[dir='rtl'] .tox-dialog__body { + text-align: right; +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav { + margin-left: 0; + } +} +@media only screen and (max-width: 767px) { + body:not(.tox-force-desktop) .tox[dir='rtl'] .tox-dialog__body-nav-item:not(:first-child) { + margin-right: 8px; + } +} +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-end > *, +.tox[dir='rtl'] .tox-dialog__footer .tox-dialog__footer-start > * { + margin-right: 8px; +} +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox .tox-dropzone-container { + display: flex; + flex: 1; +} +.tox .tox-dropzone { + align-items: center; + background: #fff; + border: 2px dashed #ccc; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-grow: 1; + justify-content: center; + min-height: 100px; + padding: 10px; +} +.tox .tox-dropzone p { + color: rgba(34, 47, 62, 0.7); + margin: 0 0 16px 0; +} +.tox .tox-edit-area { + display: flex; + flex: 1; + overflow: hidden; + position: relative; +} +.tox .tox-edit-area__iframe { + background-color: #fff; + border: 0; + box-sizing: border-box; + flex: 1; + height: 100%; + position: absolute; + width: 100%; +} +.tox.tox-inline-edit-area { + border: 1px dotted #ccc; +} +.tox .tox-editor-container { + display: flex; + flex: 1 1 auto; + flex-direction: column; + overflow: hidden; +} +.tox .tox-editor-header { + z-index: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: #fff; + border-bottom: none; + box-shadow: none; + padding: 4px 0; + transition: box-shadow 0.5s; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: 1px solid #c1c1c1; + box-shadow: none; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: #fff; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 4px 0; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox-editor-dock-fadeout { + opacity: 0; + visibility: hidden; +} +.tox-editor-dock-fadein { + opacity: 1; + visibility: visible; +} +.tox-editor-dock-transition { + transition: visibility 0s linear 0.25s, opacity 0.25s ease; +} +.tox-editor-dock-transition.tox-editor-dock-fadein { + transition-delay: 0s; +} +.tox .tox-control-wrap { + flex: 1; + position: relative; +} +.tox .tox-control-wrap:not(.tox-control-wrap--status-invalid) .tox-control-wrap__status-icon-invalid, +.tox .tox-control-wrap:not(.tox-control-wrap--status-unknown) .tox-control-wrap__status-icon-unknown, +.tox .tox-control-wrap:not(.tox-control-wrap--status-valid) .tox-control-wrap__status-icon-valid { + display: none; +} +.tox .tox-control-wrap svg { + display: block; +} +.tox .tox-control-wrap__status-icon-wrap { + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-control-wrap__status-icon-invalid svg { + fill: #c00; +} +.tox .tox-control-wrap__status-icon-unknown svg { + fill: orange; +} +.tox .tox-control-wrap__status-icon-valid svg { + fill: green; +} +.tox:not([dir='rtl']) .tox-control-wrap--status-invalid .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-unknown .tox-textfield, +.tox:not([dir='rtl']) .tox-control-wrap--status-valid .tox-textfield { + padding-right: 32px; +} +.tox:not([dir='rtl']) .tox-control-wrap__status-icon-wrap { + right: 4px; +} +.tox[dir='rtl'] .tox-control-wrap--status-invalid .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-unknown .tox-textfield, +.tox[dir='rtl'] .tox-control-wrap--status-valid .tox-textfield { + padding-left: 32px; +} +.tox[dir='rtl'] .tox-control-wrap__status-icon-wrap { + left: 4px; +} +.tox .tox-autocompleter { + max-width: 25em; +} +.tox .tox-autocompleter .tox-menu { + border-color: #ccc; + box-shadow: none; + max-width: 25em; +} +.tox .tox-autocompleter .tox-autocompleter-highlight { + font-weight: 700; +} +.tox .tox-color-input { + display: flex; + position: relative; + z-index: 1; +} +.tox .tox-color-input .tox-textfield { + z-index: -1; +} +.tox .tox-color-input span { + border-color: rgba(34, 47, 62, 0.2); + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + height: 24px; + position: absolute; + top: 6px; + width: 24px; +} +.tox .tox-color-input span:focus:not([aria-disabled='true']), +.tox .tox-color-input span:hover:not([aria-disabled='true']) { + border-color: #207ab7; + cursor: pointer; +} +.tox .tox-color-input span::before { + background-image: linear-gradient(45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(-45deg, rgba(0, 0, 0, 0.25) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%), + linear-gradient(-45deg, transparent 75%, rgba(0, 0, 0, 0.25) 75%); + background-position: 0 0, 0 6px, 6px -6px, -6px 0; + background-size: 12px 12px; + border: 1px solid #fff; + border-radius: 3px; + box-sizing: border-box; + content: ''; + height: 24px; + left: -1px; + position: absolute; + top: -1px; + width: 24px; + z-index: -1; +} +.tox .tox-color-input span[aria-disabled='true'] { + cursor: not-allowed; +} +.tox:not([dir='rtl']) .tox-color-input .tox-textfield { + padding-left: 36px; +} +.tox:not([dir='rtl']) .tox-color-input span { + left: 6px; +} +.tox[dir='rtl'] .tox-color-input .tox-textfield { + padding-right: 36px; +} +.tox[dir='rtl'] .tox-color-input span { + right: 6px; +} +.tox .tox-label, +.tox .tox-toolbar-label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.3; + padding: 0 8px 0 0; + text-transform: none; + white-space: nowrap; +} +.tox .tox-toolbar-label { + padding: 0 8px; +} +.tox[dir='rtl'] .tox-label { + padding: 0 0 0 8px; +} +.tox .tox-form { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group { + box-sizing: border-box; + margin-bottom: 4px; +} +.tox .tox-form-group--maximize { + flex: 1; +} +.tox .tox-form__group--error { + color: #c00; +} +.tox .tox-form__group--collection { + display: flex; +} +.tox .tox-form__grid { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: space-between; +} +.tox .tox-form__grid--2col > .tox-form__group { + width: calc(50% - (8px / 2)); +} +.tox .tox-form__grid--3col > .tox-form__group { + width: calc(100% / 3 - (8px / 2)); +} +.tox .tox-form__grid--4col > .tox-form__group { + width: calc(25% - (8px / 2)); +} +.tox .tox-form__controls-h-stack { + align-items: center; + display: flex; +} +.tox .tox-form__group--inline { + align-items: center; + display: flex; +} +.tox .tox-form__group--stretched { + display: flex; + flex: 1; + flex-direction: column; +} +.tox .tox-form__group--stretched .tox-textarea { + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj { + display: flex; + flex: 1; +} +.tox .tox-form__group--stretched .tox-navobj :nth-child(2) { + flex: 1; + height: 100%; +} +.tox:not([dir='rtl']) .tox-form__controls-h-stack > :not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-form__controls-h-stack > :not(:first-child) { + margin-right: 4px; +} +.tox .tox-lock.tox-locked .tox-lock-icon__unlock, +.tox .tox-lock:not(.tox-locked) .tox-lock-icon__lock { + display: none; +} +.tox .tox-listboxfield .tox-listbox--select, +.tox .tox-textarea, +.tox .tox-textfield, +.tox .tox-toolbar-textfield { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #ccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-textarea[disabled], +.tox .tox-textfield[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-listboxfield .tox-listbox--select:focus, +.tox .tox-textarea:focus, +.tox .tox-textfield:focus { + background-color: #fff; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} +.tox .tox-toolbar-textfield { + border-width: 0; + margin-bottom: 3px; + margin-top: 2px; + max-width: 250px; +} +.tox .tox-naked-btn { + background-color: transparent; + border: 0; + border-color: transparent; + box-shadow: unset; + color: #207ab7; + cursor: pointer; + display: block; + margin: 0; + padding: 0; +} +.tox .tox-naked-btn svg { + display: block; + fill: #222f3e; +} +.tox:not([dir='rtl']) .tox-toolbar-textfield + * { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-toolbar-textfield + * { + margin-right: 4px; +} +.tox .tox-listboxfield { + cursor: pointer; + position: relative; +} +.tox .tox-listboxfield .tox-listbox--select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-listbox__select-label { + cursor: default; + flex: 1; + margin: 0 4px; +} +.tox .tox-listbox__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-listbox__select-chevron svg { + fill: #222f3e; +} +.tox .tox-listboxfield .tox-listbox--select { + align-items: center; + display: flex; +} +.tox:not([dir='rtl']) .tox-listboxfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-listboxfield svg { + left: 8px; +} +.tox .tox-selectfield { + cursor: pointer; + position: relative; +} +.tox .tox-selectfield select { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: #fff; + border-color: #ccc; + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + color: #222f3e; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 24px; + margin: 0; + min-height: 34px; + outline: 0; + padding: 5px 4.75px; + resize: none; + width: 100%; +} +.tox .tox-selectfield select[disabled] { + background-color: #f2f2f2; + color: rgba(34, 47, 62, 0.85); + cursor: not-allowed; +} +.tox .tox-selectfield select::-ms-expand { + display: none; +} +.tox .tox-selectfield select:focus { + background-color: #fff; + border-color: #207ab7; + box-shadow: none; + outline: 2px solid rgba(32, 122, 183, 0.25); +} +.tox .tox-selectfield svg { + pointer-events: none; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox:not([dir='rtl']) .tox-selectfield select[size='0'], +.tox:not([dir='rtl']) .tox-selectfield select[size='1'] { + padding-right: 24px; +} +.tox:not([dir='rtl']) .tox-selectfield svg { + right: 8px; +} +.tox[dir='rtl'] .tox-selectfield select[size='0'], +.tox[dir='rtl'] .tox-selectfield select[size='1'] { + padding-left: 24px; +} +.tox[dir='rtl'] .tox-selectfield svg { + left: 8px; +} +.tox .tox-textarea { + -webkit-appearance: textarea; + -moz-appearance: textarea; + appearance: textarea; + white-space: pre-wrap; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} +.tox .tox-help__more-link { + list-style: none; + margin-top: 1em; +} +.tox .tox-imagepreview { + background-color: #666; + height: 380px; + overflow: hidden; + position: relative; + width: 100%; +} +.tox .tox-imagepreview.tox-imagepreview__loaded { + overflow: auto; +} +.tox .tox-imagepreview__container { + display: flex; + left: 100vw; + position: absolute; + top: 100vw; +} +.tox .tox-imagepreview__image { + background: url(data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==); +} +.tox .tox-image-tools .tox-spacer { + flex: 1; +} +.tox .tox-image-tools .tox-bar { + align-items: center; + display: flex; + height: 60px; + justify-content: center; +} +.tox .tox-image-tools .tox-imagepreview, +.tox .tox-image-tools .tox-imagepreview + .tox-bar { + margin-top: 8px; +} +.tox .tox-image-tools .tox-croprect-block { + background: #000; + opacity: 0.5; + position: absolute; + zoom: 1; +} +.tox .tox-image-tools .tox-croprect-handle { + border: 2px solid #fff; + height: 20px; + left: 0; + position: absolute; + top: 0; + width: 20px; +} +.tox .tox-image-tools .tox-croprect-handle-move { + border: 0; + cursor: move; + position: absolute; +} +.tox .tox-image-tools .tox-croprect-handle-nw { + border-width: 2px 0 0 2px; + cursor: nw-resize; + left: 100px; + margin: -2px 0 0 -2px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-ne { + border-width: 2px 2px 0 0; + cursor: ne-resize; + left: 200px; + margin: -2px 0 0 -20px; + top: 100px; +} +.tox .tox-image-tools .tox-croprect-handle-sw { + border-width: 0 0 2px 2px; + cursor: sw-resize; + left: 100px; + margin: -20px 2px 0 -2px; + top: 200px; +} +.tox .tox-image-tools .tox-croprect-handle-se { + border-width: 0 2px 2px 0; + cursor: se-resize; + left: 200px; + margin: -20px 0 0 -20px; + top: 200px; +} +.tox .tox-insert-table-picker { + display: flex; + flex-wrap: wrap; + width: 170px; +} +.tox .tox-insert-table-picker > div { + border-color: #ccc; + border-style: solid; + border-width: 0 1px 1px 0; + box-sizing: border-box; + height: 17px; + width: 17px; +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: 0 -4px; +} +.tox .tox-insert-table-picker .tox-insert-table-picker__selected { + background-color: rgba(32, 122, 183, 0.5); + border-color: rgba(32, 122, 183, 0.5); +} +.tox .tox-insert-table-picker__label { + color: rgba(34, 47, 62, 0.7); + display: block; + font-size: 14px; + padding: 4px; + text-align: center; + width: 100%; +} +.tox:not([dir='rtl']) .tox-insert-table-picker > div:nth-child(10n) { + border-right: 0; +} +.tox[dir='rtl'] .tox-insert-table-picker > div:nth-child(10n + 1) { + border-right: 0; +} +.tox .tox-menu { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: 0 4px 8px 0 rgba(34, 47, 62, 0.1); + display: inline-block; + overflow: hidden; + vertical-align: top; + z-index: 1150; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0 0; +} +.tox .tox-menu.tox-collection.tox-collection--toolbar { + padding: 4px; +} +.tox .tox-menu.tox-collection.tox-collection--grid { + padding: 4px; +} +.tox .tox-menu__label blockquote, +.tox .tox-menu__label code, +.tox .tox-menu__label h1, +.tox .tox-menu__label h2, +.tox .tox-menu__label h3, +.tox .tox-menu__label h4, +.tox .tox-menu__label h5, +.tox .tox-menu__label h6, +.tox .tox-menu__label p { + margin: 0; +} +.tox .tox-menubar { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") + left 0 top 0 #fff; + background-color: #fff; + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 4px 0 4px; +} +.tox.tox-tinymce:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-menubar { + border-top: 1px solid #ccc; +} +.tox .tox-mbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 34px; + justify-content: center; + margin: 2px 0 3px 0; + outline: 0; + overflow: hidden; + padding: 0 4px; + text-transform: none; + width: auto; +} +.tox .tox-mbtn[disabled] { + background-color: transparent; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-mbtn:focus:not(:disabled) { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn--active { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn:hover:not(:disabled):not(.tox-mbtn--active) { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-mbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-mbtn[disabled] .tox-mbtn__select-label { + cursor: not-allowed; +} +.tox .tox-mbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; + display: none; +} +.tox .tox-notification { + border-radius: 3px; + border-style: solid; + border-width: 1px; + box-shadow: none; + box-sizing: border-box; + display: grid; + font-size: 14px; + font-weight: 400; + grid-template-columns: minmax(40px, 1fr) auto minmax(40px, 1fr); + margin-top: 4px; + opacity: 0; + padding: 4px; + transition: transform 0.1s ease-in, opacity 150ms ease-in; +} +.tox .tox-notification p { + font-size: 14px; + font-weight: 400; +} +.tox .tox-notification a { + cursor: pointer; + text-decoration: underline; +} +.tox .tox-notification--in { + opacity: 1; +} +.tox .tox-notification--success { + background-color: #e4eeda; + border-color: #d7e6c8; + color: #222f3e; +} +.tox .tox-notification--success p { + color: #222f3e; +} +.tox .tox-notification--success a { + color: #517342; +} +.tox .tox-notification--success svg { + fill: #222f3e; +} +.tox .tox-notification--error { + background-color: #f5cccc; + border-color: #f0b3b3; + color: #222f3e; +} +.tox .tox-notification--error p { + color: #222f3e; +} +.tox .tox-notification--error a { + color: #77181f; +} +.tox .tox-notification--error svg { + fill: #222f3e; +} +.tox .tox-notification--warn, +.tox .tox-notification--warning { + background-color: #fff5cc; + border-color: #fff0b3; + color: #222f3e; +} +.tox .tox-notification--warn p, +.tox .tox-notification--warning p { + color: #222f3e; +} +.tox .tox-notification--warn a, +.tox .tox-notification--warning a { + color: #7a6e25; +} +.tox .tox-notification--warn svg, +.tox .tox-notification--warning svg { + fill: #222f3e; +} +.tox .tox-notification--info { + background-color: #d6e7fb; + border-color: #c1dbf9; + color: #222f3e; +} +.tox .tox-notification--info p { + color: #222f3e; +} +.tox .tox-notification--info a { + color: #2a64a6; +} +.tox .tox-notification--info svg { + fill: #222f3e; +} +.tox .tox-notification__body { + align-self: center; + color: #222f3e; + font-size: 14px; + grid-column-end: 3; + grid-column-start: 2; + grid-row-end: 2; + grid-row-start: 1; + text-align: center; + white-space: normal; + word-break: break-all; + word-break: break-word; +} +.tox .tox-notification__body > * { + margin: 0; +} +.tox .tox-notification__body > * + * { + margin-top: 1rem; +} +.tox .tox-notification__icon { + align-self: center; + grid-column-end: 2; + grid-column-start: 1; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification__icon svg { + display: block; +} +.tox .tox-notification__dismiss { + align-self: start; + grid-column-end: 4; + grid-column-start: 3; + grid-row-end: 2; + grid-row-start: 1; + justify-self: end; +} +.tox .tox-notification .tox-progress-bar { + grid-column-end: 4; + grid-column-start: 1; + grid-row-end: 3; + grid-row-start: 2; + justify-self: center; +} +.tox .tox-pop { + display: inline-block; + position: relative; +} +.tox .tox-pop--resizing { + transition: width 0.1s ease; +} +.tox .tox-pop--resizing .tox-toolbar, +.tox .tox-pop--resizing .tox-toolbar__group { + flex-wrap: nowrap; +} +.tox .tox-pop--transition { + transition: 0.15s ease; + transition-property: left, right, top, bottom; +} +.tox .tox-pop--transition::after, +.tox .tox-pop--transition::before { + transition: all 0.15s, visibility 0s, opacity 75ms ease 75ms; +} +.tox .tox-pop__dialog { + background-color: #fff; + border: 1px solid #ccc; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + min-width: 0; + overflow: hidden; +} +.tox .tox-pop__dialog > :not(.tox-toolbar) { + margin: 4px 4px 4px 8px; +} +.tox .tox-pop__dialog .tox-toolbar { + background-color: transparent; + margin-bottom: -1px; +} +.tox .tox-pop::after, +.tox .tox-pop::before { + border-style: solid; + content: ''; + display: block; + height: 0; + opacity: 1; + position: absolute; + width: 0; +} +.tox .tox-pop.tox-pop--inset::after, +.tox .tox-pop.tox-pop--inset::before { + opacity: 0; + transition: all 0s 0.15s, visibility 0s, opacity 75ms ease; +} +.tox .tox-pop.tox-pop--bottom::after, +.tox .tox-pop.tox-pop--bottom::before { + left: 50%; + top: 100%; +} +.tox .tox-pop.tox-pop--bottom::after { + border-color: #fff transparent transparent transparent; + border-width: 8px; + margin-left: -8px; + margin-top: -1px; +} +.tox .tox-pop.tox-pop--bottom::before { + border-color: #ccc transparent transparent transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--top::after, +.tox .tox-pop.tox-pop--top::before { + left: 50%; + top: 0; + transform: translateY(-100%); +} +.tox .tox-pop.tox-pop--top::after { + border-color: transparent transparent #fff transparent; + border-width: 8px; + margin-left: -8px; + margin-top: 1px; +} +.tox .tox-pop.tox-pop--top::before { + border-color: transparent transparent #ccc transparent; + border-width: 9px; + margin-left: -9px; +} +.tox .tox-pop.tox-pop--left::after, +.tox .tox-pop.tox-pop--left::before { + left: 0; + top: calc(50% - 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--left::after { + border-color: transparent #fff transparent transparent; + border-width: 8px; + margin-left: -15px; +} +.tox .tox-pop.tox-pop--left::before { + border-color: transparent #ccc transparent transparent; + border-width: 10px; + margin-left: -19px; +} +.tox .tox-pop.tox-pop--right::after, +.tox .tox-pop.tox-pop--right::before { + left: 100%; + top: calc(50% + 1px); + transform: translateY(-50%); +} +.tox .tox-pop.tox-pop--right::after { + border-color: transparent transparent transparent #fff; + border-width: 8px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--right::before { + border-color: transparent transparent transparent #ccc; + border-width: 10px; + margin-left: -1px; +} +.tox .tox-pop.tox-pop--align-left::after, +.tox .tox-pop.tox-pop--align-left::before { + left: 20px; +} +.tox .tox-pop.tox-pop--align-right::after, +.tox .tox-pop.tox-pop--align-right::before { + left: calc(100% - 20px); +} +.tox .tox-sidebar-wrap { + display: flex; + flex-direction: row; + flex-grow: 1; + min-height: 0; +} +.tox .tox-sidebar { + background-color: #fff; + display: flex; + flex-direction: row; + justify-content: flex-end; +} +.tox .tox-sidebar__slider { + display: flex; + overflow: hidden; +} +.tox .tox-sidebar__pane-container { + display: flex; +} +.tox .tox-sidebar__pane { + display: flex; +} +.tox .tox-sidebar--sliding-closed { + opacity: 0; +} +.tox .tox-sidebar--sliding-open { + opacity: 1; +} +.tox .tox-sidebar--sliding-growing, +.tox .tox-sidebar--sliding-shrinking { + transition: width 0.5s ease, opacity 0.5s ease; +} +.tox .tox-selector { + background-color: #4099ff; + border-color: #4099ff; + border-style: solid; + border-width: 1px; + box-sizing: border-box; + display: inline-block; + height: 10px; + position: absolute; + width: 10px; +} +.tox.tox-platform-touch .tox-selector { + height: 12px; + width: 12px; +} +.tox .tox-slider { + align-items: center; + display: flex; + flex: 1; + height: 24px; + justify-content: center; + position: relative; +} +.tox .tox-slider__rail { + background-color: transparent; + border: 1px solid #ccc; + border-radius: 3px; + height: 10px; + min-width: 120px; + width: 100%; +} +.tox .tox-slider__handle { + background-color: #207ab7; + border: 2px solid #185d8c; + border-radius: 3px; + box-shadow: none; + height: 24px; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%); + width: 14px; +} +.tox .tox-form__controls-h-stack > .tox-slider:not(:first-of-type) { + margin-inline-start: 8px; +} +.tox .tox-form__controls-h-stack > .tox-form__group + .tox-slider { + margin-inline-start: 32px; +} +.tox .tox-form__controls-h-stack > .tox-slider + .tox-form__group { + margin-inline-start: 32px; +} +.tox .tox-source-code { + overflow: auto; +} +.tox .tox-spinner { + display: flex; +} +.tox .tox-spinner > div { + animation: tam-bouncing-dots 1.5s ease-in-out 0s infinite both; + background-color: rgba(34, 47, 62, 0.7); + border-radius: 100%; + height: 8px; + width: 8px; +} +.tox .tox-spinner > div:nth-child(1) { + animation-delay: -0.32s; +} +.tox .tox-spinner > div:nth-child(2) { + animation-delay: -0.16s; +} +@keyframes tam-bouncing-dots { + 0%, + 100%, + 80% { + transform: scale(0); + } + 40% { + transform: scale(1); + } +} +.tox:not([dir='rtl']) .tox-spinner > div:not(:first-child) { + margin-left: 4px; +} +.tox[dir='rtl'] .tox-spinner > div:not(:first-child) { + margin-right: 4px; +} +.tox .tox-statusbar { + align-items: center; + background-color: #fff; + border-top: 1px solid #ccc; + color: rgba(34, 47, 62, 0.7); + display: flex; + flex: 0 0 auto; + font-size: 12px; + font-weight: 400; + height: 18px; + overflow: hidden; + padding: 0 8px; + position: relative; + text-transform: uppercase; +} +.tox .tox-statusbar__text-container { + display: flex; + flex: 1 1 auto; + justify-content: flex-end; + overflow: hidden; +} +.tox .tox-statusbar__path { + display: flex; + flex: 1 1 auto; + margin-right: auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.tox .tox-statusbar__path > * { + display: inline; + white-space: nowrap; +} +.tox .tox-statusbar__wordcount { + flex: 0 0 auto; + margin-left: 1ch; +} +.tox .tox-statusbar a, +.tox .tox-statusbar__path-item, +.tox .tox-statusbar__wordcount { + color: rgba(34, 47, 62, 0.7); + text-decoration: none; +} +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']) { + color: #222f3e; + cursor: pointer; +} +.tox .tox-statusbar__branding svg { + fill: rgba(34, 47, 62, 0.8); + height: 1.14em; + vertical-align: -0.28em; + width: 3.6em; +} +.tox .tox-statusbar__branding a:focus:not(:disabled):not([aria-disabled='true']) svg, +.tox .tox-statusbar__branding a:hover:not(:disabled):not([aria-disabled='true']) svg { + fill: #222f3e; +} +.tox .tox-statusbar__resize-handle { + align-items: flex-end; + align-self: stretch; + cursor: nwse-resize; + display: flex; + flex: 0 0 auto; + justify-content: flex-end; + margin-left: auto; + margin-right: -8px; + padding-bottom: 3px; + padding-left: 1ch; + padding-right: 3px; +} +.tox .tox-statusbar__resize-handle svg { + display: block; + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-statusbar__resize-handle:focus svg { + background-color: #dee0e2; + border-radius: 1px 1px -4px 1px; + box-shadow: 0 0 0 2px #dee0e2; +} +.tox:not([dir='rtl']) .tox-statusbar__path > * { + margin-right: 4px; +} +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 2ch; +} +.tox[dir='rtl'] .tox-statusbar { + flex-direction: row-reverse; +} +.tox[dir='rtl'] .tox-statusbar__path > * { + margin-left: 4px; +} +.tox .tox-throbber { + z-index: 1299; +} +.tox .tox-throbber__busy-spinner { + align-items: center; + background-color: rgba(255, 255, 255, 0.6); + bottom: 0; + display: flex; + justify-content: center; + left: 0; + position: absolute; + right: 0; + top: 0; +} +.tox .tox-tbtn { + align-items: center; + background: 0 0; + border: 0; + border-radius: 3px; + box-shadow: none; + color: #222f3e; + display: flex; + flex: 0 0 auto; + font-size: 14px; + font-style: normal; + font-weight: 400; + height: 34px; + justify-content: center; + margin: 3px 0 2px 0; + outline: 0; + overflow: hidden; + padding: 0; + text-transform: none; + width: 34px; +} +.tox .tox-tbtn svg { + display: block; + fill: #222f3e; +} +.tox .tox-tbtn.tox-tbtn-more { + padding-left: 5px; + padding-right: 5px; + width: inherit; +} +.tox .tox-tbtn:focus { + background: #dee0e2; + border: 0; + box-shadow: none; +} +.tox .tox-tbtn:hover { + background: #dee0e2; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:hover svg { + fill: #222f3e; +} +.tox .tox-tbtn:active { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn:active svg { + fill: #222f3e; +} +.tox .tox-tbtn--disabled, +.tox .tox-tbtn--disabled:hover, +.tox .tox-tbtn:disabled, +.tox .tox-tbtn:disabled:hover { + background: 0 0; + border: 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); + cursor: not-allowed; +} +.tox .tox-tbtn--disabled svg, +.tox .tox-tbtn--disabled:hover svg, +.tox .tox-tbtn:disabled svg, +.tox .tox-tbtn:disabled:hover svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn--enabled, +.tox .tox-tbtn--enabled:hover { + background: #c8cbcf; + border: 0; + box-shadow: none; + color: #222f3e; +} +.tox .tox-tbtn--enabled:hover > *, +.tox .tox-tbtn--enabled > * { + transform: none; +} +.tox .tox-tbtn--enabled svg, +.tox .tox-tbtn--enabled:hover svg { + fill: #222f3e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) { + color: #222f3e; +} +.tox .tox-tbtn:focus:not(.tox-tbtn--disabled) svg { + fill: #222f3e; +} +.tox .tox-tbtn:active > * { + transform: none; +} +.tox .tox-tbtn--md { + height: 51px; + width: 51px; +} +.tox .tox-tbtn--lg { + flex-direction: column; + height: 68px; + width: 68px; +} +.tox .tox-tbtn--return { + align-self: stretch; + height: unset; + width: 16px; +} +.tox .tox-tbtn--labeled { + padding: 0 4px; + width: unset; +} +.tox .tox-tbtn__vlabel { + display: block; + font-size: 10px; + font-weight: 400; + letter-spacing: -0.025em; + margin-bottom: 4px; + white-space: nowrap; +} +.tox .tox-tbtn--select { + margin: 3px 0 2px 0; + padding: 0 4px; + width: auto; +} +.tox .tox-tbtn__select-label { + cursor: default; + font-weight: 400; + margin: 0 4px; +} +.tox .tox-tbtn__select-chevron { + align-items: center; + display: flex; + justify-content: center; + width: 16px; +} +.tox .tox-tbtn__select-chevron svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-tbtn--bespoke { + background: 0 0; +} +.tox .tox-tbtn--bespoke + .tox-tbtn--bespoke { + margin-inline-start: 0; +} +.tox .tox-tbtn--bespoke .tox-tbtn__select-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + width: 7em; +} +.tox .tox-split-button { + border: 0; + border-radius: 3px; + box-sizing: border-box; + display: flex; + margin: 3px 0 2px 0; + overflow: hidden; +} +.tox .tox-split-button:hover { + box-shadow: 0 0 0 1px #dee0e2 inset; +} +.tox .tox-split-button:focus { + background: #dee0e2; + box-shadow: none; + color: #222f3e; +} +.tox .tox-split-button > * { + border-radius: 0; +} +.tox .tox-split-button__chevron { + width: 16px; +} +.tox .tox-split-button__chevron svg { + fill: rgba(34, 47, 62, 0.5); +} +.tox .tox-split-button .tox-tbtn { + margin: 0; +} +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:focus, +.tox .tox-split-button.tox-tbtn--disabled .tox-tbtn:hover, +.tox .tox-split-button.tox-tbtn--disabled:focus, +.tox .tox-split-button.tox-tbtn--disabled:hover { + background: 0 0; + box-shadow: none; + color: rgba(34, 47, 62, 0.5); +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn--select { + padding: 0 0; +} +.tox.tox-platform-touch .tox-split-button .tox-tbtn:not(.tox-tbtn--select):first-child { + width: 30px; +} +.tox.tox-platform-touch .tox-split-button__chevron { + width: 20px; +} +.tox .tox-toolbar-overlord { + background-color: #fff; +} +.tox .tox-toolbar, +.tox .tox-toolbar__overflow, +.tox .tox-toolbar__primary { + background-color: #fff; + background-image: repeating-linear-gradient(#ccc 0 1px, transparent 1px 39px); + background-position: center top 39px; + background-repeat: no-repeat; + background-size: calc(100% - 4px * 2) calc(100% - 39px); + display: flex; + flex: 0 0 auto; + flex-shrink: 0; + flex-wrap: wrap; + padding: 0 0; + transform: perspective(1px); +} +.tox .tox-toolbar-overlord > .tox-toolbar, +.tox .tox-toolbar-overlord > .tox-toolbar__overflow, +.tox .tox-toolbar-overlord > .tox-toolbar__primary { + background-position: center top 0; + background-size: calc(100% - 4px * 2) calc(100% - 0px); +} +.tox .tox-toolbar__overflow.tox-toolbar__overflow--closed { + height: 0; + opacity: 0; + padding-bottom: 0; + padding-top: 0; + visibility: hidden; +} +.tox .tox-toolbar__overflow--growing { + transition: height 0.3s ease, opacity 0.2s linear 0.1s; +} +.tox .tox-toolbar__overflow--shrinking { + transition: opacity 0.3s ease, height 0.2s linear 0.1s, visibility 0s linear 0.3s; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: 1px solid #ccc; + margin-top: 0; + padding-bottom: 0; + padding-top: 0; +} +.tox .tox-toolbar--scrolling { + flex-wrap: nowrap; + overflow-x: auto; +} +.tox .tox-pop .tox-toolbar { + border-width: 0; +} +.tox .tox-toolbar--no-divider { + background-image: none; +} +.tox .tox-toolbar-overlord .tox-toolbar:not(.tox-toolbar--scrolling):first-child, +.tox .tox-toolbar-overlord .tox-toolbar__primary { + background-position: center top 39px; +} +.tox .tox-editor-header > .tox-toolbar--scrolling, +.tox .tox-toolbar-overlord .tox-toolbar--scrolling:first-child { + background-image: none; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + background-color: #fff; + background-position: center top 43px; + background-size: calc(100% - 8px * 2) calc(100% - 51px); + border: none; + border-radius: 3px; + box-shadow: 0 0 2px 0 rgba(34, 47, 62, 0.2), 0 4px 8px 0 rgba(34, 47, 62, 0.15); + padding: 4px 0; +} +.tox-pop .tox-pop__dialog .tox-toolbar { + background-position: center top 43px; + background-size: calc(100% - 4px * 2) calc(100% - 51px); + padding: 4px 0; +} +.tox .tox-toolbar__group { + align-items: center; + display: flex; + flex-wrap: wrap; + margin: 0 0; + padding: 0 4px 0 4px; +} +.tox .tox-toolbar__group--pull-right { + margin-left: auto; +} +.tox .tox-toolbar--scrolling .tox-toolbar__group { + flex-shrink: 0; + flex-wrap: nowrap; +} +.tox:not([dir='rtl']) .tox-toolbar__group:not(:last-of-type) { + border-right: 1px solid #ccc; +} +.tox[dir='rtl'] .tox-toolbar__group:not(:last-of-type) { + border-left: 1px solid #ccc; +} +.tox .tox-tooltip { + display: inline-block; + padding: 8px; + position: relative; +} +.tox .tox-tooltip__body { + background-color: #222f3e; + border-radius: 3px; + box-shadow: 0 2px 4px rgba(34, 47, 62, 0.3); + color: rgba(255, 255, 255, 0.75); + font-size: 14px; + font-style: normal; + font-weight: 400; + padding: 4px 8px; + text-transform: none; +} +.tox .tox-tooltip__arrow { + position: absolute; +} +.tox .tox-tooltip--down .tox-tooltip__arrow { + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid #222f3e; + bottom: 0; + left: 50%; + position: absolute; + transform: translateX(-50%); +} +.tox .tox-tooltip--up .tox-tooltip__arrow { + border-bottom: 8px solid #222f3e; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + left: 50%; + position: absolute; + top: 0; + transform: translateX(-50%); +} +.tox .tox-tooltip--right .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-left: 8px solid #222f3e; + border-top: 8px solid transparent; + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-tooltip--left .tox-tooltip__arrow { + border-bottom: 8px solid transparent; + border-right: 8px solid #222f3e; + border-top: 8px solid transparent; + left: 0; + position: absolute; + top: 50%; + transform: translateY(-50%); +} +.tox .tox-well { + border: 1px solid #ccc; + border-radius: 3px; + padding: 8px; + width: 100%; +} +.tox .tox-well > :first-child { + margin-top: 0; +} +.tox .tox-well > :last-child { + margin-bottom: 0; +} +.tox .tox-well > :only-child { + margin: 0; +} +.tox .tox-custom-editor { + border: 1px solid #ccc; + border-radius: 3px; + display: flex; + flex: 1; + position: relative; +} +.tox .tox-dialog-loading::before { + background-color: rgba(0, 0, 0, 0.5); + content: ''; + height: 100%; + position: absolute; + width: 100%; + z-index: 1000; +} +.tox .tox-tab { + cursor: pointer; +} +.tox .tox-dialog__content-js { + display: flex; + flex: 1; +} +.tox .tox-dialog__body-content .tox-collection { + display: flex; + flex: 1; +} +.tox:not(.tox-tinymce-inline) .tox-editor-header { + background-color: none; + padding: 0; +} +.tox.tox-tinymce--toolbar-bottom .tox-editor-header, +.tox.tox-tinymce-inline .tox-editor-header { + margin-bottom: -1px; +} +.tox:not(.tox-tinymce-inline).tox-tinymce--toolbar-bottom .tox-editor-header { + border-top: none; + box-shadow: none; +} +.tox.tox.tox-tinymce--toolbar-sticky-on .tox-editor-header { + background-color: transparent; + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); + padding: 0; +} +.tox.tox.tox-tinymce--toolbar-sticky-on.tox-tinymce--toolbar-bottom .tox-editor-header { + box-shadow: 0 4px 4px -3px rgba(0, 0, 0, 0.25); +} +.tox .tox-collection--list .tox-collection__group .tox-insert-table-picker { + margin: -4px 0; +} +.tox .tox-menu.tox-collection.tox-collection--list { + padding: 0; +} +.tox .tox-pop { + box-shadow: none; +} +.tox .tox-split-button, +.tox .tox-tbtn, +.tox .tox-tbtn--select { + margin: 2px 0 3px 0; +} +.tox .tox-toolbar, +.tox .tox-toolbar__overflow, +.tox .tox-toolbar__primary { + background: url("data:image/svg+xml;charset=utf8,%3Csvg height='39px' viewBox='0 0 40 39px' width='40' xmlns='http://www.w3.org/2000/svg'%3E%3Crect x='0' y='38px' width='100' height='1' fill='%23cccccc'/%3E%3C/svg%3E") + left 0 top 0 #fff !important; +} +.tox .tox-menubar + .tox-toolbar-overlord { + border-top: none; +} +.tox .tox-menubar + .tox-toolbar, +.tox .tox-menubar + .tox-toolbar-overlord .tox-toolbar__primary { + border-top: 1px solid #ccc; + margin-top: -1px; +} +.tox.tox-tinymce-aux .tox-toolbar__overflow { + border: 1px solid #ccc; + padding: 0; +} +.tox:not(.tox-tinymce-inline) + .tox-editor-header:not(:first-child) + .tox-toolbar-overlord:first-child + .tox-toolbar__primary, +.tox:not(.tox-tinymce-inline) .tox-editor-header:not(:first-child) .tox-toolbar:first-child { + border-top: 1px solid #ccc; +} +.tox .tox-toolbar__group { + padding: 0 4px 0 4px; +} +.tox .tox-collection__item { + border-radius: 0; + cursor: pointer; +} +.tox .tox-statusbar a:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar a:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__path-item:hover:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:focus:not(:disabled):not([aria-disabled='true']), +.tox .tox-statusbar__wordcount:hover:not(:disabled):not([aria-disabled='true']) { + color: rgba(34, 47, 62, 0.7); + text-decoration: underline; +} +.tox .tox-statusbar__branding svg { + vertical-align: -0.25em; +} +.tox:not([dir='rtl']) .tox-statusbar__branding { + margin-left: 1ch; +} +.tox .tox-statusbar__resize-handle { + padding-bottom: 0; + padding-right: 0; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css new file mode 100644 index 00000000..d9ea82a3 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.css @@ -0,0 +1,35 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} + +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} + +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} + +.tox.tox-tinymce.tox-fullscreen, +.tox-shadowhost.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} + +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} + +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css new file mode 100644 index 00000000..c1141c55 --- /dev/null +++ b/src/frontend/admin/public/tinymce/skins/ui/tinymce-5/skin.shadowdom.min.css @@ -0,0 +1,30 @@ +body.tox-dialog__disable-scroll { + overflow: hidden; +} +.tox-fullscreen { + border: 0; + height: 100%; + margin: 0; + overflow: hidden; + overscroll-behavior: none; + padding: 0; + touch-action: pinch-zoom; + width: 100%; +} +.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle { + display: none; +} +.tox-shadowhost.tox-fullscreen, +.tox.tox-tinymce.tox-fullscreen { + left: 0; + position: fixed; + top: 0; + z-index: 1200; +} +.tox.tox-tinymce.tox-fullscreen { + background-color: transparent; +} +.tox-fullscreen .tox.tox-tinymce-aux, +.tox-fullscreen ~ .tox.tox-tinymce-aux { + z-index: 1201; +} \ No newline at end of file diff --git a/src/frontend/admin/src/App.vue b/src/frontend/admin/src/App.vue new file mode 100644 index 00000000..805ab9b2 --- /dev/null +++ b/src/frontend/admin/src/App.vue @@ -0,0 +1,46 @@ + + + + + \ No newline at end of file diff --git a/src/frontend/admin/src/api/index.js b/src/frontend/admin/src/api/index.js new file mode 100644 index 00000000..1397ad01 --- /dev/null +++ b/src/frontend/admin/src/api/index.js @@ -0,0 +1,11 @@ +/** + * @description 自动import导入所有 api 模块 + */ + +const files = import.meta.globEager('./*/*.js') +const modules = {} +Object.keys(files).forEach((key) => { + modules[key.replace(/^\.\/(.*?)\/(.*)\.js$/g, '$1_$2')] = files[key].default +}) + +export default modules \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/api.js b/src/frontend/admin/src/api/sys/api.js new file mode 100644 index 00000000..0ba9a3a2 --- /dev/null +++ b/src/frontend/admin/src/api/sys/api.js @@ -0,0 +1,33 @@ +/** + * 接口服务 + * @module @/api/sys/api + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 查询接口 + */ +query :{ + url: `${config.API_URL}/api/sys/api/query`, + name: `查询接口`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 同步接口 + */ +sync :{ + url: `${config.API_URL}/api/sys/api/sync`, + name: `同步接口`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/cache.js b/src/frontend/admin/src/api/sys/cache.js new file mode 100644 index 00000000..c0af0208 --- /dev/null +++ b/src/frontend/admin/src/api/sys/cache.js @@ -0,0 +1,33 @@ +/** + * 缓存服务 + * @module @/api/sys/cache + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 缓存统计 + */ +cacheStatistics :{ + url: `${config.API_URL}/api/sys/cache/cache.statistics`, + name: `缓存统计`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 获取所有缓存项 + */ +getAllEntries :{ + url: `${config.API_URL}/api/sys/cache/get.all.entries`, + name: `获取所有缓存项`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/captcha.js b/src/frontend/admin/src/api/sys/captcha.js new file mode 100644 index 00000000..7136d98b --- /dev/null +++ b/src/frontend/admin/src/api/sys/captcha.js @@ -0,0 +1,33 @@ +/** + * 人机验证服务 + * @module @/api/sys/captcha + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 获取人机校验图 + */ +getCaptchaImage :{ + url: `${config.API_URL}/api/sys/captcha/get.captcha.image`, + name: `获取人机校验图`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 完成人机校验 + */ +verifyCaptcha :{ + url: `${config.API_URL}/api/sys/captcha/verify.captcha`, + name: `完成人机校验`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/config.js b/src/frontend/admin/src/api/sys/config.js new file mode 100644 index 00000000..cb4d0981 --- /dev/null +++ b/src/frontend/admin/src/api/sys/config.js @@ -0,0 +1,88 @@ +/** + * 配置服务 + * @module @/api/sys/config + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除配置 + */ +bulkDelete :{ + url: `${config.API_URL}/api/sys/config/bulk.delete`, + name: `批量删除配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建配置 + */ +create :{ + url: `${config.API_URL}/api/sys/config/create`, + name: `创建配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除配置 + */ +delete :{ + url: `${config.API_URL}/api/sys/config/delete`, + name: `删除配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 获取最新有效配置 + */ +getLatestConfig :{ + url: `${config.API_URL}/api/sys/config/get.latest.config`, + name: `获取最新有效配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询配置 + */ +pagedQuery :{ + url: `${config.API_URL}/api/sys/config/paged.query`, + name: `分页查询配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询配置 + */ +query :{ + url: `${config.API_URL}/api/sys/config/query`, + name: `查询配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新配置 + */ +update :{ + url: `${config.API_URL}/api/sys/config/update`, + name: `更新配置`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/constant.js b/src/frontend/admin/src/api/sys/constant.js new file mode 100644 index 00000000..42c8aae4 --- /dev/null +++ b/src/frontend/admin/src/api/sys/constant.js @@ -0,0 +1,55 @@ +/** + * 常量服务 + * @module @/api/sys/constant + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 获得常量字符串 + */ +getChars :{ + url: `${config.API_URL}/api/sys/constant/get.chars`, + name: `获得常量字符串`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 获得公共枚举值 + */ +getEnums :{ + url: `${config.API_URL}/api/sys/constant/get.enums`, + name: `获得公共枚举值`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 获得本地化字符串 + */ +getLocalizedStrings :{ + url: `${config.API_URL}/api/sys/constant/get.localized.strings`, + name: `获得本地化字符串`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 获得数字常量表 + */ +getNumbers :{ + url: `${config.API_URL}/api/sys/constant/get.numbers`, + name: `获得数字常量表`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/dept.js b/src/frontend/admin/src/api/sys/dept.js new file mode 100644 index 00000000..963b6e06 --- /dev/null +++ b/src/frontend/admin/src/api/sys/dept.js @@ -0,0 +1,66 @@ +/** + * 部门服务 + * @module @/api/sys/dept + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除部门 + */ +bulkDelete :{ + url: `${config.API_URL}/api/sys/dept/bulk.delete`, + name: `批量删除部门`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建部门 + */ +create :{ + url: `${config.API_URL}/api/sys/dept/create`, + name: `创建部门`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除部门 + */ +delete :{ + url: `${config.API_URL}/api/sys/dept/delete`, + name: `删除部门`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询部门 + */ +query :{ + url: `${config.API_URL}/api/sys/dept/query`, + name: `查询部门`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新部门 + */ +update :{ + url: `${config.API_URL}/api/sys/dept/update`, + name: `更新部门`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/dev.js b/src/frontend/admin/src/api/sys/dev.js new file mode 100644 index 00000000..fddc09c5 --- /dev/null +++ b/src/frontend/admin/src/api/sys/dev.js @@ -0,0 +1,44 @@ +/** + * 开发服务 + * @module @/api/sys/dev + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 生成后端代码 + */ +generateCsCode :{ + url: `${config.API_URL}/api/sys/dev/generate.cs.code`, + name: `生成后端代码`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 生成图标代码 + */ +generateIconCode :{ + url: `${config.API_URL}/api/sys/dev/generate.icon.code`, + name: `生成图标代码`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 生成接口代码 + */ +generateJsCode :{ + url: `${config.API_URL}/api/sys/dev/generate.js.code`, + name: `生成接口代码`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/dic.js b/src/frontend/admin/src/api/sys/dic.js new file mode 100644 index 00000000..9ccefda6 --- /dev/null +++ b/src/frontend/admin/src/api/sys/dic.js @@ -0,0 +1,143 @@ +/** + * 字典服务 + * @module @/api/sys/dic + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除字典目录 + */ +bulkDeleteCatalog :{ + url: `${config.API_URL}/api/sys/dic/bulk.delete.catalog`, + name: `批量删除字典目录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 批量删除字典内容 + */ +bulkDeleteContent :{ + url: `${config.API_URL}/api/sys/dic/bulk.delete.content`, + name: `批量删除字典内容`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建字典目录 + */ +createCatalog :{ + url: `${config.API_URL}/api/sys/dic/create.catalog`, + name: `创建字典目录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建字典内容 + */ +createContent :{ + url: `${config.API_URL}/api/sys/dic/create.content`, + name: `创建字典内容`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除字典目录 + */ +deleteCatalog :{ + url: `${config.API_URL}/api/sys/dic/delete.catalog`, + name: `删除字典目录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除字典内容 + */ +deleteContent :{ + url: `${config.API_URL}/api/sys/dic/delete.content`, + name: `删除字典内容`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询字典目录 + */ +pagedQueryCatalog :{ + url: `${config.API_URL}/api/sys/dic/paged.query.catalog`, + name: `分页查询字典目录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询字典内容 + */ +pagedQueryContent :{ + url: `${config.API_URL}/api/sys/dic/paged.query.content`, + name: `分页查询字典内容`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询字典目录 + */ +queryCatalog :{ + url: `${config.API_URL}/api/sys/dic/query.catalog`, + name: `查询字典目录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询字典内容 + */ +queryContent :{ + url: `${config.API_URL}/api/sys/dic/query.content`, + name: `查询字典内容`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新字典目录 + */ +updateCatalog :{ + url: `${config.API_URL}/api/sys/dic/update.catalog`, + name: `更新字典目录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新字典内容 + */ +updateContent :{ + url: `${config.API_URL}/api/sys/dic/update.content`, + name: `更新字典内容`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/file.js b/src/frontend/admin/src/api/sys/file.js new file mode 100644 index 00000000..5b50ba66 --- /dev/null +++ b/src/frontend/admin/src/api/sys/file.js @@ -0,0 +1,22 @@ +/** + * 文件服务 + * @module @/api/sys/file + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 文件上传 + */ +upload :{ + url: `${config.API_URL}/api/sys/file/upload`, + name: `文件上传`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/log.js b/src/frontend/admin/src/api/sys/log.js new file mode 100644 index 00000000..054de945 --- /dev/null +++ b/src/frontend/admin/src/api/sys/log.js @@ -0,0 +1,33 @@ +/** + * 请求日志服务 + * @module @/api/sys/log + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 分页查询请求日志 + */ +pagedQuery :{ + url: `${config.API_URL}/api/sys/log/paged.query`, + name: `分页查询请求日志`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询请求日志 + */ +query :{ + url: `${config.API_URL}/api/sys/log/query`, + name: `查询请求日志`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/menu.js b/src/frontend/admin/src/api/sys/menu.js new file mode 100644 index 00000000..ea55a58f --- /dev/null +++ b/src/frontend/admin/src/api/sys/menu.js @@ -0,0 +1,77 @@ +/** + * 菜单服务 + * @module @/api/sys/menu + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除菜单 + */ +bulkDelete :{ + url: `${config.API_URL}/api/sys/menu/bulk.delete`, + name: `批量删除菜单`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建菜单 + */ +create :{ + url: `${config.API_URL}/api/sys/menu/create`, + name: `创建菜单`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除菜单 + */ +delete :{ + url: `${config.API_URL}/api/sys/menu/delete`, + name: `删除菜单`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询菜单 + */ +query :{ + url: `${config.API_URL}/api/sys/menu/query`, + name: `查询菜单`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新菜单 + */ +update :{ + url: `${config.API_URL}/api/sys/menu/update`, + name: `更新菜单`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 当前用户菜单 + */ +userMenus :{ + url: `${config.API_URL}/api/sys/menu/user.menus`, + name: `当前用户菜单`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/position.js b/src/frontend/admin/src/api/sys/position.js new file mode 100644 index 00000000..43e5093b --- /dev/null +++ b/src/frontend/admin/src/api/sys/position.js @@ -0,0 +1,77 @@ +/** + * 岗位服务 + * @module @/api/sys/position + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除岗位 + */ +bulkDelete :{ + url: `${config.API_URL}/api/sys/position/bulk.delete`, + name: `批量删除岗位`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建岗位 + */ +create :{ + url: `${config.API_URL}/api/sys/position/create`, + name: `创建岗位`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除岗位 + */ +delete :{ + url: `${config.API_URL}/api/sys/position/delete`, + name: `删除岗位`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询岗位 + */ +pagedQuery :{ + url: `${config.API_URL}/api/sys/position/paged.query`, + name: `分页查询岗位`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询岗位 + */ +query :{ + url: `${config.API_URL}/api/sys/position/query`, + name: `查询岗位`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新岗位 + */ +update :{ + url: `${config.API_URL}/api/sys/position/update`, + name: `更新岗位`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/role.js b/src/frontend/admin/src/api/sys/role.js new file mode 100644 index 00000000..1772d99f --- /dev/null +++ b/src/frontend/admin/src/api/sys/role.js @@ -0,0 +1,77 @@ +/** + * 角色服务 + * @module @/api/sys/role + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除角色 + */ +bulkDelete :{ + url: `${config.API_URL}/api/sys/role/bulk.delete`, + name: `批量删除角色`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建角色 + */ +create :{ + url: `${config.API_URL}/api/sys/role/create`, + name: `创建角色`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除角色 + */ +delete :{ + url: `${config.API_URL}/api/sys/role/delete`, + name: `删除角色`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询角色 + */ +pagedQuery :{ + url: `${config.API_URL}/api/sys/role/paged.query`, + name: `分页查询角色`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询角色 + */ +query :{ + url: `${config.API_URL}/api/sys/role/query`, + name: `查询角色`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新角色 + */ +update :{ + url: `${config.API_URL}/api/sys/role/update`, + name: `更新角色`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/tools.js b/src/frontend/admin/src/api/sys/tools.js new file mode 100644 index 00000000..f42c06fa --- /dev/null +++ b/src/frontend/admin/src/api/sys/tools.js @@ -0,0 +1,33 @@ +/** + * 工具服务 + * @module @/api/sys/tools + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 服务器时间 + */ +getServerUtcTime :{ + url: `${config.API_URL}/api/sys/tools/get.server.utc.time`, + name: `服务器时间`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 版本信息 + */ +version :{ + url: `${config.API_URL}/api/sys/tools/version`, + name: `版本信息`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/user.js b/src/frontend/admin/src/api/sys/user.js new file mode 100644 index 00000000..5a4d30c6 --- /dev/null +++ b/src/frontend/admin/src/api/sys/user.js @@ -0,0 +1,198 @@ +/** + * 用户服务 + * @module @/api/sys/user + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 检查手机号是否可用 + */ +checkMobileAvailable :{ + url: `${config.API_URL}/api/sys/user/check.mobile.available`, + name: `检查手机号是否可用`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 检查用户名是否可用 + */ +checkUserNameAvailable :{ + url: `${config.API_URL}/api/sys/user/check.user.name.available`, + name: `检查用户名是否可用`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建用户 + */ +create :{ + url: `${config.API_URL}/api/sys/user/create`, + name: `创建用户`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除用户 + */ +delete :{ + url: `${config.API_URL}/api/sys/user/delete`, + name: `删除用户`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 密码登录 + */ +loginByPwd :{ + url: `${config.API_URL}/api/sys/user/login.by.pwd`, + name: `密码登录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 短信登录 + */ +loginBySms :{ + url: `${config.API_URL}/api/sys/user/login.by.sms`, + name: `短信登录`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询用户 + */ +pagedQuery :{ + url: `${config.API_URL}/api/sys/user/paged.query`, + name: `分页查询用户`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询用户 + */ +query :{ + url: `${config.API_URL}/api/sys/user/query`, + name: `查询用户`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询用户档案 + */ +queryProfile :{ + url: `${config.API_URL}/api/sys/user/query.profile`, + name: `查询用户档案`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 注册用户 + */ +register :{ + url: `${config.API_URL}/api/sys/user/register`, + name: `注册用户`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 重设密码 + */ +resetPassword :{ + url: `${config.API_URL}/api/sys/user/reset.password`, + name: `重设密码`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新用户头像 + */ +setAvatar :{ + url: `${config.API_URL}/api/sys/user/set.avatar`, + name: `更新用户头像`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 设置邮箱 + */ +setEmail :{ + url: `${config.API_URL}/api/sys/user/set.email`, + name: `设置邮箱`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 设置手机号 + */ +setMobile :{ + url: `${config.API_URL}/api/sys/user/set.mobile`, + name: `设置手机号`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 设置密码 + */ +setPassword :{ + url: `${config.API_URL}/api/sys/user/set.password`, + name: `设置密码`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新用户 + */ +update :{ + url: `${config.API_URL}/api/sys/user/update`, + name: `更新用户`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 当前用户信息 + */ +userInfo :{ + url: `${config.API_URL}/api/sys/user/user.info`, + name: `当前用户信息`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/sys/verifycode.js b/src/frontend/admin/src/api/sys/verifycode.js new file mode 100644 index 00000000..f0ea1264 --- /dev/null +++ b/src/frontend/admin/src/api/sys/verifycode.js @@ -0,0 +1,33 @@ +/** + * 验证码服务 + * @module @/api/sys/verify.code + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 发送验证码 + */ +sendVerifyCode :{ + url: `${config.API_URL}/api/sys/verify.code/send.verify.code`, + name: `发送验证码`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 完成验证 + */ +verify :{ + url: `${config.API_URL}/api/sys/verify.code/verify`, + name: `完成验证`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/tpl/example.js b/src/frontend/admin/src/api/tpl/example.js new file mode 100644 index 00000000..4b672530 --- /dev/null +++ b/src/frontend/admin/src/api/tpl/example.js @@ -0,0 +1,77 @@ +/** + * 示例服务 + * @module @/api/tpl/example + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + /** + * 批量删除示例 + */ +bulkDelete :{ + url: `${config.API_URL}/api/tpl/example/bulk.delete`, + name: `批量删除示例`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 创建示例 + */ +create :{ + url: `${config.API_URL}/api/tpl/example/create`, + name: `创建示例`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 删除示例 + */ +delete :{ + url: `${config.API_URL}/api/tpl/example/delete`, + name: `删除示例`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 分页查询示例 + */ +pagedQuery :{ + url: `${config.API_URL}/api/tpl/example/paged.query`, + name: `分页查询示例`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 查询示例 + */ +query :{ + url: `${config.API_URL}/api/tpl/example/query`, + name: `查询示例`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +/** + * 更新示例 + */ +update :{ + url: `${config.API_URL}/api/tpl/example/update`, + name: `更新示例`, + post:async function(data={}, config={}) { + return await http.post(this.url,data, config) + } +}, + +} \ No newline at end of file diff --git a/src/frontend/admin/src/api/tpl/inner.js b/src/frontend/admin/src/api/tpl/inner.js new file mode 100644 index 00000000..d4dfd800 --- /dev/null +++ b/src/frontend/admin/src/api/tpl/inner.js @@ -0,0 +1,10 @@ +//~/** +//~ * $actionDesc$ +//~ */ +//~$actionName$ :{ +//~ url: `${config.API_URL}/$actionPath$`, +//~ name: `$actionDesc$`, +//~ $actionMethod$:async function(data={}, config={}) { +//~ return await http.$actionMethod$(this.url,data, config) +//~ } +//~}, \ No newline at end of file diff --git a/src/frontend/admin/src/api/tpl/outer.js b/src/frontend/admin/src/api/tpl/outer.js new file mode 100644 index 00000000..15b6479b --- /dev/null +++ b/src/frontend/admin/src/api/tpl/outer.js @@ -0,0 +1,13 @@ +/** + * $controllerDesc$ + * @module @/$controllerPath$ + */ + +import config from "@/config" +import http from "@/utils/request" + +export default { + + //~$inner$ + +} \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Api.vue b/src/frontend/admin/src/assets/icons/Api.vue new file mode 100644 index 00000000..bf12ac5a --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Api.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/App.vue b/src/frontend/admin/src/assets/icons/App.vue new file mode 100644 index 00000000..969371f1 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/App.vue @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/App2.vue b/src/frontend/admin/src/assets/icons/App2.vue new file mode 100644 index 00000000..84c82568 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/App2.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/BugFill.vue b/src/frontend/admin/src/assets/icons/BugFill.vue new file mode 100644 index 00000000..82131e69 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/BugFill.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/BugLine.vue b/src/frontend/admin/src/assets/icons/BugLine.vue new file mode 100644 index 00000000..06a8f25c --- /dev/null +++ b/src/frontend/admin/src/assets/icons/BugLine.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Business.vue b/src/frontend/admin/src/assets/icons/Business.vue new file mode 100644 index 00000000..462eaf0c --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Business.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Code.vue b/src/frontend/admin/src/assets/icons/Code.vue new file mode 100644 index 00000000..766183de --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Code.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Code2.vue b/src/frontend/admin/src/assets/icons/Code2.vue new file mode 100644 index 00000000..9e49fcc7 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Code2.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Csharp.vue b/src/frontend/admin/src/assets/icons/Csharp.vue new file mode 100644 index 00000000..f68bbb99 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Csharp.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Dashboard.vue b/src/frontend/admin/src/assets/icons/Dashboard.vue new file mode 100644 index 00000000..fa38220b --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Dashboard.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Demo.vue b/src/frontend/admin/src/assets/icons/Demo.vue new file mode 100644 index 00000000..43036476 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Demo.vue @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Dept.vue b/src/frontend/admin/src/assets/icons/Dept.vue new file mode 100644 index 00000000..41f810aa --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Dept.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Device.vue b/src/frontend/admin/src/assets/icons/Device.vue new file mode 100644 index 00000000..fa32daf0 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Device.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Dic.vue b/src/frontend/admin/src/assets/icons/Dic.vue new file mode 100644 index 00000000..ebaabec9 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Dic.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Docker.vue b/src/frontend/admin/src/assets/icons/Docker.vue new file mode 100644 index 00000000..7a7628fd --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Docker.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Download.vue b/src/frontend/admin/src/assets/icons/Download.vue new file mode 100644 index 00000000..4ebd9cba --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Download.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Drone.vue b/src/frontend/admin/src/assets/icons/Drone.vue new file mode 100644 index 00000000..4b16be7b --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Drone.vue @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Elastic.vue b/src/frontend/admin/src/assets/icons/Elastic.vue new file mode 100644 index 00000000..2a604114 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Elastic.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/FileExcel.vue b/src/frontend/admin/src/assets/icons/FileExcel.vue new file mode 100644 index 00000000..bc94f8ec --- /dev/null +++ b/src/frontend/admin/src/assets/icons/FileExcel.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/FilePpt.vue b/src/frontend/admin/src/assets/icons/FilePpt.vue new file mode 100644 index 00000000..dc86cb42 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/FilePpt.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/FileWord.vue b/src/frontend/admin/src/assets/icons/FileWord.vue new file mode 100644 index 00000000..938125d3 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/FileWord.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Gitea.vue b/src/frontend/admin/src/assets/icons/Gitea.vue new file mode 100644 index 00000000..988fb8a4 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Gitea.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Grafana.vue b/src/frontend/admin/src/assets/icons/Grafana.vue new file mode 100644 index 00000000..48a0a3c8 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Grafana.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Js.vue b/src/frontend/admin/src/assets/icons/Js.vue new file mode 100644 index 00000000..37044e49 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Js.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Kafka.vue b/src/frontend/admin/src/assets/icons/Kafka.vue new file mode 100644 index 00000000..d114aa9b --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Kafka.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Kibana.vue b/src/frontend/admin/src/assets/icons/Kibana.vue new file mode 100644 index 00000000..d5c06819 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Kibana.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Link.vue b/src/frontend/admin/src/assets/icons/Link.vue new file mode 100644 index 00000000..9a7e5eca --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Link.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Memory.vue b/src/frontend/admin/src/assets/icons/Memory.vue new file mode 100644 index 00000000..005e4cbb --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Memory.vue @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Meter.vue b/src/frontend/admin/src/assets/icons/Meter.vue new file mode 100644 index 00000000..89eb0a24 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Meter.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Organization.vue b/src/frontend/admin/src/assets/icons/Organization.vue new file mode 100644 index 00000000..6010b5c2 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Organization.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Position.vue b/src/frontend/admin/src/assets/icons/Position.vue new file mode 100644 index 00000000..3ee928a3 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Position.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Product.vue b/src/frontend/admin/src/assets/icons/Product.vue new file mode 100644 index 00000000..bc776705 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Product.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/ProductCategory.vue b/src/frontend/admin/src/assets/icons/ProductCategory.vue new file mode 100644 index 00000000..bbc45dbb --- /dev/null +++ b/src/frontend/admin/src/assets/icons/ProductCategory.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Resource.vue b/src/frontend/admin/src/assets/icons/Resource.vue new file mode 100644 index 00000000..51abc643 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Resource.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Robot.vue b/src/frontend/admin/src/assets/icons/Robot.vue new file mode 100644 index 00000000..581c85ba --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Robot.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Role.vue b/src/frontend/admin/src/assets/icons/Role.vue new file mode 100644 index 00000000..214bcadd --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Role.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Send.vue b/src/frontend/admin/src/assets/icons/Send.vue new file mode 100644 index 00000000..2b084c0b --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Send.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/SmsCode.vue b/src/frontend/admin/src/assets/icons/SmsCode.vue new file mode 100644 index 00000000..4f0aa13e --- /dev/null +++ b/src/frontend/admin/src/assets/icons/SmsCode.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Sync.vue b/src/frontend/admin/src/assets/icons/Sync.vue new file mode 100644 index 00000000..c672d426 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Sync.vue @@ -0,0 +1,17 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Task.vue b/src/frontend/admin/src/assets/icons/Task.vue new file mode 100644 index 00000000..48598cce --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Task.vue @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Tpl.vue b/src/frontend/admin/src/assets/icons/Tpl.vue new file mode 100644 index 00000000..8ef06b19 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Tpl.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Unlink.vue b/src/frontend/admin/src/assets/icons/Unlink.vue new file mode 100644 index 00000000..85880af9 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Unlink.vue @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Upload.vue b/src/frontend/admin/src/assets/icons/Upload.vue new file mode 100644 index 00000000..12a73ed8 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Upload.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Vue.vue b/src/frontend/admin/src/assets/icons/Vue.vue new file mode 100644 index 00000000..134feed2 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Vue.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/Wechat.vue b/src/frontend/admin/src/assets/icons/Wechat.vue new file mode 100644 index 00000000..8393938b --- /dev/null +++ b/src/frontend/admin/src/assets/icons/Wechat.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/index.js b/src/frontend/admin/src/assets/icons/index.js new file mode 100644 index 00000000..c1d46af6 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/index.js @@ -0,0 +1,45 @@ +export {default as Vue} from './Vue.vue' +export {default as Code} from './Code.vue' +export {default as Wechat} from './Wechat.vue' +export {default as BugFill} from './BugFill.vue' +export {default as BugLine} from './BugLine.vue' +export {default as FileWord} from './FileWord.vue' +export {default as FileExcel} from './FileExcel.vue' +export {default as FilePpt} from './FilePpt.vue' +export {default as Organization} from './Organization.vue' +export {default as Upload} from './Upload.vue' +export {default as Download} from './Download.vue' +export {default as Role} from './Role.vue' +export {default as Dept} from './Dept.vue' +export {default as Js} from './Js.vue' +export {default as Memory} from './Memory.vue' +export {default as Dashboard} from './Dashboard.vue' +export {default as Api} from './Api.vue' +export {default as Code2} from './Code2.vue' +export {default as Csharp} from './Csharp.vue' +export {default as Dic} from './Dic.vue' +export {default as Position} from './Position.vue' +export {default as Tpl} from './Tpl.vue' +export {default as Demo} from './Demo.vue' +export {default as Link} from './Link.vue' +export {default as Unlink} from './Unlink.vue' +export {default as Send} from './Send.vue' +export {default as SmsCode} from './SmsCode.vue' +export {default as Meter} from './Meter.vue' +export {default as Grafana} from './Grafana.vue' +export {default as Elastic} from './Elastic.vue' +export {default as Kibana} from './Kibana.vue' +export {default as Kafka} from './Kafka.vue' +export {default as Resource} from './Resource.vue' +export {default as Robot} from './Robot.vue' +export {default as Device} from './Device.vue' +export {default as Business} from './Business.vue' +export {default as App} from './App.vue' +export {default as App2} from './App2.vue' +export {default as Sync} from './Sync.vue' +export {default as Drone} from './Drone.vue' +export {default as Gitea} from './Gitea.vue' +export {default as Docker} from './Docker.vue' +export {default as Task} from './Task.vue' +export {default as ProductCategory} from './ProductCategory.vue' +export {default as Product} from './Product.vue' \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/tpl/Svg.vue b/src/frontend/admin/src/assets/icons/tpl/Svg.vue new file mode 100644 index 00000000..ccf33639 --- /dev/null +++ b/src/frontend/admin/src/assets/icons/tpl/Svg.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/frontend/admin/src/assets/icons/tpl/export.js b/src/frontend/admin/src/assets/icons/tpl/export.js new file mode 100644 index 00000000..85fb64cd --- /dev/null +++ b/src/frontend/admin/src/assets/icons/tpl/export.js @@ -0,0 +1 @@ +//~export {default as $iconName$} from './$iconName$.vue' \ No newline at end of file diff --git a/src/frontend/admin/src/assets/img/404.png b/src/frontend/admin/src/assets/img/404.png new file mode 100644 index 0000000000000000000000000000000000000000..47197ec7caf753873d1ce38bd4928b71e86c707e GIT binary patch literal 99568 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