Full Code of 648540858/wvp-GB28181-pro for AI

master 20986f4a48fa cached
1142 files
7.3 MB
2.0M tokens
7879 symbols
1 requests
Download .txt
Showing preview only (7,887K chars total). Download the full file or copy to clipboard to get everything.
Repository: 648540858/wvp-GB28181-pro
Branch: master
Commit: 20986f4a48fa
Files: 1142
Total size: 7.3 MB

Directory structure:
gitextract_3q5h2l1l/

├── .dockerignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.md
│   │   ├── new.md
│   │   └── solve.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── bin/
│   └── wvp.sh
├── doc/
│   ├── README.md
│   ├── _content/
│   │   ├── ability/
│   │   │   ├── auto_play.md
│   │   │   ├── cascade.md
│   │   │   ├── cascade2.md
│   │   │   ├── channel.md
│   │   │   ├── cloud_record.md
│   │   │   ├── continuous_broadcast.md
│   │   │   ├── continuous_recording.md
│   │   │   ├── device.md
│   │   │   ├── device_use.md
│   │   │   ├── gis.md
│   │   │   ├── node_manager.md
│   │   │   ├── online_doc.md
│   │   │   ├── proxy.md
│   │   │   ├── push.md
│   │   │   └── user.md
│   │   ├── about_doc.md
│   │   ├── broadcast.md
│   │   ├── disclaimers.md
│   │   ├── introduction/
│   │   │   ├── compile.md
│   │   │   ├── config.md
│   │   │   └── deployment.md
│   │   ├── qa/
│   │   │   ├── bug.md
│   │   │   ├── development.md
│   │   │   ├── play_error.md
│   │   │   ├── regiser_error.md
│   │   │   └── start_error.md
│   │   ├── skill/
│   │   │   └── tcpdump.md
│   │   └── theory/
│   │       ├── broadcast_cascade.md
│   │       ├── code.md
│   │       ├── play.md
│   │       └── register.md
│   ├── _coverpage.md
│   ├── _navbar.md
│   ├── _sidebar.md
│   ├── index.html
│   └── lib/
│       ├── css/
│       │   └── vue.css
│       └── js/
│           └── docsify@4.js
├── docker/
│   ├── README.md
│   ├── build.sh
│   ├── docker-compose.yml
│   ├── docker-upgrade.sh
│   ├── media/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   └── config.ini
│   ├── mysql/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   └── db/
│   │       ├── privileges.sql
│   │       └── wvp.sql
│   ├── nginx/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   ├── config.js
│   │   └── templates/
│   │       └── nginx.conf.template
│   ├── push.sh
│   ├── redis/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   └── conf/
│   │       └── redis.conf
│   └── wvp/
│       ├── Dockerfile
│       ├── build.sh
│       └── wvp/
│           ├── application-base.yml
│           ├── application-docker.yml
│           └── application.yml
├── install.sh
├── libs/
│   ├── jdbc-aarch/
│   │   ├── kingbase8-8.6.0.jar
│   │   ├── kingbase8-8.6.0.jre7.jar
│   │   ├── postgresql-42.2.9.jar
│   │   └── postgresql-42.2.9.jre7.jar
│   └── jdbc-x86/
│       ├── bcprov-jdk15on-1.70.jar
│       ├── kingbase8-8.6.0.jar
│       ├── kingbase8-8.6.0.jre6.jar
│       ├── kingbase8-8.6.0.jre7.jar
│       ├── postgresql-42.2.9.jar
│       ├── postgresql-42.2.9.jre6.jar
│       └── postgresql-42.2.9.jre7.jar
├── pom.xml
├── run.sh
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── genersoft/
│   │   │           └── iot/
│   │   │               └── vmp/
│   │   │                   ├── VManageBootstrap.java
│   │   │                   ├── common/
│   │   │                   │   ├── CivilCodePo.java
│   │   │                   │   ├── CommonCallback.java
│   │   │                   │   ├── DeviceStatusCallback.java
│   │   │                   │   ├── InviteInfo.java
│   │   │                   │   ├── InviteSessionStatus.java
│   │   │                   │   ├── InviteSessionType.java
│   │   │                   │   ├── RemoteAddressInfo.java
│   │   │                   │   ├── ServerInfo.java
│   │   │                   │   ├── StatisticsInfo.java
│   │   │                   │   ├── StreamInfo.java
│   │   │                   │   ├── StreamURL.java
│   │   │                   │   ├── SubscribeCallback.java
│   │   │                   │   ├── SystemAllInfo.java
│   │   │                   │   ├── VersionPo.java
│   │   │                   │   ├── VideoManagerConstants.java
│   │   │                   │   └── enums/
│   │   │                   │       ├── ChannelDataType.java
│   │   │                   │       ├── DeviceControlType.java
│   │   │                   │       └── MediaApp.java
│   │   │                   ├── conf/
│   │   │                   │   ├── CivilCodeFileConf.java
│   │   │                   │   ├── CloudRecordTimer.java
│   │   │                   │   ├── DynamicTask.java
│   │   │                   │   ├── GlobalExceptionHandler.java
│   │   │                   │   ├── GlobalResponseAdvice.java
│   │   │                   │   ├── MediaConfig.java
│   │   │                   │   ├── MediaStatusTimerTask.java
│   │   │                   │   ├── MybatisConfig.java
│   │   │                   │   ├── ScheduleConfig.java
│   │   │                   │   ├── ServiceInfo.java
│   │   │                   │   ├── SipConfig.java
│   │   │                   │   ├── SpringDocConfig.java
│   │   │                   │   ├── SystemInfoTimerTask.java
│   │   │                   │   ├── ThreadPoolTaskConfig.java
│   │   │                   │   ├── UserSetting.java
│   │   │                   │   ├── VersionConfig.java
│   │   │                   │   ├── VersionInfo.java
│   │   │                   │   ├── WVPTimerTask.java
│   │   │                   │   ├── exception/
│   │   │                   │   │   ├── ControllerException.java
│   │   │                   │   │   ├── ServiceException.java
│   │   │                   │   │   └── SsrcTransactionNotFoundException.java
│   │   │                   │   ├── ftpServer/
│   │   │                   │   │   ├── FileCallback.java
│   │   │                   │   │   ├── FtpAuthority.java
│   │   │                   │   │   ├── FtpFileSystemFactory.java
│   │   │                   │   │   ├── FtpFileSystemView.java
│   │   │                   │   │   ├── FtpServerConfig.java
│   │   │                   │   │   ├── FtpSetting.java
│   │   │                   │   │   ├── Ftplet.java
│   │   │                   │   │   ├── UserManager.java
│   │   │                   │   │   └── VirtualFtpFile.java
│   │   │                   │   ├── redis/
│   │   │                   │   │   ├── RedisMsgListenConfig.java
│   │   │                   │   │   ├── RedisRpcConfig.java
│   │   │                   │   │   ├── RedisTemplateConfig.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       ├── RedisRpcClassHandler.java
│   │   │                   │   │       ├── RedisRpcMessage.java
│   │   │                   │   │       ├── RedisRpcRequest.java
│   │   │                   │   │       └── RedisRpcResponse.java
│   │   │                   │   ├── security/
│   │   │                   │   │   ├── AnonymousAuthenticationEntryPoint.java
│   │   │                   │   │   ├── DefaultUserDetailsServiceImpl.java
│   │   │                   │   │   ├── JwtAuthenticationFilter.java
│   │   │                   │   │   ├── JwtUtils.java
│   │   │                   │   │   ├── LogoutHandler.java
│   │   │                   │   │   ├── SecurityUtils.java
│   │   │                   │   │   ├── WebSecurityConfig.java
│   │   │                   │   │   └── dto/
│   │   │                   │   │       ├── JwtUser.java
│   │   │                   │   │       └── LoginUser.java
│   │   │                   │   ├── webLog/
│   │   │                   │   │   ├── LogChannel.java
│   │   │                   │   │   └── WebSocketAppender.java
│   │   │                   │   └── websocket/
│   │   │                   │       └── WebSocketConfig.java
│   │   │                   ├── gb28181/
│   │   │                   │   ├── SipLayer.java
│   │   │                   │   ├── auth/
│   │   │                   │   │   └── DigestServerAuthenticationHelper.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── AlarmChannelMessage.java
│   │   │                   │   │   ├── AudioBroadcastCatch.java
│   │   │                   │   │   ├── AudioBroadcastCatchStatus.java
│   │   │                   │   │   ├── BaiduPoint.java
│   │   │                   │   │   ├── BasicParam.java
│   │   │                   │   │   ├── CatalogChannelEvent.java
│   │   │                   │   │   ├── CatalogData.java
│   │   │                   │   │   ├── CmdType.java
│   │   │                   │   │   ├── CommonGBChannel.java
│   │   │                   │   │   ├── CommonRecordInfo.java
│   │   │                   │   │   ├── Device.java
│   │   │                   │   │   ├── DeviceAlarm.java
│   │   │                   │   │   ├── DeviceAlarmMethod.java
│   │   │                   │   │   ├── DeviceChannel.java
│   │   │                   │   │   ├── DeviceChannelInPlatform.java
│   │   │                   │   │   ├── DeviceNotFoundEvent.java
│   │   │                   │   │   ├── DeviceType.java
│   │   │                   │   │   ├── DeviceTypeEnum.java
│   │   │                   │   │   ├── DragZoomParam.java
│   │   │                   │   │   ├── DragZoomRequest.java
│   │   │                   │   │   ├── DrawThinProcess.java
│   │   │                   │   │   ├── FrontEndCode.java
│   │   │                   │   │   ├── FrontEndControlCodeForAuxiliary.java
│   │   │                   │   │   ├── FrontEndControlCodeForFI.java
│   │   │                   │   │   ├── FrontEndControlCodeForPTZ.java
│   │   │                   │   │   ├── FrontEndControlCodeForPreset.java
│   │   │                   │   │   ├── FrontEndControlCodeForScan.java
│   │   │                   │   │   ├── FrontEndControlCodeForTour.java
│   │   │                   │   │   ├── FrontEndControlCodeForWiper.java
│   │   │                   │   │   ├── FrontEndControlType.java
│   │   │                   │   │   ├── GBStringMsgParser.java
│   │   │                   │   │   ├── Gb28181Sdp.java
│   │   │                   │   │   ├── GbCode.java
│   │   │                   │   │   ├── GbSipDate.java
│   │   │                   │   │   ├── GbSteamIdentification.java
│   │   │                   │   │   ├── GbStream.java
│   │   │                   │   │   ├── GbStringMsgParserFactory.java
│   │   │                   │   │   ├── Group.java
│   │   │                   │   │   ├── GroupTree.java
│   │   │                   │   │   ├── HandlerCatchData.java
│   │   │                   │   │   ├── HomePositionRequest.java
│   │   │                   │   │   ├── Host.java
│   │   │                   │   │   ├── IFrontEndControlCode.java
│   │   │                   │   │   ├── IndustryCodeType.java
│   │   │                   │   │   ├── IndustryCodeTypeEnum.java
│   │   │                   │   │   ├── InviteDecodeException.java
│   │   │                   │   │   ├── InviteMessageInfo.java
│   │   │                   │   │   ├── InviteStreamCallback.java
│   │   │                   │   │   ├── InviteStreamInfo.java
│   │   │                   │   │   ├── InviteStreamType.java
│   │   │                   │   │   ├── MessageResponseTask.java
│   │   │                   │   │   ├── MobilePosition.java
│   │   │                   │   │   ├── NetworkIdentificationType.java
│   │   │                   │   │   ├── NetworkIdentificationTypeEnum.java
│   │   │                   │   │   ├── NotifyCatalogChannel.java
│   │   │                   │   │   ├── OpenRTPServerResult.java
│   │   │                   │   │   ├── Platform.java
│   │   │                   │   │   ├── PlatformCatalog.java
│   │   │                   │   │   ├── PlatformCatch.java
│   │   │                   │   │   ├── PlatformChannel.java
│   │   │                   │   │   ├── PlatformGbStream.java
│   │   │                   │   │   ├── PlatformKeepaliveCallback.java
│   │   │                   │   │   ├── PlatformRegister.java
│   │   │                   │   │   ├── PlayException.java
│   │   │                   │   │   ├── Preset.java
│   │   │                   │   │   ├── RecordInfo.java
│   │   │                   │   │   ├── RecordItem.java
│   │   │                   │   │   ├── RedisGroupMessage.java
│   │   │                   │   │   ├── Region.java
│   │   │                   │   │   ├── RegionTree.java
│   │   │                   │   │   ├── SDPInfo.java
│   │   │                   │   │   ├── SendRtpInfo.java
│   │   │                   │   │   ├── SipMsgInfo.java
│   │   │                   │   │   ├── SipSendFailEvent.java
│   │   │                   │   │   ├── SipTransactionInfo.java
│   │   │                   │   │   ├── SsrcTransaction.java
│   │   │                   │   │   ├── SubscribeHolder.java
│   │   │                   │   │   ├── SubscribeInfo.java
│   │   │                   │   │   ├── SyncStatus.java
│   │   │                   │   │   ├── TalkRtpInfo.java
│   │   │                   │   │   └── VectorTileSource.java
│   │   │                   │   ├── conf/
│   │   │                   │   │   ├── DefaultProperties.java
│   │   │                   │   │   ├── ServerLoggerImpl.java
│   │   │                   │   │   └── StackLoggerImpl.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   ├── AlarmController.java
│   │   │                   │   │   ├── ChannelController.java
│   │   │                   │   │   ├── ChannelFrontEndController.java
│   │   │                   │   │   ├── DeviceConfig.java
│   │   │                   │   │   ├── DeviceControl.java
│   │   │                   │   │   ├── DeviceQuery.java
│   │   │                   │   │   ├── GBRecordController.java
│   │   │                   │   │   ├── GroupController.java
│   │   │                   │   │   ├── MediaController.java
│   │   │                   │   │   ├── MobilePositionController.java
│   │   │                   │   │   ├── PlatformController.java
│   │   │                   │   │   ├── PlayController.java
│   │   │                   │   │   ├── PlaybackController.java
│   │   │                   │   │   ├── PtzController.java
│   │   │                   │   │   ├── RegionController.java
│   │   │                   │   │   ├── SseController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       ├── AudioBroadcastEvent.java
│   │   │                   │   │       ├── ChannelForThin.java
│   │   │                   │   │       ├── ChannelListForRpcParam.java
│   │   │                   │   │       ├── ChannelReduce.java
│   │   │                   │   │       ├── ChannelToGroupByGbDeviceParam.java
│   │   │                   │   │       ├── ChannelToGroupParam.java
│   │   │                   │   │       ├── ChannelToRegionByGbDeviceParam.java
│   │   │                   │   │       ├── ChannelToRegionParam.java
│   │   │                   │   │       ├── DrawThinParam.java
│   │   │                   │   │       ├── Extent.java
│   │   │                   │   │       ├── PlayResult.java
│   │   │                   │   │       ├── ResetParam.java
│   │   │                   │   │       └── UpdateChannelParam.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── CommonGBChannelMapper.java
│   │   │                   │   │   ├── DeviceAlarmMapper.java
│   │   │                   │   │   ├── DeviceChannelMapper.java
│   │   │                   │   │   ├── DeviceMapper.java
│   │   │                   │   │   ├── DeviceMobilePositionMapper.java
│   │   │                   │   │   ├── GroupMapper.java
│   │   │                   │   │   ├── PlatformChannelMapper.java
│   │   │                   │   │   ├── PlatformMapper.java
│   │   │                   │   │   ├── RegionMapper.java
│   │   │                   │   │   └── provider/
│   │   │                   │   │       ├── ChannelProvider.java
│   │   │                   │   │       └── DeviceChannelProvider.java
│   │   │                   │   ├── event/
│   │   │                   │   │   ├── EventPublisher.java
│   │   │                   │   │   ├── MessageSubscribe.java
│   │   │                   │   │   ├── SipSubscribe.java
│   │   │                   │   │   ├── alarm/
│   │   │                   │   │   │   ├── AlarmEvent.java
│   │   │                   │   │   │   └── AlarmEventListener.java
│   │   │                   │   │   ├── channel/
│   │   │                   │   │   │   └── ChannelEvent.java
│   │   │                   │   │   ├── record/
│   │   │                   │   │   │   ├── RecordInfoEndEvent.java
│   │   │                   │   │   │   ├── RecordInfoEvent.java
│   │   │                   │   │   │   └── RecordInfoEventListener.java
│   │   │                   │   │   ├── sip/
│   │   │                   │   │   │   ├── MessageEvent.java
│   │   │                   │   │   │   └── SipEvent.java
│   │   │                   │   │   └── subscribe/
│   │   │                   │   │       ├── catalog/
│   │   │                   │   │       │   ├── CatalogEvent.java
│   │   │                   │   │       │   └── CatalogEventLister.java
│   │   │                   │   │       └── mobilePosition/
│   │   │                   │   │           ├── MobilePositionEvent.java
│   │   │                   │   │           └── MobilePositionEventLister.java
│   │   │                   │   ├── service/
│   │   │                   │   │   ├── IDeviceAlarmService.java
│   │   │                   │   │   ├── IDeviceChannelService.java
│   │   │                   │   │   ├── IDeviceService.java
│   │   │                   │   │   ├── IGbChannelControlService.java
│   │   │                   │   │   ├── IGbChannelPlayService.java
│   │   │                   │   │   ├── IGbChannelService.java
│   │   │                   │   │   ├── IGroupService.java
│   │   │                   │   │   ├── IInviteStreamService.java
│   │   │                   │   │   ├── IPTZService.java
│   │   │                   │   │   ├── IPlatformChannelService.java
│   │   │                   │   │   ├── IPlatformService.java
│   │   │                   │   │   ├── IPlayService.java
│   │   │                   │   │   ├── IRegionService.java
│   │   │                   │   │   ├── ISourceDownloadService.java
│   │   │                   │   │   ├── ISourcePTZService.java
│   │   │                   │   │   ├── ISourcePlayService.java
│   │   │                   │   │   ├── ISourcePlaybackService.java
│   │   │                   │   │   └── impl/
│   │   │                   │   │       ├── DeviceAlarmServiceImpl.java
│   │   │                   │   │       ├── DeviceChannelServiceImpl.java
│   │   │                   │   │       ├── DeviceServiceImpl.java
│   │   │                   │   │       ├── GbChannelControlServiceImpl.java
│   │   │                   │   │       ├── GbChannelPlayServiceImpl.java
│   │   │                   │   │       ├── GbChannelServiceImpl.java
│   │   │                   │   │       ├── GroupServiceImpl.java
│   │   │                   │   │       ├── InviteStreamServiceImpl.java
│   │   │                   │   │       ├── PTZServiceImpl.java
│   │   │                   │   │       ├── PlatformChannelServiceImpl.java
│   │   │                   │   │       ├── PlatformServiceImpl.java
│   │   │                   │   │       ├── PlayServiceImpl.java
│   │   │                   │   │       ├── RegionServiceImpl.java
│   │   │                   │   │       ├── SourceDownloadServiceForGbImpl.java
│   │   │                   │   │       ├── SourcePTZServiceForGbImpl.java
│   │   │                   │   │       ├── SourcePlayServiceForGbImpl.java
│   │   │                   │   │       └── SourcePlaybackServiceForGbImpl.java
│   │   │                   │   ├── session/
│   │   │                   │   │   ├── AudioBroadcastManager.java
│   │   │                   │   │   ├── CatalogDataManager.java
│   │   │                   │   │   ├── CommonSessionManager.java
│   │   │                   │   │   ├── SSRCFactory.java
│   │   │                   │   │   ├── SipInviteSessionManager.java
│   │   │                   │   │   └── SseSessionManager.java
│   │   │                   │   ├── task/
│   │   │                   │   │   ├── deviceStatus/
│   │   │                   │   │   │   ├── DeviceStatusTask.java
│   │   │                   │   │   │   ├── DeviceStatusTaskInfo.java
│   │   │                   │   │   │   └── DeviceStatusTaskRunner.java
│   │   │                   │   │   ├── deviceSubscribe/
│   │   │                   │   │   │   ├── SubscribeTask.java
│   │   │                   │   │   │   ├── SubscribeTaskInfo.java
│   │   │                   │   │   │   ├── SubscribeTaskRunner.java
│   │   │                   │   │   │   └── impl/
│   │   │                   │   │   │       ├── SubscribeTaskForCatalog.java
│   │   │                   │   │   │       └── SubscribeTaskForMobilPosition.java
│   │   │                   │   │   └── platformStatus/
│   │   │                   │   │       ├── PlatformKeepaliveTask.java
│   │   │                   │   │       ├── PlatformRegisterTask.java
│   │   │                   │   │       ├── PlatformRegisterTaskInfo.java
│   │   │                   │   │       └── PlatformStatusTaskRunner.java
│   │   │                   │   ├── transmit/
│   │   │                   │   │   ├── ISIPProcessorObserver.java
│   │   │                   │   │   ├── SIPProcessorObserver.java
│   │   │                   │   │   ├── SIPSender.java
│   │   │                   │   │   ├── callback/
│   │   │                   │   │   │   ├── DeferredResultHolder.java
│   │   │                   │   │   │   └── RequestMessage.java
│   │   │                   │   │   ├── cmd/
│   │   │                   │   │   │   ├── ISIPCommander.java
│   │   │                   │   │   │   ├── ISIPCommanderForPlatform.java
│   │   │                   │   │   │   ├── SIPRequestHeaderPlarformProvider.java
│   │   │                   │   │   │   ├── SIPRequestHeaderProvider.java
│   │   │                   │   │   │   └── impl/
│   │   │                   │   │   │       ├── SIPCommander.java
│   │   │                   │   │   │       └── SIPCommanderForPlatform.java
│   │   │                   │   │   └── event/
│   │   │                   │   │       ├── request/
│   │   │                   │   │       │   ├── ISIPRequestProcessor.java
│   │   │                   │   │       │   ├── SIPRequestProcessorParent.java
│   │   │                   │   │       │   └── impl/
│   │   │                   │   │       │       ├── AckRequestProcessor.java
│   │   │                   │   │       │       ├── ByeRequestProcessor.java
│   │   │                   │   │       │       ├── CancelRequestProcessor.java
│   │   │                   │   │       │       ├── InviteRequestProcessor.java
│   │   │                   │   │       │       ├── NotifyRequestForCatalogProcessor.java
│   │   │                   │   │       │       ├── NotifyRequestForMobilePositionProcessor.java
│   │   │                   │   │       │       ├── NotifyRequestProcessor.java
│   │   │                   │   │       │       ├── RegisterRequestProcessor.java
│   │   │                   │   │       │       ├── SubscribeRequestProcessor.java
│   │   │                   │   │       │       ├── info/
│   │   │                   │   │       │       │   └── InfoRequestProcessor.java
│   │   │                   │   │       │       └── message/
│   │   │                   │   │       │           ├── IMessageHandler.java
│   │   │                   │   │       │           ├── MessageHandlerAbstract.java
│   │   │                   │   │       │           ├── MessageRequestProcessor.java
│   │   │                   │   │       │           ├── control/
│   │   │                   │   │       │           │   ├── ControlMessageHandler.java
│   │   │                   │   │       │           │   └── cmd/
│   │   │                   │   │       │           │       └── DeviceControlQueryMessageHandler.java
│   │   │                   │   │       │           ├── notify/
│   │   │                   │   │       │           │   ├── NotifyMessageHandler.java
│   │   │                   │   │       │           │   └── cmd/
│   │   │                   │   │       │           │       ├── AlarmNotifyMessageHandler.java
│   │   │                   │   │       │           │       ├── BroadcastNotifyMessageHandler.java
│   │   │                   │   │       │           │       ├── KeepaliveNotifyMessageHandler.java
│   │   │                   │   │       │           │       ├── MediaStatusNotifyMessageHandler.java
│   │   │                   │   │       │           │       └── MobilePositionNotifyMessageHandler.java
│   │   │                   │   │       │           ├── query/
│   │   │                   │   │       │           │   ├── QueryMessageHandler.java
│   │   │                   │   │       │           │   └── cmd/
│   │   │                   │   │       │           │       ├── AlarmQueryMessageHandler.java
│   │   │                   │   │       │           │       ├── CatalogQueryMessageHandler.java
│   │   │                   │   │       │           │       ├── DeviceInfoQueryMessageHandler.java
│   │   │                   │   │       │           │       ├── DeviceStatusQueryMessageHandler.java
│   │   │                   │   │       │           │       └── RecordInfoQueryMessageHandler.java
│   │   │                   │   │       │           └── response/
│   │   │                   │   │       │               ├── ResponseMessageHandler.java
│   │   │                   │   │       │               └── cmd/
│   │   │                   │   │       │                   ├── AlarmResponseMessageHandler.java
│   │   │                   │   │       │                   ├── BroadcastResponseMessageHandler.java
│   │   │                   │   │       │                   ├── CatalogResponseMessageHandler.java
│   │   │                   │   │       │                   ├── ConfigDownloadResponseMessageHandler.java
│   │   │                   │   │       │                   ├── DeviceInfoResponseMessageHandler.java
│   │   │                   │   │       │                   ├── DeviceStatusResponseMessageHandler.java
│   │   │                   │   │       │                   ├── MobilePositionResponseMessageHandler.java
│   │   │                   │   │       │                   ├── PresetQueryResponseMessageHandler.java
│   │   │                   │   │       │                   └── RecordInfoResponseMessageHandler.java
│   │   │                   │   │       └── response/
│   │   │                   │   │           ├── ISIPResponseProcessor.java
│   │   │                   │   │           ├── SIPResponseProcessorAbstract.java
│   │   │                   │   │           └── impl/
│   │   │                   │   │               ├── ByeResponseProcessor.java
│   │   │                   │   │               ├── CancelResponseProcessor.java
│   │   │                   │   │               ├── InviteResponseProcessor.java
│   │   │                   │   │               └── RegisterResponseProcessor.java
│   │   │                   │   └── utils/
│   │   │                   │       ├── Coordtransform.java
│   │   │                   │       ├── MessageElement.java
│   │   │                   │       ├── MessageElementForCatalog.java
│   │   │                   │       ├── NumericUtil.java
│   │   │                   │       ├── SipUtils.java
│   │   │                   │       ├── VectorTileCatch.java
│   │   │                   │       └── XmlUtil.java
│   │   │                   ├── jt1078/
│   │   │                   │   ├── annotation/
│   │   │                   │   │   └── MsgId.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── JTAlarmSign.java
│   │   │                   │   │   ├── JTAreaAttribute.java
│   │   │                   │   │   ├── JTAreaOrRoute.java
│   │   │                   │   │   ├── JTChannel.java
│   │   │                   │   │   ├── JTCircleArea.java
│   │   │                   │   │   ├── JTCommunicationModuleAttribute.java
│   │   │                   │   │   ├── JTConfirmationAlarmMessageType.java
│   │   │                   │   │   ├── JTDevice.java
│   │   │                   │   │   ├── JTDeviceAttribute.java
│   │   │                   │   │   ├── JTDeviceConfig.java
│   │   │                   │   │   ├── JTDeviceConnectionControl.java
│   │   │                   │   │   ├── JTDeviceType.java
│   │   │                   │   │   ├── JTDriverInformation.java
│   │   │                   │   │   ├── JTGnssAttribute.java
│   │   │                   │   │   ├── JTMediaAttribute.java
│   │   │                   │   │   ├── JTMediaDataInfo.java
│   │   │                   │   │   ├── JTMediaEventInfo.java
│   │   │                   │   │   ├── JTMediaStreamType.java
│   │   │                   │   │   ├── JTPassengerNum.java
│   │   │                   │   │   ├── JTPhoneBookContact.java
│   │   │                   │   │   ├── JTPolygonArea.java
│   │   │                   │   │   ├── JTPolygonPoint.java
│   │   │                   │   │   ├── JTPositionAdditionalInfo.java
│   │   │                   │   │   ├── JTPositionBaseInfo.java
│   │   │                   │   │   ├── JTPositionInfo.java
│   │   │                   │   │   ├── JTQueryMediaDataCommand.java
│   │   │                   │   │   ├── JTRecordDownloadCatch.java
│   │   │                   │   │   ├── JTRectangleArea.java
│   │   │                   │   │   ├── JTRoute.java
│   │   │                   │   │   ├── JTRouteAttribute.java
│   │   │                   │   │   ├── JTRoutePoint.java
│   │   │                   │   │   ├── JTRouteSectionAttribute.java
│   │   │                   │   │   ├── JTShootingCommand.java
│   │   │                   │   │   ├── JTStatus.java
│   │   │                   │   │   ├── JTTextSign.java
│   │   │                   │   │   ├── JTVehicleControl.java
│   │   │                   │   │   ├── JTVideoAlarm.java
│   │   │                   │   │   ├── common/
│   │   │                   │   │   │   └── ConfigAttribute.java
│   │   │                   │   │   └── config/
│   │   │                   │   │       ├── JTAlarmRecordingParam.java
│   │   │                   │   │       ├── JTAloneChanel.java
│   │   │                   │   │       ├── JTAnalyzeAlarmParam.java
│   │   │                   │   │       ├── JTAwakenParam.java
│   │   │                   │   │       ├── JTCameraTimer.java
│   │   │                   │   │       ├── JTChanelConfig.java
│   │   │                   │   │       ├── JTChannelListParam.java
│   │   │                   │   │       ├── JTChannelParam.java
│   │   │                   │   │       ├── JTCollisionAlarmParams.java
│   │   │                   │   │       ├── JTDeviceSubConfig.java
│   │   │                   │   │       ├── JTGnssPositioningMode.java
│   │   │                   │   │       ├── JTIllegalDrivingPeriods.java
│   │   │                   │   │       ├── JTOSDConfig.java
│   │   │                   │   │       ├── JTVideoAlarmBit.java
│   │   │                   │   │       └── JTVideoParam.java
│   │   │                   │   ├── cmd/
│   │   │                   │   │   └── JT1078Template.java
│   │   │                   │   ├── codec/
│   │   │                   │   │   ├── decode/
│   │   │                   │   │   │   ├── Jt808Decoder.java
│   │   │                   │   │   │   └── MultiPacketManager.java
│   │   │                   │   │   ├── encode/
│   │   │                   │   │   │   ├── Jt808Encoder.java
│   │   │                   │   │   │   └── Jt808EncoderCmd.java
│   │   │                   │   │   └── netty/
│   │   │                   │   │       ├── Jt808Handler.java
│   │   │                   │   │       └── TcpServer.java
│   │   │                   │   ├── config/
│   │   │                   │   │   ├── JT1078AutoConfiguration.java
│   │   │                   │   │   └── JT1078Config.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   ├── JT1078Controller.java
│   │   │                   │   │   ├── JT1078TerminalController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       ├── ConfirmationAlarmMessageParam.java
│   │   │                   │   │       ├── ConnectionControlParam.java
│   │   │                   │   │       ├── QueryMediaDataParam.java
│   │   │                   │   │       ├── SetAreaParam.java
│   │   │                   │   │       ├── SetConfigParam.java
│   │   │                   │   │       ├── SetPhoneBookParam.java
│   │   │                   │   │       ├── ShootingParam.java
│   │   │                   │   │       └── TextMessageParam.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── JTChannelMapper.java
│   │   │                   │   │   ├── JTTerminalMapper.java
│   │   │                   │   │   └── provider/
│   │   │                   │   │       └── JTChannelProvider.java
│   │   │                   │   ├── event/
│   │   │                   │   │   ├── ConnectChangeEvent.java
│   │   │                   │   │   ├── DeviceUpdateEvent.java
│   │   │                   │   │   ├── FtpUploadEvent.java
│   │   │                   │   │   ├── JTPositionEvent.java
│   │   │                   │   │   └── eventListener/
│   │   │                   │   │       └── ConnectChangeEventListener.java
│   │   │                   │   ├── proc/
│   │   │                   │   │   ├── Header.java
│   │   │                   │   │   ├── entity/
│   │   │                   │   │   │   └── Cmd.java
│   │   │                   │   │   ├── factory/
│   │   │                   │   │   │   └── CodecFactory.java
│   │   │                   │   │   ├── request/
│   │   │                   │   │   │   ├── J0001.java
│   │   │                   │   │   │   ├── J0002.java
│   │   │                   │   │   │   ├── J0003.java
│   │   │                   │   │   │   ├── J0004.java
│   │   │                   │   │   │   ├── J0100.java
│   │   │                   │   │   │   ├── J0102.java
│   │   │                   │   │   │   ├── J0104.java
│   │   │                   │   │   │   ├── J0107.java
│   │   │                   │   │   │   ├── J0200.java
│   │   │                   │   │   │   ├── J0201.java
│   │   │                   │   │   │   ├── J0500.java
│   │   │                   │   │   │   ├── J0608.java
│   │   │                   │   │   │   ├── J0702.java
│   │   │                   │   │   │   ├── J0704.java
│   │   │                   │   │   │   ├── J0800.java
│   │   │                   │   │   │   ├── J0801.java
│   │   │                   │   │   │   ├── J0802.java
│   │   │                   │   │   │   ├── J0805.java
│   │   │                   │   │   │   ├── J0900.java
│   │   │                   │   │   │   ├── J0901.java
│   │   │                   │   │   │   ├── J0A00.java
│   │   │                   │   │   │   ├── J1003.java
│   │   │                   │   │   │   ├── J1005.java
│   │   │                   │   │   │   ├── J1205.java
│   │   │                   │   │   │   ├── J1206.java
│   │   │                   │   │   │   └── Re.java
│   │   │                   │   │   └── response/
│   │   │                   │   │       ├── J8001.java
│   │   │                   │   │       ├── J8100.java
│   │   │                   │   │       ├── J8103.java
│   │   │                   │   │       ├── J8104.java
│   │   │                   │   │       ├── J8105.java
│   │   │                   │   │       ├── J8106.java
│   │   │                   │   │       ├── J8107.java
│   │   │                   │   │       ├── J8201.java
│   │   │                   │   │       ├── J8202.java
│   │   │                   │   │       ├── J8203.java
│   │   │                   │   │       ├── J8204.java
│   │   │                   │   │       ├── J8300.java
│   │   │                   │   │       ├── J8400.java
│   │   │                   │   │       ├── J8401.java
│   │   │                   │   │       ├── J8500.java
│   │   │                   │   │       ├── J8600.java
│   │   │                   │   │       ├── J8601.java
│   │   │                   │   │       ├── J8602.java
│   │   │                   │   │       ├── J8603.java
│   │   │                   │   │       ├── J8604.java
│   │   │                   │   │       ├── J8605.java
│   │   │                   │   │       ├── J8606.java
│   │   │                   │   │       ├── J8607.java
│   │   │                   │   │       ├── J8608.java
│   │   │                   │   │       ├── J8702.java
│   │   │                   │   │       ├── J8801.java
│   │   │                   │   │       ├── J8802.java
│   │   │                   │   │       ├── J8803.java
│   │   │                   │   │       ├── J8804.java
│   │   │                   │   │       ├── J8805.java
│   │   │                   │   │       ├── J8900.java
│   │   │                   │   │       ├── J8A00.java
│   │   │                   │   │       ├── J9003.java
│   │   │                   │   │       ├── J9101.java
│   │   │                   │   │       ├── J9102.java
│   │   │                   │   │       ├── J9201.java
│   │   │                   │   │       ├── J9202.java
│   │   │                   │   │       ├── J9205.java
│   │   │                   │   │       ├── J9206.java
│   │   │                   │   │       ├── J9207.java
│   │   │                   │   │       ├── J9301.java
│   │   │                   │   │       ├── J9302.java
│   │   │                   │   │       ├── J9303.java
│   │   │                   │   │       ├── J9304.java
│   │   │                   │   │       ├── J9305.java
│   │   │                   │   │       ├── J9306.java
│   │   │                   │   │       └── Rs.java
│   │   │                   │   ├── service/
│   │   │                   │   │   ├── Ijt1078PlayService.java
│   │   │                   │   │   ├── Ijt1078Service.java
│   │   │                   │   │   └── impl/
│   │   │                   │   │       ├── SourcePTZServiceForJTImpl.java
│   │   │                   │   │       ├── SourcePlayServiceForJTImpl.java
│   │   │                   │   │       ├── SourcePlaybackServiceForJTImpl.java
│   │   │                   │   │       ├── jt1078PlayServiceImpl.java
│   │   │                   │   │       └── jt1078ServiceImpl.java
│   │   │                   │   ├── session/
│   │   │                   │   │   ├── FtpDownloadManager.java
│   │   │                   │   │   ├── Session.java
│   │   │                   │   │   └── SessionManager.java
│   │   │                   │   └── util/
│   │   │                   │       ├── BCDUtil.java
│   │   │                   │       ├── Bin.java
│   │   │                   │       └── ClassUtil.java
│   │   │                   ├── media/
│   │   │                   │   ├── MediaServerConfig.java
│   │   │                   │   ├── abl/
│   │   │                   │   │   ├── ABLHttpHookListener.java
│   │   │                   │   │   ├── ABLMediaNodeServerService.java
│   │   │                   │   │   ├── ABLMediaServerStatusManger.java
│   │   │                   │   │   ├── ABLRESTfulUtils.java
│   │   │                   │   │   ├── bean/
│   │   │                   │   │   │   ├── ABLMedia.java
│   │   │                   │   │   │   ├── ABLRecordFile.java
│   │   │                   │   │   │   ├── ABLResult.java
│   │   │                   │   │   │   ├── ABLUrls.java
│   │   │                   │   │   │   ├── AblServerConfig.java
│   │   │                   │   │   │   ├── ConfigKeyId.java
│   │   │                   │   │   │   └── hook/
│   │   │                   │   │   │       ├── ABLHookParam.java
│   │   │                   │   │   │       ├── OnPlayABLHookParam.java
│   │   │                   │   │   │       ├── OnPublishABLHookParam.java
│   │   │                   │   │   │       ├── OnRecordMp4ABLHookParam.java
│   │   │                   │   │   │       ├── OnRecordProgressABLHookParam.java
│   │   │                   │   │   │       ├── OnServerKeepaliveABLHookParam.java
│   │   │                   │   │   │       ├── OnServerStaredABLHookParam.java
│   │   │                   │   │   │       └── OnStreamArriveABLHookParam.java
│   │   │                   │   │   └── event/
│   │   │                   │   │       ├── HookAblServerKeepaliveEvent.java
│   │   │                   │   │       └── HookAblServerStartEvent.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── MediaInfo.java
│   │   │                   │   │   ├── MediaServer.java
│   │   │                   │   │   ├── RecordInfo.java
│   │   │                   │   │   └── ResultForOnPublish.java
│   │   │                   │   ├── event/
│   │   │                   │   │   ├── hook/
│   │   │                   │   │   │   ├── Hook.java
│   │   │                   │   │   │   ├── HookData.java
│   │   │                   │   │   │   ├── HookSubscribe.java
│   │   │                   │   │   │   └── HookType.java
│   │   │                   │   │   ├── media/
│   │   │                   │   │   │   ├── MediaArrivalEvent.java
│   │   │                   │   │   │   ├── MediaDepartureEvent.java
│   │   │                   │   │   │   ├── MediaEvent.java
│   │   │                   │   │   │   ├── MediaNotFoundEvent.java
│   │   │                   │   │   │   ├── MediaPublishEvent.java
│   │   │                   │   │   │   ├── MediaRecordMp4Event.java
│   │   │                   │   │   │   ├── MediaRecordProcessEvent.java
│   │   │                   │   │   │   └── MediaRtpServerTimeoutEvent.java
│   │   │                   │   │   └── mediaServer/
│   │   │                   │   │       ├── MediaSendRtpStoppedEvent.java
│   │   │                   │   │       ├── MediaServerChangeEvent.java
│   │   │                   │   │       ├── MediaServerDeleteEvent.java
│   │   │                   │   │       ├── MediaServerEventAbstract.java
│   │   │                   │   │       ├── MediaServerOfflineEvent.java
│   │   │                   │   │       ├── MediaServerOnlineEvent.java
│   │   │                   │   │       └── MediaServerStatusEventListener.java
│   │   │                   │   ├── service/
│   │   │                   │   │   ├── IMediaNodeServerService.java
│   │   │                   │   │   ├── IMediaServerService.java
│   │   │                   │   │   └── impl/
│   │   │                   │   │       └── MediaServerServiceImpl.java
│   │   │                   │   └── zlm/
│   │   │                   │       ├── AssistRESTfulUtils.java
│   │   │                   │       ├── ZLMHttpHookListener.java
│   │   │                   │       ├── ZLMMediaNodeServerService.java
│   │   │                   │       ├── ZLMMediaServerStatusManager.java
│   │   │                   │       ├── ZLMRESTfulUtils.java
│   │   │                   │       ├── ZLMServerFactory.java
│   │   │                   │       ├── dto/
│   │   │                   │       │   ├── ChannelOnlineEvent.java
│   │   │                   │       │   ├── FlagData.java
│   │   │                   │       │   ├── RtpServerResult.java
│   │   │                   │       │   ├── ServerKeepaliveData.java
│   │   │                   │       │   ├── SessionData.java
│   │   │                   │       │   ├── StreamAuthorityInfo.java
│   │   │                   │       │   ├── StreamProxyResult.java
│   │   │                   │       │   ├── ZLMResult.java
│   │   │                   │       │   ├── ZLMRunInfo.java
│   │   │                   │       │   ├── ZLMServerConfig.java
│   │   │                   │       │   └── hook/
│   │   │                   │       │       ├── HookParam.java
│   │   │                   │       │       ├── HookResult.java
│   │   │                   │       │       ├── HookResultForOnPublish.java
│   │   │                   │       │       ├── OnPlayHookParam.java
│   │   │                   │       │       ├── OnPublishHookParam.java
│   │   │                   │       │       ├── OnRecordMp4HookParam.java
│   │   │                   │       │       ├── OnRtpServerTimeoutHookParam.java
│   │   │                   │       │       ├── OnSendRtpStoppedHookParam.java
│   │   │                   │       │       ├── OnServerKeepaliveHookParam.java
│   │   │                   │       │       ├── OnStreamChangedHookParam.java
│   │   │                   │       │       ├── OnStreamNoneReaderHookParam.java
│   │   │                   │       │       ├── OnStreamNotFoundHookParam.java
│   │   │                   │       │       └── OriginType.java
│   │   │                   │       └── event/
│   │   │                   │           ├── HookZlmServerKeepaliveEvent.java
│   │   │                   │           └── HookZlmServerStartEvent.java
│   │   │                   ├── service/
│   │   │                   │   ├── ICloudRecordService.java
│   │   │                   │   ├── ILogService.java
│   │   │                   │   ├── IMapService.java
│   │   │                   │   ├── IMediaService.java
│   │   │                   │   ├── IMobilePositionService.java
│   │   │                   │   ├── IReceiveRtpServerService.java
│   │   │                   │   ├── IRecordPlanService.java
│   │   │                   │   ├── IRoleService.java
│   │   │                   │   ├── ISendRtpServerService.java
│   │   │                   │   ├── IUserApiKeyService.java
│   │   │                   │   ├── IUserService.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── CloudRecordItem.java
│   │   │                   │   │   ├── DownloadFileInfo.java
│   │   │                   │   │   ├── ErrorCallback.java
│   │   │                   │   │   ├── GPSMsgInfo.java
│   │   │                   │   │   ├── InviteErrorCode.java
│   │   │                   │   │   ├── InviteTimeOutCallback.java
│   │   │                   │   │   ├── LogFileInfo.java
│   │   │                   │   │   ├── MediaServerLoad.java
│   │   │                   │   │   ├── MessageForPushChannel.java
│   │   │                   │   │   ├── MessageForPushChannelResponse.java
│   │   │                   │   │   ├── PlayBackCallback.java
│   │   │                   │   │   ├── PlayBackResult.java
│   │   │                   │   │   ├── PushStreamStatusChangeFromRedisDto.java
│   │   │                   │   │   ├── RTPServerParam.java
│   │   │                   │   │   ├── RecordPlan.java
│   │   │                   │   │   ├── RecordPlanItem.java
│   │   │                   │   │   ├── RequestPushStreamMsg.java
│   │   │                   │   │   ├── RequestSendItemMsg.java
│   │   │                   │   │   ├── RequestStopPushStreamMsg.java
│   │   │                   │   │   ├── ResponseSendItemMsg.java
│   │   │                   │   │   ├── SSRCInfo.java
│   │   │                   │   │   ├── StreamPushItemFromRedis.java
│   │   │                   │   │   ├── ThirdPartyGB.java
│   │   │                   │   │   ├── WvpRedisMsg.java
│   │   │                   │   │   └── WvpRedisMsgCmd.java
│   │   │                   │   ├── impl/
│   │   │                   │   │   ├── CloudRecordServiceImpl.java
│   │   │                   │   │   ├── LogServiceImpl.java
│   │   │                   │   │   ├── MediaServiceImpl.java
│   │   │                   │   │   ├── MobilePositionServiceImpl.java
│   │   │                   │   │   ├── RecordPlanServiceImpl.java
│   │   │                   │   │   ├── RoleServerImpl.java
│   │   │                   │   │   ├── RtpServerServiceImpl.java
│   │   │                   │   │   ├── SendRtpServerServiceImpl.java
│   │   │                   │   │   ├── UserApiKeyServiceImpl.java
│   │   │                   │   │   └── UserServiceImpl.java
│   │   │                   │   └── redisMsg/
│   │   │                   │       ├── IRedisRpcPlayService.java
│   │   │                   │       ├── IRedisRpcService.java
│   │   │                   │       ├── RedisAlarmMsgListener.java
│   │   │                   │       ├── RedisCloseStreamMsgListener.java
│   │   │                   │       ├── RedisGpsMsgListener.java
│   │   │                   │       ├── RedisGroupChangeListener.java
│   │   │                   │       ├── RedisGroupMsgListener.java
│   │   │                   │       ├── RedisPushStreamListMsgListener.java
│   │   │                   │       ├── RedisPushStreamResponseListener.java
│   │   │                   │       ├── RedisPushStreamStatusMsgListener.java
│   │   │                   │       ├── control/
│   │   │                   │       │   ├── RedisRpcChannelPlayController.java
│   │   │                   │       │   ├── RedisRpcCloudRecordController.java
│   │   │                   │       │   ├── RedisRpcDeviceController.java
│   │   │                   │       │   ├── RedisRpcDevicePlayController.java
│   │   │                   │       │   ├── RedisRpcGbDeviceController.java
│   │   │                   │       │   ├── RedisRpcPlatformController.java
│   │   │                   │       │   ├── RedisRpcSendRtpController.java
│   │   │                   │       │   ├── RedisRpcStreamProxyController.java
│   │   │                   │       │   └── RedisRpcStreamPushController.java
│   │   │                   │       ├── dto/
│   │   │                   │       │   ├── RedisRpcController.java
│   │   │                   │       │   ├── RedisRpcMapping.java
│   │   │                   │       │   └── RpcController.java
│   │   │                   │       └── service/
│   │   │                   │           ├── RedisRpcPlayServiceImpl.java
│   │   │                   │           └── RedisRpcServiceImpl.java
│   │   │                   ├── storager/
│   │   │                   │   ├── IRedisCatchStorage.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── CloudRecordServiceMapper.java
│   │   │                   │   │   ├── MediaServerMapper.java
│   │   │                   │   │   ├── RecordPlanMapper.java
│   │   │                   │   │   ├── RoleMapper.java
│   │   │                   │   │   ├── UserApiKeyMapper.java
│   │   │                   │   │   ├── UserMapper.java
│   │   │                   │   │   └── dto/
│   │   │                   │   │       ├── ChannelSourceInfo.java
│   │   │                   │   │       ├── LogDto.java
│   │   │                   │   │       ├── PlatformRegisterInfo.java
│   │   │                   │   │       ├── RecordInfo.java
│   │   │                   │   │       ├── Role.java
│   │   │                   │   │       ├── User.java
│   │   │                   │   │       └── UserApiKey.java
│   │   │                   │   └── impl/
│   │   │                   │       └── RedisCatchStorageImpl.java
│   │   │                   ├── streamProxy/
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── StreamProxy.java
│   │   │                   │   │   └── StreamProxyParam.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   └── StreamProxyController.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── StreamProxyMapper.java
│   │   │                   │   │   └── provider/
│   │   │                   │   │       └── StreamProxyProvider.java
│   │   │                   │   └── service/
│   │   │                   │       ├── IStreamProxyPlayService.java
│   │   │                   │       ├── IStreamProxyService.java
│   │   │                   │       └── impl/
│   │   │                   │           ├── SourcePlayServiceForStreamProxyImpl.java
│   │   │                   │           ├── StreamProxyPlayServiceImpl.java
│   │   │                   │           └── StreamProxyServiceImpl.java
│   │   │                   ├── streamPush/
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── BatchRemoveParam.java
│   │   │                   │   │   ├── RedisPushStreamMessage.java
│   │   │                   │   │   ├── StreamPush.java
│   │   │                   │   │   └── StreamPushExcelDto.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   └── StreamPushController.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   └── StreamPushMapper.java
│   │   │                   │   ├── enent/
│   │   │                   │   │   └── StreamPushUploadFileHandler.java
│   │   │                   │   └── service/
│   │   │                   │       ├── IStreamPushPlayService.java
│   │   │                   │       ├── IStreamPushService.java
│   │   │                   │       └── impl/
│   │   │                   │           ├── SourcePlayServiceForStreamPushImpl.java
│   │   │                   │           ├── StreamPushPlayServiceImpl.java
│   │   │                   │           └── StreamPushServiceImpl.java
│   │   │                   ├── utils/
│   │   │                   │   ├── CivilCodeUtil.java
│   │   │                   │   ├── Coordtransform.java
│   │   │                   │   ├── DateUtil.java
│   │   │                   │   ├── GitUtil.java
│   │   │                   │   ├── GpsUtil.java
│   │   │                   │   ├── HttpUtils.java
│   │   │                   │   ├── IpPortUtil.java
│   │   │                   │   ├── JsonUtil.java
│   │   │                   │   ├── MediaServerUtils.java
│   │   │                   │   ├── SSLSocketClientUtil.java
│   │   │                   │   ├── SpringBeanFactory.java
│   │   │                   │   ├── SystemInfoUtils.java
│   │   │                   │   ├── TileUtils.java
│   │   │                   │   ├── UJson.java
│   │   │                   │   └── redis/
│   │   │                   │       ├── FastJsonRedisSerializer.java
│   │   │                   │       ├── RedisUtil.java
│   │   │                   │       └── RedisUtil2.java
│   │   │                   ├── vmanager/
│   │   │                   │   ├── TestController.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── AudioBroadcastResult.java
│   │   │                   │   │   ├── BatchGBStreamParam.java
│   │   │                   │   │   ├── DeferredResultEx.java
│   │   │                   │   │   ├── DeferredResultFilter.java
│   │   │                   │   │   ├── ErrorCode.java
│   │   │                   │   │   ├── MapConfig.java
│   │   │                   │   │   ├── MapModelIcon.java
│   │   │                   │   │   ├── OtherPsSendInfo.java
│   │   │                   │   │   ├── OtherRtpSendInfo.java
│   │   │                   │   │   ├── PlayTypeEnum.java
│   │   │                   │   │   ├── RecordFile.java
│   │   │                   │   │   ├── ResourceBaseInfo.java
│   │   │                   │   │   ├── ResourceInfo.java
│   │   │                   │   │   ├── SnapPath.java
│   │   │                   │   │   ├── StreamContent.java
│   │   │                   │   │   ├── SystemConfigInfo.java
│   │   │                   │   │   ├── TablePageInfo.java
│   │   │                   │   │   └── WVPResult.java
│   │   │                   │   ├── cloudRecord/
│   │   │                   │   │   ├── CloudRecordController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       └── CloudRecordUrl.java
│   │   │                   │   ├── log/
│   │   │                   │   │   └── LogController.java
│   │   │                   │   ├── ps/
│   │   │                   │   │   └── PsController.java
│   │   │                   │   ├── recordPlan/
│   │   │                   │   │   ├── RecordPlanController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       └── RecordPlanParam.java
│   │   │                   │   ├── rtp/
│   │   │                   │   │   └── RtpController.java
│   │   │                   │   ├── server/
│   │   │                   │   │   └── ServerController.java
│   │   │                   │   └── user/
│   │   │                   │       ├── RoleController.java
│   │   │                   │       ├── UserApiKeyController.java
│   │   │                   │       └── UserController.java
│   │   │                   └── web/
│   │   │                       ├── custom/
│   │   │                       │   ├── CameraChannelController.java
│   │   │                       │   ├── bean/
│   │   │                       │   │   ├── CameraChannel.java
│   │   │                       │   │   ├── CameraCount.java
│   │   │                       │   │   ├── CameraGroup.java
│   │   │                       │   │   ├── CameraStreamContent.java
│   │   │                       │   │   ├── CameraStreamInfo.java
│   │   │                       │   │   ├── ChannelParam.java
│   │   │                       │   │   ├── IdsQueryParam.java
│   │   │                       │   │   ├── Point.java
│   │   │                       │   │   ├── PolygonQueryParam.java
│   │   │                       │   │   └── SYMember.java
│   │   │                       │   ├── conf/
│   │   │                       │   │   ├── CachedBodyHttpServletRequest.java
│   │   │                       │   │   ├── SignAuthenticationFilter.java
│   │   │                       │   │   └── SyTokenManager.java
│   │   │                       │   └── service/
│   │   │                       │       ├── CameraChannelService.java
│   │   │                       │       └── SyServiceImpl.java
│   │   │                       └── gb28181/
│   │   │                           ├── ApiControlController.java
│   │   │                           ├── ApiController.java
│   │   │                           ├── ApiDeviceController.java
│   │   │                           ├── ApiStreamController.java
│   │   │                           ├── AuthController.java
│   │   │                           └── dto/
│   │   │                               └── DeviceChannelExtend.java
│   │   └── resources/
│   │       ├── application.yml
│   │       ├── banner.txt
│   │       ├── civilCode.csv
│   │       ├── index.html
│   │       ├── install.sh
│   │       ├── jwk.json
│   │       ├── local.jks
│   │       ├── logback-spring.xml
│   │       └── 配置详情.yml
│   └── test/
│       └── java/
│           └── com/
│               └── genersoft/
│                   └── iot/
│                       └── vmp/
│                           └── jt1078/
│                               └── JT1078ServerTest.java
├── web/
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .travis.yml
│   ├── LICENSE
│   ├── README-zh.md
│   ├── README.md
│   ├── babel.config.js
│   ├── build/
│   │   └── index.js
│   ├── jest.config.js
│   ├── jsconfig.json
│   ├── mock/
│   │   ├── index.js
│   │   ├── mock-server.js
│   │   ├── table.js
│   │   ├── user.js
│   │   └── utils.js
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   │   ├── index.html
│   │   ├── libDecoder.wasm
│   │   └── static/
│   │       ├── file/
│   │       │   └── 设置电话本模板.xlsx
│   │       └── js/
│   │           ├── ZLMRTCClient.js
│   │           ├── config.js
│   │           ├── h265web/
│   │           │   ├── h265webjs-v20221106.js
│   │           │   ├── index.d.ts
│   │           │   ├── index.js
│   │           │   ├── missile-v20221120.wasm
│   │           │   └── missile.js
│   │           └── jessibuca/
│   │               ├── decoder.js
│   │               ├── decoder.wasm
│   │               ├── jessibuca.d.ts
│   │               └── jessibuca.js
│   ├── src/
│   │   ├── App.vue
│   │   ├── api/
│   │   │   ├── cloudRecord.js
│   │   │   ├── commonChannel.js
│   │   │   ├── device.js
│   │   │   ├── frontEnd.js
│   │   │   ├── gbRecord.js
│   │   │   ├── group.js
│   │   │   ├── jtDevice.js
│   │   │   ├── log.js
│   │   │   ├── platform.js
│   │   │   ├── play.js
│   │   │   ├── playback.js
│   │   │   ├── recordPlan.js
│   │   │   ├── region.js
│   │   │   ├── role.js
│   │   │   ├── server.js
│   │   │   ├── streamProxy.js
│   │   │   ├── streamPush.js
│   │   │   ├── table.js
│   │   │   ├── user.js
│   │   │   └── userApiKey.js
│   │   ├── components/
│   │   │   ├── Breadcrumb/
│   │   │   │   └── index.vue
│   │   │   ├── Hamburger/
│   │   │   │   └── index.vue
│   │   │   └── SvgIcon/
│   │   │       └── index.vue
│   │   ├── directive/
│   │   │   └── el-drag-dialog/
│   │   │       ├── drag.js
│   │   │       └── index.js
│   │   ├── icons/
│   │   │   ├── index.js
│   │   │   └── svgo.yml
│   │   ├── layout/
│   │   │   ├── components/
│   │   │   │   ├── AppMain.vue
│   │   │   │   ├── Navbar.vue
│   │   │   │   ├── Sidebar/
│   │   │   │   │   ├── FixiOSBug.js
│   │   │   │   │   ├── Item.vue
│   │   │   │   │   ├── Link.vue
│   │   │   │   │   ├── Logo.vue
│   │   │   │   │   ├── SidebarItem.vue
│   │   │   │   │   └── index.vue
│   │   │   │   ├── TagsView/
│   │   │   │   │   ├── ScrollPane.vue
│   │   │   │   │   └── index.vue
│   │   │   │   ├── dialog/
│   │   │   │   │   └── changePassword.vue
│   │   │   │   └── index.js
│   │   │   ├── index.vue
│   │   │   └── mixin/
│   │   │       └── ResizeHandler.js
│   │   ├── main.js
│   │   ├── permission.js
│   │   ├── router/
│   │   │   └── index.js
│   │   ├── settings.js
│   │   ├── store/
│   │   │   ├── getters.js
│   │   │   ├── index.js
│   │   │   └── modules/
│   │   │       ├── app.js
│   │   │       ├── cloudRecord.js
│   │   │       ├── commonChanel.js
│   │   │       ├── device.js
│   │   │       ├── frontEnd.js
│   │   │       ├── gbRecord.js
│   │   │       ├── group.js
│   │   │       ├── jtDevice.js
│   │   │       ├── log.js
│   │   │       ├── platform.js
│   │   │       ├── play.js
│   │   │       ├── playback.js
│   │   │       ├── recordPlan.js
│   │   │       ├── region.js
│   │   │       ├── role.js
│   │   │       ├── server.js
│   │   │       ├── settings.js
│   │   │       ├── streamProxy.js
│   │   │       ├── streamPush.js
│   │   │       ├── tagsView.js
│   │   │       ├── user.js
│   │   │       └── userApiKeys.js
│   │   ├── styles/
│   │   │   ├── element-ui.scss
│   │   │   ├── iconfont.scss
│   │   │   ├── index.scss
│   │   │   ├── mixin.scss
│   │   │   ├── sidebar.scss
│   │   │   ├── transition.scss
│   │   │   └── variables.scss
│   │   ├── utils/
│   │   │   ├── auth.js
│   │   │   ├── diff.js
│   │   │   ├── get-page-title.js
│   │   │   ├── index.js
│   │   │   ├── request.js
│   │   │   └── validate.js
│   │   └── views/
│   │       ├── 404.vue
│   │       ├── channel/
│   │       │   ├── edit.vue
│   │       │   ├── group/
│   │       │   │   └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── record.vue
│   │       │   └── region/
│   │       │       └── index.vue
│   │       ├── cloudRecord/
│   │       │   ├── cloudRecordPlayer.vue
│   │       │   ├── detail.vue
│   │       │   ├── index.vue
│   │       │   └── playerDialog.vue
│   │       ├── common/
│   │       │   ├── CommonChannelEdit.vue
│   │       │   ├── DeviceTree.vue
│   │       │   ├── GroupTree.vue
│   │       │   ├── MapComponent.vue
│   │       │   ├── MapComponent_bak.vue
│   │       │   ├── RegionTree.vue
│   │       │   ├── VideoTimeLine/
│   │       │   │   ├── WindowListItem.vue
│   │       │   │   ├── constant.js
│   │       │   │   └── index.vue
│   │       │   ├── channelPlayer/
│   │       │   │   ├── chooseChannelForJt.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── jtDeviceEdit.vue
│   │       │   │   ├── jtDevicePlayer.vue
│   │       │   │   ├── ptzCruising.vue
│   │       │   │   ├── ptzPreset.vue
│   │       │   │   ├── ptzScan.vue
│   │       │   │   ├── ptzSwitch.vue
│   │       │   │   └── ptzWiper.vue
│   │       │   ├── h265web.vue
│   │       │   ├── jessibuca.vue
│   │       │   ├── map/
│   │       │   │   ├── DragInteraction.js
│   │       │   │   └── TransformLonLat.js
│   │       │   ├── mediaInfo.vue
│   │       │   ├── ptzCruising.vue
│   │       │   ├── ptzPreset.vue
│   │       │   ├── ptzScan.vue
│   │       │   ├── ptzSwitch.vue
│   │       │   ├── ptzWiper.vue
│   │       │   ├── rtcPlayer.vue
│   │       │   └── weekTimePicker.vue
│   │       ├── dashboard/
│   │       │   ├── console/
│   │       │   │   ├── ConsoleCPU.vue
│   │       │   │   ├── ConsoleDisk.vue
│   │       │   │   ├── ConsoleMEM.vue
│   │       │   │   ├── ConsoleMediaServer.vue
│   │       │   │   ├── ConsoleNet.vue
│   │       │   │   ├── ConsoleNodeLoad.vue
│   │       │   │   └── ConsoleResource.vue
│   │       │   └── index.vue
│   │       ├── device/
│   │       │   ├── channel/
│   │       │   │   ├── edit.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── record.vue
│   │       │   ├── edit.vue
│   │       │   ├── index.vue
│   │       │   └── list.vue
│   │       ├── dialog/
│   │       │   ├── GbChannelSelect.vue
│   │       │   ├── GbDeviceSelect.vue
│   │       │   ├── MediaServerEdit.vue
│   │       │   ├── SyncChannelProgress.vue
│   │       │   ├── UnusualGroupChannelSelect.vue
│   │       │   ├── UnusualRegionChannelSelect.vue
│   │       │   ├── addUser.vue
│   │       │   ├── addUserApiKey.vue
│   │       │   ├── catalogEdit.vue
│   │       │   ├── changePasswordForAdmin.vue
│   │       │   ├── changePushKey.vue
│   │       │   ├── channelCode.vue
│   │       │   ├── channelMapInfobox.vue
│   │       │   ├── chooseCivilCode.vue
│   │       │   ├── chooseGroup.vue
│   │       │   ├── chooseTimeRange.vue
│   │       │   ├── commonChannelEditDialog.vue
│   │       │   ├── configInfo.vue
│   │       │   ├── devicePlayer.vue
│   │       │   ├── editRecordPlan.vue
│   │       │   ├── groupEdit.vue
│   │       │   ├── hasStreamChannel.vue
│   │       │   ├── importChannel.vue
│   │       │   ├── importChannelShowErrorData.vue
│   │       │   ├── linkChannelRecord.vue
│   │       │   ├── pushStreamEdit.vue
│   │       │   ├── queryTrace.vue
│   │       │   ├── recordDownload.vue
│   │       │   ├── regionCode.vue
│   │       │   ├── regionEdit.vue
│   │       │   ├── remarkUserApiKey.vue
│   │       │   ├── resetChannel.vue
│   │       │   ├── shareChannel.vue
│   │       │   └── shareChannelAdd.vue
│   │       ├── form/
│   │       │   └── index.vue
│   │       ├── jtDevice/
│   │       │   ├── channel/
│   │       │   │   ├── edit.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── record.vue
│   │       │   ├── deviceParam/
│   │       │   │   ├── alarm.vue
│   │       │   │   ├── alarmSign.vue
│   │       │   │   ├── awakenParam.vue
│   │       │   │   ├── cameraTimer.vue
│   │       │   │   ├── canCollectionParam.vue
│   │       │   │   ├── carInfo.vue
│   │       │   │   ├── communication.vue
│   │       │   │   ├── driving.vue
│   │       │   │   ├── gnssParam.vue
│   │       │   │   ├── imageConfig.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── phoneNumber.vue
│   │       │   │   ├── position.vue
│   │       │   │   ├── server.vue
│   │       │   │   ├── videoAlarmSign.vue
│   │       │   │   └── videoParam.vue
│   │       │   ├── dialog/
│   │       │   │   ├── attribute.vue
│   │       │   │   ├── connectionServer.vue
│   │       │   │   ├── controlDoor.vue
│   │       │   │   ├── driverInfo.vue
│   │       │   │   ├── jtDevicePlayer.vue
│   │       │   │   ├── mediaAttribute.vue
│   │       │   │   ├── phoneBook.vue
│   │       │   │   ├── position.vue
│   │       │   │   ├── queryMediaList.vue
│   │       │   │   ├── queryMediaListDialog.vue
│   │       │   │   ├── shootingNow.vue
│   │       │   │   ├── telephoneCallback.vue
│   │       │   │   └── textMsg.vue
│   │       │   ├── edit.vue
│   │       │   ├── index.vue
│   │       │   └── list.vue
│   │       ├── live/
│   │       │   └── index.vue
│   │       ├── login/
│   │       │   └── index.vue
│   │       ├── map/
│   │       │   ├── dialog/
│   │       │   │   └── drawThinProgress.vue
│   │       │   ├── index.vue
│   │       │   └── queryTrace.vue
│   │       ├── mediaServer/
│   │       │   └── index.vue
│   │       ├── operations/
│   │       │   ├── historyLog.vue
│   │       │   ├── realLog.vue
│   │       │   ├── showLog.vue
│   │       │   └── systemInfo.vue
│   │       ├── platform/
│   │       │   ├── edit.vue
│   │       │   └── index.vue
│   │       ├── recordPlan/
│   │       │   └── index.vue
│   │       ├── streamProxy/
│   │       │   ├── edit.vue
│   │       │   └── index.vue
│   │       ├── streamPush/
│   │       │   ├── buildPushStreamUrl.vue
│   │       │   ├── edit.vue
│   │       │   └── index.vue
│   │       └── user/
│   │           ├── apiKeyManager.vue
│   │           └── index.vue
│   ├── tests/
│   │   └── unit/
│   │       ├── .eslintrc.js
│   │       ├── components/
│   │       │   ├── Breadcrumb.spec.js
│   │       │   ├── Hamburger.spec.js
│   │       │   └── SvgIcon.spec.js
│   │       └── utils/
│   │           ├── formatTime.spec.js
│   │           ├── param2Obj.spec.js
│   │           ├── parseTime.spec.js
│   │           └── validate.spec.js
│   └── vue.config.js
├── 打包/
│   └── config/
│       └── config.ini
└── 数据库/
    ├── 2.6.9/
    │   ├── 初始化-mysql-2.6.9.sql
    │   ├── 初始化-postgresql-kingbase-2.6.9.sql
    │   ├── 更新-mysql-2.6.9.sql
    │   └── 更新-postgresql-kingbase-2.6.9.sql
    ├── 2.7.0/
    │   ├── 初始化-mysql-2.7.0.sql
    │   ├── 初始化-postgresql-kingbase-2.7.0.sql
    │   ├── 更新-mysql-2.7.0.sql
    │   └── 更新-postgresql-kingbase-2.7.0.sql
    ├── 2.7.1/
    │   ├── 初始化-mysql-2.7.1.sql
    │   ├── 初始化-postgresql-kingbase-2.7.1.sql
    │   ├── 更新-mysql-2.7.1.sql
    │   └── 更新-postgresql-kingbase-2.7.1.sql
    ├── 2.7.3/
    │   ├── 初始化-mysql-2.7.3.sql
    │   ├── 初始化-postgresql-kingbase-2.7.3.sql
    │   ├── 更新-mysql-2.7.1升级到2.7.3.sql
    │   ├── 更新-mysql-2.7.3.sql
    │   ├── 更新-postgresql-kingbase-2.7.1升级到2.7.3.sql
    │   └── 更新-postgresql-kingbase-2.7.3.sql
    ├── 2.7.4/
    │   ├── 初始化-mysql-2.7.4.sql
    │   ├── 初始化-postgresql-kingbase-2.7.4.sql
    │   ├── 更新-mysql-2.7.4.sql
    │   └── 更新-postgresql-kingbase-2.7.4.sql
    ├── 2.7.4-h2/
    │   ├── h2-data.sql
    │   └── h2-schema.sql
    └── old/
        ├── 2.6.6-2.6.7更新.sql
        ├── 2.6.8升级2.6.9.sql
        ├── 2.6.8补丁更新.sql
        └── clean.sql

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
docker/volumes

================================================
FILE: .github/ISSUE_TEMPLATE/bug.md
================================================
---
name: "[ BUG ] "
about: 关于wvp的bug,与zlm有关的建议直接在zlm的issue中提问
title: 'BUG'
labels: 'wvp的bug'
assignees: ''

---

**环境信息:**

 - 1. 部署方式 wvp-pro docker / zlm(docker) + 编译wvp-pro/ wvp-prp + zlm都是编译部署/
 - 2. 部署环境 windows / ubuntu/ centos ...
 - 3. 端口开放情况
 - 4. 是否是公网部署 
 - 5. 是否使用https
 - 6. 接入设备/平台品牌
 - 7. 你做过哪些尝试
 - 8. 代码更新时间
 - 9. 是否是4G设备接入

**描述错误**
描述下您遇到的问题

**如何复现**
有明确复现步骤的问题会很容易被解决

**截图**  

**抓包文件**
  
**日志**
```
日志内容放这里, 文件的话请直接上传
```




================================================
FILE: .github/ISSUE_TEMPLATE/new.md
================================================
---
name: "[ 新功能 ]"
about: 新功能
title: '希望wVP实现的新功能,此功能应与你的具体业务无关'
labels: ''
assignees: ''

---

**项目的详细需求**

**这样的实现什么作用**



================================================
FILE: .github/ISSUE_TEMPLATE/solve.md
================================================
---
name: "[ 技术咨询 ] "
about: 对于使用中遇到问题
title: '技术咨询'
labels: '技术咨询'
assignees: ''

---

**环境信息:**

 - 1. 部署方式 wvp-pro docker / zlm(docker) + 编译wvp-pro/ wvp-prp + zlm都是编译部署/
 - 2. 部署环境 windows / ubuntu/ centos ...
 - 3. 端口开放情况
 - 4. 是否是公网部署 
 - 5. 是否使用https
 - 6. 方便的话提供下使用的设备品牌或平台
 - 7. 你做过哪些尝试
 - 8. 代码更新时间(旧版本请更新最新版本代码测试)


**内容描述:**

**截图**  

**抓包文件**
  
**日志**
```
日志内容放这里, 文件的话请直接上传
```


================================================
FILE: .github/workflows/build.yml
================================================
name: release-ubuntu

on:
  push:
    tags:
      - "v*.*.*" # 触发条件是推送标签 如git tag v2.7.4 git push origin v2.7.4

jobs:
  build-ubuntu:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        arch: [amd64]
      max-parallel: 1 # 最大并行数
    steps:
      - name: Checkout
        uses: actions/checkout@v4 # github action运行环境

      - name: Create release # 创建文件夹
        run: |
          rm -rf release 
          mkdir release
          echo ${{ github.sha }} > Release.txt
          cp Release.txt LICENSE release/
          cat Release.txt

      - name: Set up JDK 21
        uses: actions/setup-java@v4
        with:
          # Eclipse基金会维护的开源Java发行版 因为github action参考java的用这个 所以用这个
          # 还有microsoft(微软维护的openjdk发行版) oracle(商用SDK)等
          distribution: 'temurin'
          java-version: '21'

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x' # Node.js版本 20系列的最新稳定版

      - name: clean maven cache
        run: rm -rf ~/.m2/repository/io/github/git-commit-id

      - name: Build Backend
        run: |
          mvn clean package

      - name: Compile frontend
        run: |
          cd ./web
          npm install
          npm run build:prod
          cd ../

      - name: Package Files
        run: |
          cp -r ./src/main/resources/static release/  # 复制前端文件
          cp ./target/*.jar release/     # 复制 JAR 文件
          cp ./src/main/resources/application-dev.yml release/application.yml
          
          BRANCH=${{ github.event.base_ref }}
          BRANCH_NAME=$(echo "$BRANCH" | grep -oP 'refs/heads/\K.*')
          echo "BRANCH_NAME= ${BRANCH_NAME}"
          # 如果无法获取,使用默认分支
          if [[ -z "BRANCH_NAME" ]]; then
            BRANCH_NAME="${{ github.event.repository.default_branch }}"
          fi
          
          TAG_NAME="${GITHUB_REF#refs/tags/}"
          ZIP_FILE_NAME="${BRANCH_NAME}-${TAG_NAME}.zip"
          zip -r "$ZIP_FILE_NAME" release
          echo "ZIP_FILE_NAME=$ZIP_FILE_NAME" >> $GITHUB_ENV

      - name: Release
        uses: softprops/action-gh-release@v2
        if: startsWith(github.ref, 'refs/tags/')
        with:
          files: ${{ env.ZIP_FILE_NAME }}


================================================
FILE: .gitignore
================================================
# Compiled class file
*.class

# Log file
*.log
logs/*
# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/
src/main/resources/application-*.yml
# Package Files #
#*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
*.iml
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
/.idea/*
/target/*
/.idea/
/target/

/src/main/resources/static/
certificates
/.vs
/docker/volumes
/docker/wvp/config/jwk.json


================================================
FILE: .gitmodules
================================================
[submodule "be.teletask.onvif-java"]
	path = be.teletask.onvif-java
	url = https://gitee.com/pan648540858/be.teletask.onvif-java.git


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020 swwhaha

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.


================================================
FILE: README.md
================================================
![logo](doc/_media/logo.png)
# 开箱即用的国标28181和部标808+1078协议视频平台

[![Build Status](https://travis-ci.org/xia-chu/ZLMediaKit.svg?branch=master)](https://travis-ci.org/xia-chu/ZLMediaKit)
[![license](http://img.shields.io/badge/license-MIT-green.svg)](https://github.com/xia-chu/ZLMediaKit/blob/master/LICENSE)
[![JAVA](https://img.shields.io/badge/language-java-red.svg)](https://en.cppreference.com/)
[![platform](https://img.shields.io/badge/platform-linux%20|%20macos%20|%20windows-blue.svg)](https://github.com/xia-chu/ZLMediaKit)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-yellow.svg)](https://github.com/xia-chu/ZLMediaKit/pulls)


WEB VIDEO PLATFORM是一个基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台,负责实现核心信令与设备管理后台部分,支持NAT穿透,支持海康、大华、宇视等品牌的IPC、NVR接入。支持国标级联,支持将不带国标功能的摄像机/直播流/直播推流转发到其他国标平台。

流媒体服务基于@夏楚 ZLMediaKit [https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)   
播放器使用@dexter jessibuca [https://github.com/langhuihui/jessibuca/tree/v3](https://github.com/langhuihui/jessibuca/tree/v3)  
播放器使用@Numberwolf-Yanlong h265web.js [https://github.com/numberwolf/h265web.js](https://github.com/numberwolf/h265web.js)  
前端页面基于vue-admin-template构建 [https://github.com/PanJiaChen/vue-admin-template?tab=readme-ov-file](https://github.com/PanJiaChen/vue-admin-template?tab=readme-ov-file)  

# 应用场景:
- 支持浏览器无插件播放摄像头视频。
- 支持国标设备(摄像机、平台、NVR等)设备接入
- 支持rtsp, rtmp,直播设备设备接入,充分利旧。
- 支持国标级联。多平台级联。跨网视频预览。
- 支持跨网网闸平台互联。


# 文档
wvp使用文档 [https://doc.wvp-pro.cn](https://doc.wvp-pro.cn)  
ZLM使用文档 [https://github.com/ZLMediaKit/ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)

# gitee仓库
https://gitee.com/pan648540858/wvp-GB28181-pro.git

# 截图
<table>
    <tr>
        <td ><center><img src="doc/_media/1.png" >登录页面 </center></td>
        <td ><center><img src="doc/_media/2.png" >首页</center></td>
    </tr>
    <tr>
        <td ><center><img src="doc/_media/3.png" >分屏播放 </center></td>
        <td ><center><img src="doc/_media/4.png" >国标设备列表</center></td>
    </tr>
    <tr>
        <td ><center><img src="doc/_media/5.png" >行政区划管理 </center></td>
        <td ><center><img src="doc/_media/8.png" >业务分组管理</center></td>
    </tr>
    <tr>
        <td ><center><img src="doc/_media/6.png" >录制计划</center></td>
        <td ><center><img src="doc/_media/7.png" >平台信息</center></td>
    </tr>
</table>

# 功能特性
- [X] 集成web界面
- [X] 兼容性良好
- [X] 跨平台服务,一次编译多端部署, 可以同时用于x86和arm架构
- [X] 接入设备
  - [X] 视频预览
  - [X] 支持主码流子码流切换
  - [X] 无限制接入路数,能接入多少设备只取决于你的服务器性能
  - [X] 云台控制,控制设备转向,拉近,拉远
  - [X] 预置位查询,使用与设置
  - [X] 查询NVR/IPC上的录像与播放,支持指定时间播放与下载
  - [X] 无人观看自动断流,节省流量
  - [X] 视频设备信息同步
  - [X] 离在线监控
  - [X] 支持直接输出RTSP、RTMP、HTTP-FLV、Websocket-FLV、HLS多种协议流地址
  - [X] 支持通过一个流地址直接观看摄像头,无需登录以及调用任何接口
  - [X] 支持UDP和TCP两种国标信令传输模式
  - [X] 支持UDP和TCP两种国标流传输模式
  - [X] 支持检索,通道筛选
  - [X] 支持通道子目录查询
  - [X] 支持过滤音频,防止杂音影响观看
  - [X] 支持国标网络校时
  - [X] 支持播放H264和H265
  - [X] 报警信息处理,支持向前端推送报警信息
  - [X] 语音对讲
  - [X] 支持业务分组和行政区划树自定义展示以及级联推送
  - [X] 支持订阅与通知方法
    - [X] 移动位置订阅
    - [X] 移动位置通知处理
    - [X] 报警事件订阅
    - [X] 报警事件通知处理
    - [X] 设备目录订阅
    - [X] 设备目录通知处理
  -  [X] 移动位置查询和显示
  - [X] 支持手动添加设备和给设备设置单独的密码
-  [X] 支持平台对接接入
-  [X] 支持国标级联
  - [X] 国标通道向上级联
    - [X] WEB添加上级平台
    - [X] 注册
    - [X] 心跳保活
    - [X] 通道选择
    - [X] 支持通道编号自定义, 支持每个平台使用不同的通道编号
    - [X] 通道推送
    - [X] 点播
    - [X] 云台控制
    - [X] 平台状态查询
    - [X] 平台信息查询
    - [X] 平台远程启动
    - [X] 每个级联平台可自定义的虚拟目录
    - [X] 目录订阅与通知
    - [X] 录像查看与播放
    - [X] GPS订阅与通知(直播推流)
    - [X] 语音对讲
  - [X] 支持同时级联到多个上级平台
- [X] 支持自动配置ZLM媒体服务, 减少因配置问题所出现的问题;
- [X] 支持流媒体节点集群,负载均衡。
- [X] 支持启用udp多端口模式, 提高udp模式下媒体传输性能;
- [X] 支持公网部署;
- [X] 支持wvp与zlm分开部署,提升平台并发能力
- [X] 支持拉流RTSP/RTMP,分发为各种流格式,或者推送到其他国标平台
- [X] 支持推流RTSP/RTMP,分发为各种流格式,或者推送到其他国标平台
- [X] 支持推流鉴权
- [X] 支持接口鉴权
- [X] 云端录像,推流/代理/国标视频均可以录制在云端服务器,支持预览和下载
- [X] 支持打包可执行jar和war
- [X] 支持跨域请求,支持前后端分离部署
- [X] 支持Mysql,Postgresql,金仓等数据库
- [X] 支持录制计划, 根据设定的时间对通道进行录制. 暂不支持将录制的内容转发到国标上级
- [X] 支持国标信令集群
- [X] 新增支持部标808和部标1078,大量新特性不一一列表了。支持作为网关被国标上级调用部标设备
- [X] 支持电子地图。支持展示通道位置,支持在地图上修改通道位置。支持了数据分层抽稀数据能力,百万级数据也可以轻松展示。提供标准的矢量瓦片图层,常见地图引擎都可以直接展示。
- [X] 借用zlm闭源版本新能力,可以支持录像保存至s3存储,支持minio。

# 闭源内容
- [X] 国标增强版: 支持国标28181-2022协议,支持巡航轨迹查询,PTZ精准控制,存储卡格式化,设备软件升级,OSD配置,h265+aac,支持辅码流,录像倒放等。
- [X] 全功能版: 
  - [X] 支持开源所有功能
  - [X] ONVIF协议
    - 设备检索
    - 实时图像预览
    - 录像回放、回放倍速控制
    - 云台控制、预置位控制、云台绝对定位、看守位
    - 聚焦控制
    - 设备重启
    - 设备时间设置以及跟系统时间的差值比较
    - 恢复出厂设置
    - 自动获取设备品牌等信息、支持展示DNS信息、支持协议的展示
    - 国标级联点播、自动点播等。
  - [X] 国网B接口协议
    - 设备注册
    - 资源获取
    - 预览
    - 云台控制
    - 预置位控制等,
    - 可免费定制支持语音对讲、录像回放和抓拍图像。
  - [X] 支持按权限分配可以使用的通道
  - [X] 支持表格导出
  - [X] 拉流代理支持按照品牌拼接url。
  - [X] 播放鉴权,更加安全。


# 授权协议
本项目自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。 但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项目及开发者无关,请自行承担法律风险。 在使用本项目代码时,也应该在授权协议中同时表明本项目依赖的第三方库的协议

# 技术支持

# 付费社群
<img src="doc/_media/shequ.png" width="50%" height="50%">

> 付费社群即可以对作者提供支持,也可以为大家更加快速的解决问题。如果暂时无法加入,给项目点个星也是极大的鼓励。


[知识星球](https://t.zsxq.com/0d8VAD3Dm)专栏列表:,
- [使用入门系列一:WVP-PRO能做什么](https://t.zsxq.com/0dLguVoSp)

有偿技术支持,一对一开发辅导,闭源内容合作请发送邮件到648540858@qq.com咨询

# 致谢
感谢作者[夏楚](https://github.com/xia-chu) 提供这么棒的开源流媒体服务框架,并在开发过程中给予支持与帮助。     
感谢作者[dexter langhuihui](https://github.com/langhuihui)和[Numberwolf-Yanlong](https://github.com/numberwolf/h265web.js) 开源这么好用的WEB播放器。      
感谢各位大佬的赞助以及对项目的指正与帮助。包括但不限于代码贡献、问题反馈、资金捐赠等各种方式的支持!以下排名不分先后:  
[lawrencehj](https://github.com/lawrencehj) [Smallwhitepig](https://github.com/Smallwhitepig) [swwhaha](https://github.com/swwheihei)
[hotcoffie](https://github.com/hotcoffie) [xiaomu](https://github.com/nikmu) [TristingChen](https://github.com/TristingChen)
[chenparty](https://github.com/chenparty) [Hotleave](https://github.com/hotleave) [ydwxb](https://github.com/ydwxb)
[ydpd](https://github.com/ydpd) [szy833](https://github.com/szy833) [ydwxb](https://github.com/ydwxb) [Albertzhu666](https://github.com/Albertzhu666)
[mk1990](https://github.com/mk1990) [SaltFish001](https://github.com/SaltFish001)


================================================
FILE: bin/wvp.sh
================================================
#!/bin/bash

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

function log() {
	message="[Polaris Log]: $1 "
	case "$1" in
	*"Fail"* | *"Error"* | *"请使用 root 或 sudo 权限运行此脚本"*)
		echo -e "${RED}${message}${NC}" 2>&1 | tee -a
		;;
	*"Success"*)
		echo -e "${GREEN}${message}${NC}" 2>&1 | tee -a
		;;
	*"Ignore"* | *"Jump"*)
		echo -e "${YELLOW}${message}${NC}" 2>&1 | tee -a
		;;
	*)
		echo -e "${BLUE}${message}${NC}" 2>&1 | tee -a
		;;
	esac
}
echo
cat <<EOF
██████╗  ██████╗ ██╗      █████╗ ██████╗ ██╗███████╗
██╔══██╗██╔═══██╗██║     ██╔══██╗██╔══██╗██║██╔════╝
██████╔╝██║   ██║██║     ███████║██████╔╝██║███████╗
██╔═══╝ ██║   ██║██║     ██╔══██║██╔══██╗██║╚════██║
██║     ╚██████╔╝███████╗██║  ██║██║  ██║██║███████║
╚═╝      ╚═════╝ ╚══════╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝╚══════╝

EOF

#配置jdk的路径
export JAVA_HOME=/usr/local/java/jdk1.8.0_202   #此处为JDK路径
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

# WVP-pro defines
AppName=wvp-pro-2.7.2-05131055.jar
AppHome="/root/polaris/wvp/"
# JVM参数
JVM_OPTS="-Dname=$AppName  -Duser.timezone=Asia/Shanghai -Xms512m -Xmx2048m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=1024m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps  -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"

function start() {
	log "======================= 开启流媒体服务 ======================="
	log "AppName: $AppName"
	log "AppHome: $AppHome"
	log "Success:流媒体服务开启成功"
}

function stop() {
	log "======================= 停止流媒体服务 ======================="

	PID=""
	query() {
		PID=$(ps -ef | grep java | grep $AppName | grep -v grep | awk '{print $2}')
	}
	query
	if [ x"$PID" != x"" ]; then
		log "进程PID: $PID"
		kill -TERM $PID
		log "$AppName (pid:$PID) exiting..."
		while [ x"$PID" != x"" ]; do
			sleep 1
			query
		done
		log "Success:$AppName exited."
	else
		log "Jump:进程不存在"
	fi
}

function status() {
	log "======================= 运行状态 ======================="
	log ""

	PID=$(ps -ef | grep java | grep $AppName | grep -v grep | wc -l)
	if [ $PID != 0 ]; then
		log "进程PID: $PID"
		log "$AppName is running..."
	else
		log "$AppName is not running..."
	fi
	log ""
	log "========================================================"
}

function restart() {
	stop
	sleep 3
	start
}

case $1 in
start)
	start
	;;
stop)
	stop
	;;
restart)
	restart
	;;
status)
	status
	;;
*) ;;

esac



================================================
FILE: doc/README.md
================================================
# 介绍

> 开箱即用的28181协议视频平台

# 概述

- WVP-PRO基于GB/T
  28181-2016标准实现的流媒体平台,依托优秀的开源流媒体服务[ZLMediaKit](https://github.com/ZLMediaKit/ZLMediaKit)
  ,提供完善丰富的功能。
- GB/T 28181-2016 中文标准名称是《公共安全视频监控联网系统信息传输、交换、控制技术要求》是监控领域的国家标准。大量应用于政府视频平台。
- 通过28181协议你可以将IPC摄像头接入平台,可以观看也可以使用28181/rtsp/rtmp/flv等协议将视频流分发到其他平台。

# 特性

- 实现标准的28181信令,兼容常见的品牌设备,比如海康、大华、宇视等品牌的IPC、NVR以及平台。
- 支持将国标设备级联到其他国标平台,也支持将不支持国标的设备的图像或者直播推送到其他国标平台
- 前端完善,自带完整前端页面,无需二次开发可直接部署使用。
- 完全开源,且使用MIT许可协议。保留版权的情况下可以用于商业项目。
- 支持多流媒体节点负载均衡。

# 付费社群

[![社群](_media/shequ.png "shequ")](https://t.zsxq.com/0d8VAD3Dm)
> 收费是为了提供更好的服务,也是对作者更大的激励。加入星球的用户三天后可以私信我留下微信号,我会拉大家入群。加入三天内不满意可以直接退款,大家不需要有顾虑,来白嫖三天也不是不可以。

# 我们实现了哪些国标功能

**作为上级平台**

- [X] 注册
- [X] 注销
- [X] 实时视音频点播
- [X] 设备控制
    - [X] 云台控制
    - [X] 远程启动
    - [X] 录像控制
    - [X] 报警布防/撤防
    - [X] 报警复位
    - [X] 强制关键帧
    - [X] 拉框放大
    - [X] 拉框缩小
    - [X] 看守位控制
    - [X] 设备配置
- [X] 报警事件通知和分发
- [X] 设备目录订阅
- [X] 网络设备信息查询
    - [X] 设备目录查询
    - [X] 设备状态查询
    - [X] 设备配置查询
    - [X] 设备预置位查询
- [X] 状态信息报送
- [X] 设备视音频文件检索
- [X] 历史视音频的回放
    - [X] 播放
    - [X] 暂停
    - [X] 进/退
    - [X] 停止
- [X] 视音频文件下载
- [X] 校时
- [X] 订阅和通知
    - [X] 事件订阅
        - [X] 移动设备位置订阅
        - [X] 报警订阅
        - [X] 目录订阅
- [X] 语音广播
- [X] 语音喊话

**国标级联**

- [X] 注册
- [X] 注销
- [X] 实时视音频点播
- [X] 设备控制
    - [X] 云台控制
    - [ ] 远程启动
    - [X] 录像控制
    - [X] 报警布防/撤防
    - [X] 报警复位
    - [X] 强制关键帧
    - [X] 拉框放大
    - [X] 拉框缩小
    - [X] 看守位控制
    - [ ] 设备配置
- [ ] 报警事件通知和分发
- [X] 设备目录订阅
- [X] 网络设备信息查询
    - [X] 设备目录查询
    - [X] 设备状态查询
    - [ ] 设备配置查询
    - [X] 设备预置位查询
- [X] 状态信息报送
- [X] 设备视音频文件检索
- [X] 历史视音频的回放
    - [X] 播放
    - [x] 暂停
    - [x] 进/退
    - [x] 停止
- [X] 视音频文件下载
- [ ] ~~校时~~
- [X] 订阅和通知
    - [X] 事件订阅
        - [X] 移动设备位置订阅
        - [ ] 报警订阅
        - [X] 目录订阅
- [X] 语音广播
- [X] 语音喊话

**闭源版本**
- [X] 国标28181-2022  
    相比28181-2016标准,28181-2022标准新增了以下功能
    - [X] 云台控制精准位置查询和控制,支持设置具体的水平角度、垂直角度和缩放倍数,支持订阅和通知。
    - [X] 支持标准的H265视频编码和AAC音频编码格式
    - [X] 支持主辅码流
    - [X] 支持图像抓拍,无需拉流即可获取当前图像,推理获取图片友好。
    - [X] 支持GB18030编码,不输UTF-8的编码格式,2016中使用的GB2312编码的升级,基本告别中文乱码了
    - [X] 支持存储卡格式化
    - [X] 支持设备软件升级
    - [X] 支持OSD配置
    - [X] 支持录像倒放功能
    - [X] 支持目标跟踪控制
    - [X] 支持视频参数属性配置
    - [X] 支持视频遮挡配置
    - [X] 支持设备软件升级
# 社区

代码目前托管在GitHub和Gitee,Gitee目前作为加速仓库使用,不接受issue。  
GitHub: [https://github.com/648540858/wvp-GB28181-pro](https://github.com/648540858/wvp-GB28181-pro)  
Gitee: [https://gitee.com/pan648540858/wvp-GB28181-pro](https://gitee.com/pan648540858/wvp-GB28181-pro)


================================================
FILE: doc/_content/ability/auto_play.md
================================================
<!-- 自动点播 -->

# 自动点播


================================================
FILE: doc/_content/ability/cascade.md
================================================
<!-- 国标级联的使用 -->

# 国标级联的使用

国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。

## 1 接入平台

### 1.1 wvp-pro

#### 1.1.1 wvp-pro管理页面点击添加

![cascade1](_media/cascade1.png)

#### 1.1.2 填入wvp-pro上级平台信息

![cascade1](_media/img_4.png)
![cascade1](_media/img_5.png)

#### 1.1.3 编辑wvp-pro上级设备信息,开启订阅

![cascade1](_media/img_6.png)

### 1.2 大华平台

### 1.3 海康平台

### 1.4 liveGBS

#### 1.4.1. wvp-pro管理页面点击添加

![添加](_media/cascade1.png)

#### 1.4.2. 填入liveGBS平台信息

![填入liveGBS平台信息1](_media/cascade2.png)
![填入liveGBS平台信息2](_media/cascade3.png)

#### 1.4.3. 编辑liveGBS设备信息,开启目录订阅

![cascade1](_media/cascade4.png)

#### 1.4.4. 编辑liveGBS设备信息,开启GPS订阅

![cascade1](_media/img_7.png)

## 2 添加目录与通道

1. 级联平台添加目录信息  
   ![cascade1](_media/img_1.png)
2. 为目录添加通道  
   ![cascade1](_media/img_2.png)
3. 设置默认流目录   
   如果需要后续自动生成的流信息都在某一个节点下,可以在对应节点右键设置为默认  
   ![cascade1](_media/img_3.png)



================================================
FILE: doc/_content/ability/cascade2.md
================================================
<!-- 国标级联的使用 -->

# 国标级联的使用

国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。

## 添加上级平台

在国标级联页面点击“添加”按钮,以推送到上级WVP为例子,参看[接入设备](./_content/ability/device.md)
![cascade17](_media/img_17.png)

1. 名称  
   上级平台看到的下级平台名称;
2. 本地IP  
   本地连接上级使用的具体哪个网卡;
3. SIP认证用户名  
   可以设置为与"设备国标编号"一致;
4. 注册周期  
   间隔多久发起一次注册,单位秒;
5. 心跳周期  
   间隔多久发送一次心跳,一般上级平台三次收不到心跳就会认为下级离线了, 所以建议{心跳周期}x3 < 注册周期;
6. SDP发流IP  
   调用媒体节点发送视频流给上级时,使用的本地IP;
7. 信令传输  
   信令传输模式,支持udp和TCP,没有特殊需求,默认UDP即可;
8. 目录分组  
   上级发送"CATALOG"消息查询通道信息,每一条消息中携带几条通道信息,默认为1,增大该值,可以加快通道发送速度;
9. 字符集  
   发送给上级"MESSAGE"消息中的消息体使用的编码格式,国标28181-2016默认为GB2312;
10. 行政区划  
    如果勾选"其他选项/推送平台信息"选项,会给上级推送平台信息,这里就是平台的行政区划信息
11. 平台厂商  
    如果勾选"其他选项/推送平台信息"选项,会给上级推送平台信息,这里就是平台的平台厂商信息
12. 平台型号  
    如果勾选"其他选项/推送平台信息"选项,会给上级推送平台信息,这里就是平台的平台型号信息
13. 平台安装地址  
    如果勾选"其他选项/推送平台信息"选项,会给上级推送平台信息,这里就是平台的平台安装地址信息
14. 其他选项
    - RTCP保活  
      在上级的流传输模式为UDP时,因为UDP的无状态特性,会无法知道上级是否在正常收流,启用RTCP保活时,就可以主动发送RTCP消息确认上级是否在正常收流,
      异常情况下,可以下级主动停止发流;
    - 消息通道  
      支持通过报警消息给上级级WVP推送消息,消息内容由redis消息发送给wvp,wvp编辑成报警消息发送给上级;
    - 主动推送通道  
      WVP模拟一条目录订阅信息,然后在共享通道变化时,发送CATAOLOG事件给上级,通知具体的通道变化,  
      目前支持的状态有: 状态改变事件 ON:上线,OFF:离线,VLOST:视频丢失,DEFECT:故障,ADD:增加,DEL:删除,UPDATE:更新;
    - 推送平台信息  
      勾选此项,上级收到的通道信息中会多出一个平台信息的通道.内容在平台的编辑中修改;
    - 推送分组信息  
      勾选此项,如果你共享的通道分配了具体的业务分组以及虚拟组织,那么上级收到的通道中会包括业务分组以及虚拟组织节点信息;
    - 推送行政区划  
      勾选此项,如果你共享的通道分配了具体的行政区划,那么上级收到的通道中会包括行政区划信息;

国标级联列表出现了级联的这个平台;同时状态显示为在线,如果状态为离线那么可能是你的服务信息配置有误或者网络不通。
订阅信息列有三个图标,表示上级开启订阅,从左到右依次是:报警订阅,目录订阅,移动位置订阅。

## 通道共享

点击你要推送的平台的“通道共享”按钮。
![cascade18](_media/img_18.png)

1. 添加状态选择"未共享"可以将具体的通道共享给上级;
2. 添加状态选择"已共享"可以看到已经共享的通道,并且支持为这个通道在这个平台设备专门的名称和编号;
3. 点击"按设备添加"可以将某个国标设备下的所有通道共享给上级;
4. 点击"按设备移除"可以将某个国标设备下的所有通道取消共享给上级;
5. 点击"全部添加"可以将所有通道共享给上级;
6. 点击"全部移除"可以将所有通道共享给上级;

## 推送通道

WVP会将所有通道信息按照目录订阅消息通知形式,发送ADD事件给上级.

================================================
FILE: doc/_content/ability/channel.md
================================================
# 通道管理

通道管理为了对已经分配国标编号的通道进行统一的行政区划和业务分组管理,国标中对于组织结构有两种表示方式,一种是按照行政区划,一种是业务分组+虚拟组织的方式.
行政区划结构固定,比如: 北京/市辖区/昌平区, 通道可以挂载道何一级行政区划下. 业务分组比较灵活, 可以按照自己的随意取名,
但是通道只能放在业务分组下的虚拟组织里,不能放在业务分组下.

## 行政区划

左侧树结构为行政区划结构, 通过数据鼠标右键可以操作,包括: 刷新节点,新建节点,编辑节点,删除节点,添加设备(
可以将某个国标设备下的通道全部添加道某一个节点下),移除设备(可以将某个国标设备下的通道全部从这个节点移除)
右侧伪通道列表, 对于非国标接入的设备只有配置了国标编号后才可以在这里进行操作。  
选择左侧的节点后,可以点击右侧的“添加通道”, 选择需要的通道添加到改节点下,如果找不到通道, 可以选择“异常挂载通道”,点击清理后重新回来选择。
![行政区划](_media/img_21.png)

## 业务分组

左侧树结构为业务分组结构, 通过数据鼠标右键可以操作,包括: 刷新节点,新建节点,编辑节点,删除节点,添加设备(
可以将某个国标设备下的通道全部添加道某一个节点下),移除设备(可以将某个国标设备下的通道全部从这个节点移除)
业务分组下不能挂载设备,所以没有选择该节点的单选框.
右侧为通道列表, 对于非国标接入的设备只有配置了国标编号后才可以在这里进行操作。  

选择左侧的节点后,可以点击右侧的“添加通道”, 选择需要的通道添加到改节点下。  
如果找不到通道, 可以选择“异常挂载通道”,点击清理后重新回来选择。  
注意,根资源组下的那一级为业务分组类型不可以直接挂载设备,需要继续建立节点,后续的节点的都是虚拟组织类型, 就可以挂载通道了。
![业务分组](_media/img_22.png)


================================================
FILE: doc/_content/ability/cloud_record.md
================================================
<!-- 云端录像 -->

# 云端录像

![云端录像](_media/img_26.png)
云端录像是对录制在zlm服务下的录像文件的管理,录像的文件路径默认在ZLM/www/record下。

- 国标设备是否录像: 可以再WVP的配置中user-settings.record-sip设置为true那么每次点播以及录像回放都会录像;
- 推流设备是否录像: 可以再WVP的配置中user-settings.record-push-live设置为true;
- 拉流代理的是否录像: 在添加和编辑拉流代理时可以指定, 每次点播都会进行录像
- 录像文件存储路径配置: 可以修改media.record-path来修改录像路径,但是如果有旧的录像文件,请不要迁移,因为数据库记录了每一个录像的绝对路径,一旦修改会造成找到文件,无法定时移除以及播放
- 录像保存时间: 可以修改media.record-day来修改录像保存时间,单位是天;



================================================
FILE: doc/_content/ability/continuous_broadcast.md
================================================
# 语音对讲

## 流程和原理

语音对讲在国标28181-2016中分为broadcast(广播)和talk(对讲)两种模式,broadcast模式是从服务端把音频传送到设备端,是单向的,
需要结合点播视频来实现双向对讲,talk模式支持双向,不过wvp只处理了和broadcast一样的把音频传递设备,这样两种模式可以使用一样的逻辑处理即可。
不同的设备对于两种模式的支持不同且通常差异很大,不同的设备对同一个设备的支持也有一些不同,所以语音对讲中的兼容和适配也是问题最多的。talk模式因为在国标28181-2022中已经移除,所以这里不再讨论它了。

### 1. broadcast模式流程

```plantuml
@startuml
"WVP-PRO" -> "设备": 语音广播通知
"WVP-PRO" <-- "设备": 200OK
"WVP-PRO" <- "设备": 语音广播应答
"WVP-PRO" --> "设备": 200OK
"WVP-PRO" <- "设备": Invite
"WVP-PRO" --> "设备": 200OK(携带SDP消息体)
"WVP-PRO" <-- "设备": ACK
"ZLMediaKit" -> "设备": 向设备发送语音流
@enduml
```

与点播的流程不同的是,这里的invite消息是由设备发送给wvp的,wvp按照invite协商的方式给设备推送语音流,所有对讲的使用那种方式(UDP/TCP被动/TCP主动)传输语音流由设备决定

## 使用条件与限制

因为invite消息是由设备发送给wvp的,这决定了发送语音流的方式,这也就决定了有的设备不能用于公网对讲,比如大部分的海康设备只支持udp方式收流(
目前新版的海康设备已经在着手解决这个问题),那么wvp发流时只能按照sdp中指定的ip端口发流,所以如果wvp在公网,设备在内网中,那么wvp无法连接设备提供的IP,发流也就失败了。
与海康不同的,大华以及很多执法记录仪厂商是支持tcp主动方式取流的,这样是可以实现公网对讲的。

## 使用ffmpeg快速测试

由于浏览器对于音频的采集需要网页支持https才可以,所以如果想要实现网页音频对讲,那么你必须给wvp和zlm配置证书以使用https。
测试阶段如果只是想测试功能可以用ffmpeg来模拟语音流,推送到wvp后可以实现把音频文件推送到摄像头。
测试命令格式如下:

```shell
ffmpeg -re -i {音频文件} -acodec pcm_alaw -ar 8000 -ac 1 -f rtsp 'rtsp://{zlm的IP}:{zlm的RTSP端口}/broadcast/{设备国标编号}_{通道国标编号}?sign={md5(pushKey)}' 
```

例如

```shell
ffmpeg -re -i test.mp3 -acodec pcm_alaw -ar 8000 -ac 1 -f rtsp 'rtsp://192.168.1.3:22554/broadcast/34020000001320000001_34020000001320000001?sign=41db35390ddad33f83944f44b8b75ded' 
```

测试流程如下:

```plantuml
@startuml
"FFMPEG" -> "ZLMediaKit": 推流到zlm
"WVP-PRO" <- "ZLMediaKit": 通知收到语音对讲推流,携带设备和通道信息
"WVP-PRO" -> "设备": 开始语音对讲
"WVP-PRO" <-- "设备": 语音对讲建立成功,携带收流端口
"WVP-PRO" -> "ZLMediaKit": 通知zlm将流推送到设备收流端口
"ZLMediaKit" -> "设备": 向设备推流
@enduml
```

如果听到设备播放你推送的音频,那么意味着调用成功,此过程推流即可需要调用任何接口

## 生产环境网页发起语音对讲

生产环境下使用语音对讲,如果是自己的客户端设备那么直接上面的ffmpeg测试方式,按照固定格式推流到zlm即可。
对于WEB程序,主要是局域网和公网的区别,两个原因:

1. 很多设备不支持公网对讲
2. 公网和局域网获取证书实现https支持的方式不同

### 公网使用

公网你可以直接使用证书厂商或者云服务器厂商提供的证书,这是很方便的。

### 局域网使用

局域网你需要为wvp和zlm生成自签名证书,这里我推荐一种生成自签名证书相对方便的方式,
此方式为linux下的一种方式。
下载证书生成工具:  
[https://github.com/FiloSottile/mkcert/releases/tag/v1.4.4](https://github.com/FiloSottile/mkcert/releases/tag/v1.4.4)
安装此工具, 进入解压的工具目录,执行

```shell
./mkcert-v1.4.4-linux-amd64 -install
```

生成pem证书

```shell
./mkcert-v1.4.4-linux-amd64 局域网IP 局域网IP2 局域网IP3
```

你会得到两文件*-key.pem和*.pem, 此文件配置到wvp后既可实现证书的加载
生成zlm使用的证书

```shell
cat *.pem *-key.pem> ./zlm.pem
```

得到的文件就是可以给zlm使用的证书
zlm下使用证书有两种方式:

1. 替换zlm下的default.pem, 即删除此文件并把zlm.pem重命名为default.pem
2. 在启动zlm的使用添加 `-s zlm.pem`

================================================
FILE: doc/_content/ability/continuous_recording.md
================================================
<!-- 7*24不间断录像 -->

# 7*24不间断录像

目前如果要实现不间断录像如果只是关闭无人观看停止推流是不够的,设备可能经历断网,重启,都会导致录像的中断,目前给大家提供一种可用的临时方案。

**原理:** wvp支持使用流地址自动点播,即你拿到一个流地址直接去播放,即使设备处于未点播状态,wvp会自动帮你点播;ZLM
的拉流代理成功后会无限重试,只要流一恢复就可以拉起来,基于这两个原理。  
**方案如下:**

1. wvp的配置中user-settings->auto-apply-play设置为团true,开启自动点播;
2. 点击你要录像的通道,点击播放页面左下角的“更多地址”,点击rtsp,此时复制了rtsp地址到剪贴板;
3. 在拉流代理中添加一路流,地址填写你复制的地址,启用成功即可。  
   **前提:**
1. wvp使用多端口收流,不然你无法得到一个固定的流地址,也就无法实现自动点播。



================================================
FILE: doc/_content/ability/device.md
================================================
<!-- 接入设备 -->

# 接入设备

## 国标28181设备

设备接入主要是需要在设备上配置28181上级也就是WVP-PRO的信息,只有信息一致的情况才可以注册成功。设备注册成功后打开WVP->
国标设备,可以看到新增加的设备;[设备使用](./_content/ability/device_use.md),  
主要有以下字段需要配置:

- sip->port  
  28181服务监听的端口

- sip->domain  
  domain宜采用ID统一编码的前十位编码。

- sip->id  
  28181服务ID

- sip->password  
  28181服务密码

- 配置信息在如下位置

![_media/img_16.png](_media/img_16.png)
***

### 1. 大华摄像头

![_media/img_10.png](_media/img_10.png)

### 2. 大华NVR

![_media/img_11.png](_media/img_11.png)

### 3. 宇视科技

![_media/img_25.png](_media/img_25.png)

### 3. 艾科威视摄像头

![_media/img_15.png](_media/img_15.png)

### 4. 水星摄像头

![_media/img_12.png](_media/img_12.png)

### 5. 海康摄像头

![_media/img_9.png](_media/img_9.png)

## 直播推流设备

这里以obs推流为例,很多无人机也是一样的,设置下推流地址就可以接入了

1. 从wvp获取推流地址, 选择节点管理菜单,查看要推流的节点;
   ![_media/img_19.png](_media/img_19.png)
2. 拼接推流地址
   得到的rtsp地址就是: rtsp://{流IP}:{RTSP PORT}/{app}/{stream}
   得到的rtmp地址就是: rtsp://{流IP}:{RTMP PORT}/{app}/{stream}
   其中流IP是设备可以连接到zlm的IP,端口是对应协议的端口号, app和stream自己定义就可以.
3. 增加推流鉴权信息
   wvp默认开启推流鉴权,拼接好的地址是不能直接推送的,会被返回鉴权失败,参考[推流规则](_content/ability/push?id=推流规则)
4. 推流成功后可以再推流列表中看到推流设备,可以播放
   此方式只支持设备实时流的播放,无其他功能, 推流信息在推流结束后会自动移除,在列表里就看不到了,如果需要推流信息需要为设备配置国标编号,这样才可以作为wvp的一个永久通道存在.

## 接入非国标IPC设备或者其他流地址形式的设备

这类设备的接入主要通过拉流代理的方式接入,原理就是zlm主动像播放器一样拉取这个流缓存在自己服务器供其他人播放.可以解决源设备并发访问能力差的问题.
在拉流代理/添加代理后可以直接播放, 拉流代理也是同样只支持播放当前配置的流.

[设备使用](_content/ability/device_use.md)


================================================
FILE: doc/_content/ability/device_use.md
================================================
<!-- 设备使用 -->

# 国标设备

### 更新设备通道

点击列表末尾的“刷新”按钮,可以看到一个圆形进度条,等进度结束提示成功后即可更新完成,如果通道数量有变化你可以看点击左上角的![刷新](_media/img_14.png)
即可看到通道数量的变化;如果通道数量仍未0,那么可能时对方尚未推送通道给你。

### 查看设备通道

点击列表末尾的“通道”按钮,

### 编辑设备

点击列表末尾的“编辑”按钮,即可在打开的弹窗中对设备功能进行修改

- 设备名称  
  如何未能从设备里读取到设备名称或者需要自己重命名,那么可以修改此选项。
- 密码
  支持为设备配置独立的密码.
- 收流IP
  如果你需要设备从指定的网络地址接入视频流,那么可以配置此IP,设备将会发流到这个IP,比如多网卡接入的服务器.或者存在网络映射的情况.
- 流媒体ID
  固定设备使用的流媒体ID,默认根据负载自动分配.
- 字符集  
  修改读取设备数据时使用的字符集,默认为GB2312,但是GB2312收录的汉字不全,所以有时候回遇到乱码,可以修改为UTF-8来解决。
- 目录订阅  
  填写订阅周期即可对设备开启目录订阅,设备如果支持目录订阅那么设备在通道信息发生变化时就会通知WVP哪些通道发生了那些变化,包括通道增加/删除/更新/上线/下线/视频丢失/故障。0为取消订阅。
  一般NVR和平台对接可以开启此选项,直接接摄像机开启此选项意义不大。
- 移动位置订阅  
  对设备开启移动位置订阅,设备如果支持目录订阅那么设备位置发生变化时会通知到WVP,一般执法记录仪可以开启此选项,对固定位置的设备意义不大。
- SSRC校验  
  为了解决部分设备出现的串流问题,可以打开此选项。ZLM会严格按照给定的ssrc处理视频流。部分设备流信息不标准,开启可能导致无法点播。
- 作为消息通道
  wvp支持通过报警消息给下级WVP互相推送消息,消息内容由redis消息发送给wvp,wvp编辑成报警消息发送给下级
- 收到ACK后发流
  语音对讲策略: 不同的设备对于语音对讲的收流时机要求不一,勾选后会在收到设备发送的ack后再开始发流,不勾选则在回复200OK后开始发流,目前已知大华设备不勾选,海康需要勾选.

### 删除设备

可以删除WVP中的设备信息,如果设备28181配置未更改,那么设备在下一次注册后仍然会注册上来。

### 点播视频

进入通道列表后,点击列表末尾的“播放”按钮,稍等即可弹出播放页面

### 设备录像

进入通道列表后,点击列表末尾的“设备录像”按钮,也可以在播放页面点击录像查询进入录像查看页面,选择要查看的日期即可对录像进行播放和下载。

### 云台控制

可以对支持云台功能的设备进行上下左右的转动以及拉近拉远的操作。

### 获取视频的播放器地址

视频点播成功后在实时视频页面,点击“更多地址”可以看到所有的播放地址,地址是否可以播放与你是否完整编译启用zlm功能有关,更与网络有关。

### 语音对讲

[语音对讲](_content/ability/continuous_broadcast.md)

================================================
FILE: doc/_content/ability/gis.md
================================================
<!-- 电子地图 -->

# 电子地图

WVP提供了简单的电子地图用于设备的定位以及移动设备的轨迹信息,电子地图基于开源的地图引擎openlayers开发。

### 查看设备定位

1. 可以在设备列表点击“定位”按钮,自动跳转到电子地图页面;
2. 在电子地图页面在设备上右键点击“定位”获取设备/平台下的所有通道位置。
3. 单击通道信息可以定位到具体的通道

### 查询设备轨迹

查询轨迹需要提前配置save-position-history选项开启轨迹信息的保存,目前WVP此处未支持分库分表,对于大数据量的轨迹信息无法胜任,有需求请自行二次开发或者定制开发。
在电子地图页面在设备上右键点击“查询轨迹”获取设备轨迹信息。

PS: 目前的底图仅用用作演示和学习,商用情况请自行购买授权使用。

### 更换底图以及底图配置

目前WVP支持使用了更换底图,配置文件在web_src/static/js/config.js,请修改后重新编译前端文件。

```javascript
window.mapParam = {
  // 开启/关闭地图功能
  enable: true,
  // 坐标系 GCJ-02 WGS-84,
  coordinateSystem: "GCJ-02",
  // 地图瓦片地址
  tilesUrl: "http://webrd0{1-4}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8",
  // 瓦片大小
  tileSize: 256,
  // 默认层级
  zoom:10,
  // 默认地图中心点
  center:[116.41020, 39.915119],
  // 地图最大层级
  maxZoom:18,
  // 地图最小层级
  minZoom: 3
}
```


================================================
FILE: doc/_content/ability/node_manager.md
================================================
<!-- 节点管理 -->

# 节点管理

![节点管理](_media/img_26.png)

WVP支持单个WVP多个ZLM的方案来扩展WVP的视频并发能力,并发点播是因为带宽和性能的原因,单个ZLM节点能支持的路数有限,所以WVP增加了ZLM集群来扩展并发并且保证ZLM的高可用。

## 默认节点

WVP中为了保证功能的完整性,ZLM节点至少要有一个默认节点,这个节点不是在管理页面添加的,而是在WVP的配置文件中配置的,这个节点不可在页面删除。每次启动会自动从配置文件中读取配置写入数据库备用。

## 新增节点

启动你要添加的zlm节点,然后点击“添加节点”按钮输入zlm的ip,
http端口,SECRET。点击测试测试完成则开始对节点进行详细的设置,如果你的zlm是使用docker启动的,可能存在zlm使用的端口与宿主机端口不一致的情况,需要在这里一一配置。

## wvp使用多个节点的原理

wvp会把连接的节点统一记录在redis中,并记录zlm的负载情况,当新的请求到来时,会取出负载最低的那个zlm进行使用。以此保证节点负载均衡。


================================================
FILE: doc/_content/ability/online_doc.md
================================================
<!-- 在线文档 -->

# 在线文档


================================================
FILE: doc/_content/ability/proxy.md
================================================
<!-- 拉流代理 -->

# 拉流代理

不是所有的摄像机都支持国标或者推流的,但是这些设备可以得到一个视频播放地址,通常为rtsp协议,
以大华为例:

```text
rtsp://{user}:{passwd}@{ipc_ip}:{rtsp_port}/cam/realmonitor?channel=1&subtype=0
```

可以得到这样一个流地址,可以直接用vlc进行播放,此时我们可以通过拉流代理功能将这个设备推送给其他国标平台了。
流程如下:

```plantuml
@startuml
"摄像机"  <- "ZLMediaKit": 1. 流去流信息到ZLM
"ZLMediaKit"  -> "WVP-PRO": 2. 收到hook通知得到流信息
"上级国标平台"  -> "WVP-PRO": 3. 点播这路视频
"WVP-PRO" -> "ZLMediaKit": 4. 通知推流到上级国标平台
@enduml
```

## 添加代理

拉流代理支持两种方式:

1. ZLM中直接代理流,支持RTSP/RTMP,不支持转码;
2. 借助ffmpeg完成拉转,可以通过修改ffmpeg拉转参数完成转码。  
   点击页面的“添加代理”,添加信息后保存即可,如果你需要共享推流信息到其他国标平台,那么你需要编辑/国标通道配置,配置国标编码.

`PS: ffmpeg默认模板不需修改,需要修改`参数自行去ZLM配置文件中添加一个即可。


================================================
FILE: doc/_content/ability/push.md
================================================
<!-- 推流列表 -->

# 推流列表

## 功能说明

WVP支持三种图像输入方式,直播,[拉流代理](_content/ability/proxy.md),[国标](_content/ability/device.md),直播设备接入流程如下

```plantuml
@startuml
"直播设备"  -> "ZLMediaKit": 1. 发起推流
"ZLMediaKit"  -> "WVP-PRO": 2. 收到hook通知得到流信息
"上级国标平台"  -> "WVP-PRO": 3. 点播这路视频
"WVP-PRO" -> "ZLMediaKit": 4. 通知推流到上级国标平台
@enduml
```

1. 默认情况下WVP收到推流信息后,列表中出现这条推流信息,如果你需要共享推流信息到其他国标平台,那么你需要编辑/国标通道配置,配置国标编码.
2. WVP也支持推流前导入大量通道直接推送给上级,点击“下载模板”按钮,根据示例修改模板后,点击“通道导入”按钮导入通道数据.

## 生成推流地址
可以在推流列表里点击‘生成推流地址’按钮,得到新地址后直接复制到推流设备。

## 推拉流鉴权规则

为了保护服务器的WVP默认开启推流鉴权(目前不支持关闭此功能)

### 推流规则

推流时需要携带推流鉴权的签名sign,sign=md5(pushKey),pushKey来自用户表,每个用户会有一个不同的pushKey.
例如app=test,stream=live,pushKey=1000,ip=192.168.1.4, port=10554 那么推流地址为:

```
rtsp://192.168.1.4:10554/test/live?sign=a9b7ba70783b617e9998dc4dd82eb3c5
```

支持推流时自定义播放鉴权Id,参数名为callId,此时sign=md5(callId_pushKey)
例如app=test,stream=live,pushKey=1000,callId=12345678, ip=192.168.1.4, port=10554 那么推流地址为:

```
rtsp://192.168.1.4:10554/test/live?callId=12345678&sign=c8e6e01dde2d60c66dcea8d2498ffef1
```

### 播放规则

默认情况播放不需要鉴权,但是如果推流时携带了callId,那么播放时必须携带callId
例如app=test,stream=live,无callId, ip=192.168.1.4, port=10554 那么播放地址为:

```
rtsp://192.168.1.4:10554/test/live
```

例如app=test,stream=live,callId=12345678, ip=192.168.1.4, port=10554 那么播放地址为:

```
rtsp://192.168.1.4:10554/test/live?callId=12345678
```



================================================
FILE: doc/_content/ability/user.md
================================================
<!-- 用户管理 -->

# 用户管理


================================================
FILE: doc/_content/about_doc.md
================================================
<!-- 关于本文档 -->

# 关于本文档

本文档开源在gitee上,[https://gitee.com/pan648540858/wvp-pro-doc.git](https://gitee.com/pan648540858/wvp-pro-doc.git)
,如果文档出现任何错误或者不易理解的语句,请大家提ISSUE帮助我及时更正。欢迎大家提交PR一起维护这份文档,让更多的人可以使用到这个开源的视频平台。



================================================
FILE: doc/_content/broadcast.md
================================================
# 原理图

## 使用ffmpeg测试语音对讲原理

```plantuml
@startuml
"FFMPEG" -> "ZLMediaKit": 推流到zlm
"WVP-PRO" <- "ZLMediaKit": 通知收到语音对讲推流,携带设备和通道信息
"WVP-PRO" -> "设备": 开始语音对讲
"WVP-PRO" <-- "设备": 语音对讲建立成功,携带收流端口
"WVP-PRO" -> "ZLMediaKit": 通知zlm将流推送到设备收流端口
"ZLMediaKit" -> "设备": 向设备推流
@enduml
```

## 使用网页测试语音对讲原理

```plantuml
@startuml
"前端页面" -> "WVP-PRO": 请求推流地址
"前端页面" <-- "WVP-PRO": 返回推流地址
"前端页面" -> "ZLMediaKit": 使用webrtc推流到zlm,以下过程相同
"WVP-PRO" <- "ZLMediaKit": 通知收到语音对讲推流,携带设备和通道信息
"WVP-PRO" -> "设备": 开始语音对讲
"WVP-PRO" <-- "设备": 语音对讲建立成功,携带收流端口
"WVP-PRO" -> "ZLMediaKit": 通知zlm将流推送到设备收流端口
"ZLMediaKit" -> "设备": 向设备推流
@enduml
```

================================================
FILE: doc/_content/disclaimers.md
================================================
# 免责声明

WVP-PRO自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。
但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为一概与本项目及开发者无关,请自行承担法律风险。
在使用本项目代码时,也应该在授权协议中同时表明本项目依赖的第三方库的协议

================================================
FILE: doc/_content/introduction/compile.md
================================================
<!-- 编译 -->

# 编译

WVP-PRO不只是实现了国标28181的协议,本身也是一个完整的视频平台。所以对于新手来说,你可能需要一些耐心来完成。遇到问题不要焦躁,你可以

1. 百度
2. 加入星球体提问;[知识星球](https://t.zsxq.com/0d8VAD3Dm)
3. 向作者发送邮件648540858@qq.com,寻求技术支持(有偿);

WVP-PRO使用Spring boot开发,maven管理依赖。对于熟悉spring开发的朋友是很容易进行编译部署以及运行的。  
下面将提供一种通用方法方便大家运行项目。

## 1 服务介绍

| 服务         | 作用                                       | 是否必须 |
|------------|------------------------------------------|------|
| WVP-PRO    | 实现国标28181的信令以及视频平台相关的功能                  | 是    |
| ZLMediaKit | 为WVP-PRO提供国标28181的媒体部分的实现,以及各种视频流格式的分发支持 | 是    |

## 2 安装依赖

| 依赖     | 版本    | 用途          | 开发环境需要 | 生产环境需要 |
|--------|-------|-------------|--------|--------|
| jdk    | >=21  | 运行与编译java代码 | 是      | 是      |  
| maven  | >=3.3 | 管理java代码依赖  | 否      | 否      |
| git    |       | 下载/更新/提交代码  | 否      | 否      |
| nodejs |       | 编译于运行前端文件   | 否      | 否      |
| npm    |       | 管理前端文件依赖    | 否      | 否      |

如果你是一个新手,建议你使用linux或者macOS平台。windows不推荐。

ubuntu环境,以ubuntu 18为例:

``` bash
apt-get install -y openjdk-21-jdk git maven nodejs npm
```

window环境,以windows10为例:

```bash
这里不细说了,百度或者谷歌一搜一大把,基本都是下一步下一步,然后配置环境变量。
```

## 3 安装mysql以及redis

这里依然是参考网上教程,自行安装吧。

## 4 编译ZLMediaKit

> 现在zlm提供最新版本的打包直接下载了, 地址为:[各平台二进制包下载](https://github.com/ZLMediaKit/ZLMediaKit/issues/483)

参考ZLMediaKit[WIKI](https://github.com/ZLMediaKit/ZLMediaKit/wiki)
,如果需要使用语音对讲功能,请参考[zlm启用webrtc编译指南](https://github.com/ZLMediaKit/ZLMediaKit/wiki/zlm%E5%90%AF%E7%94%A8webrtc%E7%BC%96%E8%AF%91%E6%8C%87%E5%8D%97)
,开启zlm的webrtc功能。截取一下关键步骤:

```bash
# 国内用户推荐从同步镜像网站gitee下载 
git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
# 千万不要忘记执行这句命令
git submodule update --init
```

## 5 编译WVP-PRO

### 5.1 可以通过git克隆,也可以在项目下载点击下载

![点击下载](_media/img_1.png)
![点击下载](_media/img_2.png)
从gitee克隆

```bash
git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git
```

从github克隆

```bash
git clone https://github.com/648540858/wvp-GB28181-pro.git
```

### 5.2 编译前端页面

```shell script
cd wvp-GB28181-pro/web/
npm --registry=https://registry.npmmirror.com install
npm run build:prod
```

编译如果报错, 一般都是网络问题, 导致的依赖包下载失败  
编译完成后在src/main/resources下出现static目录
**编译完成一般是这个样子,中间没有报红的错误信息**
![编译成功](_media/img.png)

### 5.3 生成可执行jar

```bash
cd wvp-GB28181-pro
mvn package
```

### 5.4 生成war

```bash
cd wvp-GB28181-pro
mvn package -P war
```

编译如果报错, 一般都是网络问题, 导致的依赖包下载失败  
编译完成后在target目录下出现 `wvp-pro-VERSION.jar` 和 `wvp-pro-VERSION.war` 文件。  
接下来[配置服务](./_content/introduction/config.md)

  








================================================
FILE: doc/_content/introduction/config.md
================================================
<!-- 配置 -->

# 配置

对于首次测试或者新手同学,我建议在局域网测试,并且关闭服务器与客户机的防火墙测试。建议部署在linux进行测试。

```plantuml
@startuml
"WVP-PRO" -> "ZLMediaKit": RESTful 接口
"WVP-PRO" <-- "ZLMediaKit": Web Hook 接口
@enduml
```

WVP-PRO通过调用ZLMediaKit的RESTful接口实现对ZLMediaKit行为的控制; ZLMediaKit通过Web Hook 接口把消息通知WVP-PRO。通过这种方式,实现了两者的互通。
对于最简单的配置,你不需要修改ZLMediaKit的任何默认配置。你只需要在WVP-PRO中配置的ZLMediaKit信息即可

## 1 WVP配置文件位置

基于spring boot的开发方式,配置文件的加载是很灵活的。默认在src/main/resources/application.yml,部分配置项是可选,你不需要全部配置在配置文件中,
完全的配置说明可以参看"src/main/resources/配置详情.yml"。

### 1.1 默认加载配置文件方式

使用maven打包后的target里,已经存在了配置文件,默认加载配置文件为application.yml,查看内容发现其中spring.profiles.active配置的内容,将入配置的值为dev,那么具体加载的配置文件就是application-dev.yml,如果配置的值找不到对应的配置文件,修改值为dev。

```shell
cd wvp-GB28181-pro/target
java -jar wvp-pro-*.jar
```

## 2 配置WVP-PRO

wvp支持多种数据库,包括Mysql,Postgresql,金仓等,配置任选一种即可。

### 2.1 数据库配置

#### 2.1.1 初始化数据库

首先使用创建数据库,然后使用sql/初始化.sql初始化数据库,如果是从旧版升级上来的,使用升级sql更新。

#### 2.1.2 Mysql数据库配置

数据库名称以wvp为例

```yaml
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true
    username: root
    password: root123
```

#### 2.1.3 Postgresql数据库配置

数据库名称以wvp为例

```yaml
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
    username: root
    password: 12345678

pagehelper:
  helper-dialect: postgresql
```

#### 2.1.4 金仓数据库配置

数据库名称以wvp为例

```yaml
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.kingbase8.Driver
    url: jdbc:kingbase8://127.0.0.1:3306/wvp?useUnicode=true&characterEncoding=utf8
    username: root
    password: 12345678
    

pagehelper:
  helper-dialect: postgresql
```

### 2.2 Redis数据库配置

配置wvp中的redis连接信息,建议wvp自己单独使用一个db。

### 2.3 配置服务启动端口(可直接使用默认配置)

```yaml
# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口
server:
  port: 18080
```

### 2.4 配置28181相关信息(可直接使用默认配置)

```yaml
# 作为28181服务器的配置
sip:
  # [可选] 28181服务监听的端口
  port: 5060
  # 根据国标6.1.2中规定,domain宜采用ID统一编码的前十位编码。国标附录D中定义前8位为中心编码(由省级、市级、区级、基层编号组成,参照GB/T 2260-2007)
  # 后两位为行业编码,定义参照附录D.3
  # 3701020049标识山东济南历下区 信息行业接入
  # [可选]
  domain: 3402000000
  # [可选]
  id: 34020000002000000001
  # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
  password: 12345678
```

### 2.5 配置ZLMediaKit连接信息

```yaml
#zlm 默认服务器配置
media:
  id: zlmediakit-local
  # [必须修改] zlm服务器的内网IP
  ip: 172.19.128.50
  # [可选] 有公网IP就配置公网IP, 不可用域名
  wan_ip:
  # [必须修改] zlm服务器的http.port
  http-port: 9092
  # [可选] zlm服务器访问WVP所使用的IP, 默认使用127.0.0.1,zlm和wvp没有部署在同一台服务器时必须配置
  hook-ip: 172.19.128.50
  # [必选选] zlm服务器的hook.admin_params=secret
  secret: TWSYFgYJOQWB4ftgeYut8DW4wbs7pQnj
  # 启用多端口模式, 多端口模式使用端口区分每路流,兼容性更好。 单端口使用流的ssrc区分, 点播超时建议使用多端口测试
  rtp:
    # [可选] 是否启用多端口模式, 开启后会在portRange范围内选择端口用于媒体流传输
    enable: true
    # [可选] 在此范围内选择端口用于媒体流传输, 必须提前在zlm上配置该属性,不然自动配置此属性可能不成功
    port-range: 30000,35000 # 端口范围
    # [可选] 国标级联在此范围内选择端口发送媒体流,
    send-port-range: 40000,40300 # 端口范围
```

### 2.4 策略配置

```yaml
# [根据业务需求配置]
user-settings:
  # 点播/录像回放 等待超时时间,单位:毫秒
  play-timeout: 180000
  # [可选] 自动点播, 使用固定流地址进行播放时,如果未点播则自动进行点播, 需要rtp.enable=true
  auto-apply-play: true
  # 推流直播是否录制
  record-push-live: true
  # 国标是否录制
  record-sip: true
  # 国标点播 按需拉流, true:有人观看拉流,无人观看释放, false:拉起后不自动释放
  stream-on-demand: true
```

更多完整的配置信息参考"src/main/resources/配置详情.yml"文件,需要那个配置项,复制到正在使用的配置文件中对应的文件即可。

如果配置信息无误,你可以启动zlm,再启动wvp来测试了,启动成功的话,你可以在wvp的日志下看到zlm已连接的提示。
接下来[部署到服务器](./_content/introduction/deployment.md), 如果你只是本地运行直接在本地运行即可。


================================================
FILE: doc/_content/introduction/deployment.md
================================================
<!-- 部署 -->

# 部署

**请仔细阅读以下内容**

1. WVP-PRO与ZLM支持分开部署;
2. 需要开放的端口
   | 服务 | 端口 | 类型 | 必选 |
   |-----|:-------------------------|-------------|-------|
   | wvp | server.port | tcp | 是 |
   | wvp | sip.port | udp and tcp | 是 |
   | zlm | http.port | tcp | 是 |
   | zlm | http.sslport | tcp | 否 |
   | zlm | rtmp.port | tcp | 否 |
   | zlm | rtmp.sslport | tcp | 否 |
   | zlm | rtsp.port | udp and tcp | 否 |
   | zlm | rtsp.sslport | udp and tcp | 否 |
   | zlm | rtp_proxy.port | udp and tcp | 单端口开放 |
   | zlm | rtp.port-range(在wvp中配置)  | udp and tcp | 多端口开放 |

3. 测试环境部署建议所有服务部署在一台主机,关闭防火墙,减少因网络出现问题的可能;
4. 生产环境按需开放端口,但是建议修改默认端口,尤其是5060端口,易受到攻击;
5. zlm使用docker部署的情况,请使用host模式,或者端口映射一致,比如映射5060,应将外部端口也映射为5060端口;
6. zlm与wvp会保持高频率的通信,所以不要去将wvp与zlm分属在两个网络,比如wvp在内网,zlm却在公网的情况。
7. 启动服务,以linux为例
   **启动WVP-PRO**

```shell
nohup java -jar wvp-pro-*.jar &
```

**war包:**  
下载Tomcat后将war包放入webapps中,启动Tomcat以解压war包,停止Tomcat后,删除ROOT目录以及war包,将解压后的war包目录重命名为ROOT,将配置文件中的Server.port配置为与Tomcat端口一致
然后启动Tomcat。  
**启动ZLM**

```shell
nohup ./MediaServer -d -m 3 &
```

### 前后端分离部署

前端基于 [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template/blob/master/README-zh.md) 构建, 参考这儿即可。

### 默认账号和密码

部署完毕后,可以通过访问 ip加端口的方式访问 WVP ,WVP的默认登录账号和密码均为 admin。





================================================
FILE: doc/_content/qa/bug.md
================================================
<!-- 反馈bug -->

# 反馈bug

代码是在不断的完善的,不断修改会修复旧的问题也有可能引入新的问题,所以遇到BUG是很正常的一件事。所以遇到问题不要烦燥,咱们就事论事就好了。

## 如何反馈

1. 在知识星球提问。
2. 更新代码,很可能你遇到问题别人已经更早的遇到了,或者是作者自己发现了,已经解决了,所以你可以更新代码再次进行测试;
3. 可以在github提ISSUE,我几乎每天都会去看issue,你的问题我会尽快给予答复;

> 有偿支持可以给我发邮件, 648540858@qq.com

## 社群

[![社群](../../_media/shequ.png "shequ")](https://t.zsxq.com/0d8VAD3Dm)
> 收费是为了提供更好的服务,也是对作者更大的激励。加入星球的用户三天后可以私信我留下微信号,我会拉大家入群。加入三天内不满意可以直接退款,大家不需要有顾虑,来白嫖三天也不是不可以。

================================================
FILE: doc/_content/qa/development.md
================================================
<!-- 参与开发 -->

# 参与到开发中来

非常欢迎有兴趣的小伙伴一起来维护这个项目

## 与开发有关的信息

- 开发语言:后端java + 前端vue;
- jdk版本: 1.8;
- 作者自用开发ide: jetbrains intellij idea;
- nodejs/npm版本:v10.19.0/6.14.4;
- 后端使用Spring boot框架开发;
- 项目大量使用了异步操作;
- 跟代码学流程需要参考28181文档,只看代码你会很懵的;
- 必须学会[抓包](_content/skill/tcpdump.md),这是必须的

## 提交代码

大家可以通过fork项目的方式提交自己的代码,然后提交PR,我来合并到主线。提交代码的过程中我们需要遵循“**阿里编码规约**
”,现有代码也有很多代码没有做到,但是我们在朝这个方向努力。

================================================
FILE: doc/_content/qa/play_error.md
================================================
<!-- 点播错误 -->

# 点播错误

排查点播错误你首先要清楚[点播的基本流程](_content/theory/play.md),一般的流程如下:

```plantuml
@startuml
"WEB用户"  -> "WVP-PRO": 1. 发起点播请求
"设备" <-  "WVP-PRO": 2. Invite(携带SDP消息体)
"设备" --> "WVP-PRO": 3. 200OK(携带SDP消息体)
"设备" <-- "WVP-PRO": 4. Ack
"设备" -> "ZLMediaKit": 5. 发送实时流
"WVP-PRO" <- "ZLMediaKit": 6. 流改变事件
"WEB用户"  <-- "WVP-PRO": 7. 回复流播放地址(携带流地址)
"WVP-PRO" <- "ZLMediaKit": 8. 无人观看事件
"设备" <-  "WVP-PRO": 9 Bye消息
"设备" -->  "WVP-PRO": 10 200OK
@enduml
```

针对几种常见的错误,我们来分析一下,也方便大家对号入座解决常见的问题

## 点播收到错误码

这个错误一般表现为点击"播放"按钮后很快得到一个错误。

1. **400错误码**  
   出现400错误玛时一般是这样的流程是这样的

```plantuml
@startuml
"WEB用户"  -> "WVP-PRO": 1. 发起点播请求
"设备" <-  "WVP-PRO": 2. Invite(携带SDP消息体)
"设备" --> "WVP-PRO": 3. 400错误
@enduml
```

此时通常是设备认为WVP发送了错误的消息给它,它认为消息不全或者错误所以直接返回400错误,此时我们需要[抓包](_content/skill/tcpdump.md)
来分析是否缺失了内容,也可以直接联系对方询问为什么返回了400。
WVP不能保证兼容所有的设备,有些实现不规范的设备可能在对接时就会出现上述问题,你可以联系作者帮忙对接。

2. **500错误码**  
   500或者大于500小于600的错误码一般多是设备内部出了问题,解决方式有两个,第一种直接联系设备/平台客服寻求解决;第二种,如果你有确定可以对接这个设备的平台那么可以把对接这个平台的抓包和对接wvp的抓包同时发送给我,我来尝试解决。

## 点播超时

点播超时的情况大致分为两种:点播超时和收流超时

1. **点播超时**  
   点播超时错误一般为信令的超时,比如长时间为收到对方的回复,可能出现在流程中 “3. 200OK(携带SDP消息体)
   ”这个位置,即我们发送点播消息,但是设备没有回复,可能的原因:

> 1. 设备内部错误,未能回复消息
> 2. 网络原因消息未到到达设备

大部分时候是原因2,所以遇到这个错误我们首先要排查我们我的网路,如果你是公网部署,那么也可能时心跳周期太长,导致的路由NAT失效,WVP的消息无法通道原来的IP端口号发送给设备。

2. **收流超时**  
   收流超时可能发生在流程中的5和6,可能的原因有:

> 1. 设备发送了流但是发送到了错误的ip和端口上,而这个信息是在invite消息的sdp中指定的,就是流程2Invite(携带SDP消息体)
     中,而这个错误很可能来自你的配置错误,比如你设置了127.0.0.1导致设备网127.0.0.1上发流,或者是你WVP在公网,但是你给设备了一个内网ip,导致设备无法把流发送过来;
> 2. 设备内部错误未发送流;
> 2. 设备发送了流,但是流无法识别,可能存在于流不规范和网络很差的情况下;
> 3. 设备发送了流,zlm也收到了,但是zlm无法通过hook通知到wvp,此时原因是你可以检查zlm的配置文件中的hook配置,看看是否无法从zlm连接到wvp;
> 4. 设备发送了流,但是开启SSRC校验,设备的流不够规范采用错误的ssrc,导致zlm选择丢弃;

针对这些可能的错误原因我建议的排查顺序:

- 关闭ssrc校验;
- 查看zlm配置的hook是否可以连接到zlm;
- 查看zlm日志是否有流注册;
- 抓包查看流的信息,看看流是否正常发送,甚至可以导出发送原始流,用vlc播放,看看是否可以播放。


================================================
FILE: doc/_content/qa/regiser_error.md
================================================
<!-- 设备注册不上来的解决办法 -->

# 设备注册不上来的解决办法

一般的原因有两个

1. 信息填写错误,比如密码错误;
2. 网络不通导致注册消息无法发送到WVP;

遇到问题首先仔细校验填写信息,例如海康可能需要勾选鉴权才可以输入密码。网络问题请自行测试。

================================================
FILE: doc/_content/qa/start_error.md
================================================
<!-- 启动时报错 -->

# 启动时报错

启动时的报错大部分时候是因为你的配置有问题,比如mysql没连接上,redis没连接上,18080/15060端口占用了,这些都会导致启动是报错,修改配置配置之后都可以解决;
下面我整理的一些常见的错误,大家可以先对号入座的简单排查下。
> **常见错误**

![_media/img.png](_media/img.png)
**错误原因:** redis配置错误,可能原因: redis未启动/ip错误/端口错误/网络不通
---
![_media/img_1.png](_media/img_1.png)
**错误原因:** redis配置错误,可能原因: 密码错误
---
![_media/img_2.png](_media/img_2.png)
**错误原因:** mysql配置错误,可能原因: mysql未启动/ip错误/端口错误/网络不通
---
![_media/img_3.png](_media/img_3.png)
**错误原因:** mysql配置错误,可能原因: 用户名/密码错误
---
![_media/img_4.png](_media/img_4.png)
**错误原因:** SIP配置错误,可能原因: SIP端口被占用
---
![_media/img_5.png](_media/img_5.png)
**错误原因:** WVP Tomcat端口配置错误,可能原因: server.port端口被占用
---

================================================
FILE: doc/_content/skill/tcpdump.md
================================================
<!-- 抓包 -->

# 抓包

如果说对于网络编程,有什么工具是必会的,我觉得抓包肯定是其中之一了。作为GB/T
28181调试过程中最重要的手段,我觉得如果你真对他有兴趣,或者系统遇到问题可以最快的得到解决,那么抓包你就一定要学会了。

## 抓包工具的选择

### 1. Wireshark

在具备图形界面的系统上,比如windows,linux发行版ubuntu,opensuse等,我一般直接使用Wireshark直接进行抓包,也方便进行内容的查看。

### 2. Tcpdump

在使用命令行的系统,比如linux服务器,我一般使用Tcpdump进行抓包,无需额外安装,系统一般自带,抓包的到的文件,可以使用Wireshark打开,在图形界面下方便查看内容。

## 工具安装

Wireshark的安装很简单,根据提示一步步点击就好了,在linux需要解决权限的问题,如果和我一样使用图形界面的linux发行版的话,可以参看如下步骤;
windows的小伙伴直接略过即可

```shell
# 1. 添加wireshark用户组
sudo groupadd wireshark
# 2. 将dumpcap更改为wireshark用户组
sudo chgrp wireshark /usr/bin/dumpcap
# 3. 让wireshark用户组有root权限使用dumpcap
sudo chmod 4755 /usr/bin/dumpcap
# 4. 将需要使用的用户名加入wireshark用户组
sudo gpasswd -a $USER wireshark
```

tcpdump一般linux都是自带,无需安装,可以这样验证;显示版本信息即是已安装

```shell
tcpdump --version
```

## 开始抓包

### 使用Wireshark

在28181中我一般只关注sip包和rtp包,所以我一般是直接过滤sip和rtp,可以输入框输入 `sip or rtp`这样即可,如果设备来源比较多还可以加上ip和端口号的过滤
`(sip or rtp )and ip.addr==192.168.1.3 and udp.port==5060`
详细的过滤规则可以自行百度,我可以提供一些常用的给大家参考
![img.png](_media/img.png)  
**只过滤SIP:**

```shell
sip
```

**只获取rtp数据:**

```shell
rtp
```

**默认方式:**

```shell
sip or rtp
```

**过滤IP:**

```shell
 sip and ip.addr==192.168.1.3
```

**过滤端口:**

```shell
 sip and udp.port==5060
```

输入命令开启抓包后,此时可以进行操作,比如点播,录像回访等,操作完成回到Wireshark点击红色的停止即可,需要保存文件可以点击
`文件->导出特定分组`导出过滤后的数据,也可以直接`文件->另存为`保存未过滤的数据。

### 使用tcpdump

对于服务器抓包,为了得到足够完整的数据,我一般会要求直接抓取网卡数据而不过滤,如下:
抓取网卡首先需要获取网卡名,在linux我一般使用`ip addr`获取网卡信息,如下所示:
![img_1.png](_media/img_1.png)

```shell
sudo tcpdump -i wlp3s0 -w demo.pcap
```

![img_2.png](_media/img_2.png)  
命令行会停留在这个位置,此时可以进行操作,比如点播,录像回放等,操作完成回到命令行使用`Ctrl+C`
结束命令行,在当前目录下得到demo.pcap,将这个文件下载到图形界面操作系统里,即可使用Wireshark查看了
更多的操作可以参考: [https://www.cnblogs.com/jiujuan/p/9017495.html](https://www.cnblogs.com/jiujuan/p/9017495.html)


================================================
FILE: doc/_content/theory/broadcast_cascade.md
================================================
<!-- 点播流程 -->

# 点播流程

> 以下为WVP-PRO级联语音喊话流程。

```plantuml
@startuml
"上级平台"  -> "下级平台": 1. 发起语音喊话请求
"上级平台" <--  "下级平台": 2. 200OK
"上级平台" <- "下级平台": 3. 回复Result OK
"上级平台" -->  "下级平台": 4. 200OK

"下级平台"  -> "设备": 5. 发起语音喊话请求
"下级平台" <--  "设备": 6. 200OK
"下级平台" <- "设备": 7. 回复Result OK
"下级平台" -->  "设备": 8. 200OK

"下级平台"  <- "设备": 9. invite(broadcast)
"下级平台"  --> "设备": 10. 100 trying
"下级平台"  --> "设备": 11. 200OK SDP
"下级平台"  <-- "设备": 12. ack

"上级平台"  <- "下级平台": 13. invite(broadcast)
"上级平台"  --> "下级平台": 14. 100 trying
"上级平台"  --> "下级平台": 15. 200OK SDP
"上级平台"  <-- "下级平台": 16. ack

"上级平台"  -> "下级平台": 17. 推送RTP
"下级平台"  -> "设备": 18. 推送RTP

@enduml
```

## 注册流程描述如下:

1. 用户从网页或调用接口发起点播请求;
2. WVP-PRO向摄像机发送Invite消息,消息头域中携带 Subject字段,表明点播的视频源ID、发送方媒体流序列号、ZLMediaKit接收流使用的IP、端口号、
   接收端媒体流序列号等参数,SDP消息体中 s字段为“Play”代表实时点播,y字段描述SSRC值,f字段描述媒体参数。
3. 摄像机向WVP-PRO回复200OK,消息体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC字段等内容。
4. WVP-PRO向设备回复Ack, 会话建立成功。
5. 设备向ZLMediaKit发送实时流。
6. ZLMediaKit向WVP-PRO发送流改变事件。
7. WVP-PRO向WEB用户回复播放地址。
8. ZLMediaKit向WVP发送流无人观看事件。
9. WVP-PRO向设备回复Bye, 结束会话。
10. 设备回复200OK,会话结束成功。


================================================
FILE: doc/_content/theory/code.md
================================================
<!-- 统一编码规则 -->

# 统一编码规则

## D.1 编码规则 A

> &emsp;&emsp;编码规则 A 由中心编码(8位)、行业编码(2位)、类型编码(3位)和序号(7位)四个码段共20位十
> 进制数字字符构成,即系统编码 =中心编码 + 行业编码 + 类型编码 + 序号。  
> &emsp;&emsp;编码规则 A 的详细说明见表 D.1。其中,中心编码指用户或设备所归属的监控中心的编码,按照监控中心所在地的行政区划代码确定,
> 当不是基层单位时空余位为0。行政区划代码采用 GB/T2260— 2007规定的行政区划代码表示。行业编码是指用户或设备所归属的行业,行业编码对照表见
> D.3。
> 类型编码指定了设备或用户的具体类型,其中的前端设备包含公安系统和非公安系统的前端设备,终端用
> 户包含公安系统和非公安系统的终端用户。   
![img_7.png](_media/img_7.png)
![img_1.png](_media/img_1.png)
![img_2.png](_media/img_2.png)

## D.2 编码规则 B

> &emsp;&emsp;编码规则 B由中心编码(8位)、行业编码(2位)、序号(4位)和类型编码(2位)四个码段构成,即系
> 统编码 =中心编码 + 行业编码 +序号+类型编码。编码规则 B的详细说明见表 D.2。
![img_3.png](_media/img_3.png)
![img_4.png](_media/img_4.png)

## D.3 行业编码对照表

> &emsp;&emsp;行业编码对照表见表 D.3。  
![img_5.png](_media/img_5.png)
![img_6.png](_media/img_6.png)

================================================
FILE: doc/_content/theory/play.md
================================================
<!-- 点播流程 -->

# 点播流程

> 以下为WVP-PRO点播流程。点播成功前的任何一个环节出现问题都可能出现点播超时,这也是排查点播超时的依据。

```plantuml
@startuml
"WEB用户"  -> "WVP-PRO": 1. 发起点播请求
"设备" <-  "WVP-PRO": 2. Invite(携带SDP消息体)
"设备" --> "WVP-PRO": 3. 200OK(携带SDP消息体)
"设备" <-- "WVP-PRO": 4. Ack
"设备" -> "ZLMediaKit": 5. 发送实时流
"WVP-PRO" <- "ZLMediaKit": 6. 流改变事件
"WEB用户"  <-- "WVP-PRO": 7. 回复流播放地址(携带流地址)
"WVP-PRO" <- "ZLMediaKit": 8. 无人观看事件
"设备" <-  "WVP-PRO": 9 Bye消息
"设备" -->  "WVP-PRO": 10 200OK
@enduml
```

## 注册流程描述如下:

1. 用户从网页或调用接口发起点播请求;
2. WVP-PRO向摄像机发送Invite消息,消息头域中携带 Subject字段,表明点播的视频源ID、发送方媒体流序列号、ZLMediaKit接收流使用的IP、端口号、
   接收端媒体流序列号等参数,SDP消息体中 s字段为“Play”代表实时点播,y字段描述SSRC值,f字段描述媒体参数。
3. 摄像机向WVP-PRO回复200OK,消息体中描述了媒体流发送者发送媒体流的IP、端口、媒体格式、SSRC字段等内容。
4. WVP-PRO向设备回复Ack, 会话建立成功。
5. 设备向ZLMediaKit发送实时流。
6. ZLMediaKit向WVP-PRO发送流改变事件。
7. WVP-PRO向WEB用户回复播放地址。
8. ZLMediaKit向WVP发送流无人观看事件。
9. WVP-PRO向设备回复Bye, 结束会话。
10. 设备回复200OK,会话结束成功。


================================================
FILE: doc/_content/theory/register.md
================================================
<!-- 注册流程 -->

# 注册流程

WVP-PRO目前仅支持国标中描述的基本注册流程,也是最常用的,
> 基本注册即采用IETFRFC3261规定的基于数字摘要的挑战应答式安全技术进行注册.

```plantuml
@startuml
"设备"  -> "WVP-PRO": 1. Register
"设备" <-- "WVP-PRO": 2. 401 Unauthorized
"设备"  -> "WVP-PRO": 3. Register
"设备" <-- "WVP-PRO": 4. 200 OK
@enduml
```

> 注册流程描述如下:
> 1. 摄像机向WVP-PRO服务器发送 Register请求;
> 2. WVP-PRO向摄像机发送响应401,并在响应的消息头 WWW_Authenticate字段中给出适合摄像机的认证体制和参数;
> 3. 摄像机重新向WVP-PRO发送 Register请求,在请求的 Authorization字段给出信任书, 包含认证信息;
> 4. WVP-PRO对请求进行验证,如果检查出 摄像机身份合法,向摄像机发送成功响应 200OK,如果身份不合法则发送拒绝服务应答。


================================================
FILE: doc/_coverpage.md
================================================
<!-- 封面 -->
![logo](_media/logo-mini.png)

# WVP-PRO <small>2.0</small>

> 开箱即用的28181协议视频平台。

- 基于GB/T28181-2016标准信令实现,兼容GB/T28181-2011。
- 自带完整前端页面,开箱即用。
- 完全开源,且使用MIT许可协议。可以在保留版权信息的基础上商用。

[GitHub](https://github.com/648540858/wvp-GB28181-pro)
[Gitee](https://gitee.com/pan648540858/wvp-GB28181-pro)

<!-- 背景色 -->

[//]: # ([comment]: <> &#40;![color]&#40;#f0f0f0&#41;&#41;)


================================================
FILE: doc/_navbar.md
================================================
<!-- 导航栏 -->


================================================
FILE: doc/_sidebar.md
================================================
<!-- 侧边栏 -->

* **编译与部署**
    * [编译](_content/introduction/compile.md)
    * [配置](_content/introduction/config.md)
    * [部署](_content/introduction/deployment.md)
* **功能与使用**
    * [接入设备](_content/ability/device.md)
    * [国标设备](_content/ability/device_use.md)
    * [推流列表](_content/ability/push.md)
    * [拉流代理](_content/ability/proxy.md)
    * [云端录像](_content/ability/cloud_record.md)
    * [节点管理](_content/ability/node_manager.md)
    * [通道管理](_content/ability/channel.md)
    * [国标级联](_content/ability/cascade2.md)
* **流程与原理**
    * [统一编码规则](_content/theory/code.md)
    * [注册流程](_content/theory/register.md)
    * [点播流程](_content/theory/play.md)
    * [级联语音喊话流程](_content/theory/broadcast_cascade.md)
    * [语音对讲](_content/ability/continuous_broadcast.md)
* **必备技巧**
    * [抓包](_content/skill/tcpdump.md)

* **常见问答**
    - [如何反馈BUG](_content/qa/bug.md)
    - [如何参与开发](_content/qa/development.md)
    - [启动报错的解决办法](_content/qa/start_error.md)
    - [设备注册不上来的解决办法](_content/qa/regiser_error.md)
    - [点播超时/报错的解决办法](_content/qa/play_error.md)
* [**免责声明**](_content/disclaimers.md)
* [**关于本文档**](_content/about_doc.md)


================================================
FILE: doc/index.html
================================================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WVP-PRO文档</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="description" content="Description">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
    <link rel="icon" href="_media/favicon.ico" type="image/x-icon"/>
    <link rel="stylesheet" href="./lib/css/vue.css">
    <!--  <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify/lib/themes/dark.css">-->
    <style>
        .cover {
            background: linear-gradient(to left bottom, hsl(82, 100%, 85%) 0%, hsl(199, 100%, 85%) 100%) !important;
        }
    </style>
</head>
<body>
<div id="app">加载中</div>
<script>
    window.$docsify = {
        name: 'WVP-RPO使用文档',
        repo: 'https://github.com/648540858/wvp-GB28181-pro',
        loadSidebar: true, // 开启侧边栏
        loadNavbar: true, // 开启导航栏
        coverpage: true, // 开启封面

        subMaxLevel: 3,
        plantuml: {
            skin: 'default',
        },
        search: {
            maxAge: 86400000, // 过期时间,单位毫秒,默认一天
            paths: 'auto', // or 'auto'
            placeholder: '搜索',
            noData: '找不到结果',
            // 搜索标题的最大层级, 1 - 6
            depth: 4,
            hideOtherSidebarContent: false, // 是否隐藏其他侧边栏内容
        },
        copyCode: {
            buttonText: '复制',
            errorText: '错误',
            successText: '已复制'
        },
        // disqus: 'shortname'
    }
</script>
<!-- Docsify v4 -->
<script src="./lib/js/docsify@4.js"></script>
<script src="./lib/js/docsify-plantuml.min.js"></script>
<script src="./lib/js/search.min.js"></script>
<script src="./lib/js/zoom-image.min.js"></script>
<script src="./lib/js/docsify-copy-code.min.js"></script>

</script>
<!--  <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/disqus.min.js"></script>-->
</body>
</html>


================================================
FILE: doc/lib/css/vue.css
================================================
@import url("https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600");*{-webkit-font-smoothing:antialiased;-webkit-overflow-scrolling:touch;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-text-size-adjust:none;-webkit-touch-callout:none;box-sizing:border-box}body:not(.ready){overflow:hidden}body:not(.ready) .app-nav,body:not(.ready)>nav,body:not(.ready) [data-cloak]{display:none}div#app{font-size:30px;font-weight:lighter;margin:40vh auto;text-align:center}div#app:empty:before{content:"Loading..."}img.emoji{height:1.2em}img.emoji,span.emoji{vertical-align:middle}span.emoji{font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-size:1.2em}.progress{background-color:#42b983;background-color:var(--theme-color,#42b983);height:2px;left:0;position:fixed;right:0;top:0;transition:width .2s,opacity .4s;width:0;z-index:999999}.search .search-keyword,.search a:hover{color:#42b983;color:var(--theme-color,#42b983)}.search .search-keyword{font-style:normal;font-weight:700}body,html{height:100%}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;color:#34495e;font-family:Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:15px;letter-spacing:0;margin:0;overflow-x:hidden}img{max-width:100%}a[disabled]{cursor:not-allowed;opacity:.6}kbd{border:1px solid #ccc;border-radius:3px;display:inline-block;font-size:12px!important;line-height:12px;margin-bottom:3px;padding:3px 5px;vertical-align:middle}li input[type=checkbox]{margin:0 .2em .25em 0;vertical-align:middle}.app-nav{margin:25px 60px 0 0;position:absolute;right:0;text-align:right;z-index:10}.app-nav.no-badge{margin-right:25px}.app-nav p{margin:0}.app-nav>a{margin:0 1rem;padding:5px 0}.app-nav li,.app-nav ul{display:inline-block;list-style:none;margin:0}.app-nav a{color:inherit;font-size:16px;text-decoration:none;transition:color .3s}.app-nav a.active,.app-nav a:hover{color:#42b983;color:var(--theme-color,#42b983)}.app-nav a.active{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983)}.app-nav li{display:inline-block;margin:0 1rem;padding:5px 0;position:relative;cursor:pointer}.app-nav li ul{background-color:#fff;border:1px solid;border-color:#ddd #ddd #ccc;border-radius:4px;box-sizing:border-box;display:none;max-height:calc(100vh - 61px);overflow-y:auto;padding:10px 0;position:absolute;right:-15px;text-align:left;top:100%;white-space:nowrap}.app-nav li ul li{display:block;font-size:14px;line-height:1rem;margin:8px 14px;white-space:nowrap}.app-nav li ul a{display:block;font-size:inherit;margin:0;padding:0}.app-nav li ul a.active{border-bottom:0}.app-nav li:hover ul{display:block}.github-corner{border-bottom:0;position:fixed;right:0;text-decoration:none;top:0;z-index:1}.github-corner:hover .octo-arm{animation:octocat-wave .56s ease-in-out}.github-corner svg{color:#fff;fill:#42b983;fill:var(--theme-color,#42b983);height:80px;width:80px}main{display:block;position:relative;width:100vw;height:100%;z-index:0}main.hidden{display:none}.anchor{display:inline-block;text-decoration:none;transition:all .3s}.anchor span{color:#34495e}.anchor:hover{text-decoration:underline}.sidebar{border-right:1px solid rgba(0,0,0,.07);overflow-y:auto;padding:40px 0 0;position:absolute;top:0;bottom:0;left:0;transition:transform .25s ease-out;width:300px;z-index:20}.sidebar>h1{margin:0 auto 1rem;font-size:1.5rem;font-weight:300;text-align:center}.sidebar>h1 a{color:inherit;text-decoration:none}.sidebar>h1 .app-nav{display:block;position:static}.sidebar .sidebar-nav{line-height:2em;padding-bottom:40px}.sidebar li.collapse .app-sub-sidebar{display:none}.sidebar ul{margin:0 0 0 15px;padding:0}.sidebar li>p{font-weight:700;margin:0}.sidebar ul,.sidebar ul li{list-style:none}.sidebar ul li a{border-bottom:none;display:block}.sidebar ul li ul{padding-left:20px}.sidebar::-webkit-scrollbar{width:4px}.sidebar::-webkit-scrollbar-thumb{background:transparent;border-radius:4px}.sidebar:hover::-webkit-scrollbar-thumb{background:hsla(0,0%,53.3%,.4)}.sidebar:hover::-webkit-scrollbar-track{background:hsla(0,0%,53.3%,.1)}.sidebar-toggle{background-color:transparent;background-color:hsla(0,0%,100%,.8);border:0;outline:none;padding:10px;position:absolute;bottom:0;left:0;text-align:center;transition:opacity .3s;width:284px;z-index:30;cursor:pointer}.sidebar-toggle:hover .sidebar-toggle-button{opacity:.4}.sidebar-toggle span{background-color:#42b983;background-color:var(--theme-color,#42b983);display:block;margin-bottom:4px;width:16px;height:2px}body.sticky .sidebar,body.sticky .sidebar-toggle{position:fixed}.content{padding-top:60px;position:absolute;top:0;right:0;bottom:0;left:300px;transition:left .25s ease}.markdown-section{margin:0 auto;max-width:80%;padding:30px 15px 40px;position:relative}.markdown-section>*{box-sizing:border-box;font-size:inherit}.markdown-section>:first-child{margin-top:0!important}.markdown-section hr{border:none;border-bottom:1px solid #eee;margin:2em 0}.markdown-section iframe{border:1px solid #eee;width:1px;min-width:100%}.markdown-section table{border-collapse:collapse;border-spacing:0;display:block;margin-bottom:1rem;overflow:auto;width:100%}.markdown-section th{font-weight:700}.markdown-section td,.markdown-section th{border:1px solid #ddd;padding:6px 13px}.markdown-section tr{border-top:1px solid #ccc}.markdown-section p.tip,.markdown-section tr:nth-child(2n){background-color:#f8f8f8}.markdown-section p.tip{border-bottom-right-radius:2px;border-left:4px solid #f66;border-top-right-radius:2px;margin:2em 0;padding:12px 24px 12px 30px;position:relative}.markdown-section p.tip:before{background-color:#f66;border-radius:100%;color:#fff;content:"!";font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px;font-weight:700;left:-12px;line-height:20px;position:absolute;height:20px;width:20px;text-align:center;top:14px}.markdown-section p.tip code{background-color:#efefef}.markdown-section p.tip em{color:#34495e}.markdown-section p.warn{background:rgba(66,185,131,.1);border-radius:2px;padding:1rem}.markdown-section ul.task-list>li{list-style-type:none}body.close .sidebar{transform:translateX(-300px)}body.close .sidebar-toggle{width:auto}body.close .content{left:0}@media print{.app-nav,.github-corner,.sidebar,.sidebar-toggle{display:none}}@media screen and (max-width:768px){.github-corner,.sidebar,.sidebar-toggle{position:fixed}.app-nav{margin-top:16px}.app-nav li ul{top:30px}main{height:auto;min-height:100vh;overflow-x:hidden}.sidebar{left:-300px;transition:transform .25s ease-out}.content{left:0;max-width:100vw;position:static;padding-top:20px;transition:transform .25s ease}.app-nav,.github-corner{transition:transform .25s ease-out}.sidebar-toggle{background-color:transparent;width:auto;padding:30px 30px 10px 10px}body.close .sidebar{transform:translateX(300px)}body.close .sidebar-toggle{background-color:hsla(0,0%,100%,.8);transition:background-color 1s;width:284px;padding:10px}body.close .content{transform:translateX(300px)}body.close .app-nav,body.close .github-corner{display:none}.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave .56s ease-in-out}}@keyframes octocat-wave{0%,to{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}section.cover{position:relative;align-items:center;background-position:50%;background-repeat:no-repeat;background-size:cover;min-height:100vh;width:100%;display:none}section.cover.show{display:flex}section.cover.has-mask .mask{background-color:#fff;opacity:.8;position:absolute;top:0;bottom:0;width:100%}section.cover .cover-main{flex:1;margin:0 16px;text-align:center;position:relative}section.cover a{color:inherit}section.cover a,section.cover a:hover{text-decoration:none}section.cover p{line-height:1.5rem;margin:1em 0}section.cover h1{color:inherit;font-size:2.5rem;font-weight:300;margin:.625rem 0 2.5rem;position:relative;text-align:center}section.cover h1 a{display:block}section.cover h1 small{bottom:-.4375rem;font-size:1rem;position:absolute}section.cover blockquote{font-size:1.5rem;text-align:center}section.cover ul{line-height:1.8;list-style-type:none;margin:1em auto;max-width:500px;padding:0}section.cover .cover-main>p:last-child a{border-radius:2rem;border:1px solid #42b983;border-color:var(--theme-color,#42b983);box-sizing:border-box;color:#42b983;color:var(--theme-color,#42b983);display:inline-block;font-size:1.05rem;letter-spacing:.1rem;margin:.5rem 1rem;padding:.75em 2rem;text-decoration:none;transition:all .15s ease}section.cover .cover-main>p:last-child a:last-child{background-color:#42b983;background-color:var(--theme-color,#42b983);color:#fff}section.cover .cover-main>p:last-child a:last-child:hover{color:inherit;opacity:.8}section.cover .cover-main>p:last-child a:hover{color:inherit}section.cover blockquote>p>a{border-bottom:2px solid #42b983;border-bottom:2px solid var(--theme-color,#42b983);transition:color .3s}section.cover blockquote>p>a:hover{color:#42b983;color:var(--theme-color,#42b983)}.sidebar,body{background-color:#fff}.sidebar{color:#364149}.sidebar li{margin:6px 0}.sidebar ul li a{color:#505d6b;font-size:14px;font-weight:400;overflow:hidden;text-decoration:none;text-overflow:ellipsis;white-space:nowrap}.sidebar ul li a:hover{text-decoration:underline}.sidebar ul li ul{padding:0}.sidebar ul li.active>a{border-right:2px solid;color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.app-sub-sidebar li:before{content:"-";padding-right:4px;float:left}.markdown-section h1,.markdown-section h2,.markdown-section h3,.markdown-section h4,.markdown-section strong{color:#2c3e50;font-weight:600}.markdown-section a{color:#42b983;color:var(--theme-color,#42b983);font-weight:600}.markdown-section h1{font-size:2rem;margin:0 0 1rem}.markdown-section h2{font-size:1.75rem;margin:45px 0 .8rem}.markdown-section h3{font-size:1.5rem;margin:40px 0 .6rem}.markdown-section h4{font-size:1.25rem}.markdown-section h5{font-size:1rem}.markdown-section h6{color:#777;font-size:1rem}.markdown-section figure,.markdown-section p{margin:1.2em 0}.markdown-section ol,.markdown-section p,.markdown-section ul{line-height:1.6rem;word-spacing:.05rem}.markdown-section ol,.markdown-section ul{padding-left:1.5rem}.markdown-section blockquote{border-left:4px solid #42b983;border-left:4px solid var(--theme-color,#42b983);color:#858585;margin:2em 0;padding-left:20px}.markdown-section blockquote p{font-weight:600;margin-left:0}.markdown-section iframe{margin:1em 0}.markdown-section em{color:#7f8c8d}.markdown-section code,.markdown-section output:after,.markdown-section pre{font-family:Roboto Mono,Monaco,courier,monospace}.markdown-section code,.markdown-section pre{background-color:#f8f8f8}.markdown-section output,.markdown-section pre{margin:1.2em 0;position:relative}.markdown-section output,.markdown-section pre>code{border-radius:2px;display:block}.markdown-section output:after,.markdown-section pre>code{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial}.markdown-section code{border-radius:2px;color:#e96900;margin:0 2px;padding:3px 5px;white-space:pre-wrap}.markdown-section>:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) code{font-size:.8rem}.markdown-section pre{padding:0 1.4rem;line-height:1.5rem;overflow:auto;word-wrap:normal}.markdown-section pre>code{color:#525252;font-size:.8rem;padding:2.2em 5px;line-height:inherit;margin:0 2px;max-width:inherit;overflow:inherit;white-space:inherit}.markdown-section output{padding:1.7rem 1.4rem;border:1px dotted #ccc}.markdown-section output>:first-child{margin-top:0}.markdown-section output>:last-child{margin-bottom:0}.markdown-section code:after,.markdown-section code:before,.markdown-section output:after,.markdown-section output:before{letter-spacing:.05rem}.markdown-section output:after,.markdown-section pre:after{color:#ccc;font-size:.6rem;font-weight:600;height:15px;line-height:15px;padding:5px 10px 0;position:absolute;right:0;text-align:right;top:0;content:attr(data-lang)}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8e908c}.token.namespace{opacity:.7}.token.boolean,.token.number{color:#c76b29}.token.punctuation{color:#525252}.token.property{color:#c08b30}.token.tag{color:#2973b7}.token.string{color:#42b983;color:var(--theme-color,#42b983)}.token.selector{color:#6679cc}.token.attr-name{color:#2973b7}.language-css .token.string,.style .token.string,.token.entity,.token.url{color:#22a2c9}.token.attr-value,.token.control,.token.directive,.token.unit{color:#42b983;color:var(--theme-color,#42b983)}.token.function,.token.keyword{color:#e96900}.token.atrule,.token.regex,.token.statement{color:#22a2c9}.token.placeholder,.token.variable{color:#3d8fd1}.token.deleted{text-decoration:line-through}.token.inserted{border-bottom:1px dotted #202746;text-decoration:none}.token.italic{font-style:italic}.token.bold,.token.important{font-weight:700}.token.important{color:#c94922}.token.entity{cursor:help}code .token{-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;min-height:1.5rem;position:relative;left:auto}

================================================
FILE: doc/lib/js/docsify@4.js
================================================
!function(){function c(i){var o=Object.create(null);return function(e){var n=f(e)?e:JSON.stringify(e);return o[n]||(o[n]=i(e))}}var a=c(function(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}),u=Object.prototype.hasOwnProperty,m=Object.assign||function(e){for(var n=arguments,i=1;i<arguments.length;i++){var o,t=Object(n[i]);for(o in t)u.call(t,o)&&(e[o]=t[o])}return e};function f(e){return"string"==typeof e||"number"==typeof e}function d(){}function o(e){return"function"==typeof e}function g(e){e=e.match(/^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^#]*)?(#.*)?/);return"string"==typeof e[1]&&0<e[1].length&&e[1].toLowerCase()!==location.protocol||"string"==typeof e[2]&&0<e[2].length&&e[2].replace(new RegExp(":("+{"http:":80,"https:":443}[location.protocol]+")?$"),"")!==location.host}var s=document.body.clientWidth<=600,t=window.history&&window.history.pushState&&window.history.replaceState&&!navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]\D|WebApps\/.+CFNetwork)/),i={};function l(e,n){if(void 0===n&&(n=!1),"string"==typeof e){if(void 0!==window.Vue)return b(e);e=n?b(e):i[e]||(i[e]=b(e))}return e}var v=document,h=v.body,_=v.head;function b(e,n){return n?e.querySelector(n):v.querySelector(e)}function k(e,n){return[].slice.call(n?e.querySelectorAll(n):v.querySelectorAll(e))}function w(e,n){return e=v.createElement(e),n&&(e.innerHTML=n),e}function r(e,n){return e.appendChild(n)}function y(e,n){return e.insertBefore(n,e.children[0])}function p(e,n,i){o(n)?window.addEventListener(e,n):e.addEventListener(n,i)}function x(e,n,i){o(n)?window.removeEventListener(e,n):e.removeEventListener(n,i)}function S(e,n,i){e&&e.classList[i?n:"toggle"](i||n)}function e(e,n){var i=(n=void 0===n?document:n).readyState;if("complete"===i||"interactive"===i)return setTimeout(e,0);n.addEventListener("DOMContentLoaded",e)}var n=Object.freeze({__proto__:null,getNode:l,$:v,body:h,head:_,find:b,findAll:k,create:w,appendTo:r,before:y,on:p,off:x,toggleClass:S,style:function(e){r(_,w("style",e))},documentReady:e});function A(e,n){return-1!==e.indexOf(n,e.length-n.length)}var $=decodeURIComponent,z=encodeURIComponent;function F(e){var n={};return(e=e.trim().replace(/^(\?|#|&)/,""))&&e.split("&").forEach(function(e){e=e.replace(/\+/g," ").split("=");n[e[0]]=e[1]&&$(e[1])}),n}function E(e,n){void 0===n&&(n=[]);var i,o=[];for(i in e)-1<n.indexOf(i)||o.push(e[i]?(z(i)+"="+z(e[i])).toLowerCase():z(i));return o.length?"?"+o.join("&"):""}var T=c(function(e){return/(:|(\/{2}))/g.test(e)}),C=c(function(e){return e.split(/[?#]/)[0]}),R=c(function(e){if(/\/$/g.test(e))return e;e=e.match(/(\S*\/)[^/]+$/);return e?e[1]:""}),j=c(function(e){return e.replace(/^\/+/,"/").replace(/([^:])\/{2,}/g,"$1/")}),O=c(function(e){for(var n=e.replace(/^\//,"").split("/"),i=[],o=0,t=n.length;o<t;o++){var a=n[o];".."===a?i.pop():"."!==a&&i.push(a)}return"/"+i.join("/")});function L(e){return e.split("/").filter(function(e){return-1===e.indexOf("#")}).join("/")}function q(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return j(e.map(L).join("/"))}var P=c(function(e){return e.replace("#","?id=")}),M={};function I(e){this.config=e}function N(e){var n=location.href.indexOf("#");location.replace(location.href.slice(0,0<=n?n:0)+"#"+e)}I.prototype.getBasePath=function(){return this.config.basePath},I.prototype.getFile=function(e,n){void 0===e&&(e=this.getCurrentPath());var i,o,t=this.config,a=this.getBasePath(),r="string"==typeof t.ext?t.ext:".md";return e=t.alias?function e(n,i,o){var t=Object.keys(i).filter(function(e){return(M[e]||(M[e]=new RegExp("^"+e+"$"))).test(n)&&n!==o})[0];return t?e(n.replace(M[t],i[t]),i,n):n}(e,t.alias):e,i=e,o=r,e=(e=new RegExp("\\.("+o.replace(/^\./,"")+"|html)$","g").test(i)?i:/\/$/g.test(i)?i+"README"+o:""+i+o)==="/README"+r&&t.homepage||e,e=T(e)?e:q(a,e),e=n?e.replace(new RegExp("^"+a),""):e},I.prototype.onchange=function(e){(e=void 0===e?d:e)()},I.prototype.getCurrentPath=function(){},I.prototype.normalize=function(){},I.prototype.parse=function(){},I.prototype.toURL=function(e,n,i){var o=i&&"#"===e[0],t=this.parse(P(e));if(t.query=m({},t.query,n),e=(e=t.path+E(t.query)).replace(/\.md(\?)|\.md$/,"$1"),o&&(e=(0<(o=i.indexOf("?"))?i.substring(0,o):i)+e),this.config.relativePath&&0!==e.indexOf("/")){i=i.substring(0,i.lastIndexOf("/")+1);return j(O(i+e))}return j("/"+e)};var H=function(o){function e(e){o.call(this,e),this.mode="hash"}return o&&(e.__proto__=o),((e.prototype=Object.create(o&&o.prototype)).constructor=e).prototype.getBasePath=function(){var e=window.location.pathname||"",n=this.config.basePath,e=A(e,".html")?e+"#/"+n:e+"/"+n;return/^(\/|https?:)/g.test(n)?n:j(e)},e.prototype.getCurrentPath=function(){var e=location.href,n=e.indexOf("#");return-1===n?"":e.slice(n+1)},e.prototype.onchange=function(i){void 0===i&&(i=d);var o=!1;p("click",function(e){e="A"===e.target.tagName?e.target:e.target.parentNode;e&&"A"===e.tagName&&!/_blank/.test(e.target)&&(o=!0)}),p("hashchange",function(e){var n=o?"navigate":"history";o=!1,i({event:e,source:n})})},e.prototype.normalize=function(){var e=this.getCurrentPath();if("/"===(e=P(e)).charAt(0))return N(e);N("/"+e)},e.prototype.parse=function(e){var n="",i=(e=void 0===e?location.href:e).indexOf("#"),i=(e=0<=i?e.slice(i+1):e).indexOf("?");return 0<=i&&(n=e.slice(i+1),e=e.slice(0,i)),{path:e,file:this.getFile(e,!0),query:F(n)}},e.prototype.toURL=function(e,n,i){return"#"+o.prototype.toURL.call(this,e,n,i)},e}(I),D=function(n){function e(e){n.call(this,e),this.mode="history"}return n&&(e.__proto__=n),((e.prototype=Object.create(n&&n.prototype)).constructor=e).prototype.getCurrentPath=function(){var e=this.getBasePath(),n=window.location.pathname;return((n=e&&0===n.indexOf(e)?n.slice(e.length):n)||"/")+window.location.search+window.location.hash},e.prototype.onchange=function(i){var o=this;void 0===i&&(i=d),p("click",function(e){var n="A"===e.target.tagName?e.target:e.target.parentNode;n&&"A"===n.tagName&&!/_blank/.test(n.target)&&(e.preventDefault(),n=n.href,-1!==o.config.crossOriginLinks.indexOf(n)?window.open(n,"_self"):window.history.pushState({key:n},"",n),i({event:e,source:"navigate"}))}),p("popstate",function(e){i({event:e,source:"history"})})},e.prototype.parse=function(e){var n="",i=(e=void 0===e?location.href:e).indexOf("?");0<=i&&(n=e.slice(i+1),e=e.slice(0,i));var o=q(location.origin),i=e.indexOf(o);return{path:e=-1<i?e.slice(i+o.length):e,file:this.getFile(e),query:F(n)}},e}(I),U={};var Z,B,V=/([^{]*?)\w(?=\})/g,Y={YYYY:"getFullYear",YY:"getYear",MM:function(e){return e.getMonth()+1},DD:"getDate",HH:"getHours",mm:"getMinutes",ss:"getSeconds",fff:"getMilliseconds"};function G(e){var n,i=e.loaded,o=e.total,t=e.step;Z||((e=w("div")).classList.add("progress"),r(h,e),Z=e),n=t?80<(n=parseInt(Z.style.width||0,10)+t)?80:n:Math.floor(i/o*100),Z.style.opacity=1,Z.style.width=95<=n?"100%":n+"%",95<=n&&(clearTimeout(B),B=setTimeout(function(e){Z.style.opacity=0,Z.style.width="0%"},200))}var W={};function X(t,e,n){void 0===e&&(e=!1),void 0===n&&(n={});function a(){r.addEventListener.apply(r,arguments)}var i,r=new XMLHttpRequest,o=W[t];if(o)return{then:function(e){return e(o.content,o.opt)},abort:d};for(i in r.open("GET",t),n)u.call(n,i)&&r.setRequestHeader(i,n[i]);return r.send(),{then:function(n,i){var o;void 0===i&&(i=d),e&&(o=setInterval(function(e){return G({step:Math.floor(5*Math.random()+1)})},500),a("progress",G),a("loadend",function(e){G(e),clearInterval(o)})),a("error",i),a("load",function(e){var e=e.target;400<=e.status?i(e):(e=W[t]={content:e.response,opt:{updatedAt:r.getResponseHeader("last-modified")}},n(e.content,e.opt))})},abort:function(e){return 4!==r.readyState&&r.abort()}}}function Q(e,n){e.innerHTML=e.innerHTML.replace(/var\(\s*--theme-color.*?\)/g,n)}var J=v.title;function K(){var e,n=l("section.cover");n&&(e=n.getBoundingClientRect().height,window.pageYOffset>=e||n.classList.contains("hidden")?S(h,"add","sticky"):S(h,"remove","sticky"))}function ee(e,n,o,i){var t=[];null!=(n=l(n))&&(t=k(n,"a"));var a,r=decodeURI(e.toURL(e.getCurrentPath()));return t.sort(function(e,n){return n.href.length-e.href.length}).forEach(function(e){var n=decodeURI(e.getAttribute("href")),i=o?e.parentNode:e;e.title=e.title||e.innerText,0!==r.indexOf(n)||a?S(i,"remove","active"):(a=e,S(i,"add","active"))}),i&&(v.title=a?a.title||a.innerText+" - "+J:J),a}function ne(e,n){for(var i=0;i<n.length;i++){var o=n[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}var ie=(function(e,n,i){return n&&ne(e.prototype,n),i&&ne(e,i),e}(oe,[{key:"getIntermediateValue",value:function(e){return this.decimal?e:Math.round(e)}},{key:"getFinalValue",value:function(){return this.end}}]),oe);function oe(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,oe),this.start=e.start,this.end=e.end,this.decimal=e.decimal}function te(e,n){for(var i=0;i<n.length;i++){var o=n[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}}var ae=(function(e,n,i){return n&&te(e.prototype,n),i&&te(e,i),e}(re,[{key:"begin",value:function(){return this.isRunning||this.next===this.end||(this.frame=window.requestAnimationFrame(this._tick.bind(this))),this}},{key:"stop",value:function(){return window.cancelAnimationFrame(this.frame),this.isRunning=!1,this.frame=null,this.timeStart=null,this.next=null,this}},{key:"on",value:function(e,n){return this.events[e]=this.events[e]||[],this.events[e].push(n),this}},{key:"_emit",value:function(e,n){var i=this,e=this.events[e];e&&e.forEach(function(e){return e.call(i,n)})}},{key:"_tick",value:function(e){this.isRunning=!0;var n=this.next||this.start;this.timeStart||(this.timeStart=e),this.timeElapsed=e-this.timeStart,this.next=this.ease(this.timeElapsed,this.start,this.end-this.start,this.duration),this._shouldTick(n)?(this._emit("tick",this.tweener.getIntermediateValue(this.next)),this.frame=window.requestAnimationFrame(this._tick.bind(this))):(this._emit("tick",this.tweener.getFinalValue()),this._emit("done",null))}},{key:"_shouldTick",value:function(e){return{up:this.next<this.end&&e<=this.next,down:this.next>this.end&&e>=this.next}[this.direction]}},{key:"_defaultEase",value:function(e,n,i,o){return(e/=o/2)<1?i/2*e*e+n:-i/2*(--e*(e-2)-1)+n}}]),re);function re(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};!function(e,n){if(!(e instanceof n))throw new TypeError("Cannot call a class as a function")}(this,re),this.duration=e.duration||1e3,this.ease=e.easing||this._defaultEase,this.tweener=e.tweener||new ie(e),this.start=this.tweener.start,this.end=this.tweener.end,this.frame=null,this.next=null,this.isRunning=!1,this.events={},this.direction=this.start<this.end?"up":"down"}var ce=document.currentScript;function ue(e){var n,i=m({auto2top:!1,autoHeader:!1,basePath:"",catchPluginErrors:!0,cornerExternalLinkTarget:"_blank",coverpage:"",crossOriginLinks:[],el:"#app",executeScript:null,ext:".md",externalLinkRel:"noopener",externalLinkTarget:"_blank",formatUpdated:"",ga:"",homepage:"README.md",loadNavbar:null,loadSidebar:null,maxLevel:6,mergeNavbar:!1,name:"",nameLink:window.location.pathname,nativeEmoji:!1,noCompileLinks:[],noEmoji:!1,notFoundPage:!0,relativePath:!1,repo:"",routes:{},routerMode:"hash",subMaxLevel:0,themeColor:"",topMargin:0},"function"==typeof window.$docsify?window.$docsify(e):window.$docsify),o=ce||[].slice.call(document.getElementsByTagName("script")).filter(function(e){return/docsify\./.test(e.src)})[0];if(o)for(var t in i)!u.call(i,t)||f(n=o.getAttribute("data-"+a(t)))&&(i[t]=""===n||n);return!0===i.loadSidebar&&(i.loadSidebar="_sidebar"+i.ext),!0===i.loadNavbar&&(i.loadNavbar="_navbar"+i.ext),!0===i.coverpage&&(i.coverpage="_coverpage"+i.ext),!0===i.repo&&(i.repo=""),!0===i.name&&(i.name=""),window.$docsify=i}var fe={},pe=!1,de=null,ge=!0,se=0;function le(e){if(ge){for(var n,i=l(".sidebar"),o=k(".anchor"),t=b(i,".sidebar-nav"),a=b(i,"li.active"),r=document.documentElement,c=(r&&r.scrollTop||document.body.scrollTop)-se,u=0,f=o.length;u<f;u+=1){var p=o[u];if(p.offsetTop>c){n=n||p;break}n=p}!n||(r=fe[ve(e,n.getAttribute("data-id"))])&&r!==a&&(a&&a.classList.remove("active"),r.classList.add("active"),a=r,!pe&&h.classList.contains("sticky")&&(e=i.clientHeight,r=a.offsetTop+a.clientHeight+40,a=a.offsetTop>=t.scrollTop&&r<=t.scrollTop+e,i.scrollTop=a?t.scrollTop:+r<e?0:r-e))}}function ve(e,n){return decodeURIComponent(e)+"?id="+decodeURIComponent(n)}function he(e,n){var i,o;n&&(o=ue().topMargin,(i=b("#"+n))&&(i=i,void 0===(o=o)&&(o=0),de&&de.stop(),ge=!1,de=new ae({start:window.pageYOffset,end:Math.round(i.getBoundingClientRect().top)+window.pageYOffset-o,duration:500}).on("tick",function(e){return window.scrollTo(0,e)}).on("done",function(){ge=!0,de=null}).begin()),e=fe[ve(e,n)],(n=b(l(".sidebar"),"li.active"))&&n.classList.remove("active"),e&&e.classList.add("active"))}var _e=v.scrollingElement||v.documentElement;var me="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function be(e,n){return e(n={exports:{}},n.exports),n.exports}function ke(e){return $e[e]}var we=be(function(n){function e(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}n.exports={defaults:e(),getDefaults:e,changeDefaults:function(e){n.exports.defaults=e}}}),ye=(we.defaults,we.getDefaults,we.changeDefaults,/[&<>"']/),xe=/[&<>"']/g,Se=/[<>"']|&(?!#?\w+;)/,Ae=/[<>"']|&(?!#?\w+;)/g,$e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};var ze=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi;function Fe(e){return e.replace(ze,function(e,n){return"colon"===(n=n.toLowerCase())?":":"#"===n.charAt(0)?"x"===n.charAt(1)?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1)):""})}var Ee=/(^|[^\[])\^/g;var Te=/[^\w:]/g,Ce=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;var Re={},je=/^[^:]+:\/*[^/]*$/,Oe=/^([^:]+:)[\s\S]*$/,Le=/^([^:]+:\/*[^/]*)[\s\S]*$/;function qe(e,n){Re[" "+e]||(je.test(e)?Re[" "+e]=e+"/":Re[" "+e]=Pe(e,"/",!0));var i=-1===(e=Re[" "+e]).indexOf(":");return"//"===n.substring(0,2)?i?n:e.replace(Oe,"$1")+n:"/"===n.charAt(0)?i?n:e.replace(Le,"$1")+n:e+n}function Pe(e,n,i){var o=e.length;if(0===o)return"";for(var t=0;t<o;){var a=e.charAt(o-t-1);if(a!==n||i){if(a===n||!i)break;t++}else t++}return e.substr(0,o-t)}var Me=function(e,n){if(n){if(ye.test(e))return e.replace(xe,ke)}else if(Se.test(e))return e.replace(Ae,ke);return e},Ie=Fe,Ne=function(i,e){i=i.source||i,e=e||"";var o={replace:function(e,n){return n=(n=n.source||n).replace(Ee,"$1"),i=i.replace(e,n),o},getRegex:function(){return new RegExp(i,e)}};return o},He=function(e,n,i){if(e){var o;try{o=decodeURIComponent(Fe(i)).replace(Te,"").toLowerCase()}catch(e){return null}if(0===o.indexOf("javascript:")||0===o.indexOf("vbscript:")||0===o.indexOf("data:"))return null}n&&!Ce.test(i)&&(i=qe(n,i));try{i=encodeURI(i).replace(/%25/g,"%")}catch(e){return null}return i},De={exec:function(){}},Ue=function(e){for(var n,i,o=arguments,t=1;t<arguments.length;t++)for(i in n=o[t])Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i]);return e},Ze=function(e,n){var i=e.replace(/\|/g,function(e,n,i){for(var o=!1,t=n;0<=--t&&"\\"===i[t];)o=!o;return o?"|":" |"}).split(/ \|/),o=0;if(i.length>n)i.splice(n);else for(;i.length<n;)i.push("");for(;o<i.length;o++)i[o]=i[o].trim().replace(/\\\|/g,"|");return i},Be=Pe,Ve=function(e,n){if(-1===e.indexOf(n[1]))return-1;for(var i=e.length,o=0,t=0;t<i;t++)if("\\"===e[t])t++;else if(e[t]===n[0])o++;else if(e[t]===n[1]&&--o<0)return t;return-1},Ye=function(e){e&&e.sanitize&&!e.silent&&console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options")},Ge=function(e,n){if(n<1)return"";for(var i="";1<n;)1&n&&(i+=e),n>>=1,e+=e;return i+e},We=we.defaults,Xe=Be,Qe=Ze,Je=Me,Ke=Ve;function en(e,n,i){var o=n.href,t=n.title?Je(n.title):null,n=e[1].replace(/\\([\[\]])/g,"$1");return"!"!==e[0].charAt(0)?{type:"link",raw:i,href:o,title:t,text:n}:{type:"image",raw:i,href:o,title:t,text:Je(n)}}var nn=function(){function e(e){this.options=e||We}return e.prototype.space=function(e){e=this.rules.block.newline.exec(e);if(e)return 1<e[0].length?{type:"space",raw:e[0]}:{raw:"\n"}},e.prototype.code=function(e,n){e=this.rules.block.code.exec(e);if(e){n=n[n.length-1];if(n&&"paragraph"===n.type)return{raw:e[0],text:e[0].trimRight()};n=e[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Xe(n,"\n")}}},e.prototype.fences=function(e){var n=this.rules.block.fences.exec(e);if(n){var i=n[0],e=function(e,n){if(null===(e=e.match(/^(\s+)(?:```)/)))return n;var i=e[1];return n.split("\n").map(function(e){var n=e.match(/^\s+/);return null!==n&&n[0].length>=i.length?e.slice(i.length):e}).join("\n")}(i,n[3]||"");return{type:"code",raw:i,lang:n[2]&&n[2].trim(),text:e}}},e.prototype.heading=function(e){var n=this.rules.block.heading.exec(e);if(n){var i=n[2].trim();return/#$/.test(i)&&(e=Xe(i,"#"),!this.options.pedantic&&e&&!/ $/.test(e)||(i=e.trim())),{type:"heading",raw:n[0],depth:n[1].length,text:i}}},e.prototype.nptable=function(e){e=this.rules.block.nptable.exec(e);if(e){var n={type:"table",header:Qe(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[],raw:e[0]};if(n.header.length===n.align.length){for(var i=n.align.length,o=0;o<i;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(i=n.cells.length,o=0;o<i;o++)n.cells[o]=Qe(n.cells[o],n.header.length);return n}}},e.prototype.hr=function(e){e=this.rules.block.hr.exec(e);if(e)return{type:"hr",raw:e[0]}},e.prototype.blockquote=function(e){var n=this.rules.block.blockquote.exec(e);if(n){e=n[0].replace(/^ *> ?/gm,"");return{type:"blockquote",raw:n[0],text:e}}},e.prototype.list=function(e){e=this.rules.block.list.exec(e);if(e){for(var n,i,o,t,a,r=e[0],c=e[2],u=1<c.length,f={type:"list",raw:r,ordered:u,start:u?+c.slice(0,-1):"",loose:!1,items:[]},p=e[0].match(this.rules.block.item),d=!1,g=p.length,s=this.rules.block.listItemStart.exec(p[0]),l=0;l<g;l++){if(r=n=p[l],l!==g-1){if(o=this.rules.block.listItemStart.exec(p[l+1]),this.options.pedantic?o[1].length>s[1].length:o[1].length>s[0].length||3<o[1].length){p.splice(l,2,p[l]+"\n"+p[l+1]),l--,g--;continue}(!this.options.pedantic||this.options.smartLists?o[2][o[2].length-1]!==c[c.length-1]:u==(1===o[2].length))&&(i=p.slice(l+1).join("\n"),f.raw=f.raw.substring(0,f.raw.length-i.length),l=g-1),s=o}o=n.length,~(n=n.replace(/^ *([*+-]|\d+[.)]) ?/,"")).indexOf("\n ")&&(o-=n.length,n=this.options.pedantic?n.replace(/^ {1,4}/gm,""):n.replace(new RegExp("^ {1,"+o+"}","gm"),"")),o=d||/\n\n(?!\s*$)/.test(n),l!==g-1&&(d="\n"===n.charAt(n.length-1),o=o||d),o&&(f.loose=!0),this.options.gfm&&(a=void 0,(t=/^\[[ xX]\] /.test(n))&&(a=" "!==n[1],n=n.replace(/^\[[ xX]\] +/,""))),f.items.push({type:"list_item",raw:r,task:t,checked:a,loose:o,text:n})}return f}},e.prototype.html=function(e){e=this.rules.block.html.exec(e);if(e)return{type:this.options.sanitize?"paragraph":"html",raw:e[0],pre:!this.options.sanitizer&&("pre"===e[1]||"script"===e[1]||"style"===e[1]),text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]}},e.prototype.def=function(e){e=this.rules.block.def.exec(e);if(e)return e[3]&&(e[3]=e[3].substring(1,e[3].length-1)),{tag:e[1].toLowerCase().replace(/\s+/g," "),raw:e[0],href:e[2],title:e[3]}},e.prototype.table=function(e){e=this.rules.block.table.exec(e);if(e){var n={type:"table",header:Qe(e[1].replace(/^ *| *\| *$/g,"")),align:e[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:e[3]?e[3].replace(/\n$/,"").split("\n"):[]};if(n.header.length===n.align.length){n.raw=e[0];for(var i=n.align.length,o=0;o<i;o++)/^ *-+: *$/.test(n.align[o])?n.align[o]="right":/^ *:-+: *$/.test(n.align[o])?n.align[o]="center":/^ *:-+ *$/.test(n.align[o])?n.align[o]="left":n.align[o]=null;for(i=n.cells.length,o=0;o<i;o++)n.cells[o]=Qe(n.cells[o].replace(/^ *\| *| *\| *$/g,""),n.header.length);return n}}},e.prototype.lheading=function(e){e=this.rules.block.lheading.exec(e);if(e)return{type:"heading",raw:e[0],depth:"="===e[2].charAt(0)?1:2,text:e[1]}},e.prototype.paragraph=function(e){e=this.rules.block.paragraph.exec(e);if(e)return{type:"paragraph",raw:e[0],text:"\n"===e[1].charAt(e[1].length-1)?e[1].slice(0,-1):e[1]}},e.prototype.text=function(e,n){e=this.rules.block.text.exec(e);if(e){n=n[n.length-1];return n&&"text"===n.type?{raw:e[0],text:e[0]}:{type:"text",raw:e[0],text:e[0]}}},e.prototype.escape=function(e){e=this.rules.inline.escape.exec(e);if(e)return{type:"escape",raw:e[0],text:Je(e[1])}},e.prototype.tag=function(e,n,i){e=this.rules.inline.tag.exec(e);if(e)return!n&&/^<a /i.test(e[0])?n=!0:n&&/^<\/a>/i.test(e[0])&&(n=!1),!i&&/^<(pre|code|kbd|script)(\s|>)/i.test(e[0])?i=!0:i&&/^<\/(pre|code|kbd|script)(\s|>)/i.test(e[0])&&(i=!1),{type:this.options.sanitize?"text":"html",raw:e[0],inLink:n,inRawBlock:i,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]}},e.prototype.link=function(e){var n=this.rules.inline.link.exec(e);if(n){e=n[2].trim();if(!this.options.pedantic&&/^</.test(e)){if(!/>$/.test(e))return;var i=Xe(e.slice(0,-1),"\\");if((e.length-i.length)%2==0)return}else{var o=Ke(n[2],"()");-1<o&&(t=(0===n[0].indexOf("!")?5:4)+n[1].length+o,n[2]=n[2].substring(0,o),n[0]=n[0].substring(0,t).trim(),n[3]="")}var t,i=n[2],o="";return this.options.pedantic?(t=/^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(i))&&(i=t[1],o=t[3]):o=n[3]?n[3].slice(1,-1):"",i=i.trim(),en(n,{href:(i=/^</.test(i)?this.options.pedantic&&!/>$/.test(e)?i.slice(1):i.slice(1,-1):i)&&i.replace(this.rules.inline._escapes,"$1"),title:o&&o.replace(this.rules.inline._escapes,"$1")},n[0])}},e.prototype.reflink=function(e,n){if((i=this.rules.inline.reflink.exec(e))||(i=this.rules.inline.nolink.exec(e))){var e=(i[2]||i[1]).replace(/\s+/g," ");if((e=n[e.toLowerCase()])&&e.href)return en(i,e,i[0]);var i=i[0].charAt(0);return{type:"text",raw:i,text:i}}},e.prototype.strong=function(e,n,i){void 0===i&&(i="");var o=this.rules.inline.strong.start.exec(e);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){n=n.slice(-1*e.length);var t,a="**"===o[0]?this.rules.inline.strong.endAst:this.rules.inline.strong.endUnd;for(a.lastIndex=0;null!=(o=a.exec(n));)if(t=this.rules.inline.strong.middle.exec(n.slice(0,o.index+3)))return{type:"strong",raw:e.slice(0,t[0].length),text:e.slice(2,t[0].length-2)}}},e.prototype.em=function(e,n,i){void 0===i&&(i="");var o=this.rules.inline.em.start.exec(e);if(o&&(!o[1]||o[1]&&(""===i||this.rules.inline.punctuation.exec(i)))){n=n.slice(-1*e.length);var t,a="*"===o[0]?this.rules.inline.em.endAst:this.rules.inline.em.endUnd;for(a.lastIndex=0;null!=(o=a.exec(n));)if(t=this.rules.inline.em.middle.exec(n.slice(0,o.index+2)))return{type:"em",raw:e.slice(0,t[0].length),text:e.slice(1,t[0].length-1)}}},e.prototype.codespan=function(e){var n=this.rules.inline.code.exec(e);if(n){var i=n[2].replace(/\n/g," "),o=/[^ ]/.test(i),e=/^ /.test(i)&&/ $/.test(i);return o&&e&&(i=i.substring(1,i.length-1)),i=Je(i,!0),{type:"codespan",raw:n[0],text:i}}},e.prototype.br=function(e){e=this.rules.inline.br.exec(e);if(e)return{type:"br",raw:e[0]}},e.prototype.del=function(e){e=this.rules.inline.del.exec(e);if(e)return{type:"del",raw:e[0],text:e[2]}},e.prototype.autolink=function(e,n){e=this.rules.inline.autolink.exec(e);if(e){var i,n="@"===e[2]?"mailto:"+(i=Je(this.options.mangle?n(e[1]):e[1])):i=Je(e[1]);return{type:"link",raw:e[0],text:i,href:n,tokens:[{type:"text",raw:i,text:i}]}}},e.prototype.url=function(e,n){var i,o,t,a;if(i=this.rules.inline.url.exec(e)){if("@"===i[2])t="mailto:"+(o=Je(this.options.mangle?n(i[0]):i[0]));else{for(;a=i[0],i[0]=this.rules.inline._backpedal.exec(i[0])[0],a!==i[0];);o=Je(i[0]),t="www."===i[1]?"http://"+o:o}return{type:"link",raw:i[0],text:o,href:t,tokens:[{type:"text",raw:o,text:o}]}}},e.prototype.inlineText=function(e,n,i){e=this.rules.inline.text.exec(e);if(e){i=n?this.options.sanitize?this.options.sanitizer?this.options.sanitizer(e[0]):Je(e[0]):e[0]:Je(this.options.smartypants?i(e[0]):e[0]);return{type:"text",raw:e[0],text:i}}},e}(),Ze=De,Ve=Ne,De=Ue,Ne={newline:/^(?: *(?:\n|$))+/,code:/^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,hr:/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,list:/^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?! {0,3}bull )\n*|\s*$)/,html:"^ {0,3}(?:<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$))",def:/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,nptable:Ze,table:Ze,lheading:/^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,_paragraph:/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/,text:/^[^\n]+/,_label:/(?!\s*\])(?:\\[\[\]]|[^\[\]])+/,_title:/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/};Ne.def=Ve(Ne.def).replace("label",Ne._label).replace("title",Ne._title).getRegex(),Ne.bullet=/(?:[*+-]|\d{1,9}[.)])/,Ne.item=/^( *)(bull) ?[^\n]*(?:\n(?! *bull ?)[^\n]*)*/,Ne.item=Ve(Ne.item,"gm").replace(/bull/g,Ne.bullet).getRegex(),Ne.listItemStart=Ve(/^( *)(bull)/).replace("bull",Ne.bullet).getRegex(),Ne.list=Ve(Ne.list).replace(/bull/g,Ne.bullet).replace("hr","\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def","\\n+(?="+Ne.def.source+")").getRegex(),Ne._tag="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Ne._comment=/<!--(?!-?>)[\s\S]*?(?:-->|$)/,Ne.html=Ve(Ne.html,"i").replace("comment",Ne._comment).replace("tag",Ne._tag).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Ne.paragraph=Ve(Ne._paragraph).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("|lheading","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.blockquote=Ve(Ne.blockquote).replace("paragraph",Ne.paragraph).getRegex(),Ne.normal=De({},Ne),Ne.gfm=De({},Ne.normal,{nptable:"^ *([^|\\n ].*\\|.*)\\n {0,3}([-:]+ *\\|[-| :]*)(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)",table:"^ *\\|(.+)\\n {0,3}\\|?( *[-:]+[-| :]*)(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)"}),Ne.gfm.nptable=Ve(Ne.gfm.nptable).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.gfm.table=Ve(Ne.gfm.table).replace("hr",Ne.hr).replace("heading"," {0,3}#{1,6} ").replace("blockquote"," {0,3}>").replace("code"," {4}[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)").replace("tag",Ne._tag).getRegex(),Ne.pedantic=De({},Ne.normal,{html:Ve("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",Ne._comment).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ze,paragraph:Ve(Ne.normal._paragraph).replace("hr",Ne.hr).replace("heading"," *#{1,6} *[^\n]").replace("lheading",Ne.lheading).replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").getRegex()});Ze={escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,autolink:/^<(scheme:[^\s\x00-\x1f<>]*|email)>/,url:Ze,tag:"^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>",link:/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,reflink:/^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,nolink:/^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,reflinkSearch:"reflink|nolink(?!\\()",strong:{start:/^(?:(\*\*(?=[*punctuation]))|\*\*)(?![\s])|__/,middle:/^\*\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*\*$|^__(?![\s])((?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?)__$/,endAst:/[^punctuation\s]\*\*(?!\*)|[punctuation]\*\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]__(?!_)(?:(?=[punctuation*\s])|$)/},em:{start:/^(?:(\*(?=[punctuation]))|\*)(?![*\s])|_/,middle:/^\*(?:(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)|\*(?:(?!overlapSkip)(?:[^*]|\\\*)|overlapSkip)*?\*)+?\*$|^_(?![_\s])(?:(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)|_(?:(?!overlapSkip)(?:[^_]|\\_)|overlapSkip)*?_)+?_$/,endAst:/[^punctuation\s]\*(?!\*)|[punctuation]\*(?!\*)(?:(?=[punctuation_\s]|$))/,endUnd:/[^\s]_(?!_)(?:(?=[punctuation*\s])|$)/},code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,br:/^( {2,}|\\)\n(?!\s*$)/,del:Ze,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n)))/,punctuation:/^([\s*punctuation])/,_punctuation:"!\"#$%&'()+\\-.,/:;<=>?@\\[\\]`^{|}~"};Ze.punctuation=Ve(Ze.punctuation).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze._blockSkip="\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>",Ze._overlapSkip="__[^_]*?__|\\*\\*\\[^\\*\\]*?\\*\\*",Ze._comment=Ve(Ne._comment).replace("(?:--\x3e|$)","--\x3e").getRegex(),Ze.em.start=Ve(Ze.em.start).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.em.middle=Ve(Ze.em.middle).replace(/punctuation/g,Ze._punctuation).replace(/overlapSkip/g,Ze._overlapSkip).getRegex(),Ze.em.endAst=Ve(Ze.em.endAst,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.em.endUnd=Ve(Ze.em.endUnd,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.start=Ve(Ze.strong.start).replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.middle=Ve(Ze.strong.middle).replace(/punctuation/g,Ze._punctuation).replace(/overlapSkip/g,Ze._overlapSkip).getRegex(),Ze.strong.endAst=Ve(Ze.strong.endAst,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.strong.endUnd=Ve(Ze.strong.endUnd,"g").replace(/punctuation/g,Ze._punctuation).getRegex(),Ze.blockSkip=Ve(Ze._blockSkip,"g").getRegex(),Ze.overlapSkip=Ve(Ze._overlapSkip,"g").getRegex(),Ze._escapes=/\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g,Ze._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,Ze._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,Ze.autolink=Ve(Ze.autolink).replace("scheme",Ze._scheme).replace("email",Ze._email).getRegex(),Ze._attribute=/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/,Ze.tag=Ve(Ze.tag).replace("comment",Ze._comment).replace("attribute",Ze._attribute).getRegex(),Ze._label=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,Ze._href=/<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/,Ze._title=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,Ze.link=Ve(Ze.link).replace("label",Ze._label).replace("href",Ze._href).replace("title",Ze._title).getRegex(),Ze.reflink=Ve(Ze.reflink).replace("label",Ze._label).getRegex(),Ze.reflinkSearch=Ve(Ze.reflinkSearch,"g").replace("reflink",Ze.reflink).replace("nolink",Ze.nolink).getRegex(),Ze.normal=De({},Ze),Ze.pedantic=De({},Ze.normal,{strong:{start:/^__|\*\*/,middle:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,endAst:/\*\*(?!\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\*/,middle:/^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/,endAst:/\*(?!\*)/g,endUnd:/_(?!_)/g},link:Ve(/^!?\[(label)\]\((.*?)\)/).replace("label",Ze._label).getRegex(),reflink:Ve(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Ze._label).getRegex()}),Ze.gfm=De({},Ze.normal,{escape:Ve(Ze.escape).replace("])","~|])").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/}),Ze.gfm.url=Ve(Ze.gfm.url,"i").replace("email",Ze.gfm._extended_email).getRegex(),Ze.breaks=De({},Ze.gfm,{br:Ve(Ze.br).replace("{2,}","*").getRegex(),text:Ve(Ze.gfm.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()});var Ze={block:Ne,inline:Ze},on=we.defaults,tn=Ze.block,an=Ze.inline,rn=Ge;function cn(e){return e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…")}function un(e){for(var n,i="",o=e.length,t=0;t<o;t++)n=e.charCodeAt(t),i+="&#"+(n=.5<Math.random()?"x"+n.toString(16):n)+";";return i}var fn=function(){function i(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||on,this.options.tokenizer=this.options.tokenizer||new nn,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options;e={block:tn.normal,inline:an.normal};this.options.pedantic?(e.block=tn.pedantic,e.inline=an.pedantic):this.options.gfm&&(e.block=tn.gfm,this.options.breaks?e.inline=an.breaks:e.inline=an.gfm),this.tokenizer.rules=e}var e={rules:{configurable:!0}};return e.rules.get=function(){return{block:tn,inline:an}},i.lex=function(e,n){return new i(n).lex(e)},i.lexInline=function(e,n){return new i(n).inlineTokens(e)},i.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g,"    "),this.blockTokens(e,this.tokens,!0),this.inline(this.tokens),this.tokens},i.prototype.blockTokens=function(e,n,i){var o,t,a,r;for(void 0===n&&(n=[]),void 0===i&&(i=!0),this.options.pedantic&&(e=e.replace(/^ +$/gm,""));e;)if(o=this.tokenizer.space(e))e=e.substring(o.raw.length),o.type&&n.push(o);else if(o=this.tokenizer.code(e,n))e=e.substring(o.raw.length),o.type?n.push(o):((r=n[n.length-1]).raw+="\n"+o.raw,r.text+="\n"+o.text);else if(o=this.tokenizer.fences(e))e=e.substring(o.raw.length),n.push(o);else if(o=this.tokenizer.heading(e))e=e.substring(o.raw.length),n.push(o);else if(o=this.tokenizer.nptable(e))e=e.substring(o.raw.length),n.push(o);else if(o=this.tokenizer.hr(e))e=e.substring(o.raw.length),n.push(o);else if(o=this.tokenizer.blockquote(e))e=e.substring(o.raw.length),o.tokens=this.blockTokens(o.text,[],i),n.push(o);else if(o=this.tokenizer.list(e)){for(e=e.substring(o.raw.length),a=o.items.length,t=0;t<a;t++)o.items[t].tokens=this.blockTokens(o.items[t].text,[],!1);n.push(o)}else if(o=this.tokenizer.html(e))e=e.substring(o.raw.length),n.push(o);else if(i&&(o=this.tokenizer.def(e)))e=e.substring(o.raw.length),this.tokens.links[o.tag]||(this.tokens.links[o.tag]={href:o.href,title:o.title});else if(o=this.tokenizer.table(e))e=e.substring(o.raw.length),n.push(o);else if(o=this.tokenizer.lheading(e))e=e.substring(o.raw.length),n.push(o);else if(i&&(o=this.tokenizer.paragraph(e)))e=e.substring(o.raw.length),n.push(o);else if(o=this.tokenizer.text(e,n))e=e.substring(o.raw.length),o.type?n.push(o):((r=n[n.length-1]).raw+="\n"+o.raw,r.text+="\n"+o.text);else if(e){var c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}throw new Error(c)}return n},i.prototype.inline=function(e){for(var n,i,o,t,a,r=e.length,c=0;c<r;c++)switch((a=e[c]).type){case"paragraph":case"text":case"heading":a.tokens=[],this.inlineTokens(a.text,a.tokens);break;case"table":for(a.tokens={header:[],cells:[]},o=a.header.length,n=0;n<o;n++)a.tokens.header[n]=[],this.inlineTokens(a.header[n],a.tokens.header[n]);for(o=a.cells.length,n=0;n<o;n++)for(t=a.cells[n],a.tokens.cells[n]=[],i=0;i<t.length;i++)a.tokens.cells[n][i]=[],this.inlineTokens(t[i],a.tokens.cells[n][i]);break;case"blockquote":this.inline(a.tokens);break;case"list":for(o=a.items.length,n=0;n<o;n++)this.inline(a.items[n].tokens)}return e},i.prototype.inlineTokens=function(e,n,i,o){var t;void 0===n&&(n=[]),void 0===i&&(i=!1),void 0===o&&(o=!1);var a,r,c,u=e;if(this.tokens.links){var f=Object.keys(this.tokens.links);if(0<f.length)for(;null!=(a=this.tokenizer.rules.inline.reflinkSearch.exec(u));)f.includes(a[0].slice(a[0].lastIndexOf("[")+1,-1))&&(u=u.slice(0,a.index)+"["+rn("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(a=this.tokenizer.rules.inline.blockSkip.exec(u));)u=u.slice(0,a.index)+"["+rn("a",a[0].length-2)+"]"+u.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;e;)if(r||(c=""),r=!1,t=this.tokenizer.escape(e))e=e.substring(t.raw.length),n.push(t);else if(t=this.tokenizer.tag(e,i,o))e=e.substring(t.raw.length),i=t.inLink,o=t.inRawBlock,n.push(t);else if(t=this.tokenizer.link(e))e=e.substring(t.raw.length),"link"===t.type&&(t.tokens=this.inlineTokens(t.text,[],!0,o)),n.push(t);else if(t=this.tokenizer.reflink(e,this.tokens.links))e=e.substring(t.raw.length),"link"===t.type&&(t.tokens=this.inlineTokens(t.text,[],!0,o)),n.push(t);else if(t=this.tokenizer.strong(e,u,c))e=e.substring(t.raw.length),t.tokens=this.inlineTokens(t.text,[],i,o),n.push(t);else if(t=this.tokenizer.em(e,u,c))e=e.substring(t.raw.length),t.tokens=this.inlineTokens(t.text,[],i,o),n.push(t);else if(t=this.tokenizer.codespan(e))e=e.substring(t.raw.length),n.push(t);else if(t=this.tokenizer.br(e))e=e.substring(t.raw.length),n.push(t);else if(t=this.tokenizer.del(e))e=e.substring(t.raw.length),t.tokens=this.inlineTokens(t.text,[],i,o),n.push(t);else if(t=this.tokenizer.autolink(e,un))e=e.substring(t.raw.length),n.push(t);else if(i||!(t=this.tokenizer.url(e,un))){if(t=this.tokenizer.inlineText(e,o,cn))e=e.substring(t.raw.length),c=t.raw.slice(-1),r=!0,n.push(t);else if(e){var p="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(p);break}throw new Error(p)}}else e=e.substring(t.raw.length),n.push(t);return n},Object.defineProperties(i,e),i}(),pn=we.defaults,dn=He,gn=Me,sn=function(){function e(e){this.options=e||pn}return e.prototype.code=function(e,n,i){var o=(n||"").match(/\S*/)[0];return!this.options.highlight||null!=(n=this.options.highlight(e,o))&&n!==e&&(i=!0,e=n),e=e.replace(/\n$/,"")+"\n",o?'<pre><code class="'+this.options.langPrefix+gn(o,!0)+'">'+(i?e:gn(e,!0))+"</code></pre>\n":"<pre><code>"+(i?e:gn(e,!0))+"</code></pre>\n"},e.prototype.blockquote=function(e){return"<blockquote>\n"+e+"</blockquote>\n"},e.prototype.html=function(e){return e},e.prototype.heading=function(e,n,i,o){return this.options.headerIds?"<h"+n+' id="'+this.options.headerPrefix+o.slug(i)+'">'+e+"</h"+n+">\n":"<h"+n+">"+e+"</h"+n+">\n"},e.prototype.hr=function(){return this.options.xhtml?"<hr/>\n":"<hr>\n"},e.prototype.list=function(e,n,i){var o=n?"ol":"ul";return"<"+o+(n&&1!==i?' start="'+i+'"':"")+">\n"+e+"</"+o+">\n"},e.prototype.listitem=function(e){return"<li>"+e+"</li>\n"},e.prototype.checkbox=function(e){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"'+(this.options.xhtml?" /":"")+"> "},e.prototype.paragraph=function(e){return"<p>"+e+"</p>\n"},e.prototype.table=function(e,n){return"<table>\n<thead>\n"+e+"</thead>\n"+(n=n&&"<tbody>"+n+"</tbody>")+"</table>\n"},e.prototype.tablerow=function(e){return"<tr>\n"+e+"</tr>\n"},e.prototype.tablecell=function(e,n){var i=n.header?"th":"td";return(n.align?"<"+i+' align="'+n.align+'">':"<"+i+">")+e+"</"+i+">\n"},e.prototype.strong=function(e){return"<strong>"+e+"</strong>"},e.prototype.em=function(e){return"<em>"+e+"</em>"},e.prototype.codespan=function(e){return"<code>"+e+"</code>"},e.prototype.br=function(){return this.options.xhtml?"<br/>":"<br>"},e.prototype.del=function(e){return"<del>"+e+"</del>"},e.prototype.link=function(e,n,i){if(null===(e=dn(this.options.sanitize,this.options.baseUrl,e)))return i;e='<a href="'+gn(e)+'"';return n&&(e+=' title="'+n+'"'),e+=">"+i+"</a>"},e.prototype.image=function(e,n,i){if(null===(e=dn(this.options.sanitize,this.options.baseUrl,e)))return i;i='<img src="'+e+'" alt="'+i+'"';return n&&(i+=' title="'+n+'"'),i+=this.options.xhtml?"/>":">"},e.prototype.text=function(e){return e},e}(),ln=function(){function e(){}return e.prototype.strong=function(e){return e},e.prototype.em=function(e){return e},e.prototype.codespan=function(e){return e},e.prototype.del=function(e){return e},e.prototype.html=function(e){return e},e.prototype.text=function(e){return e},e.prototype.link=function(e,n,i){return""+i},e.prototype.image=function(e,n,i){return""+i},e.prototype.br=function(){return""},e}(),vn=function(){function e(){this.seen={}}return e.prototype.serialize=function(e){return e.toLowerCase().trim().replace(/<[!\/a-z].*?>/gi,"").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g,"").replace(/\s/g,"-")},e.prototype.getNextSafeSlug=function(e,n){var i=e,o=0;if(this.seen.hasOwnProperty(i))for(o=this.seen[e];i=e+"-"+ ++o,this.seen.hasOwnProperty(i););return n||(this.seen[e]=o,this.seen[i]=0),i},e.prototype.slug=function(e,n){void 0===n&&(n={});e=this.serialize(e);return this.getNextSafeSlug(e,n.dryrun)},e}(),hn=we.defaults,_n=Ie,mn=function(){function i(e){this.options=e||hn,this.options.renderer=this.options.renderer||new sn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new ln,this.slugger=new vn}return i.parse=function(e,n){return new i(n).parse(e)},i.parseInline=function(e,n){return new i(n).parseInline(e)},i.prototype.parse=function(e,n){void 0===n&&(n=!0);for(var i,o,t,a,r,c,u,f,p,d,g,s,l,v,h,_="",m=e.length,b=0;b<m;b++)switch((f=e[b]).type){case"space":continue;case"hr":_+=this.renderer.hr();continue;case"heading":_+=this.renderer.heading(this.parseInline(f.tokens),f.depth,_n(this.parseInline(f.tokens,this.textRenderer)),this.slugger);continue;case"code":_+=this.renderer.code(f.text,f.lang,f.escaped);continue;case"table":for(c=p="",t=f.header.length,i=0;i<t;i++)c+=this.renderer.tablecell(this.parseInline(f.tokens.header[i]),{header:!0,align:f.align[i]});for(p+=this.renderer.tablerow(c),u="",t=f.cells.length,i=0;i<t;i++){for(c="",a=(r=f.tokens.cells[i]).length,o=0;o<a;o++)c+=this.renderer.tablecell(this.parseInline(r[o]),{header:!1,align:f.align[o]});u+=this.renderer.tablerow(c)}_+=this.renderer.table(p,u);continue;case"blockquote":u=this.parse(f.tokens),_+=this.renderer.blockquote(u);continue;case"list":for(p=f.ordered,k=f.start,d=f.loose,t=f.items.length,u="",i=0;i<t;i++)l=(s=f.items[i]).checked,v=s.task,g="",s.task&&(h=this.renderer.checkbox(l),d?0<s.tokens.length&&"text"===s.tokens[0].type?(s.tokens[0].text=h+" "+s.tokens[0].text,s.tokens[0].tokens&&0<s.tokens[0].tokens.length&&"text"===s.tokens[0].tokens[0].type&&(s.tokens[0].tokens[0].text=h+" "+s.tokens[0].tokens[0].text)):s.tokens.unshift({type:"text",text:h}):g+=h),g+=this.parse(s.tokens,d),u+=this.renderer.listitem(g,v,l);_+=this.renderer.list(u,p,k);continue;case"html":_+=this.renderer.html(f.text);continue;case"paragraph":_+=this.renderer.paragraph(this.parseInline(f.tokens));continue;case"text":for(u=f.tokens?this.parseInline(f.tokens):f.text;b+1<m&&"text"===e[b+1].type;)u+="\n"+((f=e[++b]).tokens?this.parseInline(f.tokens):f.text);_+=n?this.renderer.paragraph(u):u;continue;default:var k='Token with "'+f.type+'" type was not found.';if(this.options.silent)return void console.error(k);throw new Error(k)}return _},i.prototype.parseInline=function(e,n){n=n||this.renderer;for(var i,o="",t=e.length,a=0;a<t;a++)switch((i=e[a]).type){case"escape":o+=n.text(i.text);break;case"html":o+=n.html(i.text);break;case"link":o+=n.link(i.href,i.title,this.parseInline(i.tokens,n));break;case"image":o+=n.image(i.href,i.title,i.text);break;case"strong":o+=n.strong(this.parseInline(i.tokens,n));break;case"em":o+=n.em(this.parseInline(i.tokens,n));break;case"codespan":o+=n.codespan(i.text);break;case"br":o+=n.br();break;case"del":o+=n.del(this.parseInline(i.tokens,n));break;case"text":o+=n.text(i.text);break;default:var r='Token with "'+i.type+'" type was not found.';if(this.options.silent)return void console.error(r);throw new Error(r)}return o},i}(),bn=Ue,kn=Ye,wn=Me,Me=we.getDefaults,yn=we.changeDefaults,we=we.defaults;function xn(e,i,o){if(null==e)throw new Error("marked(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");if("function"==typeof i&&(o=i,i=null),i=bn({},xn.defaults,i||{}),kn(i),o){var t,a=i.highlight;try{t=fn.lex(e,i)}catch(e){return o(e)}function r(n){var e;if(!n)try{e=mn.parse(t,i)}catch(e){n=e}return i.highlight=a,n?o(n):o(null,e)}if(!a||a.length<3)return r();if(delete i.highlight,!t.length)return r();var c=0;return xn.walkTokens(t,function(i){"code"===i.type&&(c++,setTimeout(function(){a(i.text,i.lang,function(e,n){return e?r(e):(null!=n&&n!==i.text&&(i.text=n,i.escaped=!0),void(0===--c&&r()))})},0))}),void(0===c&&r())}try{var n=fn.lex(e,i);return i.walkTokens&&xn.walkTokens(n,i.walkTokens),mn.parse(n,i)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",i.silent)return"<p>An error occurred:</p><pre>"+wn(e.message+"",!0)+"</pre>";throw e}}xn.options=xn.setOptions=function(e){return bn(xn.defaults,e),yn(xn.defaults),xn},xn.getDefaults=Me,xn.defaults=we,xn.use=function(a){var n,e=bn({},a);if(a.renderer){var i,r=xn.defaults.renderer||new sn;for(i in a.renderer)!function(o){var t=r[o];r[o]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var i=a.renderer[o].apply(r,e);return i=!1===i?t.apply(r,e):i}}(i);e.renderer=r}if(a.tokenizer){var t,c=xn.defaults.tokenizer||new nn;for(t in a.tokenizer)!function(){var o=c[t];c[t]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var i=a.tokenizer[t].apply(c,e);return i=!1===i?o.apply(c,e):i}}();e.tokenizer=c}a.walkTokens&&(n=xn.defaults.walkTokens,e.walkTokens=function(e){a.walkTokens(e),n&&n(e)}),xn.setOptions(e)},xn.walkTokens=function(e,n){for(var i=0,o=e;i<o.length;i+=1){var t=o[i];switch(n(t),t.type){case"table":for(var a=0,r=t.tokens.header;a<r.length;a+=1){var c=r[a];xn.walkTokens(c,n)}for(var u=0,f=t.tokens.cells;u<f.length;u+=1)for(var p=0,d=f[u];p<d.length;p+=1){var g=d[p];xn.walkTokens(g,n)}break;case"list":xn.walkTokens(t.items,n);break;default:t.tokens&&xn.walkTokens(t.tokens,n)}}},xn.parseInline=function(e,n){if(null==e)throw new Error("marked.parseInline(): input parameter is undefined or null");if("string"!=typeof e)throw new Error("marked.parseInline(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected");n=bn({},xn.defaults,n||{}),kn(n);try{var i=fn.lexInline(e,n);return n.walkTokens&&xn.walkTokens(i,n.walkTokens),mn.parseInline(i,n)}catch(e){if(e.message+="\nPlease report this to https://github.com/markedjs/marked.",n.silent)return"<p>An error occurred:</p><pre>"+wn(e.message+"",!0)+"</pre>";throw e}},xn.Parser=mn,xn.parser=mn.parse,xn.Renderer=sn,xn.TextRenderer=ln,xn.Lexer=fn,xn.lexer=fn.lex,xn.Tokenizer=nn,xn.Slugger=vn;var Sn=xn.parse=xn;function An(e,i){if(void 0===i&&(i='<ul class="app-sub-sidebar">{inner}</ul>'),!e||!e.length)return"";var o="";return e.forEach(function(e){var n=e.title.replace(/(<([^>]+)>)/g,"");o+='<li><a class="section-link" href="'+e.slug+'" title="'+n+'">'+e.title+"</a></li>",e.children&&(o+=An(e.children,i))}),i.replace("{inner}",o)}function $n(e,n){return'<p class="'+e+'">'+n.slice(5).trim()+"</p>"}function zn(e,o){var t=[],a={};return e.forEach(function(e){var n=e.level||1,i=n-1;o<n||(a[i]?a[i].children=(a[i].children||[]).concat(e):t.push(e),a[n]=e)}),t}var Fn={},En=/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g;function Tn(e){return e.toLowerCase()}function Cn(e){if("string"!=typeof e)return"";var n=e.trim().replace(/[A-Z]+/g,Tn).replace(/<[^>]+>/g,"").replace(En,"").replace(/\s/g,"-").replace(/-+/g,"-").replace(/^(\d)/,"_$1"),e=Fn[n],e=u.call(Fn,n)?e+1:0;return n=(Fn[n]=e)?n+"-"+e:n}Cn.clear=function(){Fn={}};var Rn={baseURL:"https://github.githubassets.com/images/icons/emoji/",data:{100:"unicode/1f4af.png?v8",1234:"unicode/1f522.png?v8","+1":"unicode/1f44d.png?v8","-1":"unicode/1f44e.png?v8","1st_place_medal":"unicode/1f947.png?v8","2nd_place_medal":"unicode/1f948.png?v8","3rd_place_medal":"unicode/1f949.png?v8","8ball":"unicode/1f3b1.png?v8",a:"unicode/1f170.png?v8",ab:"unicode/1f18e.png?v8",abacus:"unicode/1f9ee.png?v8",abc:"unicode/1f524.png?v8",abcd:"unicode/1f521.png?v8",accept:"unicode/1f251.png?v8",accordion:"unicode/1fa97.png?v8",adhesive_bandage:"unicode/1fa79.png?v8",adult:"unicode/1f9d1.png?v8",aerial_tramway:"unicode/1f6a1.png?v8",afghanistan:"unicode/1f1e6-1f1eb.png?v8",airplane:"unicode/2708.png?v8",aland_islands:"unicode/1f1e6-1f1fd.png?v8",alarm_clock:"unicode/23f0.png?v8",albania:"unicode/1f1e6-1f1f1.png?v8",alembic:"unicode/2697.png?v8",algeria:"unicode/1f1e9-1f1ff.png?v8",alien:"unicode/1f47d.png?v8",ambulance:"unicode/1f691.png?v8",american_samoa:"unicode/1f1e6-1f1f8.png?v8",amphora:"unicode/1f3fa.png?v8",anatomical_heart:"unicode/1fac0.png?v8",anchor:"unicode/2693.png?v8",andorra:"unicode/1f1e6-1f1e9.png?v8",angel:"unicode/1f47c.png?v8",anger:"unicode/1f4a2.png?v8",angola:"unicode/1f1e6-1f1f4.png?v8",angry:"unicode/1f620.png?v8",anguilla:"unicode/1f1e6-1f1ee.png?v8",anguished:"unicode/1f627.png?v8",ant:"unicode/1f41c.png?v8",antarctica:"unicode/1f1e6-1f1f6.png?v8",antigua_barbuda:"unicode/1f1e6-1f1ec.png?v8",apple:"unicode/1f34e.png?v8",aquarius:"unicode/2652.png?v8",argentina:"unicode/1f1e6-1f1f7.png?v8",aries:"unicode/2648.png?v8",armenia:"unicode/1f1e6-1f1f2.png?v8",arrow_backward:"unicode/25c0.png?v8",arrow_double_down:"unicode/23ec.png?v8",arrow_double_up:"unicode/23eb.png?v8",arrow_down:"unicode/2b07.png?v8",arrow_down_small:"unicode/1f53d.png?v8",arrow_forward:"unicode/25b6.png?v8",arrow_heading_down:"unicode/2935.png?v8",arrow_heading_up:"unicode/2934.png?v8",arrow_left:"unicode/2b05.png?v8",arrow_lower_left:"unicode/2199.png?v8",arrow_lower_right:"unicode/2198.png?v8",arrow_right:"unicode/27a1.png?v8",arrow_right_hook:"unicode/21aa.png?v8",arrow_up:"unicode/2b06.png?v8",arrow_up_down:"unicode/2195.png?v8",arrow_up_small:"unicode/1f53c.png?v8",arrow_upper_left:"unicode/2196.png?v8",arrow_upper_right:"unicode/2197.png?v8",arrows_clockwise:"unicode/1f503.png?v8",arrows_counterclockwise:"unicode/1f504.png?v8",art:"unicode/1f3a8.png?v8",articulated_lorry:"unicode/1f69b.png?v8",artificial_satellite:"unicode/1f6f0.png?v8",artist:"unicode/1f9d1-1f3a8.png?v8",aruba:"unicode/1f1e6-1f1fc.png?v8",ascension_island:"unicode/1f1e6-1f1e8.png?v8",asterisk:"unicode/002a-20e3.png?v8",astonished:"unicode/1f632.png?v8",astronaut:"unicode/1f9d1-1f680.png?v8",athletic_shoe:"unicode/1f45f.png?v8",atm:"unicode/1f3e7.png?v8",atom:"atom.png?v8",atom_symbol:"unicode/269b.png?v8",australia:"unicode/1f1e6-1f1fa.png?v8",austria:"unicode/1f1e6-1f1f9.png?v8",auto_rickshaw:"unicode/1f6fa.png?v8",avocado:"unicode/1f951.png?v8",axe:"unicode/1fa93.png?v8",azerbaijan:"unicode/1f1e6-1f1ff.png?v8",b:"unicode/1f171.png?v8",baby:"unicode/1f476.png?v8",baby_bottle:"unicode/1f37c.png?v8",baby_chick:"unicode/1f424.png?v8",baby_symbol:"unicode/1f6bc.png?v8",back:"unicode/1f519.png?v8",bacon:"unicode/1f953.png?v8",badger:"unicode/1f9a1.png?v8",badminton:"unicode/1f3f8.png?v8",bagel:"unicode/1f96f.png?v8",baggage_claim:"unicode/1f6c4.png?v8",baguette_bread:"unicode/1f956.png?v8",bahamas:"unicode/1f1e7-1f1f8.png?v8",bahrain:"unicode/1f1e7-1f1ed.png?v8",balance_scale:"unicode/2696.png?v8",bald_man:"unicode/1f468-1f9b2.png?v8",bald_woman:"unicode/1f469-1f9b2.png?v8",ballet_shoes:"unicode/1fa70.png?v8",balloon:"unicode/1f388.png?v8",ballot_box:"unicode/1f5f3.png?v8",ballot_box_with_check:"unicode/2611.png?v8",bamboo:"unicode/1f38d.png?v8",banana:"unicode/1f34c.png?v8",bangbang:"unicode/203c.png?v8",bangladesh:"unicode/1f1e7-1f1e9.png?v8",banjo:"unicode/1fa95.png?v8",bank:"unicode/1f3e6.png?v8",bar_chart:"unicode/1f4ca.png?v8",barbados:"unicode/1f1e7-1f1e7.png?v8",barber:"unicode/1f488.png?v8",baseball:"unicode/26be.png?v8",basecamp:"basecamp.png?v8",basecampy:"basecampy.png?v8",basket:"unicode/1f9fa.png?v8",basketball:"unicode/1f3c0.png?v8",basketball_man:"unicode/26f9-2642.png?v8",basketball_woman:"unicode/26f9-2640.png?v8",bat:"unicode/1f987.png?v8",bath:"unicode/1f6c0.png?v8",bathtub:"unicode/1f6c1.png?v8",battery:"unicode/1f50b.png?v8",beach_umbrella:"unicode/1f3d6.png?v8",bear:"unicode/1f43b.png?v8",bearded_person:"unicode/1f9d4.png?v8",beaver:"unicode/1f9ab.png?v8",bed:"unicode/1f6cf.png?v8",bee:"unicode/1f41d.png?v8",beer:"unicode/1f37a.png?v8",beers:"unicode/1f37b.png?v8",beetle:"unicode/1fab2.png?v8",beginner:"unicode/1f530.png?v8",belarus:"unicode/1f1e7-1f1fe.png?v8",belgium:"unicode/1f1e7-1f1ea.png?v8",belize:"unicode/1f1e7-1f1ff.png?v8",bell:"unicode/1f514.png?v8",bell_pepper:"unicode/1fad1.png?v8",bellhop_bell:"unicode/1f6ce.png?v8",benin:"unicode/1f1e7-1f1ef.png?v8",bento:"unicode/1f371.png?v8",bermuda:"unicode/1f1e7-1f1f2.png?v8",beverage_box:"unicode/1f9c3.png?v8",bhutan:"unicode/1f1e7-1f1f9.png?v8",bicyclist:"unicode/1f6b4.png?v8",bike:"unicode/1f6b2.png?v8",biking_man:"unicode/1f6b4-2642.png?v8",biking_woman:"unicode/1f6b4-2640.png?v8",bikini:"unicode/1f459.png?v8",billed_cap:"unicode/1f9e2.png?v8",biohazard:"unicode/2623.png?v8",bird:"unicode/1f426.png?v8",birthday:"unicode/1f382.png?v8",bison:"unicode/1f9ac.png?v8",black_cat:"unicode/1f408-2b1b.png?v8",black_circle:"unicode/26ab.png?v8",black_flag:"unicode/1f3f4.png?v8",black_heart:"unicode/1f5a4.png?v8",black_joker:"unicode/1f0cf.png?v8",black_large_square:"unicode/2b1b.png?v8",black_medium_small_square:"unicode/25fe.png?v8",black_medium_square:"unicode/25fc.png?v8",black_nib:"unicode/2712.png?v8",black_small_square:"unicode/25aa.png?v8",black_square_button:"unicode/1f532.png?v8",blond_haired_man:"unicode/1f471-2642.png?v8",blond_haired_person:"unicode/1f471.png?v8",blond_haired_woman:"unicode/1f471-2640.png?v8",blonde_woman:"unicode/1f471-2640.png?v8",blossom:"unicode/1f33c.png?v8",blowfish:"unicode/1f421.png?v8",blue_book:"unicode/1f4d8.png?v8",blue_car:"unicode/1f699.png?v8",blue_heart:"unicode/1f499.png?v8",blue_square:"unicode/1f7e6.png?v8",blueberries:"unicode/1fad0.png?v8",blush:"unicode/1f60a.png?v8",boar:"unicode/1f417.png?v8",boat:"unicode/26f5.png?v8",bolivia:"unicode/1f1e7-1f1f4.png?v8",bomb:"unicode/1f4a3.png?v8",bone:"unicode/1f9b4.png?v8",book:"unicode/1f4d6.png?v8",bookmark:"unicode/1f516.png?v8",bookmark_tabs:"unicode/1f4d1.png?v8",books:"unicode/1f4da.png?v8",boom:"unicode/1f4a5.png?v8",boomerang:"unicode/1fa83.png?v8",boot:"unicode/1f462.png?v8",bosnia_herzegovina:"unicode/1f1e7-1f1e6.png?v8",botswana:"unicode/1f1e7-1f1fc.png?v8",bouncing_ball_man:"unicode/26f9-2642.png?v8",bouncing_ball_person:"unicode/26f9.png?v8",bouncing_ball_woman:"unicode/26f9-2640.png?v8",bouquet:"unicode/1f490.png?v8",bouvet_island:"unicode/1f1e7-1f1fb.png?v8",bow:"unicode/1f647.png?v8",bow_and_arrow:"unicode/1f3f9.png?v8",bowing_man:"unicode/1f647-2642.png?v8",bowing_woman:"unicode/1f647-2640.png?v8",bowl_with_spoon:"unicode/1f963.png?v8",bowling:"unicode/1f3b3.png?v8",bowtie:"bowtie.png?v8",boxing_glove:"unicode/1f94a.png?v8",boy:"unicode/1f466.png?v8",brain:"unicode/1f9e0.png?v8",brazil:"unicode/1f1e7-1f1f7.png?v8",bread:"unicode/1f35e.png?v8",breast_feeding:"unicode/1f931.png?v8",bricks:"unicode/1f9f1.png?v8",bride_with_veil:"unicode/1f470-2640.png?v8",bridge_at_night:"unicode/1f309.png?v8",briefcase:"unicode/1f4bc.png?v8",british_indian_ocean_territory:"unicode/1f1ee-1f1f4.png?v8",british_virgin_islands:"unicode/1f1fb-1f1ec.png?v8",broccoli:"unicode/1f966.png?v8",broken_heart:"unicode/1f494.png?v8",broom:"unicode/1f9f9.png?v8",brown_circle:"unicode/1f7e4.png?v8",brown_heart:"unicode/1f90e.png?v8",brown_square:"unicode/1f7eb.png?v8",brunei:"unicode/1f1e7-1f1f3.png?v8",bubble_tea:"unicode/1f9cb.png?v8",bucket:"unicode/1faa3.png?v8",bug:"unicode/1f41b.png?v8",building_construction:"unicode/1f3d7.png?v8",bulb:"unicode/1f4a1.png?v8",bulgaria:"unicode/1f1e7-1f1ec.png?v8",bullettrain_front:"unicode/1f685.png?v8",bullettrain_side:"unicode/1f684.png?v8",burkina_faso:"unicode/1f1e7-1f1eb.png?v8",burrito:"unicode/1f32f.png?v8",burundi:"unicode/1f1e7-1f1ee.png?v8",bus:"unicode/1f68c.png?v8",business_suit_levitating:"unicode/1f574.png?v8",busstop:"unicode/1f68f.png?v8",bust_in_silhouette:"unicode/1f464.png?v8",busts_in_silhouette:"unicode/1f465.png?v8",butter:"unicode/1f9c8.png?v8",butterfly:"unicode/1f98b.png?v8",cactus:"unicode/1f335.png?v8",cake:"unicode/1f370.png?v8",calendar:"unicode/1f4c6.png?v8",call_me_hand:"unicode/1f919.png?v8",calling:"unicode/1f4f2.png?v8",cambodia:"unicode/1f1f0-1f1ed.png?v8",camel:"unicode/1f42b.png?v8",camera:"unicode/1f4f7.png?v8",camera_flash:"unicode/1f4f8.png?v8",cameroon:"unicode/1f1e8-1f1f2.png?v8",camping:"unicode/1f3d5.png?v8",canada:"unicode/1f1e8-1f1e6.png?v8",canary_islands:"unicode/1f1ee-1f1e8.png?v8",cancer:"unicode/264b.png?v8",candle:"unicode/1f56f.png?v8",candy:"unicode/1f36c.png?v8",canned_food:"unicode/1f96b.png?v8",canoe:"unicode/1f6f6.png?v8",cape_verde:"unicode/1f1e8-1f1fb.png?v8",capital_abcd:"unicode/1f520.png?v8",capricorn:"unicode/2651.png?v8",car:"unicode/1f697.png?v8",card_file_box:"unicode/1f5c3.png?v8",card_index:"unicode/1f4c7.png?v8",card_index_dividers:"unicode/1f5c2.png?v8",caribbean_netherlands:"unicode/1f1e7-1f1f6.png?v8",carousel_horse:"unicode/1f3a0.png?v8",carpentry_saw:"unicode/1fa9a.png?v8",carrot:"unicode/1f955.png?v8",cartwheeling:"unicode/1f938.png?v8",cat:"unicode/1f431.png?v8",cat2:"unicode/1f408.png?v8",cayman_islands:"unicode/1f1f0-1f1fe.png?v8",cd:"unicode/1f4bf.png?v8",central_african_republic:"unicode/1f1e8-1f1eb.png?v8",ceuta_melilla:"unicode/1f1ea-1f1e6.png?v8",chad:"unicode/1f1f9-1f1e9.png?v8",chains:"unicode/26d3.png?v8",chair:"unicode/1fa91.png?v8",champagne:"unicode/1f37e.png?v8",chart:"unicode/1f4b9.png?v8",chart_with_downwards_trend:"unicode/1f4c9.png?v8",chart_with_upwards_trend:"unicode/1f4c8.png?v8",checkered_flag:"unicode/1f3c1.png?v8",cheese:"unicode/1f9c0.png?v8",cherries:"unicode/1f352.png?v8",cherry_blossom:"unicode/1f338.png?v8",chess_pawn:"unicode/265f.png?v8",chestnut:"unicode/1f330.png?v8",chicken:"unicode/1f414.png?v8",child:"unicode/1f9d2.png?v8",children_crossing:"unicode/1f6b8.png?v8",chile:"unicode/1f1e8-1f1f1.png?v8",chipmunk:"unicode/1f43f.png?v8",chocolate_bar:"unicode/1f36b.png?v8",chopsticks:"unicode/1f962.png?v8",christmas_island:"unicode/1f1e8-1f1fd.png?v8",christmas_tree:"unicode/1f384.png?v8",church:"unicode/26ea.png?v8",cinema:"unicode/1f3a6.png?v8",circus_tent:"unicode/1f3aa.png?v8",city_sunrise:"unicode/1f307.png?v8",city_sunset:"unicode/1f306.png?v8",cityscape:"unicode/1f3d9.png?v8",cl:"unicode/1f191.png?v8",clamp:"unicode/1f5dc.png?v8",clap:"unicode/1f44f.png?v8",clapper:"unicode/1f3ac.png?v8",classical_building:"unicode/1f3db.png?v8",climbing:"unicode/1f9d7.png?v8",climbing_man:"unicode/1f9d7-2642.png?v8",climbing_woman:"unicode/1f9d7-2640.png?v8",clinking_glasses:"unicode/1f942.png?v8",clipboard:"unicode/1f4cb.png?v8",clipperton_island:"unicode/1f1e8-1f1f5.png?v8",clock1:"unicode/1f550.png?v8",clock10:"unicode/1f559.png?v8",clock1030:"unicode/1f565.png?v8",clock11:"unicode/1f55a.png?v8",clock1130:"unicode/1f566.png?v8",clock12:"unicode/1f55b.png?v8",clock1230:"unicode/1f567.png?v8",clock130:"unicode/1f55c.png?v8",clock2:"unicode/1f551.png?v8",clock230:"unicode/1f55d.png?v8",clock3:"unicode/1f552.png?v8",clock330:"unicode/1f55e.png?v8",clock4:"unicode/1f553.png?v8",clock430:"unicode/1f55f.png?v8",clock5:"unicode/1f554.png?v8",clock530:"unicode/1f560.png?v8",clock6:"unicode/1f555.png?v8",clock630:"unicode/1f561.png?v8",clock7:"unicode/1f556.png?v8",clock730:"unicode/1f562.png?v8",clock8:"unicode/1f557.png?v8",clock830:"unicode/1f563.png?v8",clock9:"unicode/1f558.png?v8",clock930:"unicode/1f564.png?v8",closed_book:"unicode/1f4d5.png?v8",closed_lock_with_key:"unicode/1f510.png?v8",closed_umbrella:"unicode/1f302.png?v8",cloud:"unicode/2601.png?v8",cloud_with_lightning:"unicode/1f329.png?v8",cloud_with_lightning_and_rain:"unicode/26c8.png?v8",cloud_with_rain:"unicode/1f327.png?v8",cloud_with_snow:"unicode/1f328.png?v8",clown_face:"unicode/1f921.png?v8",clubs:"unicode/2663.png?v8",cn:"unicode/1f1e8-1f1f3.png?v8",coat:"unicode/1f9e5.png?v8",cockroach:"unicode/1fab3.png?v8",cocktail:"unicode/1f378.png?v8",coconut:"unicode/1f965.png?v8",cocos_islands:"unicode/1f1e8-1f1e8.png?v8",coffee:"unicode/2615.png?v8",coffin:"unicode/26b0.png?v8",coin:"unicode/1fa99.png?v8",cold_face:"unicode/1f976.png?v8",cold_sweat:"unicode/1f630.png?v8",collision:"unicode/1f4a5.png?v8",colombia:"unicode/1f1e8-1f1f4.png?v8",comet:"unicode/2604.png?v8",comoros:"unicode/1f1f0-1f1f2.png?v8",compass:"unicode/1f9ed.png?v8",computer:"unicode/1f4bb.png?v8",computer_mouse:"unicode/1f5b1.png?v8",confetti_ball:"unicode/1f38a.png?v8",confounded:"unicode/1f616.png?v8",confused:"unicode/1f615.png?v8",congo_brazzaville:"unicode/1f1e8-1f1ec.png?v8",congo_kinshasa:"unicode/1f1e8-1f1e9.png?v8",congratulations:"unicode/3297.png?v8",construction:"unicode/1f6a7.png?v8",construction_worker:"unicode/1f477.png?v8",construction_worker_man:"unicode/1f477-2642.png?v8",construction_worker_woman:"unicode/1f477-2640.png?v8",control_knobs:"unicode/1f39b.png?v8",convenience_store:"unicode/1f3ea.png?v8",cook:"unicode/1f9d1-1f373.png?v8",cook_islands:"unicode/1f1e8-1f1f0.png?v8",cookie:"unicode/1f36a.png?v8",cool:"unicode/1f192.png?v8",cop:"unicode/1f46e.png?v8",copyright:"unicode/00a9.png?v8",corn:"unicode/1f33d.png?v8",costa_rica:"unicode/1f1e8-1f1f7.png?v8",cote_divoire:"unicode/1f1e8-1f1ee.png?v8",couch_and_lamp:"unicode/1f6cb.png?v8",couple:"unicode/1f46b.png?v8",couple_with_heart:"unicode/1f491.png?v8",couple_with_heart_man_man:"unicode/1f468-2764-1f468.png?v8",couple_with_heart_woman_man:"unicode/1f469-2764-1f468.png?v8",couple_with_heart_woman_woman:"unicode/1f469-2764-1f469.png?v8",couplekiss:"unicode/1f48f.png?v8",couplekiss_man_man:"unicode/1f468-2764-1f48b-1f468.png?v8",couplekiss_man_woman:"unicode/1f469-2764-1f48b-1f468.png?v8",couplekiss_woman_woman:"unicode/1f469-2764-1f48b-1f469.png?v8",cow:"unicode/1f42e.png?v8",cow2:"unicode/1f404.png?v8",cowboy_hat_face:"unicode/1f920.png?v8",crab:"unicode/1f980.png?v8",crayon:"unicode/1f58d.png?v8",credit_card:"unicode/1f4b3.png?v8",crescent_moon:"unicode/1f319.png?v8",cricket:"unicode/1f997.png?v8",cricket_game:"unicode/1f3cf.png?v8",croatia:"unicode/1f1ed-1f1f7.png?v8",crocodile:"unicode/1f40a.png?v8",croissant:"unicode/1f950.png?v8",crossed_fingers:"unicode/1f91e.png?v8",crossed_flags:"unicode/1f38c.png?v8",crossed_swords:"unicode/2694.png?v8",crown:"unicode/1f451.png?v8",cry:"unicode/1f622.png?v8",crying_cat_face:"unicode/1f63f.png?v8",crystal_ball:"unicode/1f52e.png?v8",cuba:"unicode/1f1e8-1f1fa.png?v8",cucumber:"unicode/1f952.png?v8",cup_with_straw:"unicode/1f964.png?v8",cupcake:"unicode/1f9c1.png?v8",cupid:"unicode/1f498.png?v8",curacao:"unicode/1f1e8-1f1fc.png?v8",curling_stone:"unicode/1f94c.png?v8",curly_haired_man:"unicode/1f468-1f9b1.png?v8",curly_haired_woman:"unicode/1f469-1f9b1.png?v8",curly_loop:"unicode/27b0.png?v8",currency_exchange:"unicode/1f4b1.png?v8",curry:"unicode/1f35b.png?v8",cursing_face:"unicode/1f92c.png?v8",custard:"unicode/1f36e.png?v8",customs:"unicode/1f6c3.png?v8",cut_of_meat:"unicode/1f969.png?v8",cyclone:"unicode/1f300.png?v8",cyprus:"unicode/1f1e8-1f1fe.png?v8",czech_republic:"unicode/1f1e8-1f1ff.png?v8",dagger:"unicode/1f5e1.png?v8",dancer:"unicode/1f483.png?v8",dancers:"unicode/1f46f.png?v8",dancing_men:"unicode/1f46f-2642.png?v8",dancing_women:"unicode/1f46f-2640.png?v8",dango:"unicode/1f361.png?v8",dark_sunglasses:"unicode/1f576.png?v8",dart:"unicode/1f3af.png?v8",dash:"unicode/1f4a8.png?v8",date:"unicode/1f4c5.png?v8",de:"unicode/1f1e9-1f1ea.png?v8",deaf_man:"unicode/1f9cf-2642.png?v8",deaf_person:"unicode/1f9cf.png?v8",deaf_woman:"unicode/1f9cf-2640.png?v8",deciduous_tree:"unicode/1f333.png?v8",deer:"unicode/1f98c.png?v8",denmark:"unicode/1f1e9-1f1f0.png?v8",department_store:"unicode/1f3ec.png?v8",derelict_house:"unicode/1f3da.png?v8",desert:"unicode/1f3dc.png?v8",desert_island:"unicode/1f3dd.png?v8",desktop_computer:"unicode/1f5a5.png?v8",detective:"unicode/1f575.png?v8",diamond_shape_with_a_dot_inside:"unicode/1f4a0.png?v8",diamonds:"unicode/2666.png?v8",diego_garcia:"unicode/1f1e9-1f1ec.png?v8",disappointed:"unicode/1f61e.png?v8",disappointed_relieved:"unicode/1f625.png?v8",disguised_face:"unicode/1f978.png?v8",diving_mask:"unicode/1f93f.png?v8",diya_lamp:"unicode/1fa94.png?v8",dizzy:"unicode/1f4ab.png?v8",dizzy_face:"unicode/1f635.png?v8",djibouti:"unicode/1f1e9-1f1ef.png?v8",dna:"unicode/1f9ec.png?v8",do_not_litter:"unicode/1f6af.png?v8",dodo:"unicode/1f9a4.png?v8",dog:"unicode/1f436.png?v8",dog2:"unicode/1f415.png?v8",dollar:"unicode/1f4b5.png?v8",dolls:"unicode/1f38e.png?v8",dolphin:"unicode/1f42c.png?v8",dominica:"unicode/1f1e9-1f1f2.png?v8",dominican_republic:"unicode/1f1e9-1f1f4.png?v8",door:"unicode/1f6aa.png?v8",doughnut:"unicode/1f369.png?v8",dove:"unicode/1f54a.png?v8",dragon:"unicode/1f409.png?v8",dragon_face:"unicode/1f432.png?v8",dress:"unicode/1f457.png?v8",dromedary_camel:"unicode/1f42a.png?v8",drooling_face:"unicode/1f924.png?v8",drop_of_blood:"unicode/1fa78.png?v8",droplet:"unicode/1f4a7.png?v8",drum:"unicode/1f941.png?v8",duck:"unicode/1f986.png?v8",dumpling:"unicode/1f95f.png?v8",dvd:"unicode/1f4c0.png?v8","e-mail":"unicode/1f4e7.png?v8",eagle:"unicode/1f985.png?v8",ear:"unicode/1f442.png?v8",ear_of_rice:"unicode/1f33e.png?v8",ear_with_hearing_aid:"unicode/1f9bb.png?v8",earth_africa:"unicode/1f30d.png?v8",earth_americas:"unicode/1f30e.png?v8",earth_asia:"unicode/1f30f.png?v8",ecuador:"unicode/1f1ea-1f1e8.png?v8",egg:"unicode/1f95a.png?v8",eggplant:"unicode/1f346.png?v8",egypt:"unicode/1f1ea-1f1ec.png?v8",eight:"unicode/0038-20e3.png?v8",eight_pointed_black_star:"unicode/2734.png?v8",eight_spoked_asterisk:"unicode/2733.png?v8",eject_button:"unicode/23cf.png?v8",el_salvador:"unicode/1f1f8-1f1fb.png?v8",electric_plug:"unicode/1f50c.png?v8",electron:"electron.png?v8",elephant:"unicode/1f418.png?v8",elevator:"unicode/1f6d7.png?v8",elf:"unicode/1f9dd.png?v8",elf_man:"unicode/1f9dd-2642.png?v8",elf_woman:"unicode/1f9dd-2640.png?v8",email:"unicode/1f4e7.png?v8",end:"unicode/1f51a.png?v8",england:"unicode/1f3f4-e0067-e0062-e0065-e006e-e0067-e007f.png?v8",envelope:"unicode/2709.png?v8",envelope_with_arrow:"unicode/1f4e9.png?v8",equatorial_guinea:"unicode/1f1ec-1f1f6.png?v8",eritrea:"unicode/1f1ea-1f1f7.png?v8",es:"unicode/1f1ea-1f1f8.png?v8",estonia:"unicode/1f1ea-1f1ea.png?v8",ethiopia:"unicode/1f1ea-1f1f9.png?v8",eu:"unicode/1f1ea-1f1fa.png?v8",euro:"unicode/1f4b6.png?v8",european_castle:"unicode/1f3f0.png?v8",european_post_office:"unicode/1f3e4.png?v8",european_union:"unicode/1f1ea-1f1fa.png?v8",evergreen_tree:"unicode/1f332.png?v8",exclamation:"unicode/2757.png?v8",exploding_head:"unicode/1f92f.png?v8",expressionless:"unicode/1f611.png?v8",eye:"unicode/1f441.png?v8",eye_speech_bubble:"unicode/1f441-1f5e8.png?v8",eyeglasses:"unicode/1f453.png?v8",eyes:"unicode/1f440.png?v8",face_exhaling:"unicode/1f62e-1f4a8.png?v8",face_in_clouds:"unicode/1f636-1f32b.png?v8",face_with_head_bandage:"unicode/1f915.png?v8",face_with_spiral_eyes:"unicode/1f635-1f4ab.png?v8",face_with_thermometer:"unicode/1f912.png?v8",facepalm:"unicode/1f926.png?v8",facepunch:"unicode/1f44a.png?v8",factory:"unicode/1f3ed.png?v8",factory_worker:"unicode/1f9d1-1f3ed.png?v8",fairy:"unicode/1f9da.png?v8",fairy_man:"unicode/1f9da-2642.png?v8",fairy_woman:"unicode/1f9da-2640.png?v8",falafel:"unicode/1f9c6.png?v8",falkland_islands:"unicode/1f1eb-1f1f0.png?v8",fallen_leaf:"unicode/1f342.png?v8",family:"unicode/1f46a.png?v8",family_man_boy:"unicode/1f468-1f466.png?v8",family_man_boy_boy:"unicode/1f468-1f466-1f466.png?v8",family_man_girl:"unicode/1f468-1f467.png?v8",family_man_girl_boy:"unicode/1f468-1f467-1f466.png?v8",family_man_girl_girl:"unicode/1f468-1f467-1f467.png?v8",family_man_man_boy:"unicode/1f468-1f468-1f466.png?v8",family_man_man_boy_boy:"unicode/1f468-1f468-1f466-1f466.png?v8",family_man_man_girl:"unicode/1f468-1f468-1f467.png?v8",family_man_man_girl_boy:"unicode/1f468-1f468-1f467-1f466.png?v8",family_man_man_girl_girl:"unicode/1f468-1f468-1f467-1f467.png?v8",family_man_woman_boy:"unicode/1f468-1f469-1f466.png?v8",family_man_woman_boy_boy:"unicode/1f468-1f469-1f466-1f466.png?v8",family_man_woman_girl:"unicode/1f468-1f469-1f467.png?v8",family_man_woman_girl_boy:"unicode/1f468-1f469-1f467-1f466.png?v8",family_man_woman_girl_girl:"unicode/1f468-1f469-1f467-1f467.png?v8",family_woman_boy:"unicode/1f469-1f466.png?v8",family_woman_boy_boy:"unicode/1f469-1f466-1f466.png?v8",family_woman_girl:"unicode/1f469-1f467.png?v8",family_woman_girl_boy:"unicode/1f469-1f467-1f466.png?v8",family_woman_girl_girl:"unicode/1f469-1f467-1f467.png?v8",family_woman_woman_boy:"unicode/1f469-1f469-1f466.png?v8",family_woman_woman_boy_boy:"unicode/1f469-1f469-1f466-1f466.png?v8",family_woman_woman_girl:"unicode/1f469-1f469-1f467.png?v8",family_woman_woman_girl_boy:"unicode/1f469-1f469-1f467-1f466.png?v8",family_woman_woman_girl_girl:"unicode/1f469-1f469-1f467-1f467.png?v8",farmer:"unicode/1f9d1-1f33e.png?v8",faroe_islands:"unicode/1f1eb-1f1f4.png?v8",fast_forward:"unicode/23e9.png?v8",fax:"unicode/1f4e0.png?v8",fearful:"unicode/1f628.png?v8",feather:"unicode/1fab6.png?v8",feelsgood:"feelsgood.png?v8",feet:"unicode/1f43e.png?v8",female_detective:"unicode/1f575-2640.png?v8",female_sign:"unicode/2640.png?v8",ferris_wheel:"unicode/1f3a1.png?v8",ferry:"unicode/26f4.png?v8",field_hockey:"unicode/1f3d1.png?v8",fiji:"unicode/1f1eb-1f1ef.png?v8",file_cabinet:"unicode/1f5c4.png?v8",file_folder:"unicode/1f4c1.png?v8",film_projector:"unicode/1f4fd.png?v8",film_strip:"unicode/1f39e.png?v8",finland:"unicode/1f1eb-1f1ee.png?v8",finnadie:"finnadie.png?v8",fire:"unicode/1f525.png?v8",fire_engine:"unicode/1f692.png?v8",fire_extinguisher:"unicode/1f9ef.png?v8",firecracker:"unicode/1f9e8.png?v8",firefighter:"unicode/1f9d1-1f692.png?v8",fireworks:"unicode/1f386.png?v8",first_quarter_moon:"unicode/1f313.png?v8",first_quarter_moon_with_face:"unicode/1f31b.png?v8",fish:"unicode/1f41f.png?v8",fish_cake:"unicode/1f365.png?v8",fishing_pole_and_fish:"unicode/1f3a3.png?v8",fist:"unicode/270a.png?v8",fist_left:"unicode/1f91b.png?v8",fist_oncoming:"unicode/1f44a.png?v8",fist_raised:"unicode/270a.png?v8",fist_right:"unicode/1f91c.png?v8",five:"unicode/0035-20e3.png?v8",flags:"unicode/1f38f.png?v8",flamingo:"unicode/1f9a9.png?v8",flashlight:"unicode/1f526.png?v8",flat_shoe:"unicode/1f97f.png?v8",flatbread:"unicode/1fad3.png?v8",fleur_de_lis:"unicode/269c.png?v8",flight_arrival:"unicode/1f6ec.png?v8",flight_departure:"unicode/1f6eb.png?v8",flipper:"unicode/1f42c.png?v8",floppy_disk:"unicode/1f4be.png?v8",flower_playing_cards:"unicode/1f3b4.png?v8",flushed:"unicode/1f633.png?v8",fly:"unicode/1fab0.png?v8",flying_disc:"unicode/1f94f.png?v8",flying_saucer:"unicode/1f6f8.png?v8",fog:"unicode/1f32b.png?v8",foggy:"unicode/1f301.png?v8",fondue:"unicode/1fad5.png?v8",foot:"unicode/1f9b6.png?v8",football:"unicode/1f3c8.png?v8",footprints:"unicode/1f463.png?v8",fork_and_knife:"unicode/1f374.png?v8",fortune_cookie:"unicode/1f960.png?v8",fountain:"unicode/26f2.png?v8",fountain_pen:"unicode/1f58b.png?v8",four:"unicode/0034-20e3.png?v8",four_leaf_clover:"unicode/1f340.png?v8",fox_face:"unicode/1f98a.png?v8",fr:"unicode/1f1eb-1f1f7.png?v8",framed_picture:"unicode/1f5bc.png?v8",free:"unicode/1f193.png?v8",french_guiana:"unicode/1f1ec-1f1eb.png?v8",french_polynesia:"unicode/1f1f5-1f1eb.png?v8",french_southern_territories:"unicode/1f1f9-1f1eb.png?v8",fried_egg:"unicode/1f373.png?v8",fried_shrimp:"unicode/1f364.png?v8",fries:"unicode/1f35f.png?v8",frog:"unicode/1f438.png?v8",frowning:"unicode/1f626.png?v8",frowning_face:"unicode/2639.png?v8",frowning_man:"unicode/1f64d-2642.png?v8",frowning_person:"unicode/1f64d.png?v8",frowning_woman:"unicode/1f64d-2640.png?v8",fu:"unicode/1f595.png?v8",fuelpump:"unicode/26fd.png?v8",full_moon:"unicode/1f315.png?v8",full_moon_with_face:"unicode/1f31d.png?v8",funeral_urn:"unicode/26b1.png?v8",gabon:"unicode/1f1ec-1f1e6.png?v8",gambia:"unicode/1f1ec-1f1f2.png?v8",game_die:"unicode/1f3b2.png?v8",garlic:"unicode/1f9c4.png?v8",gb:"unicode/1f1ec-1f1e7.png?v8",gear:"unicode/2699.png?v8",gem:"unicode/1f48e.png?v8",gemini:"unicode/264a.png?v8",genie:"unicode/1f9de.png?v8",genie_man:"unicode/1f9de-2642.png?v8",genie_woman:"unicode/1f9de-2640.png?v8",georgia:"unicode/1f1ec-1f1ea.png?v8",ghana:"unicode/1f1ec-1f1ed.png?v8",ghost:"unicode/1f47b.png?v8",gibraltar:"unicode/1f1ec-1f1ee.png?v8",gift:"unicode/1f381.png?v8",gift_heart:"unicode/1f49d.png?v8",giraffe:"unicode/1f992.png?v8",girl:"unicode/1f467.png?v8",globe_with_meridians:"unicode/1f310.png?v8",gloves:"unicode/1f9e4.png?v8",goal_net:"unicode/1f945.png?v8",goat:"unicode/1f410.png?v8",goberserk:"goberserk.png?v8",godmode:"godmode.png?v8",goggles:"unicode/1f97d.png?v8",golf:"unicode/26f3.png?v8",golfing:"unicode/1f3cc.png?v8",golfing_man:"unicode/1f3cc-2642.png?v8",golfing_woman:"unicode/1f3cc-2640.png?v8",gorilla:"unicode/1f98d.png?v8",grapes:"unicode/1f347.png?v8",greece:"unicode/1f1ec-1f1f7.png?v8",green_apple:"unicode/1f34f.png?v8",green_book:"unicode/1f4d7.png?v8",green_circle:"unicode/1f7e2.png?v8",green_heart:"unicode/1f49a.png?v8",green_salad:"unicode/1f957.png?v8",green_square:"unicode/1f7e9.png?v8",greenland:"unicode/1f1ec-1f1f1.png?v8",grenada:"unicode/1f1ec-1f1e9.png?v8",grey_exclamation:"unicode/2755.png?v8",grey_question:"unicode/2754.png?v8",grimacing:"unicode/1f62c.png?v8",grin:"unicode/1f601.png?v8",grinning:"unicode/1f600.png?v8",guadeloupe:"unicode/1f1ec-1f1f5.png?v8",guam:"unicode/1f1ec-1f1fa.png?v8",guard:"unicode/1f482.png?v8",guardsman:"unicode/1f482-2642.png?v8",guardswoman:"unicode/1f482-2640.png?v8",guatemala:"unicode/1f1ec-1f1f9.png?v8",guernsey:"unicode/1f1ec-1f1ec.png?v8",guide_dog:"unicode/1f9ae.png?v8",guinea:"unicode/1f1ec-1f1f3.png?v8",guinea_bissau:"unicode/1f1ec-1f1fc.png?v8",guitar:"unicode/1f3b8.png?v8",gun:"unicode/1f52b.png?v8",guyana:"unicode/1f1ec-1f1fe.png?v8",haircut:"unicode/1f487.png?v8",haircut_man:"unicode/1f487-2642.png?v8",haircut_woman:"unicode/1f487-2640.png?v8",haiti:"unicode/1f1ed-1f1f9.png?v8",hamburger:"unicode/1f354.png?v8",hammer:"unicode/1f528.png?v8",hammer_and_pick:"unicode/2692.png?v8",hammer_and_wrench:"unicode/1f6e0.png?v8",hamster:"unicode/1f439.png?v8",hand:"unicode/270b.png?v8",hand_over_mouth:"unicode/1f92d.png?v8",handbag:"unicode/1f45c.png?v8",handball_person:"unicode/1f93e.png?v8",handshake:"unicode/1f91d.png?v8",hankey:"unicode/1f4a9.png?v8",hash:"unicode/0023-20e3.png?v8",hatched_chick:"unicode/1f425.png?v8",hatching_chick:"unicode/1f423.png?v8",headphones:"unicode/1f3a7.png?v8",headstone:"unicode/1faa6.png?v8",health_worker:"unicode/1f9d1-2695.png?v8",hear_no_evil:"unicode/1f649.png?v8",heard_mcdonald_islands:"unicode/1f1ed-1f1f2.png?v8",heart:"unicode/2764.png?v8",heart_decoration:"unicode/1f49f.png?v8",heart_eyes:"unicode/1f60d.png?v8",heart_eyes_cat:"unicode/1f63b.png?v8",heart_on_fire:"unicode/2764-1f525.png?v8",heartbeat:"unicode/1f493.png?v8",heartpulse:"unicode/1f497.png?v8",hearts:"unicode/2665.png?v8",heavy_check_mark:"unicode/2714.png?v8",heavy_division_sign:"unicode/2797.png?v8",heavy_dollar_sign:"unicode/1f4b2.png?v8",heavy_exclamation_mark:"unicode/2757.png?v8",heavy_heart_exclamation:"unicode/2763.png?v8",heavy_minus_sign:"unicode/2796.png?v8",heavy_multiplication_x:"unicode/2716.png?v8",heavy_plus_sign:"unicode/2795.png?v8",hedgehog:"unicode/1f994.png?v8",helicopter:"unicode/1f681.png?v8",herb:"unicode/1f33f.png?v8",hibiscus:"unicode/1f33a.png?v8",high_brightness:"unicode/1f506.png?v8",high_heel:"unicode/1f460.png?v8",hiking_boot:"unicode/1f97e.png?v8",hindu_temple:"unicode/1f6d5.png?v8",hippopotamus:"unicode/1f99b.png?v8",hocho:"unicode/1f52a.png?v8",hole:"unicode/1f573.png?v8",honduras:"unicode/1f1ed-1f1f3.png?v8",honey_pot:"unicode/1f36f.png?v8",honeybee:"unicode/1f41d.png?v8",hong_kong:"unicode/1f1ed-1f1f0.png?v8",hook:"unicode/1fa9d.png?v8",horse:"unicode/1f434.png?v8",horse_racing:"unicode/1f3c7.png?v8",hospital:"unicode/1f3e5.png?v8",hot_face:"unicode/1f975.png?v8",hot_pepper:"unicode/1f336.png?v8",hotdog:"unicode/1f32d.png?v8",hotel:"unicode/1f3e8.png?v8",hotsprings:"unicode/2668.png?v8",hourglass:"unicode/231b.png?v8",hourglass_flowing_sand:"unicode/23f3.png?v8",house:"unicode/1f3e0.png?v8",house_with_garden:"unicode/1f3e1.png?v8",houses:"unicode/1f3d8.png?v8",hugs:"unicode/1f917.png?v8",hungary:"unicode/1f1ed-1f1fa.png?v8",hurtrealbad:"hurtrealbad.png?v8",hushed:"unicode/1f62f.png?v8",hut:"unicode/1f6d6.png?v8",ice_cream:"unicode/1f368.png?v8",ice_cube:"unicode/1f9ca.png?v8",ice_hockey:"unicode/1f3d2.png?v8",ice_skate:"unicode/26f8.png?v8",icecream:"unicode/1f366.png?v8",iceland:"unicode/1f1ee-1f1f8.png?v8",id:"unicode/1f194.png?v8",ideograph_advantage:"unicode/1f250.png?v8",imp:"unicode/1f47f.png?v8",inbox_tray:"unicode/1f4e5.png?v8",incoming_envelope:"unicode/1f4e8.png?v8",india:"unicode/1f1ee-1f1f3.png?v8",indonesia:"unicode/1f1ee-1f1e9.png?v8",infinity:"unicode/267e.png?v8",information_desk_person:"unicode/1f481.png?v8",information_source:"unicode/2139.png?v8",innocent:"unicode/1f607.png?v8",interrobang:"unicode/2049.png?v8",iphone:"unicode/1f4f1.png?v8",iran:"unicode/1f1ee-1f1f7.png?v8",iraq:"unicode/1f1ee-1f1f6.png?v8",ireland:"unicode/1f1ee-1f1ea.png?v8",isle_of_man:"unicode/1f1ee-1f1f2.png?v8",israel:"unicode/1f1ee-1f1f1.png?v8",it:"unicode/1f1ee-1f1f9.png?v8",izakaya_lantern:"unicode/1f3ee.png?v8",jack_o_lantern:"unicode/1f383.png?v8",jamaica:"unicode/1f1ef-1f1f2.png?v8",japan:"unicode/1f5fe.png?v8",japanese_castle:"unicode/1f3ef.png?v8",japanese_goblin:"unicode/1f47a.png?v8",japanese_ogre:"unicode/1f479.png?v8",jeans:"unicode/1f456.png?v8",jersey:"unicode/1f1ef-1f1ea.png?v8",jigsaw:"unicode/1f9e9.png?v8",jordan:"unicode/1f1ef-1f1f4.png?v8",joy:"unicode/1f602.png?v8",joy_cat:"unicode/1f639.png?v8",joystick:"unicode/1f579.png?v8",jp:"unicode/1f1ef-1f1f5.png?v8",judge:"unicode/1f9d1-2696.png?v8",juggling_person:"unicode/1f939.png?v8",kaaba:"unicode/1f54b.png?v8",kangaroo:"unicode/1f998.png?v8",kazakhstan:"unicode/1f1f0-1f1ff.png?v8",kenya:"unicode/1f1f0-1f1ea.png?v8",key:"unicode/1f511.png?v8",keyboard:"unicode/2328.png?v8",keycap_ten:"unicode/1f51f.png?v8",kick_scooter:"unicode/1f6f4.png?v8",kimono:"unicode/1f458.png?v8",kiribati:"unicode/1f1f0-1f1ee.png?v8",kiss:"unicode/1f48b.png?v8",kissing:"unicode/1f617.png?v8",kissing_cat:"unicode/1f63d.png?v8",kissing_closed_eyes:"unicode/1f61a.png?v8",kissing_heart:"unicode/1f618.png?v8",kissing_smiling_eyes:"unicode/1f619.png?v8",kite:"unicode/1fa81.png?v8",kiwi_fruit:"unicode/1f95d.png?v8",kneeling_man:"unicode/1f9ce-2642.png?v8",kneeling_person:"unicode/1f9ce.png?v8",kneeling_woman:"unicode/1f9ce-2640.png?v8",knife:"unicode/1f52a.png?v8",knot:"unicode/1faa2.png?v8",koala:"unicode/1f428.png?v8",koko:"unicode/1f201.png?v8",kosovo:"unicode/1f1fd-1f1f0.png?v8",kr:"unicode/1f1f0-1f1f7.png?v8",kuwait:"unicode/1f1f0-1f1fc.png?v8",kyrgyzstan:"unicode/1f1f0-1f1ec.png?v8",lab_coat:"unicode/1f97c.png?v8",label:"unicode/1f3f7.png?v8",lacrosse:"unicode/1f94d.png?v8",ladder:"unicode/1fa9c.png?v8",lady_beetle:"unicode/1f41e.png?v8",lantern:"unicode/1f3ee.png?v8",laos:"unicode/1f1f1-1f1e6.png?v8",large_blue_circle:"unicode/1f535.png?v8",large_blue_diamond:"unicode/1f537.png?v8",large_orange_diamond:"unicode/1f536.png?v8",last_quarter_moon:"unicode/1f317.png?v8",last_quarter_moon_with_face:"unicode/1f31c.png?v8",latin_cross:"unicode/271d.png?v8",latvia:"unicode/1f1f1-1f1fb.png?v8",laughing:"unicode/1f606.png?v8",leafy_green:"unicode/1f96c.png?v8",leaves:"unicode/1f343.png?v8",lebanon:"unicode/1f1f1-1f1e7.png?v8",ledger:"unicode/1f4d2.png?v8",left_luggage:"unicode/1f6c5.png?v8",left_right_arrow:"unicode/2194.png?v8",left_speech_bubble:"unicode/1f5e8.png?v8",leftwards_arrow_with_hook:"unicode/21a9.png?v8",leg:"unicode/1f9b5.png?v8",lemon:"unicode/1f34b.png?v8",leo:"unicode/264c.png?v8",leopard:"unicode/1f406.png?v8",lesotho:"unicode/1f1f1-1f1f8.png?v8",level_slider:"unicode/1f39a.png?v8",liberia:"unicode/1f1f1-1f1f7.png?v8",libra:"unicode/264e.png?v8",libya:"unicode/1f1f1-1f1fe.png?v8",liechtenstein:"unicode/1f1f1-1f1ee.png?v8",light_rail:"unicode/1f688.png?v8",link:"unicode/1f517.png?v8",lion:"unicode/1f981.png?v8",lips:"unicode/1f444.png?v8",lipstick:"unicode/1f484.png?v8",lithuania:"unicode/1f1f1-1f1f9.png?v8",lizard:"unicode/1f98e.png?v8",llama:"unicode/1f999.png?v8",lobster:"unicode/1f99e.png?v8",lock:"unicode/1f512.png?v8",lock_with_ink_pen:"unicode/1f50f.png?v8",lollipop:"unicode/1f36d.png?v8",long_drum:"unicode/1fa98.png?v8",loop:"unicode/27bf.png?v8",lotion_bottle:"unicode/1f9f4.png?v8",lotus_position:"unicode/1f9d8.png?v8",lotus_position_man:"unicode/1f9d8-2642.png?v8",lotus_position_woman:"unicode/1f9d8-2640.png?v8",loud_sound:"unicode/1f50a.png?v8",loudspeaker:"unicode/1f4e2.png?v8",love_hotel:"unicode/1f3e9.png?v8",love_letter:"unicode/1f48c.png?v8",love_you_gesture:"unicode/1f91f.png?v8",low_brightness:"unicode/1f505.png?v8",luggage:"unicode/1f9f3.png?v8",lungs:"unicode/1fac1.png?v8",luxembourg:"unicode/1f1f1-1f1fa.png?v8",lying_face:"unicode/1f925.png?v8",m:"unicode/24c2.png?v8",macau:"unicode/1f1f2-1f1f4.png?v8",macedonia:"unicode/1f1f2-1f1f0.png?v8",madagascar:"unicode/1f1f2-1f1ec.png?v8",mag:"unicode/1f50d.png?v8",mag_right:"unicode/1f50e.png?v8",mage:"unicode/1f9d9.png?v8",mage_man:"unicode/1f9d9-2642.png?v8",mage_woman:"unicode/1f9d9-2640.png?v8",magic_wand:"unicode/1fa84.png?v8",magnet:"unicode/1f9f2.png?v8",mahjong:"unicode/1f004.png?v8",mailbox:"unicode/1f4eb.png?v8",mailbox_closed:"unicode/1f4ea.png?v8",mailbox_with_mail:"unicode/1f4ec.png?v8",mailbox_with_no_mail:"unicode/1f4ed.png?v8",malawi:"unicode/1f1f2-1f1fc.png?v8",malaysia:"unicode/1f1f2-1f1fe.png?v8",maldives:"unicode/1f1f2-1f1fb.png?v8",male_detective:"unicode/1f575-2642.png?v8",male_sign:"unicode/2642.png?v8",mali:"unicode/1f1f2-1f1f1.png?v8",malta:"unicode/1f1f2-1f1f9.png?v8",mammoth:"unicode/1f9a3.png?v8",man:"unicode/1f468.png?v8",man_artist:"unicode/1f468-1f3a8.png?v8",man_astronaut:"unicode/1f468-1f680.png?v8",man_beard:"unicode/1f9d4-2642.png?v8",man_cartwheeling:"unicode/1f938-2642.png?v8",man_cook:"unicode/1f468-1f373.png?v8",man_dancing:"unicode/1f57a.png?v8",man_facepalming:"unicode/1f926-2642.png?v8",man_factory_worker:"unicode/1f468-1f3ed.png?v8",man_farmer:"unicode/1f468-1f33e.png?v8",man_feeding_baby:"unicode/1f468-1f37c.png?v8",man_firefighter:"unicode/1f468-1f692.png?v8",man_health_worker:"unicode/1f468-2695.png?v8",man_in_manual_wheelchair:"unicode/1f468-1f9bd.png?v8",man_in_motorized_wheelchair:"unicode/1f468-1f9bc.png?v8",man_in_tuxedo:"unicode/1f935-2642.png?v8",man_judge:"unicode/1f468-2696.png?v8",man_juggling:"unicode/1f939-2642.png?v8",man_mechanic:"unicode/1f468-1f527.png?v8",man_office_worker:"unicode/1f468-1f4bc.png?v8",man_pilot:"unicode/1f468-2708.png?v8",man_playing_handball:"unicode/1f93e-2642.png?v8",man_playing_water_polo:"unicode/1f93d-2642.png?v8",man_scientist:"unicode/1f468-1f52c.png?v8",man_shrugging:"unicode/1f937-2642.png?v8",man_singer:"unicode/1f468-1f3a4.png?v8",man_student:"unicode/1f468-1f393.png?v8",man_teacher:"unicode/1f468-1f3eb.png?v8",man_technologist:"unicode/1f468-1f4bb.png?v8",man_with_gua_pi_mao:"unicode/1f472.png?v8",man_with_probing_cane:"unicode/1f468-1f9af.png?v8",man_with_turban:"unicode/1f473-2642.png?v8",man_with_veil:"unicode/1f470-2642.png?v8",mandarin:"unicode/1f34a.png?v8",mango:"unicode/1f96d.png?v8",mans_shoe:"unicode/1f45e.png?v8",mantelpiece_clock:"unicode/1f570.png?v8",manual_wheelchair:"unicode/1f9bd.png?v8",maple_leaf:"unicode/1f341.png?v8",marshall_islands:"unicode/1f1f2-1f1ed.png?v8",martial_arts_uniform:"unicode/1f94b.png?v8",martinique:"unicode/1f1f2-1f1f6.png?v8",mask:"unicode/1f637.png?v8",massage:"unicode/1f486.png?v8",massage_man:"unicode/1f486-2642.png?v8",massage_woman:"unicode/1f486-2640.png?v8",mate:"unicode/1f9c9.png?v8",mauritania:"unicode/1f1f2-1f1f7.png?v8",mauritius:"unicode/1f1f2-1f1fa.png?v8",mayotte:"unicode/1f1fe-1f1f9.png?v8",meat_on_bone:"unicode/1f356.png?v8",mechanic:"unicode/1f9d1-1f527.png?v8",mechanical_arm:"unicode/1f9be.png?v8",mechanical_leg:"unicode/1f9bf.png?v8",medal_military:"unicode/1f396.png?v8",medal_sports:"unicode/1f3c5.png?v8",medical_symbol:"unicode/2695.png?v8",mega:"unicode/1f4e3.png?v8",melon:"unicode/1f348.png?v8",memo:"unicode/1f4dd.png?v8",men_wrestling:"unicode/1f93c-2642.png?v8",mending_heart:"unicode/2764-1fa79.png?v8",menorah:"unicode/1f54e.png?v8",mens:"unicode/1f6b9.png?v8",mermaid:"unicode/1f9dc-2640.png?v8",merman:"unicode/1f9dc-2642.png?v8",merperson:"unicode/1f9dc.png?v8",metal:"unicode/1f918.png?v8",metro:"unicode/1f687.png?v8",mexico:"unicode/1f1f2-1f1fd.png?v8",microbe:"unicode/1f9a0.png?v8",micronesia:"unicode/1f1eb-1f1f2.png?v8",microphone:"unicode/1f3a4.png?v8",microscope:"unicode/1f52c.png?v8",middle_finger:"unicode/1f595.png?v8",military_helmet:"unicode/1fa96.png?v8",milk_glass:"unicode/1f95b.png?v8",milky_way:"unicode/1f30c.png?v8",minibus:"unicode/1f690.png?v8",minidisc:"unicode/1f4bd.png?v8",mirror:"unicode/1fa9e.png?v8",mobile_phone_off:"unicode/1f4f4.png?v8",moldova:"unicode/1f1f2-1f1e9.png?v8",monaco:"unicode/1f1f2-1f1e8.png?v8",money_mouth_face:"unicode/1f911.png?v8",money_with_wings:"unicode/1f4b8.png?v8",moneybag:"unicode/1f4b0.png?v8",mongolia:"unicode/1f1f2-1f1f3.png?v8",monkey:"unicode/1f412.png?v8",monkey_face:"unicode/1f435.png?v8",monocle_face:"unicode/1f9d0.png?v8",monorail:"unicode/1f69d.png?v8",montenegro:"unicode/1f1f2-1f1ea.png?v8",montserrat:"unicode/1f1f2-1f1f8.png?v8",moon:"unicode/1f314.png?v8",moon_cake:"unicode/1f96e.png?v8",morocco:"unicode/1f1f2-1f1e6.png?v8",mortar_board:"unicode/1f393.png?v8",mosque:"unicode/1f54c.png?v8",mosquito:"unicode/1f99f.png?v8",motor_boat:"unicode/1f6e5.png?v8",motor_scooter:"unicode/1f6f5.png?v8",motorcycle:"unicode/1f3cd.png?v8",motorized_wheelchair:"unicode/1f9bc.png?v8",motorway:"unicode/1f6e3.png?v8",mount_fuji:"unicode/1f5fb.png?v8",mountain:"unicode/26f0.png?v8",mountain_bicyclist:"unicode/1f6b5.png?v8",mountain_biking_man:"unicode/1f6b5-2642.png?v8",mountain_biking_woman:"unicode/1f6b5-2640.png?v8",mountain_cableway:"unicode/1f6a0.png?v8",mountain_railway:"unicode/1f69e.png?v8",mountain_snow:"unicode/1f3d4.png?v8",mouse:"unicode/1f42d.png?v8",mouse2:"unicode/1f401.png?v8",mouse_trap:"unicode/1faa4.png?v8",movie_camera:"unicode/1f3a5.png?v8",moyai:"unicode/1f5ff.png?v8",mozambique:"unicode/1f1f2-1f1ff.png?v8",mrs_claus:"unicode/1f936.png?v8",muscle:"unicode/1f4aa.png?v8",mushroom:"unicode/1f344.png?v8",musical_keyboard:"unicode/1f3b9.png?v8",musical_note:"unicode/1f3b5.png?v8",musical_score:"unicode/1f3bc.png?v8",mute:"unicode/1f507.png?v8",mx_claus:"unicode/1f9d1-1f384.png?v8",myanmar:"unicode/1f1f2-1f1f2.png?v8",nail_care:"unicode/1f485.png?v8",name_badge:"unicode/1f4db.png?v8",namibia:"unicode/1f1f3-1f1e6.png?v8",national_park:"unicode/1f3de.png?v8",nauru:"unicode/1f1f3-1f1f7.png?v8",nauseated_face:"unicode/1f922.png?v8",nazar_amulet:"unicode/1f9ff.png?v8",neckbeard:"neckbeard.png?v8",necktie:"unicode/1f454.png?v8",negative_squared_cross_mark:"unicode/274e.png?v8",nepal:"unicode/1f1f3-1f1f5.png?v8",nerd_face:"unicode/1f913.png?v8",nesting_dolls:"unicode/1fa86.png?v8",netherlands:"unicode/1f1f3-1f1f1.png?v8",neutral_face:"unicode/1f610.png?v8",new:"unicode/1f195.png?v8",new_caledonia:"unicode/1f1f3-1f1e8.png?v8",new_moon:"unicode/1f311.png?v8",new_moon_with_face:"unicode/1f31a.png?v8",new_zealand:"unicode/1f1f3-1f1ff.png?v8",newspaper:"unicode/1f4f0.png?v8",newspaper_roll:"unicode/1f5de.png?v8",next_track_button:"unicode/23ed.png?v8",ng:"unicode/1f196.png?v8",ng_man:"unicode/1f645-2642.png?v8",ng_woman:"unicode/1f645-2640.png?v8",nicaragua:"unicode/1f1f3-1f1ee.png?v8",niger:"unicode/1f1f3-1f1ea.png?v8",nigeria:"unicode/1f1f3-1f1ec.png?v8",night_with_stars:"unicode/1f303.png?v8",nine:"unicode/0039-20e3.png?v8",ninja:"unicode/1f977.png?v8",niue:"unicode/1f1f3-1f1fa.png?v8",no_bell:"unicode/1f515.png?v8",no_bicycles:"unicode/1f6b3.png?v8",no_entry:"unicode/26d4.png?v8",no_entry_sign:"unicode/1f6ab.png?v8",no_good:"unicode/1f645.png?v8",no_good_man:"unicode/1f645-2642.png?v8",no_good_woman:"unicode/1f645-2640.png?v8",no_mobile_phones:"unicode/1f4f5.png?v8",no_mouth:"unicode/1f636.png?v8",no_pedestrians:"unicode/1f6b7.png?v8",no_smoking:"unicode/1f6ad.png?v8","non-potable_water":"unicode/1f6b1.png?v8",norfolk_island:"unicode/1f1f3-1f1eb.png?v8",north_korea:"unicode/1f1f0-1f1f5.png?v8",northern_mariana_islands:"unicode/1f1f2-1f1f5.png?v8",norway:"unicode/1f1f3-1f1f4.png?v8",nose:"unicode/1f443.png?v8",notebook:"unicode/1f4d3.png?v8",notebook_with_decorative_cover:"unicode/1f4d4.png?v8",notes:"unicode/1f3b6.png?v8",nut_and_bolt:"unicode/1f529.png?v8",o:"unicode/2b55.png?v8",o2:"unicode/1f17e.png?v8",ocean:"unicode/1f30a.png?v8",octocat:"octocat.png?v8",octopus:"unicode/1f419.png?v8",oden:"unicode/1f362.png?v8",office:"unicode/1f3e2.png?v8",office_worker:"unicode/1f9d1-1f4bc.png?v8",oil_drum:"unicode/1f6e2.png?v8",ok:"unicode/1f197.png?v8",ok_hand:"unicode/1f44c.png?v8",ok_man:"unicode/1f646-2642.png?v8",ok_person:"unicode/1f646.png?v8",ok_woman:"unicode/1f646-2640.png?v8",old_key:"unicode/1f5dd.png?v8",older_adult:"unicode/1f9d3.png?v8",older_man:"unicode/1f474.png?v8",older_woman:"unicode/1f475.png?v8",olive:"unicode/1fad2.png?v8",om:"unicode/1f549.png?v8",oman:"unicode/1f1f4-1f1f2.png?v8",on:"unicode/1f51b.png?v8",oncoming_automobile:"unicode/1f698.png?v8",oncoming_bus:"unicode/1f68d.png?v8",oncoming_police_car:"unicode/1f694.png?v8",oncoming_taxi:"unicode/1f696.png?v8",one:"unicode/0031-20e3.png?v8",one_piece_swimsuit:"unicode/1fa71.png?v8",onion:"unicode/1f9c5.png?v8",open_book:"unicode/1f4d6.png?v8",open_file_folder:"unicode/1f4c2.png?v8",open_hands:"unicode/1f450.png?v8",open_mouth:"unicode/1f62e.png?v8",open_umbrella:"unicode/2602.png?v8",ophiuchus:"unicode/26ce.png?v8",orange:"unicode/1f34a.png?v8",orange_book:"unicode/1f4d9.png?v8",orange_circle:"unicode/1f7e0.png?v8",orange_heart:"unicode/1f9e1.png?v8",orange_square:"unicode/1f7e7.png?v8",orangutan:"unicode/1f9a7.png?v8",orthodox_cross:"unicode/2626.png?v8",otter:"unicode/1f9a6.png?v8",outbox_tray:"unicode/1f4e4.png?v8",owl:"unicode/1f989.png?v8",ox:"unicode/1f402.png?v8",oyster:"unicode/1f9aa.png?v8",package:"unicode/1f4e6.png?v8",page_facing_up:"unicode/1f4c4.png?v8",page_with_curl:"unicode/1f4c3.png?v8",pager:"unicode/1f4df.png?v8",paintbrush:"unicode/1f58c.png?v8",pakistan:"unicode/1f1f5-1f1f0.png?v8",palau:"unicode/1f1f5-1f1fc.png?v8",palestinian_territories:"unicode/1f1f5-1f1f8.png?v8",palm_tree:"unicode/1f334.png?v8",palms_up_together:"unicode/1f932.png?v8",panama:"unicode/1f1f5-1f1e6.png?v8",pancakes:"unicode/1f95e.png?v8",panda_face:"unicode/1f43c.png?v8",paperclip:"unicode/1f4ce.png?v8",paperclips:"unicode/1f587.png?v8",papua_new_guinea:"unicode/1f1f5-1f1ec.png?v8",parachute:"unicode/1fa82.png?v8",paraguay:"unicode/1f1f5-1f1fe.png?v8",parasol_on_ground:"unicode/26f1.png?v8",parking:"unicode/1f17f.png?v8",parrot:"unicode/1f99c.png?v8",part_alternation_mark:"unicode/303d.png?v8",partly_sunny:"unicode/26c5.png?v8",partying_face:"unicode/1f973.png?v8",passenger_ship:"unicode/1f6f3.png?v8",passport_control:"unicode/1f6c2.png?v8",pause_button:"unicode/23f8.png?v8",paw_prints:"unicode/1f43e.png?v8",peace_symbol:"unicode/262e.png?v8",peach:"unicode/1f351.png?v8",peacock:"unicode/1f99a.png?v8",peanuts:"unicode/1f95c.png?v8",pear:"unicode/1f350.png?v8",pen:"unicode/1f58a.png?v8",pencil:"unicode/1f4dd.png?v8",pencil2:"unicode/270f.png?v8",penguin:"unicode/1f427.png?v8",pensive:"unicode/1f614.png?v8",people_holding_hands:"unicode/1f9d1-1f91d-1f9d1.png?v8",people_hugging:"unicode/1fac2.png?v8",performing_arts:"unicode/1f3ad.png?v8",persevere:"unicode/1f623.png?v8",person_bald:"unicode/1f9d1-1f9b2.png?v8",person_curly_hair:"unicode/1f9d1-1f9b1.png?v8",person_feeding_baby:"unicode/1f9d1-1f37c.png?v8",person_fencing:"unicode/1f93a.png?v8",person_in_manual_wheelchair:"unicode/1f9d1-1f9bd.png?v8",person_in_motorized_wheelchair:"unicode/1f9d1-1f9bc.png?v8",person_in_tuxedo:"unicode/1f935.png?v8",person_red_hair:"unicode/1f9d1-1f9b0.png?v8",person_white_hair:"unicode/1f9d1-1f9b3.png?v8",person_with_probing_cane:"unicode/1f9d1-1f9af.png?v8",person_with_turban:"unicode/1f473.png?v8",person_with_veil:"unicode/1f470.png?v8",peru:"unicode/1f1f5-1f1ea.png?v8",petri_dish:"unicode/1f9eb.png?v8",philippines:"unicode/1f1f5-1f1ed.png?v8",phone:"unicode/260e.png?v8",pick:"unicode/26cf.png?v8",pickup_truck:"unicode/1f6fb.png?v8",pie:"unicode/1f967.png?v8",pig:"unicode/1f437.png?v8",pig2:"unicode/1f416.png?v8",pig_nose:"unicode/1f43d.png?v8",pill:"unicode/1f48a.png?v8",pilot:"unicode/1f9d1-2708.png?v8",pinata:"unicode/1fa85.png?v8",pinched_fingers:"unicode/1f90c.png?v8",pinching_hand:"unicode/1f90f.png?v8",pineapple:"unicode/1f34d.png?v8",ping_pong:"unicode/1f3d3.png?v8",pirate_flag:"unicode/1f3f4-2620.png?v8",pisces:"unicode/2653.png?v8",pitcairn_islands:"unicode/1f1f5-1f1f3.png?v8",pizza:"unicode/1f355.png?v8",placard:"unicode/1faa7.png?v8",place_of_worship:"unicode/1f6d0.png?v8",plate_with_cutlery:"unicode/1f37d.png?v8",play_or_pause_button:"unicode/23ef.png?v8",pleading_face:"unicode/1f97a.png?v8",plunger:"unicode/1faa0.png?v8",point_down:"unicode/1f447.png?v8",point_left:"unicode/1f448.png?v8",point_right:"unicode/1f449.png?v8",point_up:"unicode/261d.png?v8",point_up_2:"unicode/1f446.png?v8",poland:"unicode/1f1f5-1f1f1.png?v8",polar_bear:"unicode/1f43b-2744.png?v8",police_car:"unicode/1f693.png?v8",police_officer:"unicode/1f46e.png?v8",policeman:"unicode/1f46e-2642.png?v8",policewoman:"unicode/1f46e-2640.png?v8",poodle:"unicode/1f429.png?v8",poop:"unicode/1f4a9.png?v8",popcorn:"unicode/1f37f.png?v8",portugal:"unicode/1f1f5-1f1f9.png?v8",post_office:"unicode/1f3e3.png?v8",postal_horn:"unicode/1f4ef.png?v8",postbox:"unicode/1f4ee.png?v8",potable_water:"unicode/1f6b0.png?v8",potato:"unicode/1f954.png?v8",potted_plant:"unicode/1fab4.png?v8",pouch:"unicode/1f45d.png?v8",poultry_leg:"unicode/1f357.png?v8",pound:"unicode/1f4b7.png?v8",pout:"unicode/1f621.png?v8",pouting_cat:"unicode/1f63e.png?v8",pouting_face:"unicode/1f64e.png?v8",pouting_man:"unicode/1f64e-2642.png?v8",pouting_woman:"unicode/1f64e-2640.png?v8",pray:"unicode/1f64f.png?v8",prayer_beads:"unicode/1f4ff.png?v8",pregnant_woman:"unicode/1f930.png?v8",pretzel:"unicode/1f968.png?v8",previous_track_button:"unicode/23ee.png?v8",prince:"unicode/1f934.png?v8",princess:"unicode/1f478.png?v8",printer:"unicode/1f5a8.png?v8",probing_cane:"unicode/1f9af.png?v8",puerto_rico:"unicode/1f1f5-1f1f7.png?v8",punch:"unicode/1f44a.png?v8",purple_circle:"unicode/1f7e3.png?v8",purple_heart:"unicode/1f49c.png?v8",purple_square:"unicode/1f7ea.png?v8",purse:"unicode/1f45b.png?v8",pushpin:"unicode/1f4cc.png?v8",put_litter_in_its_place:"unicode/1f6ae.png?v8",qatar:"unicode/1f1f6-1f1e6.png?v8",question:"unicode/2753.png?v8",rabbit:"unicode/1f430.png?v8",rabbit2:"unicode/1f407.png?v8",raccoon:"unicode/1f99d.png?v8",racehorse:"unicode/1f40e.png?v8",racing_car:"unicode/1f3ce.png?v8",radio:"unicode/1f4fb.png?v8",radio_button:"unicode/1f518.png?v8",radioactive:"unicode/2622.png?v8",rage:"unicode/1f621.png?v8",rage1:"rage1.png?v8",rage2:"rage2.png?v8",rage3:"rage3.png?v8",rage4:"rage4.png?v8",railway_car:"unicode/1f683.png?v8",railway_track:"unicode/1f6e4.png?v8",rainbow:"unicode/1f308.png?v8",rainbow_flag:"unicode/1f3f3-1f308.png?v8",raised_back_of_hand:"unicode/1f91a.png?v8",raised_eyebrow:"unicode/1f928.png?v8",raised_hand:"unicode/270b.png?v8",raised_hand_with_fingers_splayed:"unicode/1f590.png?v8",raised_hands:"unicode/1f64c.png?v8",raising_hand:"unicode/1f64b.png?v8",raising_hand_man:"unicode/1f64b-2642.png?v8",raising_hand_woman:"unicode/1f64b-2640.png?v8",ram:"unicode/1f40f.png?v8",ramen:"unicode/1f35c.png?v8",rat:"unicode/1f400.png?v8",razor:"unicode/1fa92.png?v8",receipt:"unicode/1f9fe.png?v8",record_button:"unicode/23fa.png?v8",recycle:"unicode/267b.png?v8",red_car:"unicode/1f697.png?v8",red_circle:"unicode/1f534.png?v8",red_envelope:"unicode/1f9e7.png?v8",red_haired_man:"unicode/1f468-1f9b0.png?v8",red_haired_woman:"unicode/1f469-1f9b0.png?v8",red_square:"unicode/1f7e5.png?v8",registered:"unicode/00ae.png?v8",relaxed:"unicode/263a.png?v8",relieved:"unicode/1f60c.png?v8",reminder_ribbon:"unicode/1f397.png?v8",repeat:"unicode/1f501.png?v8",repeat_one:"unicode/1f502.png?v8",rescue_worker_helmet:"unicode/26d1.png?v8",restroom:"unicode/1f6bb.png?v8",reunion:"unicode/1f1f7-1f1ea.png?v8",revolving_hearts:"unicode/1f49e.png?v8",rewind:"unicode/23ea.png?v8",rhinoceros:"unicode/1f98f.png?v8",ribbon:"unicode/1f380.png?v8",rice:"unicode/1f35a.png?v8",rice_ball:"unicode/1f359.png?v8",rice_cracker:"unicode/1f358.png?v8",rice_scene:"unicode/1f391.png?v8",right_anger_bubble:"unicode/1f5ef.png?v8",ring:"unicode/1f48d.png?v8",ringed_planet:"unicode/1fa90.png?v8",robot:"unicode/1f916.png?v8",rock:"unicode/1faa8.png?v8",rocket:"unicode/1f680.png?v8",rofl:"unicode/1f923.png?v8",roll_eyes:"unicode/1f644.png?v8",roll_of_paper:"unicode/1f9fb.png?v8",roller_coaster:"unicode/1f3a2.png?v8",roller_skate:"unicode/1f6fc.png?v8",romania:"unicode/1f1f7-1f1f4.png?v8",rooster:"unicode/1f413.png?v8",rose:"unicode/1f339.png?v8",rosette:"unicode/1f3f5.png?v8",rotating_light:"unicode/1f6a8.png?v8",round_pushpin:"unicode/1f4cd.png?v8",rowboat:"unicode/1f6a3.png?v8",rowing_man:"unicode/1f6a3-2642.png?v8",rowing_woman:"unicode/1f6a3-2640.png?v8",ru:"unicode/1f1f7-1f1fa.png?v8",rugby_football:"unicode/1f3c9.png?v8",runner:"unicode/1f3c3.png?v8",running:"unicode/1f3c3.png?v8",running_man:"unicode/1f3c3-2642.png?v8",running_shirt_with_sash:"unicode/1f3bd.png?v8",running_woman:"unicode/1f3c3-2640.png?v8",rwanda:"unicode/1f1f7-1f1fc.png?v8",sa:"unicode/1f202.png?v8",safety_pin:"unicode/1f9f7.png?v8",safety_vest:"unicode/1f9ba.png?v8",sagittarius:"unicode/2650.png?v8",sailboat:"unicode/26f5.png?v8",sake:"unicode/1f376.png?v8",salt:"unicode/1f9c2.png?v8",samoa:"unicode/1f1fc-1f1f8.png?v8",san_marino:"unicode/1f1f8-1f1f2.png?v8",sandal:"unicode/1f461.png?v8",sandwich:"unicode/1f96a.png?v8",santa:"unicode/1f385.png?v8",sao_tome_principe:"unicode/1f1f8-1f1f9.png?v8",sari:"unicode/1f97b.png?v8",sassy_man:"unicode/1f481-2642.png?v8",sassy_woman:"unicode/1f481-2640.png?v8",satellite:"unicode/1f4e1.png?v8",satisfied:"unicode/1f606.png?v8",saudi_arabia:"unicode/1f1f8-1f1e6.png?v8",sauna_man:"unicode/1f9d6-2642.png?v8",sauna_person:"unicode/1f9d6.png?v8",sauna_woman:"unicode/1f9d6-2640.png?v8",sauropod:"unicode/1f995.png?v8",saxophone:"unicode/1f3b7.png?v8",scarf:"unicode/1f9e3.png?v8",school:"unicode/1f3eb.png?v8",school_satchel:"unicode/1f392.png?v8",scientist:"unicode/1f9d1-1f52c.png?v8",scissors:"unicode/2702.png?v8",scorpion:"unicode/1f982.png?v8",scorpius:"unicode/264f.png?v8",scotland:"unicode/1f3f4-e0067-e0062-e0073-e0063-e0074-e007f.png?v8",scream:"unicode/1f631.png?v8",scream_cat:"unicode/1f640.png?v8",screwdriver:"unicode/1fa9b.png?v8",scroll:"unicode/1f4dc.png?v8",seal:"unicode/1f9ad.png?v8",seat:"unicode/1f4ba.png?v8",secret:"unicode/3299.png?v8",see_no_evil:"unicode/1f648.png?v8",seedling:"unicode/1f331.png?v8",selfie:"unicode/1f933.png?v8",senegal:"unicode/1f1f8-1f1f3.png?v8",serbia:"unicode/1f1f7-1f1f8.png?v8",service_dog:"unicode/1f415-1f9ba.png?v8",seven:"unicode/0037-20e3.png?v8",sewing_needle:"unicode/1faa1.png?v8",seychelles:"unicode/1f1f8-1f1e8.png?v8",shallow_pan_of_food:"unicode/1f958.png?v8",shamrock:"unicode/2618.png?v8",shark:"unicode/1f988.png?v8",shaved_ice:"unicode/1f367.png?v8",sheep:"unicode/1f411.png?v8",shell:"unicode/1f41a.png?v8",shield:"unicode/1f6e1.png?v8",shinto_shrine:"unicode/26e9.png?v8",ship:"unicode/1f6a2.png?v8",shipit:"shipit.png?v8",shirt:"unicode/1f455.png?v8",shit:"unicode/1f4a9.png?v8",shoe:"unicode/1f45e.png?v8",shopping:"unicode/1f6cd.png?v8",shopping_cart:"unicode/1f6d2.png?v8",shorts:"unicode/1fa73.png?v8",shower:"unicode/1f6bf.png?v8",shrimp:"unicode/1f990.png?v8",shrug:"unicode/1f937.png?v8",shushing_face:"unicode/1f92b.png?v8",sierra_leone:"unicode/1f1f8-1f1f1.png?v8",signal_strength:"unicode/1f4f6.png?v8",singapore:"unicode/1f1f8-1f1ec.png?v8",singer:"unicode/1f9d1-1f3a4.png?v8",sint_maarten:"unicode/1f1f8-1f1fd.png?v8",six:"unicode/0036-20e3.png?v8",six_pointed_star:"unicode/1f52f.png?v8",skateboard:"unicode/1f6f9.png?v8",ski:"unicode/1f3bf.png?v8",skier:"unicode/26f7.png?v8",skull:"unicode/1f480.png?v8",skull_and_crossbones:"unicode/2620.png?v8",skunk:"unicode/1f9a8.png?v8",sled:"unicode/1f6f7.png?v8",sleeping:"unicode/1f634.png?v8",sleeping_bed:"unicode/1f6cc.png?v8",sleepy:"unicode/1f62a.png?v8",slightly_frowning_face:"unicode/1f641.png?v8",slightly_smiling_face:"unicode/1f642.png?v8",slot_machine:"unicode/1f3b0.png?v8",sloth:"unicode/1f9a5.png?v8",slovakia:"unicode/1f1f8-1f1f0.png?v8",slovenia:"unicode/1f1f8-1f1ee.png?v8",small_airplane:"unicode/1f6e9.png?v8",small_blue_diamond:"unicode/1f539.png?v8",small_orange_diamond:"unicode/1f538.png?v8",small_red_triangle:"unicode/1f53a.png?v8",small_red_triangle_down:"unicode/1f53b.png?v8",smile:"unicode/1f604.png?v8",smile_cat:"unicode/1f638.png?v8",smiley:"unicode/1f603.png?v8",smiley_cat:"unicode/1f63a.png?v8",smiling_face_with_tear:"unicode/1f972.png?v8",smiling_face_with_three_hearts:"unicode/1f970.png?v8",smiling_imp:"unicode/1f608.png?v8",smirk:"unicode/1f60f.png?v8",smirk_cat:"unicode/1f63c.png?v8",smoking:"unicode/1f6ac.png?v8",snail:"unicode/1f40c.png?v8",snake:"unicode/1f40d.png?v8",sneezing_face:"unicode/1f927.png?v8",snowboarder:"unicode/1f3c2.png?v8",snowflake:"unicode/2744.png?v8",snowman:"unicode/26c4.png?v8",snowman_with_snow:"unicode/2603.png?v8",soap:"unicode/1f9fc.png?v8",sob:"unicode/1f62d.png?v8",soccer:"unicode/26bd.png?v8",socks:"unicode/1f9e6.png?v8",softball:"unicode/1f94e.png?v8",solomon_islands:"unicode/1f1f8-1f1e7.png?v8",somalia:"unicode/1f1f8-1f1f4.png?v8",soon:"unicode/1f51c.png?v8",sos:"unicode/1f198.png?v8",sound:"unicode/1f509.png?v8",south_africa:"unicode/1f1ff-1f1e6.png?v8",south_georgia_south_sandwich_islands:"unicode/1f1ec-1f1f8.png?v8",south_sudan:"unicode/1f1f8-1f1f8.png?v8",space_invader:"unicode/1f47e.png?v8",spades:"unicode/2660.png?v8",spaghetti:"unicode/1f35d.png?v8",sparkle:"unicode/2747.png?v8",sparkler:"unicode/1f387.png?v8",sparkles:"unicode/2728.png?v8",sparkling_heart:"unicode/1f496.png?v8",speak_no_evil:"unicode/1f64a.png?v8",speaker:"unicode/1f508.png?v8",speaking_head:"unicode/1f5e3.png?v8",speech_balloon:"unicode/1f4ac.png?v8",speedboat:"unicode/1f6a4.png?v8",spider:"unicode/1f577.png?v8",spider_web:"unicode/1f578.png?v8",spiral_calendar:"unicode/1f5d3.png?v8",spiral_notepad:"unicode/1f5d2.png?v8",sponge:"unicode/1f9fd.png?v8",spoon:"unicode/1f944.png?v8",squid:"unicode/1f991.png?v8",sri_lanka:"unicode/1f1f1-1f1f0.png?v8",st_barthelemy:"unicode/1f1e7-1f1f1.png?v8",st_helena:"unicode/1f1f8-1f1ed.png?v8",st_kitts_nevis:"unicode/1f1f0-1f1f3.png?v8",st_lucia:"unicode/1f1f1-1f1e8.png?v8",st_martin:"unicode/1f1f2-1f1eb.png?v8",st_pierre_miquelon:"unicode/1f1f5-1f1f2.png?v8",st_vincent_grenadines:"unicode/1f1fb-1f1e8.png?v8",stadium:"unicode/1f3df.png?v8",standing_man:"unicode/1f9cd-2642.png?v8",standing_person:"unicode/1f9cd.png?v8",standing_woman:"unicode/1f9cd-2640.png?v8",star:"unicode/2b50.png?v8",star2:"unicode/1f31f.png?v8",star_and_crescent:"unicode/262a.png?v8",star_of_david:"unicode/2721.png?v8",star_struck:"unicode/1f929.png?v8",stars:"unicode/1f320.png?v8",station:"unicode/1f689.png?v8",statue_of_liberty:"unicode/1f5fd.png?v8",steam_locomotive:"unicode/1f682.png?v8",stethoscope:"unicode/1fa7a.png?v8",stew:"unicode/1f372.png?v8",stop_button:"unicode/23f9.png?v8",stop_sign:"unicode/1f6d1.png?v8",stopwatch:"unicode/23f1.png?v8",straight_ruler:"unicode/1f4cf.png?v8",strawberry:"unicode/1f353.png?v8",stuck_out_tongue:"unicode/1f61b.png?v8",stuck_out_tongue_closed_eyes:"unicode/1f61d.png?v8",stuck_out_tongue_winking_eye:"unicode/1f61c.png?v8",student:"unicode/1f9d1-1f393.png?v8",studio_microphone:"unicode/1f399.png?v8",stuffed_flatbread:"unicode/1f959.png?v8",sudan:"unicode/1f1f8-1f1e9.png?v8",sun_behind_large_cloud:"unicode/1f325.png?v8",sun_behind_rain_cloud:"unicode/1f326.png?v8",sun_behind_small_cloud:"unicode/1f324.png?v8",sun_with_face:"unicode/1f31e.png?v8",sunflower:"unicode/1f33b.png?v8",sunglasses:"unicode/1f60e.png?v8",sunny:"unicode/2600.png?v8",sunrise:"unicode/1f305.png?v8",sunrise_over_mountains:"unicode/1f304.png?v8",superhero:"unicode/1f9b8.png?v8",superhero_man:"unicode/1f9b8-2642.png?v8",superhero_woman:"unicode/1f9b8-2640.png?v8",supervillain:"unicode/1f9b9.png?v8",supervillain_man:"unicode/1f9b9-2642.png?v8",supervillain_woman:"unicode/1f9b9-2640.png?v8",surfer:"unicode/1f3c4.png?v8",surfing_man:"unicode/1f3c4-2642.png?v8",surfing_woman:"unicode/1f3c4-2640.png?v8",suriname:"unicode/1f1f8-1f1f7.png?v8",sushi:"unicode/1f363.png?v8",suspect:"suspect.png?v8",suspension_railway:"unicode/1f69f.png?v8",svalbard_jan_mayen:"unicode/1f1f8-1f1ef.png?v8",swan:"unicode/1f9a2.png?v8",swaziland:"unicode/1f1f8-1f1ff.png?v8",sweat:"unicode/1f613.png?v8",sweat_drops:"unicode/1f4a6.png?v8",sweat_smile:"unicode/1f605.png?v8",sweden:"unicode/1f1f8-1f1ea.png?v8",sweet_potato:"unicode/1f360.png?v8",swim_brief:"unicode/1fa72.png?v8",swimmer:"unicode/1f3ca.png?v8",swimming_man:"unicode/1f3ca-2642.png?v8",swimming_woman:"unicode/1f3ca-2640.png?v8",switzerland:"unicode/1f1e8-1f1ed.png?v8",symbols:"unicode/1f523.png?v8",synagogue:"unicode/1f54d.png?v8",syria:"unicode/1f1f8-1f1fe.png?v8",syringe:"unicode/1f489.png?v8","t-rex":"unicode/1f996.png?v8",taco:"unicode/1f32e.png?v8",tada:"unicode/1f389.png?v8",taiwan:"unicode/1f1f9-1f1fc.png?v8",tajikistan:"unicode/1f1f9-1f1ef.png?v8",takeout_box:"unicode/1f961.png?v8",tamale:"unicode/1fad4.png?v8",tanabata_tree:"unicode/1f38b.png?v8",tangerine:"unicode/1f34a.png?v8",tanzania:"unicode/1f1f9-1f1ff.png?v8",taurus:"unicode/2649.png?v8",taxi:"unicode/1f695.png?v8",tea:"unicode/1f375.png?v8",teacher:"unicode/1f9d1-1f3eb.png?v8",teapot:"unicode/1fad6.png?v8",technologist:"unicode/1f9d1-1f4bb.png?v8",teddy_bear:"unicode/1f9f8.png?v8",telephone:"unicode/260e.png?v8",telephone_receiver:"unicode/1f4de.png?v8",telescope:"unicode/1f52d.png?v8",tennis:"unicode/1f3be.png?v8",tent:"unicode/26fa.png?v8",test_tube:"unicode/1f9ea.png?v8",thailand:"unicode/1f1f9-1f1ed.png?v8",thermometer:"unicode/1f321.png?v8",thinking:"unicode/1f914.png?v8",thong_sandal:"unicode/1fa74.png?v8",thought_balloon:"unicode/1f4ad.png?v8",thread:"unicode/1f9f5.png?v8",three:"unicode/0033-20e3.png?v8",thumbsdown:"unicode/1f44e.png?v8",thumbsup:"unicode/1f44d.png?v8",ticket:"unicode/1f3ab.png?v8",tickets:"unicode/1f39f.png?v8",tiger:"unicode/1f42f.png?v8",tiger2:"unicode/1f405.png?v8",timer_clock:"unicode/23f2.png?v8",timor_leste:"unicode/1f1f9-1f1f1.png?v8",tipping_hand_man:"unicode/1f481-2642.png?v8",tipping_hand_person:"unicode/1f481.png?v8",tipping_hand_woman:"unicode/1f481-2640.png?v8",tired_face:"unicode/1f62b.png?v8",tm:"unicode/2122.png?v8",togo:"unicode/1f1f9-1f1ec.png?v8",toilet:"unicode/1f6bd.png?v8",tokelau:"unicode/1f1f9-1f1f0.png?v8",tokyo_tower:"unicode/1f5fc.png?v8",tomato:"unicode/1f345.png?v8",tonga:"unicode/1f1f9-1f1f4.png?v8",tongue:"unicode/1f445.png?v8",toolbox:"unicode/1f9f0.png?v8",tooth:"unicode/1f9b7.png?v8",toothbrush:"unicode/1faa5.png?v8",top:"unicode/1f51d.png?v8",tophat:"unicode/1f3a9.png?v8",tornado:"unicode/1f32a.png?v8",tr:"unicode/1f1f9-1f1f7.png?v8",trackball:"unicode/1f5b2.png?v8",tractor:"unicode/1f69c.png?v8",traffic_light:"unicode/1f6a5.png?v8",train:"unicode/1f68b.png?v8",train2:"unicode/1f686.png?v8",tram:"unicode/1f68a.png?v8",transgender_flag:"unicode/1f3f3-26a7.png?v8",transgender_symbol:"unicode/26a7.png?v8",triangular_flag_on_post:"unicode/1f6a9.png?v8",triangular_ruler:"unicode/1f4d0.png?v8",trident:"unicode/1f531.png?v8",trinidad_tobago:"unicode/1f1f9-1f1f9.png?v8",tristan_da_cunha:"unicode/1f1f9-1f1e6.png?v8",triumph:"unicode/1f624.png?v8",trolleybus:"unicode/1f68e.png?v8",trollface:"trollface.png?v8",trophy:"unicode/1f3c6.png?v8",tropical_drink:"unicode/1f379.png?v8",tropical_fish:"unicode/1f420.png?v8",truck:"unicode/1f69a.png?v8",trumpet:"unicode/1f3ba.png?v8",tshirt:"unicode/1f455.png?v8",tulip:"unicode/1f337.png?v8",tumbler_glass:"unicode/1f943.png?v8",tunisia:"unicode/1f1f9-1f1f3.png?v8",turkey:"unicode/1f983.png?v8",turkmenistan:"unicode/1f1f9-1f1f2.png?v8",turks_caicos_islands:"unicode/1f1f9-1f1e8.png?v8",turtle:"unicode/1f422.png?v8",tuvalu:"unicode/1f1f9-1f1fb.png?v8",tv:"unicode/1f4fa.png?v8",twisted_rightwards_arrows:"unicode/1f500.png?v8",two:"unicode/0032-20e3.png?v8",two_hearts:"unicode/1f495.png?v8",two_men_holding_hands:"unicode/1f46c.png?v8",two_women_holding_hands:"unicode/1f46d.png?v8",u5272:"unicode/1f239.png?v8",u5408:"unicode/1f234.png?v8",u55b6:"unicode/1f23a.png?v8",u6307:"unicode/1f22f.png?v8",u6708:"unicode/1f237.png?v8",u6709:"unicode/1f236.png?v8",u6e80:"unicode/1f235.png?v8",u7121:"unicode/1f21a.png?v8",u7533:"unicode/1f238.png?v8",u7981:"unicode/1f232.png?v8",u7a7a:"unicode/1f233.png?v8",uganda:"unicode/1f1fa-1f1ec.png?v8",uk:"unicode/1f1ec-1f1e7.png?v8",ukraine:"unicode/1f1fa-1f1e6.png?v8",umbrella:"unicode/2614.png?v8",unamused:"unicode/1f612.png?v8",underage:"unicode/1f51e.png?v8",unicorn:"unicode/1f984.png?v8",united_arab_emirates:"unicode/1f1e6-1f1ea.png?v8",united_nations:"unicode/1f1fa-1f1f3.png?v8",unlock:"unicode/1f513.png?v8",up:"unicode/1f199.png?v8",upside_down_face:"unicode/1f643.png?v8",uruguay:"unicode/1f1fa-1f1fe.png?v8",us:"unicode/1f1fa-1f1f8.png?v8",us_outlying_islands:"unicode/1f1fa-1f1f2.png?v8",us_virgin_islands:"unicode/1f1fb-1f1ee.png?v8",uzbekistan:"unicode/1f1fa-1f1ff.png?v8",v:"unicode/270c.png?v8",vampire:"unicode/1f9db.png?v8",vampire_man:"unicode/1f9db-2642.png?v8",vampire_woman:"unicode/1f9db-2640.png?v8",vanuatu:"unicode/1f1fb-1f1fa.png?v8",vatican_city:"unicode/1f1fb-1f1e6.png?v8",venezuela:"unicode/1f1fb-1f1ea.png?v8",vertical_traffic_light:"unicode/1f6a6.png?v8",vhs:"unicode/1f4fc.png?v8",vibration_mode:"unicode/1f4f3.png?v8",video_camera:"unicode/1f4f9.png?v8",video_game:"unicode/1f3ae.png?v8",vietnam:"unicode/1f1fb-1f1f3.png?v8",violin:"unicode/1f3bb.png?v8",virgo:"unicode/264d.png?v8",volcano:"unicode/1f30b.png?v8",volleyball:"unicode/1f3d0.png?v8",vomiting_face:"unicode/1f92e.png?v8",vs:"unicode/1f19a.png?v8",vulcan_salute:"unicode/1f596.png?v8",waffle:"unicode/1f9c7.png?v8",wales:"unicode/1f3f4-e0067-e0062-e0077-e006c-e0073-e007f.png?v8",walking:"unicode/1f6b6.png?v8",walking_man:"unicode/1f6b6-2642.png?v8",walking_woman:"unicode/1f6b6-2640.png?v8",wallis_futuna:"unicode/1f1fc-1f1eb.png?v8",waning_crescent_moon:"unicode/1f318.png?v8",waning_gibbous_moon:"unicode/1f316.png?v8",warning:"unicode/26a0.png?v8",wastebasket:"unicode/1f5d1.png?v8",watch:"unicode/231a.png?v8",water_buffalo:"unicode/1f403.png?v8",water_polo:"unicode/1f93d.png?v8",watermelon:"unicode/1f349.png?v8",wave:"unicode/1f44b.png?v8",wavy_dash:"unicode/3030.png?v8",waxing_crescent_moon:"unicode/1f312.png?v8",waxing_gibbous_moon:"unicode/1f314.png?v8",wc:"unicode/1f6be.png?v8",weary:"unicode/1f629.png?v8",wedding:"unicode/1f492.png?v8",weight_lifting:"unicode/1f3cb.png?v8",weight_lifting_man:"unicode/1f3cb-2642.png?v8",weight_lifting_woman:"unicode/1f3cb-2640.png?v8",western_sahara:"unicode/1f1ea-1f1ed.png?v8",whale:"unicode/1f433.png?v8",whale2:"unicode/1f40b.png?v8",wheel_of_dharma:"unicode/2638.png?v8",wheelchair:"unicode/267f.png?v8",white_check_mark:"unicode/2705.png?v8",white_circle:"unicode/26aa.png?v8",white_flag:"unicode/1f3f3.png?v8",white_flower:"unicode/1f4ae.png?v8",white_haired_man:"unicode/1f468-1f9b3.png?v8",white_haired_woman:"unicode/1f469-1f9b3.png?v8",white_heart:"unicode/1f90d.png?v8",white_large_square:"unicode/2b1c.png?v8",white_medium_small_square:"unicode/25fd.png?v8",white_medium_square:"unicode/25fb.png?v8",white_small_square:"unicode/25ab.png?v8",white_square_button:"unicode/1f533.png?v8",wilted_flower:"unicode/1f940.png?v8",wind_chime:"unicode/1f390.png?v8",wind_face:"unicode/1f32c.png?v8",window:"unicode/1fa9f.png?v8",wine_glass:"unicode/1f377.png?v8",wink:"unicode/1f609.png?v8",wolf:"unicode/1f43a.png?v8",woman:"unicode/1f469.png?v8",woman_artist:"unicode/1f469-1f3a8.png?v8",woman_astronaut:"unicode/1f469-1f680.png?v8",woman_beard:"unicode/1f9d4-2640.png?v8",woman_cartwheeling:"unicode/1f938-2640.png?v8",woman_cook:"unicode/1f469-1f373.png?v8",woman_dancing:"unicode/1f483.png?v8",woman_facepalming:"unicode/1f926-2640.png?v8",woman_factory_worker:"unicode/1f469-1f3ed.png?v8",woman_farmer:"unicode/1f469-1f33e.png?v8",woman_feeding_baby:"unicode/1f469-1f37c.png?v8",woman_firefighter:"unicode/1f469-1f692.png?v8",woman_health_worker:"unicode/1f469-2695.png?v8",woman_in_manual_wheelchair:"unicode/1f469-1f9bd.png?v8",woman_in_motorized_wheelchair:"unicode/1f469-1f9bc.png?v8",woman_in_tuxedo:"unicode/1f935-2640.png?v8",woman_judge:"unicode/1f469-2696.png?v8",woman_juggling:"unicode/1f939-2640.png?v8",woman_mechanic:"unicode/1f469-1f527.png?v8",woman_office_worker:"unicode/1f469-1f4bc.png?v8",woman_pilot:"unicode/1f469-2708.png?v8",woman_playing_handball:"unicode/1f93e-2640.png?v8",woman_playing_water_polo:"unicode/1f93d-2640.png?v8",woman_scientist:"unicode/1f469-1f52c.png?v8",woman_shrugging:"unicode/1f937-2640.png?v8",woman_singer:"unicode/1f469-1f3a4.png?v8",woman_student:"unicode/1f469-1f393.png?v8",woman_teacher:"unicode/1f469-1f3eb.png?v8",woman_technologist:"unicode/1f469-1f4bb.png?v8",woman_with_headscarf:"unicode/1f9d5.png?v8",woman_with_probing_cane:"unicode/1f469-1f9af.png?v8",woman_with_turban:"unicode/1f473-2640.png?v8",woman_with_veil:"unicode/1f470-2640.png?v8",womans_clothes:"unicode/1f45a.png?v8",womans_hat:"unicode/1f452.png?v8",women_wrestling:"unicode/1f93c-2640.png?v8",womens:"unicode/1f6ba.png?v8",wood:"unicode/1fab5.png?v8",woozy_face:"unicode/1f974.png?v8",world_map:"unicode/1f5fa.png?v8",worm:"unicode/1fab1.png?v8",worried:"unicode/1f61f.png?v8",wrench:"unicode/1f527.png?v8",wrestling:"unicode/1f93c.png?v8",writing_hand:"unicode/270d.png?v8",x:"unicode/274c.png?v8",yarn:"unicode/1f9f6.png?v8",yawning_face:"unicode/1f971.png?v8",yellow_circle:"unicode/1f7e1.png?v8",yellow_heart:"unicode/1f49b.png?v8",yellow_square:"unicode/1f7e8.png?v8",yemen:"unicode/1f1fe-1f1ea.png?v8",yen:"unicode/1f4b4.png?v8",yin_yang:"unicode/262f.png?v8",yo_yo:"unicode/1fa80.png?v8",yum:"unicode/1f60b.png?v8",zambia:"unicode/1f1ff-1f1f2.png?v8",zany_face:"unicode/1f92a.png?v8",zap:"unicode/26a1.png?v8",zebra:"unicode/1f993.png?v8",zero:"unicode/0030-20e3.png?v8",zimbabwe:"unicode/1f1ff-1f1fc.png?v8",zipper_mouth_face:"unicode/1f910.png?v8",zombie:"unicode/1f9df.png?v8",zombie_man:"unicode/1f9df-2642.png?v8",zombie_woman:"unicode/1f9df-2640.png?v8",zzz:"unicode/1f4a4.png?v8"}};function jn(e,t){return e.replace(/<(code|pre|script|template)[^>]*?>[\s\S]+?<\/(code|pre|script|template)>/g,function(e){return e.replace(/:/g,"__colon__")}).replace(/<!--[\s\S]+?-->/g,function(e){return e.replace(/:/g,"__colon__")}).replace(/([a-z]{2,}:)?\/\/[^\s'">)]+/gi,function(e){return e.replace(/:/g,"__colon__")}).replace(/:([a-z0-9_\-+]+?):/g,function(e,n){return i=e,o=n,e=t,n=Rn.data[o],i,i=n?e&&/unicode/.test(n)?'<span class="emoji">'+n.replace("unicode/","").replace(/\.png.*/,"").split("-").map(function(e){return"&#x"+e+";"}).join("&zwj;").concat("&#xFE0E;")+"</span>":'<img src="'+Rn.baseURL+n+'.png" alt="'+o+'" class="emoji" loading="lazy">':i;var i,o}).replace(/__colon__/g,":")}function On(e){var o={};return{str:e=(e=void 0===e?"":e)&&e.replace(/^('|")/,"").replace(/('|")$/,"").replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g,function(e,n,i){return-1===n.indexOf(":")?(o[n]=i&&i.replace(/&quot;/g,"")||!0,""):e}).trim(),config:o}}function Ln(e){return(e=void 0===e?"":e).replace(/(<\/?a.*?>)/gi,"")}var qn,Pn=be(function(e){var u,f,p,d,n,g=function(u){var i=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,n=0,e={},T={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof C?new C(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++n}),e.__id},clone:function i(e,o){var t,n;switch(o=o||{},T.util.type(e)){case"Object":if(n=T.util.objId(e),o[n])return o[n];for(var a in t={},o[n]=t,e)e.hasOwnProperty(a)&&(t[a]=i(e[a],o));return t;case"Array":return(n=T.util.objId(e),o[n])?o[n]:(t=[],o[n]=t,e.forEach(function(e,n){t[n]=i(e,o)}),t);default:return e}},getLanguage:function(e){for(;e;){var n=i.exec(e.className);if(n)return n[1].toLowerCase();e=e.parentElement}return"none"},setLanguage:function(e,n){e.className=e.className.replace(RegExp(i,"gi"),""),e.classList.add("language-"+n)},currentScript:function(){if("undefined"==typeof document)return null;if("currentScript"in document)return document.currentScript;try{throw new Error}catch(e){var n=(/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(e.stack)||[])[1];if(n){var i,o=document.getElementsByTagName("script");for(i in o)if(o[i].src==n)return o[i]}return null}},isActive:function(e,n,i){for(var o="no-"+n;e;){var t=e.classList;if(t.contains(n))return!0;if(t.contains(o))return!1;e=e.parentElement}return!!i}},languages:{plain:e,plaintext:e,text:e,txt:e,extend:function(e,n){var i,o=T.util.clone(T.languages[e]);for(i in n)o[i]=n[i];return o},insertBefore:function(i,e,n,o){var t,a=(o=o||T.languages)[i],r={};for(t in a)if(a.hasOwnProperty(t)){if(t==e)for(var c in n)n.hasOwnProperty(c)&&(r[c]=n[c]);n.hasOwnProperty(t)||(r[t]=a[t])}var u=o[i];return o[i]=r,T.languages.DFS(T.languages,function(e,n){n===u&&e!=i&&(this[e]=r)}),r},DFS:function e(n,i,o,t){t=t||{};var a,r,c,u=T.util.objId;for(a in n)n.hasOwnProperty(a)&&(i.call(n,a,n[a],o||a),r=n[a],"Object"!==(c=T.util.type(r))||t[u(r)]?"Array"!==c||t[u(r)]||(t[u(r)]=!0,e(r,i,a,t)):(t[u(r)]=!0,e(r,i,null,t)))}},plugins:{},highlightAll:function(e,n){T.highlightAllUnder(document,e,n)},highlightAllUnder:function(e,n,i){var o={callback:i,container:e,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};T.hooks.run("before-highlightall",o),o.elements=Array.prototype.slice.apply(o.container.querySelectorAll(o.selector)),T.hooks.run("before-all-elements-highlight",o);for(var t,a=0;t=o.elements[a++];)T.highlightElement(t,!0===n,o.callback)},highlightElement:function(e,n,i){var o=T.util.getLanguage(e),t=T.languages[o];T.util.setLanguage(e,o);var a=e.parentElement;a&&"pre"===a.nodeName.toLowerCase()&&T.util.setLanguage(a,o);var r={element:e,language:o,grammar:t,code:e.textContent};function c(e){r.highlightedCode=e,T.hooks.run("before-insert",r),r.element.innerHTML=r.highlightedCode,T.hooks.run("after-highlight",r),T.hooks.run("complete",r),i&&i.call(r.element)}if(T.hooks.run("before-sanity-check",r),(a=r.element.parentElement)&&"pre"===a.nodeName.toLowerCase()&&!a.hasAttribute("tabindex")&&a.setAttribute("tabindex","0"),!r.code)return T.hooks.run("complete",r),void(i&&i.call(r.element));T.hooks.run("before-highlight",r),r.grammar?n&&u.Worker?((n=new Worker(T.filename)).onmessage=function(e){c(e.data)},n.postMessage(JSON.stringify({language:r.language,code:r.code,immediateClose:!0}))):c(T.highlight(r.code,r.grammar,r.language)):c(T.util.encode(r.code))},highlight:function(e,n,i){i={code:e,grammar:n,language:i};if(T.hooks.run("before-tokenize",i),!i.grammar)throw new Error('The language "'+i.language+'" has no grammar.');return i.tokens=T.tokenize(i.code,i.grammar),T.hooks.run("after-tokenize",i),C.stringify(T.util.encode(i.tokens),i.language)},tokenize:function(e,n){var i=n.rest;if(i){for(var o in i)n[o]=i[o];delete n.rest}var t=new a;return j(t,t.head,e),function e(n,i,o,t,a,r){for(var c in o)if(o.hasOwnProperty(c)&&o[c]){var u=o[c];u=Array.isArray(u)?u:[u];for(var f=0;f<u.length;++f){if(r&&r.cause==c+","+f)return;var p,d=u[f],g=d.inside,s=!!d.lookbehind,l=!!d.greedy,v=d.alias;l&&!d.pattern.global&&(p=d.pattern.toString().match(/[imsuy]*$/)[0],d.pattern=RegExp(d.pattern.source,p+"g"));for(var h=d.pattern||d,_=t.next,m=a;_!==i.tail&&!(r&&m>=r.reach);m+=_.value.length,_=_.next){var b=_.value;if(i.length>n.length)return;if(!(b instanceof C)){var k,w=1;if(l){if(!(k=R(h,m,n,s))||k.index>=n.length)break;var y=k.index,x=k.index+k[0].length,S=m;for(S+=_.value.length;S<=y;)_=_.next,S+=_.value.length;if(S-=_.value.length,m=S,_.value instanceof C)continue;for(var A=_;A!==i.tail&&(S<x||"string"==typeof A.value);A=A.next)w++,S+=A.value.length;w--,b=n.slice(m,S),k.index-=m}else if(!(k=R(h,0,b,s)))continue;var y=k.index,$=k[0],z=b.slice(0,y),F=b.slice(y+$.length),E=m+b.length;r&&E>r.reach&&(r.reach=E);b=_.prev;z&&(b=j(i,b,z),m+=z.length),O(i,b,w);$=new C(c,g?T.tokenize($,g):$,v,$);_=j(i,b,$),F&&j(i,_,F),1<w&&(E={cause:c+","+f,reach:E},e(n,i,o,_.prev,m,E),r&&E.reach>r.reach&&(r.reach=E.reach))}}}}}(e,t,n,t.head,0),function(e){var n=[],i=e.head.next;for(;i!==e.tail;)n.push(i.value),i=i.next;return n}(t)},hooks:{all:{},add:function(e,n){var i=T.hooks.all;i[e]=i[e]||[],i[e].push(n)},run:function(e,n){var i=T.hooks.all[e];if(i&&i.length)for(var o,t=0;o=i[t++];)o(n)}},Token:C};function C(e,n,i,o){this.type=e,this.content=n,this.alias=i,this.length=0|(o||"").length}function R(e,n,i,o){e.lastIndex=n;i=e.exec(i);return i&&o&&i[1]&&(o=i[1].length,i.index+=o,i[0]=i[0].slice(o)),i}function a(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function j(e,n,i){var o=n.next,i={value:i,prev:n,next:o};return n.next=i,o.prev=i,e.length++,i}function O(e,n,i){for(var o=n.next,t=0;t<i&&o!==e.tail;t++)o=o.next;(n.next=o).prev=n,e.length-=t}if(u.Prism=T,C.stringify=function n(e,i){if("string"==typeof e)return e;if(Array.isArray(e)){var o="";return e.forEach(function(e){o+=n(e,i)}),o}var t={type:e.type,content:n(e.content,i),tag:"span",classes:["token",e.type],attributes:{},language:i},e=e.alias;e&&(Array.isArray(e)?Array.prototype.push.apply(t.classes,e):t.classes.push(e)),T.hooks.run("wrap",t);var a,r="";for(a in t.attributes)r+=" "+a+'="'+(t.attributes[a]||"").replace(/"/g,"&quot;")+'"';return"<"+t.tag+' class="'+t.classes.join(" ")+'"'+r+">"+t.content+"</"+t.tag+">"},!u.document)return u.addEventListener&&(T.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),i=n.language,e=n.code,n=n.immediateClose;u.postMessage(T.highlight(e,T.languages[i],i)),n&&u.close()},!1)),T;var o=T.util.currentScript();function t(){T.manual||T.highlightAll()}return o&&(T.filename=o.src,o.hasAttribute("data-manual")&&(T.manual=!0)),T.manual||("loading"===(e=document.readyState)||"interactive"===e&&o&&o.defer?document.addEventListener("DOMContentLoaded",t):window.requestAnimationFrame?window.requestAnimationFrame(t):window.setTimeout(t,16)),T}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});e.exports&&(e.exports=g),void 0!==me&&(me.Prism=g),g.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},g.languages.markup.tag.inside["attr-value"].inside.entity=g.languages.markup.entity,g.languages.markup.doctype.inside["internal-subset"].inside=g.languages.markup,g.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))}),Object.defineProperty(g.languages.markup.tag,"addInlined",{value:function(e,n){var i={};i["language-"+n]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:g.languages[n]},i.cdata=/^<!\[CDATA\[|\]\]>$/i;i={"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:i}};i["language-"+n]={pattern:/[\s\S]+/,inside:g.languages[n]};n={};n[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:i},g.languages.insertBefore("markup","cdata",n)}}),Object.defineProperty(g.languages.markup.tag,"addAttribute",{value:function(e,n){g.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[n,"language-"+n],inside:g.languages[n]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),g.languages.html=g.languages.markup,g.languages.mathml=g.languages.markup,g.languages.svg=g.languages.markup,g.languages.xml=g.languages.extend("markup",{}),g.languages.ssml=g.languages.xml,g.languages.atom=g.languages.xml,g.languages.rss=g.languages.xml,function(e){var n=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:n,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;e=e.languages.markup;e&&(e.tag.addInlined("style","css"),e.tag.addAttribute("style","css"))}(g),g.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},g.languages.javascript=g.languages.extend("clike",{"class-name":[g.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),g.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,g.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:g.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a
Download .txt
gitextract_3q5h2l1l/

├── .dockerignore
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug.md
│   │   ├── new.md
│   │   └── solve.md
│   └── workflows/
│       └── build.yml
├── .gitignore
├── .gitmodules
├── LICENSE
├── README.md
├── bin/
│   └── wvp.sh
├── doc/
│   ├── README.md
│   ├── _content/
│   │   ├── ability/
│   │   │   ├── auto_play.md
│   │   │   ├── cascade.md
│   │   │   ├── cascade2.md
│   │   │   ├── channel.md
│   │   │   ├── cloud_record.md
│   │   │   ├── continuous_broadcast.md
│   │   │   ├── continuous_recording.md
│   │   │   ├── device.md
│   │   │   ├── device_use.md
│   │   │   ├── gis.md
│   │   │   ├── node_manager.md
│   │   │   ├── online_doc.md
│   │   │   ├── proxy.md
│   │   │   ├── push.md
│   │   │   └── user.md
│   │   ├── about_doc.md
│   │   ├── broadcast.md
│   │   ├── disclaimers.md
│   │   ├── introduction/
│   │   │   ├── compile.md
│   │   │   ├── config.md
│   │   │   └── deployment.md
│   │   ├── qa/
│   │   │   ├── bug.md
│   │   │   ├── development.md
│   │   │   ├── play_error.md
│   │   │   ├── regiser_error.md
│   │   │   └── start_error.md
│   │   ├── skill/
│   │   │   └── tcpdump.md
│   │   └── theory/
│   │       ├── broadcast_cascade.md
│   │       ├── code.md
│   │       ├── play.md
│   │       └── register.md
│   ├── _coverpage.md
│   ├── _navbar.md
│   ├── _sidebar.md
│   ├── index.html
│   └── lib/
│       ├── css/
│       │   └── vue.css
│       └── js/
│           └── docsify@4.js
├── docker/
│   ├── README.md
│   ├── build.sh
│   ├── docker-compose.yml
│   ├── docker-upgrade.sh
│   ├── media/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   └── config.ini
│   ├── mysql/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   └── db/
│   │       ├── privileges.sql
│   │       └── wvp.sql
│   ├── nginx/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   ├── config.js
│   │   └── templates/
│   │       └── nginx.conf.template
│   ├── push.sh
│   ├── redis/
│   │   ├── Dockerfile
│   │   ├── build.sh
│   │   └── conf/
│   │       └── redis.conf
│   └── wvp/
│       ├── Dockerfile
│       ├── build.sh
│       └── wvp/
│           ├── application-base.yml
│           ├── application-docker.yml
│           └── application.yml
├── install.sh
├── libs/
│   ├── jdbc-aarch/
│   │   ├── kingbase8-8.6.0.jar
│   │   ├── kingbase8-8.6.0.jre7.jar
│   │   ├── postgresql-42.2.9.jar
│   │   └── postgresql-42.2.9.jre7.jar
│   └── jdbc-x86/
│       ├── bcprov-jdk15on-1.70.jar
│       ├── kingbase8-8.6.0.jar
│       ├── kingbase8-8.6.0.jre6.jar
│       ├── kingbase8-8.6.0.jre7.jar
│       ├── postgresql-42.2.9.jar
│       ├── postgresql-42.2.9.jre6.jar
│       └── postgresql-42.2.9.jre7.jar
├── pom.xml
├── run.sh
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── genersoft/
│   │   │           └── iot/
│   │   │               └── vmp/
│   │   │                   ├── VManageBootstrap.java
│   │   │                   ├── common/
│   │   │                   │   ├── CivilCodePo.java
│   │   │                   │   ├── CommonCallback.java
│   │   │                   │   ├── DeviceStatusCallback.java
│   │   │                   │   ├── InviteInfo.java
│   │   │                   │   ├── InviteSessionStatus.java
│   │   │                   │   ├── InviteSessionType.java
│   │   │                   │   ├── RemoteAddressInfo.java
│   │   │                   │   ├── ServerInfo.java
│   │   │                   │   ├── StatisticsInfo.java
│   │   │                   │   ├── StreamInfo.java
│   │   │                   │   ├── StreamURL.java
│   │   │                   │   ├── SubscribeCallback.java
│   │   │                   │   ├── SystemAllInfo.java
│   │   │                   │   ├── VersionPo.java
│   │   │                   │   ├── VideoManagerConstants.java
│   │   │                   │   └── enums/
│   │   │                   │       ├── ChannelDataType.java
│   │   │                   │       ├── DeviceControlType.java
│   │   │                   │       └── MediaApp.java
│   │   │                   ├── conf/
│   │   │                   │   ├── CivilCodeFileConf.java
│   │   │                   │   ├── CloudRecordTimer.java
│   │   │                   │   ├── DynamicTask.java
│   │   │                   │   ├── GlobalExceptionHandler.java
│   │   │                   │   ├── GlobalResponseAdvice.java
│   │   │                   │   ├── MediaConfig.java
│   │   │                   │   ├── MediaStatusTimerTask.java
│   │   │                   │   ├── MybatisConfig.java
│   │   │                   │   ├── ScheduleConfig.java
│   │   │                   │   ├── ServiceInfo.java
│   │   │                   │   ├── SipConfig.java
│   │   │                   │   ├── SpringDocConfig.java
│   │   │                   │   ├── SystemInfoTimerTask.java
│   │   │                   │   ├── ThreadPoolTaskConfig.java
│   │   │                   │   ├── UserSetting.java
│   │   │                   │   ├── VersionConfig.java
│   │   │                   │   ├── VersionInfo.java
│   │   │                   │   ├── WVPTimerTask.java
│   │   │                   │   ├── exception/
│   │   │                   │   │   ├── ControllerException.java
│   │   │                   │   │   ├── ServiceException.java
│   │   │                   │   │   └── SsrcTransactionNotFoundException.java
│   │   │                   │   ├── ftpServer/
│   │   │                   │   │   ├── FileCallback.java
│   │   │                   │   │   ├── FtpAuthority.java
│   │   │                   │   │   ├── FtpFileSystemFactory.java
│   │   │                   │   │   ├── FtpFileSystemView.java
│   │   │                   │   │   ├── FtpServerConfig.java
│   │   │                   │   │   ├── FtpSetting.java
│   │   │                   │   │   ├── Ftplet.java
│   │   │                   │   │   ├── UserManager.java
│   │   │                   │   │   └── VirtualFtpFile.java
│   │   │                   │   ├── redis/
│   │   │                   │   │   ├── RedisMsgListenConfig.java
│   │   │                   │   │   ├── RedisRpcConfig.java
│   │   │                   │   │   ├── RedisTemplateConfig.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       ├── RedisRpcClassHandler.java
│   │   │                   │   │       ├── RedisRpcMessage.java
│   │   │                   │   │       ├── RedisRpcRequest.java
│   │   │                   │   │       └── RedisRpcResponse.java
│   │   │                   │   ├── security/
│   │   │                   │   │   ├── AnonymousAuthenticationEntryPoint.java
│   │   │                   │   │   ├── DefaultUserDetailsServiceImpl.java
│   │   │                   │   │   ├── JwtAuthenticationFilter.java
│   │   │                   │   │   ├── JwtUtils.java
│   │   │                   │   │   ├── LogoutHandler.java
│   │   │                   │   │   ├── SecurityUtils.java
│   │   │                   │   │   ├── WebSecurityConfig.java
│   │   │                   │   │   └── dto/
│   │   │                   │   │       ├── JwtUser.java
│   │   │                   │   │       └── LoginUser.java
│   │   │                   │   ├── webLog/
│   │   │                   │   │   ├── LogChannel.java
│   │   │                   │   │   └── WebSocketAppender.java
│   │   │                   │   └── websocket/
│   │   │                   │       └── WebSocketConfig.java
│   │   │                   ├── gb28181/
│   │   │                   │   ├── SipLayer.java
│   │   │                   │   ├── auth/
│   │   │                   │   │   └── DigestServerAuthenticationHelper.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── AlarmChannelMessage.java
│   │   │                   │   │   ├── AudioBroadcastCatch.java
│   │   │                   │   │   ├── AudioBroadcastCatchStatus.java
│   │   │                   │   │   ├── BaiduPoint.java
│   │   │                   │   │   ├── BasicParam.java
│   │   │                   │   │   ├── CatalogChannelEvent.java
│   │   │                   │   │   ├── CatalogData.java
│   │   │                   │   │   ├── CmdType.java
│   │   │                   │   │   ├── CommonGBChannel.java
│   │   │                   │   │   ├── CommonRecordInfo.java
│   │   │                   │   │   ├── Device.java
│   │   │                   │   │   ├── DeviceAlarm.java
│   │   │                   │   │   ├── DeviceAlarmMethod.java
│   │   │                   │   │   ├── DeviceChannel.java
│   │   │                   │   │   ├── DeviceChannelInPlatform.java
│   │   │                   │   │   ├── DeviceNotFoundEvent.java
│   │   │                   │   │   ├── DeviceType.java
│   │   │                   │   │   ├── DeviceTypeEnum.java
│   │   │                   │   │   ├── DragZoomParam.java
│   │   │                   │   │   ├── DragZoomRequest.java
│   │   │                   │   │   ├── DrawThinProcess.java
│   │   │                   │   │   ├── FrontEndCode.java
│   │   │                   │   │   ├── FrontEndControlCodeForAuxiliary.java
│   │   │                   │   │   ├── FrontEndControlCodeForFI.java
│   │   │                   │   │   ├── FrontEndControlCodeForPTZ.java
│   │   │                   │   │   ├── FrontEndControlCodeForPreset.java
│   │   │                   │   │   ├── FrontEndControlCodeForScan.java
│   │   │                   │   │   ├── FrontEndControlCodeForTour.java
│   │   │                   │   │   ├── FrontEndControlCodeForWiper.java
│   │   │                   │   │   ├── FrontEndControlType.java
│   │   │                   │   │   ├── GBStringMsgParser.java
│   │   │                   │   │   ├── Gb28181Sdp.java
│   │   │                   │   │   ├── GbCode.java
│   │   │                   │   │   ├── GbSipDate.java
│   │   │                   │   │   ├── GbSteamIdentification.java
│   │   │                   │   │   ├── GbStream.java
│   │   │                   │   │   ├── GbStringMsgParserFactory.java
│   │   │                   │   │   ├── Group.java
│   │   │                   │   │   ├── GroupTree.java
│   │   │                   │   │   ├── HandlerCatchData.java
│   │   │                   │   │   ├── HomePositionRequest.java
│   │   │                   │   │   ├── Host.java
│   │   │                   │   │   ├── IFrontEndControlCode.java
│   │   │                   │   │   ├── IndustryCodeType.java
│   │   │                   │   │   ├── IndustryCodeTypeEnum.java
│   │   │                   │   │   ├── InviteDecodeException.java
│   │   │                   │   │   ├── InviteMessageInfo.java
│   │   │                   │   │   ├── InviteStreamCallback.java
│   │   │                   │   │   ├── InviteStreamInfo.java
│   │   │                   │   │   ├── InviteStreamType.java
│   │   │                   │   │   ├── MessageResponseTask.java
│   │   │                   │   │   ├── MobilePosition.java
│   │   │                   │   │   ├── NetworkIdentificationType.java
│   │   │                   │   │   ├── NetworkIdentificationTypeEnum.java
│   │   │                   │   │   ├── NotifyCatalogChannel.java
│   │   │                   │   │   ├── OpenRTPServerResult.java
│   │   │                   │   │   ├── Platform.java
│   │   │                   │   │   ├── PlatformCatalog.java
│   │   │                   │   │   ├── PlatformCatch.java
│   │   │                   │   │   ├── PlatformChannel.java
│   │   │                   │   │   ├── PlatformGbStream.java
│   │   │                   │   │   ├── PlatformKeepaliveCallback.java
│   │   │                   │   │   ├── PlatformRegister.java
│   │   │                   │   │   ├── PlayException.java
│   │   │                   │   │   ├── Preset.java
│   │   │                   │   │   ├── RecordInfo.java
│   │   │                   │   │   ├── RecordItem.java
│   │   │                   │   │   ├── RedisGroupMessage.java
│   │   │                   │   │   ├── Region.java
│   │   │                   │   │   ├── RegionTree.java
│   │   │                   │   │   ├── SDPInfo.java
│   │   │                   │   │   ├── SendRtpInfo.java
│   │   │                   │   │   ├── SipMsgInfo.java
│   │   │                   │   │   ├── SipSendFailEvent.java
│   │   │                   │   │   ├── SipTransactionInfo.java
│   │   │                   │   │   ├── SsrcTransaction.java
│   │   │                   │   │   ├── SubscribeHolder.java
│   │   │                   │   │   ├── SubscribeInfo.java
│   │   │                   │   │   ├── SyncStatus.java
│   │   │                   │   │   ├── TalkRtpInfo.java
│   │   │                   │   │   └── VectorTileSource.java
│   │   │                   │   ├── conf/
│   │   │                   │   │   ├── DefaultProperties.java
│   │   │                   │   │   ├── ServerLoggerImpl.java
│   │   │                   │   │   └── StackLoggerImpl.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   ├── AlarmController.java
│   │   │                   │   │   ├── ChannelController.java
│   │   │                   │   │   ├── ChannelFrontEndController.java
│   │   │                   │   │   ├── DeviceConfig.java
│   │   │                   │   │   ├── DeviceControl.java
│   │   │                   │   │   ├── DeviceQuery.java
│   │   │                   │   │   ├── GBRecordController.java
│   │   │                   │   │   ├── GroupController.java
│   │   │                   │   │   ├── MediaController.java
│   │   │                   │   │   ├── MobilePositionController.java
│   │   │                   │   │   ├── PlatformController.java
│   │   │                   │   │   ├── PlayController.java
│   │   │                   │   │   ├── PlaybackController.java
│   │   │                   │   │   ├── PtzController.java
│   │   │                   │   │   ├── RegionController.java
│   │   │                   │   │   ├── SseController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       ├── AudioBroadcastEvent.java
│   │   │                   │   │       ├── ChannelForThin.java
│   │   │                   │   │       ├── ChannelListForRpcParam.java
│   │   │                   │   │       ├── ChannelReduce.java
│   │   │                   │   │       ├── ChannelToGroupByGbDeviceParam.java
│   │   │                   │   │       ├── ChannelToGroupParam.java
│   │   │                   │   │       ├── ChannelToRegionByGbDeviceParam.java
│   │   │                   │   │       ├── ChannelToRegionParam.java
│   │   │                   │   │       ├── DrawThinParam.java
│   │   │                   │   │       ├── Extent.java
│   │   │                   │   │       ├── PlayResult.java
│   │   │                   │   │       ├── ResetParam.java
│   │   │                   │   │       └── UpdateChannelParam.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── CommonGBChannelMapper.java
│   │   │                   │   │   ├── DeviceAlarmMapper.java
│   │   │                   │   │   ├── DeviceChannelMapper.java
│   │   │                   │   │   ├── DeviceMapper.java
│   │   │                   │   │   ├── DeviceMobilePositionMapper.java
│   │   │                   │   │   ├── GroupMapper.java
│   │   │                   │   │   ├── PlatformChannelMapper.java
│   │   │                   │   │   ├── PlatformMapper.java
│   │   │                   │   │   ├── RegionMapper.java
│   │   │                   │   │   └── provider/
│   │   │                   │   │       ├── ChannelProvider.java
│   │   │                   │   │       └── DeviceChannelProvider.java
│   │   │                   │   ├── event/
│   │   │                   │   │   ├── EventPublisher.java
│   │   │                   │   │   ├── MessageSubscribe.java
│   │   │                   │   │   ├── SipSubscribe.java
│   │   │                   │   │   ├── alarm/
│   │   │                   │   │   │   ├── AlarmEvent.java
│   │   │                   │   │   │   └── AlarmEventListener.java
│   │   │                   │   │   ├── channel/
│   │   │                   │   │   │   └── ChannelEvent.java
│   │   │                   │   │   ├── record/
│   │   │                   │   │   │   ├── RecordInfoEndEvent.java
│   │   │                   │   │   │   ├── RecordInfoEvent.java
│   │   │                   │   │   │   └── RecordInfoEventListener.java
│   │   │                   │   │   ├── sip/
│   │   │                   │   │   │   ├── MessageEvent.java
│   │   │                   │   │   │   └── SipEvent.java
│   │   │                   │   │   └── subscribe/
│   │   │                   │   │       ├── catalog/
│   │   │                   │   │       │   ├── CatalogEvent.java
│   │   │                   │   │       │   └── CatalogEventLister.java
│   │   │                   │   │       └── mobilePosition/
│   │   │                   │   │           ├── MobilePositionEvent.java
│   │   │                   │   │           └── MobilePositionEventLister.java
│   │   │                   │   ├── service/
│   │   │                   │   │   ├── IDeviceAlarmService.java
│   │   │                   │   │   ├── IDeviceChannelService.java
│   │   │                   │   │   ├── IDeviceService.java
│   │   │                   │   │   ├── IGbChannelControlService.java
│   │   │                   │   │   ├── IGbChannelPlayService.java
│   │   │                   │   │   ├── IGbChannelService.java
│   │   │                   │   │   ├── IGroupService.java
│   │   │                   │   │   ├── IInviteStreamService.java
│   │   │                   │   │   ├── IPTZService.java
│   │   │                   │   │   ├── IPlatformChannelService.java
│   │   │                   │   │   ├── IPlatformService.java
│   │   │                   │   │   ├── IPlayService.java
│   │   │                   │   │   ├── IRegionService.java
│   │   │                   │   │   ├── ISourceDownloadService.java
│   │   │                   │   │   ├── ISourcePTZService.java
│   │   │                   │   │   ├── ISourcePlayService.java
│   │   │                   │   │   ├── ISourcePlaybackService.java
│   │   │                   │   │   └── impl/
│   │   │                   │   │       ├── DeviceAlarmServiceImpl.java
│   │   │                   │   │       ├── DeviceChannelServiceImpl.java
│   │   │                   │   │       ├── DeviceServiceImpl.java
│   │   │                   │   │       ├── GbChannelControlServiceImpl.java
│   │   │                   │   │       ├── GbChannelPlayServiceImpl.java
│   │   │                   │   │       ├── GbChannelServiceImpl.java
│   │   │                   │   │       ├── GroupServiceImpl.java
│   │   │                   │   │       ├── InviteStreamServiceImpl.java
│   │   │                   │   │       ├── PTZServiceImpl.java
│   │   │                   │   │       ├── PlatformChannelServiceImpl.java
│   │   │                   │   │       ├── PlatformServiceImpl.java
│   │   │                   │   │       ├── PlayServiceImpl.java
│   │   │                   │   │       ├── RegionServiceImpl.java
│   │   │                   │   │       ├── SourceDownloadServiceForGbImpl.java
│   │   │                   │   │       ├── SourcePTZServiceForGbImpl.java
│   │   │                   │   │       ├── SourcePlayServiceForGbImpl.java
│   │   │                   │   │       └── SourcePlaybackServiceForGbImpl.java
│   │   │                   │   ├── session/
│   │   │                   │   │   ├── AudioBroadcastManager.java
│   │   │                   │   │   ├── CatalogDataManager.java
│   │   │                   │   │   ├── CommonSessionManager.java
│   │   │                   │   │   ├── SSRCFactory.java
│   │   │                   │   │   ├── SipInviteSessionManager.java
│   │   │                   │   │   └── SseSessionManager.java
│   │   │                   │   ├── task/
│   │   │                   │   │   ├── deviceStatus/
│   │   │                   │   │   │   ├── DeviceStatusTask.java
│   │   │                   │   │   │   ├── DeviceStatusTaskInfo.java
│   │   │                   │   │   │   └── DeviceStatusTaskRunner.java
│   │   │                   │   │   ├── deviceSubscribe/
│   │   │                   │   │   │   ├── SubscribeTask.java
│   │   │                   │   │   │   ├── SubscribeTaskInfo.java
│   │   │                   │   │   │   ├── SubscribeTaskRunner.java
│   │   │                   │   │   │   └── impl/
│   │   │                   │   │   │       ├── SubscribeTaskForCatalog.java
│   │   │                   │   │   │       └── SubscribeTaskForMobilPosition.java
│   │   │                   │   │   └── platformStatus/
│   │   │                   │   │       ├── PlatformKeepaliveTask.java
│   │   │                   │   │       ├── PlatformRegisterTask.java
│   │   │                   │   │       ├── PlatformRegisterTaskInfo.java
│   │   │                   │   │       └── PlatformStatusTaskRunner.java
│   │   │                   │   ├── transmit/
│   │   │                   │   │   ├── ISIPProcessorObserver.java
│   │   │                   │   │   ├── SIPProcessorObserver.java
│   │   │                   │   │   ├── SIPSender.java
│   │   │                   │   │   ├── callback/
│   │   │                   │   │   │   ├── DeferredResultHolder.java
│   │   │                   │   │   │   └── RequestMessage.java
│   │   │                   │   │   ├── cmd/
│   │   │                   │   │   │   ├── ISIPCommander.java
│   │   │                   │   │   │   ├── ISIPCommanderForPlatform.java
│   │   │                   │   │   │   ├── SIPRequestHeaderPlarformProvider.java
│   │   │                   │   │   │   ├── SIPRequestHeaderProvider.java
│   │   │                   │   │   │   └── impl/
│   │   │                   │   │   │       ├── SIPCommander.java
│   │   │                   │   │   │       └── SIPCommanderForPlatform.java
│   │   │                   │   │   └── event/
│   │   │                   │   │       ├── request/
│   │   │                   │   │       │   ├── ISIPRequestProcessor.java
│   │   │                   │   │       │   ├── SIPRequestProcessorParent.java
│   │   │                   │   │       │   └── impl/
│   │   │                   │   │       │       ├── AckRequestProcessor.java
│   │   │                   │   │       │       ├── ByeRequestProcessor.java
│   │   │                   │   │       │       ├── CancelRequestProcessor.java
│   │   │                   │   │       │       ├── InviteRequestProcessor.java
│   │   │                   │   │       │       ├── NotifyRequestForCatalogProcessor.java
│   │   │                   │   │       │       ├── NotifyRequestForMobilePositionProcessor.java
│   │   │                   │   │       │       ├── NotifyRequestProcessor.java
│   │   │                   │   │       │       ├── RegisterRequestProcessor.java
│   │   │                   │   │       │       ├── SubscribeRequestProcessor.java
│   │   │                   │   │       │       ├── info/
│   │   │                   │   │       │       │   └── InfoRequestProcessor.java
│   │   │                   │   │       │       └── message/
│   │   │                   │   │       │           ├── IMessageHandler.java
│   │   │                   │   │       │           ├── MessageHandlerAbstract.java
│   │   │                   │   │       │           ├── MessageRequestProcessor.java
│   │   │                   │   │       │           ├── control/
│   │   │                   │   │       │           │   ├── ControlMessageHandler.java
│   │   │                   │   │       │           │   └── cmd/
│   │   │                   │   │       │           │       └── DeviceControlQueryMessageHandler.java
│   │   │                   │   │       │           ├── notify/
│   │   │                   │   │       │           │   ├── NotifyMessageHandler.java
│   │   │                   │   │       │           │   └── cmd/
│   │   │                   │   │       │           │       ├── AlarmNotifyMessageHandler.java
│   │   │                   │   │       │           │       ├── BroadcastNotifyMessageHandler.java
│   │   │                   │   │       │           │       ├── KeepaliveNotifyMessageHandler.java
│   │   │                   │   │       │           │       ├── MediaStatusNotifyMessageHandler.java
│   │   │                   │   │       │           │       └── MobilePositionNotifyMessageHandler.java
│   │   │                   │   │       │           ├── query/
│   │   │                   │   │       │           │   ├── QueryMessageHandler.java
│   │   │                   │   │       │           │   └── cmd/
│   │   │                   │   │       │           │       ├── AlarmQueryMessageHandler.java
│   │   │                   │   │       │           │       ├── CatalogQueryMessageHandler.java
│   │   │                   │   │       │           │       ├── DeviceInfoQueryMessageHandler.java
│   │   │                   │   │       │           │       ├── DeviceStatusQueryMessageHandler.java
│   │   │                   │   │       │           │       └── RecordInfoQueryMessageHandler.java
│   │   │                   │   │       │           └── response/
│   │   │                   │   │       │               ├── ResponseMessageHandler.java
│   │   │                   │   │       │               └── cmd/
│   │   │                   │   │       │                   ├── AlarmResponseMessageHandler.java
│   │   │                   │   │       │                   ├── BroadcastResponseMessageHandler.java
│   │   │                   │   │       │                   ├── CatalogResponseMessageHandler.java
│   │   │                   │   │       │                   ├── ConfigDownloadResponseMessageHandler.java
│   │   │                   │   │       │                   ├── DeviceInfoResponseMessageHandler.java
│   │   │                   │   │       │                   ├── DeviceStatusResponseMessageHandler.java
│   │   │                   │   │       │                   ├── MobilePositionResponseMessageHandler.java
│   │   │                   │   │       │                   ├── PresetQueryResponseMessageHandler.java
│   │   │                   │   │       │                   └── RecordInfoResponseMessageHandler.java
│   │   │                   │   │       └── response/
│   │   │                   │   │           ├── ISIPResponseProcessor.java
│   │   │                   │   │           ├── SIPResponseProcessorAbstract.java
│   │   │                   │   │           └── impl/
│   │   │                   │   │               ├── ByeResponseProcessor.java
│   │   │                   │   │               ├── CancelResponseProcessor.java
│   │   │                   │   │               ├── InviteResponseProcessor.java
│   │   │                   │   │               └── RegisterResponseProcessor.java
│   │   │                   │   └── utils/
│   │   │                   │       ├── Coordtransform.java
│   │   │                   │       ├── MessageElement.java
│   │   │                   │       ├── MessageElementForCatalog.java
│   │   │                   │       ├── NumericUtil.java
│   │   │                   │       ├── SipUtils.java
│   │   │                   │       ├── VectorTileCatch.java
│   │   │                   │       └── XmlUtil.java
│   │   │                   ├── jt1078/
│   │   │                   │   ├── annotation/
│   │   │                   │   │   └── MsgId.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── JTAlarmSign.java
│   │   │                   │   │   ├── JTAreaAttribute.java
│   │   │                   │   │   ├── JTAreaOrRoute.java
│   │   │                   │   │   ├── JTChannel.java
│   │   │                   │   │   ├── JTCircleArea.java
│   │   │                   │   │   ├── JTCommunicationModuleAttribute.java
│   │   │                   │   │   ├── JTConfirmationAlarmMessageType.java
│   │   │                   │   │   ├── JTDevice.java
│   │   │                   │   │   ├── JTDeviceAttribute.java
│   │   │                   │   │   ├── JTDeviceConfig.java
│   │   │                   │   │   ├── JTDeviceConnectionControl.java
│   │   │                   │   │   ├── JTDeviceType.java
│   │   │                   │   │   ├── JTDriverInformation.java
│   │   │                   │   │   ├── JTGnssAttribute.java
│   │   │                   │   │   ├── JTMediaAttribute.java
│   │   │                   │   │   ├── JTMediaDataInfo.java
│   │   │                   │   │   ├── JTMediaEventInfo.java
│   │   │                   │   │   ├── JTMediaStreamType.java
│   │   │                   │   │   ├── JTPassengerNum.java
│   │   │                   │   │   ├── JTPhoneBookContact.java
│   │   │                   │   │   ├── JTPolygonArea.java
│   │   │                   │   │   ├── JTPolygonPoint.java
│   │   │                   │   │   ├── JTPositionAdditionalInfo.java
│   │   │                   │   │   ├── JTPositionBaseInfo.java
│   │   │                   │   │   ├── JTPositionInfo.java
│   │   │                   │   │   ├── JTQueryMediaDataCommand.java
│   │   │                   │   │   ├── JTRecordDownloadCatch.java
│   │   │                   │   │   ├── JTRectangleArea.java
│   │   │                   │   │   ├── JTRoute.java
│   │   │                   │   │   ├── JTRouteAttribute.java
│   │   │                   │   │   ├── JTRoutePoint.java
│   │   │                   │   │   ├── JTRouteSectionAttribute.java
│   │   │                   │   │   ├── JTShootingCommand.java
│   │   │                   │   │   ├── JTStatus.java
│   │   │                   │   │   ├── JTTextSign.java
│   │   │                   │   │   ├── JTVehicleControl.java
│   │   │                   │   │   ├── JTVideoAlarm.java
│   │   │                   │   │   ├── common/
│   │   │                   │   │   │   └── ConfigAttribute.java
│   │   │                   │   │   └── config/
│   │   │                   │   │       ├── JTAlarmRecordingParam.java
│   │   │                   │   │       ├── JTAloneChanel.java
│   │   │                   │   │       ├── JTAnalyzeAlarmParam.java
│   │   │                   │   │       ├── JTAwakenParam.java
│   │   │                   │   │       ├── JTCameraTimer.java
│   │   │                   │   │       ├── JTChanelConfig.java
│   │   │                   │   │       ├── JTChannelListParam.java
│   │   │                   │   │       ├── JTChannelParam.java
│   │   │                   │   │       ├── JTCollisionAlarmParams.java
│   │   │                   │   │       ├── JTDeviceSubConfig.java
│   │   │                   │   │       ├── JTGnssPositioningMode.java
│   │   │                   │   │       ├── JTIllegalDrivingPeriods.java
│   │   │                   │   │       ├── JTOSDConfig.java
│   │   │                   │   │       ├── JTVideoAlarmBit.java
│   │   │                   │   │       └── JTVideoParam.java
│   │   │                   │   ├── cmd/
│   │   │                   │   │   └── JT1078Template.java
│   │   │                   │   ├── codec/
│   │   │                   │   │   ├── decode/
│   │   │                   │   │   │   ├── Jt808Decoder.java
│   │   │                   │   │   │   └── MultiPacketManager.java
│   │   │                   │   │   ├── encode/
│   │   │                   │   │   │   ├── Jt808Encoder.java
│   │   │                   │   │   │   └── Jt808EncoderCmd.java
│   │   │                   │   │   └── netty/
│   │   │                   │   │       ├── Jt808Handler.java
│   │   │                   │   │       └── TcpServer.java
│   │   │                   │   ├── config/
│   │   │                   │   │   ├── JT1078AutoConfiguration.java
│   │   │                   │   │   └── JT1078Config.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   ├── JT1078Controller.java
│   │   │                   │   │   ├── JT1078TerminalController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       ├── ConfirmationAlarmMessageParam.java
│   │   │                   │   │       ├── ConnectionControlParam.java
│   │   │                   │   │       ├── QueryMediaDataParam.java
│   │   │                   │   │       ├── SetAreaParam.java
│   │   │                   │   │       ├── SetConfigParam.java
│   │   │                   │   │       ├── SetPhoneBookParam.java
│   │   │                   │   │       ├── ShootingParam.java
│   │   │                   │   │       └── TextMessageParam.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── JTChannelMapper.java
│   │   │                   │   │   ├── JTTerminalMapper.java
│   │   │                   │   │   └── provider/
│   │   │                   │   │       └── JTChannelProvider.java
│   │   │                   │   ├── event/
│   │   │                   │   │   ├── ConnectChangeEvent.java
│   │   │                   │   │   ├── DeviceUpdateEvent.java
│   │   │                   │   │   ├── FtpUploadEvent.java
│   │   │                   │   │   ├── JTPositionEvent.java
│   │   │                   │   │   └── eventListener/
│   │   │                   │   │       └── ConnectChangeEventListener.java
│   │   │                   │   ├── proc/
│   │   │                   │   │   ├── Header.java
│   │   │                   │   │   ├── entity/
│   │   │                   │   │   │   └── Cmd.java
│   │   │                   │   │   ├── factory/
│   │   │                   │   │   │   └── CodecFactory.java
│   │   │                   │   │   ├── request/
│   │   │                   │   │   │   ├── J0001.java
│   │   │                   │   │   │   ├── J0002.java
│   │   │                   │   │   │   ├── J0003.java
│   │   │                   │   │   │   ├── J0004.java
│   │   │                   │   │   │   ├── J0100.java
│   │   │                   │   │   │   ├── J0102.java
│   │   │                   │   │   │   ├── J0104.java
│   │   │                   │   │   │   ├── J0107.java
│   │   │                   │   │   │   ├── J0200.java
│   │   │                   │   │   │   ├── J0201.java
│   │   │                   │   │   │   ├── J0500.java
│   │   │                   │   │   │   ├── J0608.java
│   │   │                   │   │   │   ├── J0702.java
│   │   │                   │   │   │   ├── J0704.java
│   │   │                   │   │   │   ├── J0800.java
│   │   │                   │   │   │   ├── J0801.java
│   │   │                   │   │   │   ├── J0802.java
│   │   │                   │   │   │   ├── J0805.java
│   │   │                   │   │   │   ├── J0900.java
│   │   │                   │   │   │   ├── J0901.java
│   │   │                   │   │   │   ├── J0A00.java
│   │   │                   │   │   │   ├── J1003.java
│   │   │                   │   │   │   ├── J1005.java
│   │   │                   │   │   │   ├── J1205.java
│   │   │                   │   │   │   ├── J1206.java
│   │   │                   │   │   │   └── Re.java
│   │   │                   │   │   └── response/
│   │   │                   │   │       ├── J8001.java
│   │   │                   │   │       ├── J8100.java
│   │   │                   │   │       ├── J8103.java
│   │   │                   │   │       ├── J8104.java
│   │   │                   │   │       ├── J8105.java
│   │   │                   │   │       ├── J8106.java
│   │   │                   │   │       ├── J8107.java
│   │   │                   │   │       ├── J8201.java
│   │   │                   │   │       ├── J8202.java
│   │   │                   │   │       ├── J8203.java
│   │   │                   │   │       ├── J8204.java
│   │   │                   │   │       ├── J8300.java
│   │   │                   │   │       ├── J8400.java
│   │   │                   │   │       ├── J8401.java
│   │   │                   │   │       ├── J8500.java
│   │   │                   │   │       ├── J8600.java
│   │   │                   │   │       ├── J8601.java
│   │   │                   │   │       ├── J8602.java
│   │   │                   │   │       ├── J8603.java
│   │   │                   │   │       ├── J8604.java
│   │   │                   │   │       ├── J8605.java
│   │   │                   │   │       ├── J8606.java
│   │   │                   │   │       ├── J8607.java
│   │   │                   │   │       ├── J8608.java
│   │   │                   │   │       ├── J8702.java
│   │   │                   │   │       ├── J8801.java
│   │   │                   │   │       ├── J8802.java
│   │   │                   │   │       ├── J8803.java
│   │   │                   │   │       ├── J8804.java
│   │   │                   │   │       ├── J8805.java
│   │   │                   │   │       ├── J8900.java
│   │   │                   │   │       ├── J8A00.java
│   │   │                   │   │       ├── J9003.java
│   │   │                   │   │       ├── J9101.java
│   │   │                   │   │       ├── J9102.java
│   │   │                   │   │       ├── J9201.java
│   │   │                   │   │       ├── J9202.java
│   │   │                   │   │       ├── J9205.java
│   │   │                   │   │       ├── J9206.java
│   │   │                   │   │       ├── J9207.java
│   │   │                   │   │       ├── J9301.java
│   │   │                   │   │       ├── J9302.java
│   │   │                   │   │       ├── J9303.java
│   │   │                   │   │       ├── J9304.java
│   │   │                   │   │       ├── J9305.java
│   │   │                   │   │       ├── J9306.java
│   │   │                   │   │       └── Rs.java
│   │   │                   │   ├── service/
│   │   │                   │   │   ├── Ijt1078PlayService.java
│   │   │                   │   │   ├── Ijt1078Service.java
│   │   │                   │   │   └── impl/
│   │   │                   │   │       ├── SourcePTZServiceForJTImpl.java
│   │   │                   │   │       ├── SourcePlayServiceForJTImpl.java
│   │   │                   │   │       ├── SourcePlaybackServiceForJTImpl.java
│   │   │                   │   │       ├── jt1078PlayServiceImpl.java
│   │   │                   │   │       └── jt1078ServiceImpl.java
│   │   │                   │   ├── session/
│   │   │                   │   │   ├── FtpDownloadManager.java
│   │   │                   │   │   ├── Session.java
│   │   │                   │   │   └── SessionManager.java
│   │   │                   │   └── util/
│   │   │                   │       ├── BCDUtil.java
│   │   │                   │       ├── Bin.java
│   │   │                   │       └── ClassUtil.java
│   │   │                   ├── media/
│   │   │                   │   ├── MediaServerConfig.java
│   │   │                   │   ├── abl/
│   │   │                   │   │   ├── ABLHttpHookListener.java
│   │   │                   │   │   ├── ABLMediaNodeServerService.java
│   │   │                   │   │   ├── ABLMediaServerStatusManger.java
│   │   │                   │   │   ├── ABLRESTfulUtils.java
│   │   │                   │   │   ├── bean/
│   │   │                   │   │   │   ├── ABLMedia.java
│   │   │                   │   │   │   ├── ABLRecordFile.java
│   │   │                   │   │   │   ├── ABLResult.java
│   │   │                   │   │   │   ├── ABLUrls.java
│   │   │                   │   │   │   ├── AblServerConfig.java
│   │   │                   │   │   │   ├── ConfigKeyId.java
│   │   │                   │   │   │   └── hook/
│   │   │                   │   │   │       ├── ABLHookParam.java
│   │   │                   │   │   │       ├── OnPlayABLHookParam.java
│   │   │                   │   │   │       ├── OnPublishABLHookParam.java
│   │   │                   │   │   │       ├── OnRecordMp4ABLHookParam.java
│   │   │                   │   │   │       ├── OnRecordProgressABLHookParam.java
│   │   │                   │   │   │       ├── OnServerKeepaliveABLHookParam.java
│   │   │                   │   │   │       ├── OnServerStaredABLHookParam.java
│   │   │                   │   │   │       └── OnStreamArriveABLHookParam.java
│   │   │                   │   │   └── event/
│   │   │                   │   │       ├── HookAblServerKeepaliveEvent.java
│   │   │                   │   │       └── HookAblServerStartEvent.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── MediaInfo.java
│   │   │                   │   │   ├── MediaServer.java
│   │   │                   │   │   ├── RecordInfo.java
│   │   │                   │   │   └── ResultForOnPublish.java
│   │   │                   │   ├── event/
│   │   │                   │   │   ├── hook/
│   │   │                   │   │   │   ├── Hook.java
│   │   │                   │   │   │   ├── HookData.java
│   │   │                   │   │   │   ├── HookSubscribe.java
│   │   │                   │   │   │   └── HookType.java
│   │   │                   │   │   ├── media/
│   │   │                   │   │   │   ├── MediaArrivalEvent.java
│   │   │                   │   │   │   ├── MediaDepartureEvent.java
│   │   │                   │   │   │   ├── MediaEvent.java
│   │   │                   │   │   │   ├── MediaNotFoundEvent.java
│   │   │                   │   │   │   ├── MediaPublishEvent.java
│   │   │                   │   │   │   ├── MediaRecordMp4Event.java
│   │   │                   │   │   │   ├── MediaRecordProcessEvent.java
│   │   │                   │   │   │   └── MediaRtpServerTimeoutEvent.java
│   │   │                   │   │   └── mediaServer/
│   │   │                   │   │       ├── MediaSendRtpStoppedEvent.java
│   │   │                   │   │       ├── MediaServerChangeEvent.java
│   │   │                   │   │       ├── MediaServerDeleteEvent.java
│   │   │                   │   │       ├── MediaServerEventAbstract.java
│   │   │                   │   │       ├── MediaServerOfflineEvent.java
│   │   │                   │   │       ├── MediaServerOnlineEvent.java
│   │   │                   │   │       └── MediaServerStatusEventListener.java
│   │   │                   │   ├── service/
│   │   │                   │   │   ├── IMediaNodeServerService.java
│   │   │                   │   │   ├── IMediaServerService.java
│   │   │                   │   │   └── impl/
│   │   │                   │   │       └── MediaServerServiceImpl.java
│   │   │                   │   └── zlm/
│   │   │                   │       ├── AssistRESTfulUtils.java
│   │   │                   │       ├── ZLMHttpHookListener.java
│   │   │                   │       ├── ZLMMediaNodeServerService.java
│   │   │                   │       ├── ZLMMediaServerStatusManager.java
│   │   │                   │       ├── ZLMRESTfulUtils.java
│   │   │                   │       ├── ZLMServerFactory.java
│   │   │                   │       ├── dto/
│   │   │                   │       │   ├── ChannelOnlineEvent.java
│   │   │                   │       │   ├── FlagData.java
│   │   │                   │       │   ├── RtpServerResult.java
│   │   │                   │       │   ├── ServerKeepaliveData.java
│   │   │                   │       │   ├── SessionData.java
│   │   │                   │       │   ├── StreamAuthorityInfo.java
│   │   │                   │       │   ├── StreamProxyResult.java
│   │   │                   │       │   ├── ZLMResult.java
│   │   │                   │       │   ├── ZLMRunInfo.java
│   │   │                   │       │   ├── ZLMServerConfig.java
│   │   │                   │       │   └── hook/
│   │   │                   │       │       ├── HookParam.java
│   │   │                   │       │       ├── HookResult.java
│   │   │                   │       │       ├── HookResultForOnPublish.java
│   │   │                   │       │       ├── OnPlayHookParam.java
│   │   │                   │       │       ├── OnPublishHookParam.java
│   │   │                   │       │       ├── OnRecordMp4HookParam.java
│   │   │                   │       │       ├── OnRtpServerTimeoutHookParam.java
│   │   │                   │       │       ├── OnSendRtpStoppedHookParam.java
│   │   │                   │       │       ├── OnServerKeepaliveHookParam.java
│   │   │                   │       │       ├── OnStreamChangedHookParam.java
│   │   │                   │       │       ├── OnStreamNoneReaderHookParam.java
│   │   │                   │       │       ├── OnStreamNotFoundHookParam.java
│   │   │                   │       │       └── OriginType.java
│   │   │                   │       └── event/
│   │   │                   │           ├── HookZlmServerKeepaliveEvent.java
│   │   │                   │           └── HookZlmServerStartEvent.java
│   │   │                   ├── service/
│   │   │                   │   ├── ICloudRecordService.java
│   │   │                   │   ├── ILogService.java
│   │   │                   │   ├── IMapService.java
│   │   │                   │   ├── IMediaService.java
│   │   │                   │   ├── IMobilePositionService.java
│   │   │                   │   ├── IReceiveRtpServerService.java
│   │   │                   │   ├── IRecordPlanService.java
│   │   │                   │   ├── IRoleService.java
│   │   │                   │   ├── ISendRtpServerService.java
│   │   │                   │   ├── IUserApiKeyService.java
│   │   │                   │   ├── IUserService.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── CloudRecordItem.java
│   │   │                   │   │   ├── DownloadFileInfo.java
│   │   │                   │   │   ├── ErrorCallback.java
│   │   │                   │   │   ├── GPSMsgInfo.java
│   │   │                   │   │   ├── InviteErrorCode.java
│   │   │                   │   │   ├── InviteTimeOutCallback.java
│   │   │                   │   │   ├── LogFileInfo.java
│   │   │                   │   │   ├── MediaServerLoad.java
│   │   │                   │   │   ├── MessageForPushChannel.java
│   │   │                   │   │   ├── MessageForPushChannelResponse.java
│   │   │                   │   │   ├── PlayBackCallback.java
│   │   │                   │   │   ├── PlayBackResult.java
│   │   │                   │   │   ├── PushStreamStatusChangeFromRedisDto.java
│   │   │                   │   │   ├── RTPServerParam.java
│   │   │                   │   │   ├── RecordPlan.java
│   │   │                   │   │   ├── RecordPlanItem.java
│   │   │                   │   │   ├── RequestPushStreamMsg.java
│   │   │                   │   │   ├── RequestSendItemMsg.java
│   │   │                   │   │   ├── RequestStopPushStreamMsg.java
│   │   │                   │   │   ├── ResponseSendItemMsg.java
│   │   │                   │   │   ├── SSRCInfo.java
│   │   │                   │   │   ├── StreamPushItemFromRedis.java
│   │   │                   │   │   ├── ThirdPartyGB.java
│   │   │                   │   │   ├── WvpRedisMsg.java
│   │   │                   │   │   └── WvpRedisMsgCmd.java
│   │   │                   │   ├── impl/
│   │   │                   │   │   ├── CloudRecordServiceImpl.java
│   │   │                   │   │   ├── LogServiceImpl.java
│   │   │                   │   │   ├── MediaServiceImpl.java
│   │   │                   │   │   ├── MobilePositionServiceImpl.java
│   │   │                   │   │   ├── RecordPlanServiceImpl.java
│   │   │                   │   │   ├── RoleServerImpl.java
│   │   │                   │   │   ├── RtpServerServiceImpl.java
│   │   │                   │   │   ├── SendRtpServerServiceImpl.java
│   │   │                   │   │   ├── UserApiKeyServiceImpl.java
│   │   │                   │   │   └── UserServiceImpl.java
│   │   │                   │   └── redisMsg/
│   │   │                   │       ├── IRedisRpcPlayService.java
│   │   │                   │       ├── IRedisRpcService.java
│   │   │                   │       ├── RedisAlarmMsgListener.java
│   │   │                   │       ├── RedisCloseStreamMsgListener.java
│   │   │                   │       ├── RedisGpsMsgListener.java
│   │   │                   │       ├── RedisGroupChangeListener.java
│   │   │                   │       ├── RedisGroupMsgListener.java
│   │   │                   │       ├── RedisPushStreamListMsgListener.java
│   │   │                   │       ├── RedisPushStreamResponseListener.java
│   │   │                   │       ├── RedisPushStreamStatusMsgListener.java
│   │   │                   │       ├── control/
│   │   │                   │       │   ├── RedisRpcChannelPlayController.java
│   │   │                   │       │   ├── RedisRpcCloudRecordController.java
│   │   │                   │       │   ├── RedisRpcDeviceController.java
│   │   │                   │       │   ├── RedisRpcDevicePlayController.java
│   │   │                   │       │   ├── RedisRpcGbDeviceController.java
│   │   │                   │       │   ├── RedisRpcPlatformController.java
│   │   │                   │       │   ├── RedisRpcSendRtpController.java
│   │   │                   │       │   ├── RedisRpcStreamProxyController.java
│   │   │                   │       │   └── RedisRpcStreamPushController.java
│   │   │                   │       ├── dto/
│   │   │                   │       │   ├── RedisRpcController.java
│   │   │                   │       │   ├── RedisRpcMapping.java
│   │   │                   │       │   └── RpcController.java
│   │   │                   │       └── service/
│   │   │                   │           ├── RedisRpcPlayServiceImpl.java
│   │   │                   │           └── RedisRpcServiceImpl.java
│   │   │                   ├── storager/
│   │   │                   │   ├── IRedisCatchStorage.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── CloudRecordServiceMapper.java
│   │   │                   │   │   ├── MediaServerMapper.java
│   │   │                   │   │   ├── RecordPlanMapper.java
│   │   │                   │   │   ├── RoleMapper.java
│   │   │                   │   │   ├── UserApiKeyMapper.java
│   │   │                   │   │   ├── UserMapper.java
│   │   │                   │   │   └── dto/
│   │   │                   │   │       ├── ChannelSourceInfo.java
│   │   │                   │   │       ├── LogDto.java
│   │   │                   │   │       ├── PlatformRegisterInfo.java
│   │   │                   │   │       ├── RecordInfo.java
│   │   │                   │   │       ├── Role.java
│   │   │                   │   │       ├── User.java
│   │   │                   │   │       └── UserApiKey.java
│   │   │                   │   └── impl/
│   │   │                   │       └── RedisCatchStorageImpl.java
│   │   │                   ├── streamProxy/
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── StreamProxy.java
│   │   │                   │   │   └── StreamProxyParam.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   └── StreamProxyController.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   ├── StreamProxyMapper.java
│   │   │                   │   │   └── provider/
│   │   │                   │   │       └── StreamProxyProvider.java
│   │   │                   │   └── service/
│   │   │                   │       ├── IStreamProxyPlayService.java
│   │   │                   │       ├── IStreamProxyService.java
│   │   │                   │       └── impl/
│   │   │                   │           ├── SourcePlayServiceForStreamProxyImpl.java
│   │   │                   │           ├── StreamProxyPlayServiceImpl.java
│   │   │                   │           └── StreamProxyServiceImpl.java
│   │   │                   ├── streamPush/
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── BatchRemoveParam.java
│   │   │                   │   │   ├── RedisPushStreamMessage.java
│   │   │                   │   │   ├── StreamPush.java
│   │   │                   │   │   └── StreamPushExcelDto.java
│   │   │                   │   ├── controller/
│   │   │                   │   │   └── StreamPushController.java
│   │   │                   │   ├── dao/
│   │   │                   │   │   └── StreamPushMapper.java
│   │   │                   │   ├── enent/
│   │   │                   │   │   └── StreamPushUploadFileHandler.java
│   │   │                   │   └── service/
│   │   │                   │       ├── IStreamPushPlayService.java
│   │   │                   │       ├── IStreamPushService.java
│   │   │                   │       └── impl/
│   │   │                   │           ├── SourcePlayServiceForStreamPushImpl.java
│   │   │                   │           ├── StreamPushPlayServiceImpl.java
│   │   │                   │           └── StreamPushServiceImpl.java
│   │   │                   ├── utils/
│   │   │                   │   ├── CivilCodeUtil.java
│   │   │                   │   ├── Coordtransform.java
│   │   │                   │   ├── DateUtil.java
│   │   │                   │   ├── GitUtil.java
│   │   │                   │   ├── GpsUtil.java
│   │   │                   │   ├── HttpUtils.java
│   │   │                   │   ├── IpPortUtil.java
│   │   │                   │   ├── JsonUtil.java
│   │   │                   │   ├── MediaServerUtils.java
│   │   │                   │   ├── SSLSocketClientUtil.java
│   │   │                   │   ├── SpringBeanFactory.java
│   │   │                   │   ├── SystemInfoUtils.java
│   │   │                   │   ├── TileUtils.java
│   │   │                   │   ├── UJson.java
│   │   │                   │   └── redis/
│   │   │                   │       ├── FastJsonRedisSerializer.java
│   │   │                   │       ├── RedisUtil.java
│   │   │                   │       └── RedisUtil2.java
│   │   │                   ├── vmanager/
│   │   │                   │   ├── TestController.java
│   │   │                   │   ├── bean/
│   │   │                   │   │   ├── AudioBroadcastResult.java
│   │   │                   │   │   ├── BatchGBStreamParam.java
│   │   │                   │   │   ├── DeferredResultEx.java
│   │   │                   │   │   ├── DeferredResultFilter.java
│   │   │                   │   │   ├── ErrorCode.java
│   │   │                   │   │   ├── MapConfig.java
│   │   │                   │   │   ├── MapModelIcon.java
│   │   │                   │   │   ├── OtherPsSendInfo.java
│   │   │                   │   │   ├── OtherRtpSendInfo.java
│   │   │                   │   │   ├── PlayTypeEnum.java
│   │   │                   │   │   ├── RecordFile.java
│   │   │                   │   │   ├── ResourceBaseInfo.java
│   │   │                   │   │   ├── ResourceInfo.java
│   │   │                   │   │   ├── SnapPath.java
│   │   │                   │   │   ├── StreamContent.java
│   │   │                   │   │   ├── SystemConfigInfo.java
│   │   │                   │   │   ├── TablePageInfo.java
│   │   │                   │   │   └── WVPResult.java
│   │   │                   │   ├── cloudRecord/
│   │   │                   │   │   ├── CloudRecordController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       └── CloudRecordUrl.java
│   │   │                   │   ├── log/
│   │   │                   │   │   └── LogController.java
│   │   │                   │   ├── ps/
│   │   │                   │   │   └── PsController.java
│   │   │                   │   ├── recordPlan/
│   │   │                   │   │   ├── RecordPlanController.java
│   │   │                   │   │   └── bean/
│   │   │                   │   │       └── RecordPlanParam.java
│   │   │                   │   ├── rtp/
│   │   │                   │   │   └── RtpController.java
│   │   │                   │   ├── server/
│   │   │                   │   │   └── ServerController.java
│   │   │                   │   └── user/
│   │   │                   │       ├── RoleController.java
│   │   │                   │       ├── UserApiKeyController.java
│   │   │                   │       └── UserController.java
│   │   │                   └── web/
│   │   │                       ├── custom/
│   │   │                       │   ├── CameraChannelController.java
│   │   │                       │   ├── bean/
│   │   │                       │   │   ├── CameraChannel.java
│   │   │                       │   │   ├── CameraCount.java
│   │   │                       │   │   ├── CameraGroup.java
│   │   │                       │   │   ├── CameraStreamContent.java
│   │   │                       │   │   ├── CameraStreamInfo.java
│   │   │                       │   │   ├── ChannelParam.java
│   │   │                       │   │   ├── IdsQueryParam.java
│   │   │                       │   │   ├── Point.java
│   │   │                       │   │   ├── PolygonQueryParam.java
│   │   │                       │   │   └── SYMember.java
│   │   │                       │   ├── conf/
│   │   │                       │   │   ├── CachedBodyHttpServletRequest.java
│   │   │                       │   │   ├── SignAuthenticationFilter.java
│   │   │                       │   │   └── SyTokenManager.java
│   │   │                       │   └── service/
│   │   │                       │       ├── CameraChannelService.java
│   │   │                       │       └── SyServiceImpl.java
│   │   │                       └── gb28181/
│   │   │                           ├── ApiControlController.java
│   │   │                           ├── ApiController.java
│   │   │                           ├── ApiDeviceController.java
│   │   │                           ├── ApiStreamController.java
│   │   │                           ├── AuthController.java
│   │   │                           └── dto/
│   │   │                               └── DeviceChannelExtend.java
│   │   └── resources/
│   │       ├── application.yml
│   │       ├── banner.txt
│   │       ├── civilCode.csv
│   │       ├── index.html
│   │       ├── install.sh
│   │       ├── jwk.json
│   │       ├── local.jks
│   │       ├── logback-spring.xml
│   │       └── 配置详情.yml
│   └── test/
│       └── java/
│           └── com/
│               └── genersoft/
│                   └── iot/
│                       └── vmp/
│                           └── jt1078/
│                               └── JT1078ServerTest.java
├── web/
│   ├── .editorconfig
│   ├── .eslintignore
│   ├── .eslintrc.js
│   ├── .gitignore
│   ├── .travis.yml
│   ├── LICENSE
│   ├── README-zh.md
│   ├── README.md
│   ├── babel.config.js
│   ├── build/
│   │   └── index.js
│   ├── jest.config.js
│   ├── jsconfig.json
│   ├── mock/
│   │   ├── index.js
│   │   ├── mock-server.js
│   │   ├── table.js
│   │   ├── user.js
│   │   └── utils.js
│   ├── package.json
│   ├── postcss.config.js
│   ├── public/
│   │   ├── index.html
│   │   ├── libDecoder.wasm
│   │   └── static/
│   │       ├── file/
│   │       │   └── 设置电话本模板.xlsx
│   │       └── js/
│   │           ├── ZLMRTCClient.js
│   │           ├── config.js
│   │           ├── h265web/
│   │           │   ├── h265webjs-v20221106.js
│   │           │   ├── index.d.ts
│   │           │   ├── index.js
│   │           │   ├── missile-v20221120.wasm
│   │           │   └── missile.js
│   │           └── jessibuca/
│   │               ├── decoder.js
│   │               ├── decoder.wasm
│   │               ├── jessibuca.d.ts
│   │               └── jessibuca.js
│   ├── src/
│   │   ├── App.vue
│   │   ├── api/
│   │   │   ├── cloudRecord.js
│   │   │   ├── commonChannel.js
│   │   │   ├── device.js
│   │   │   ├── frontEnd.js
│   │   │   ├── gbRecord.js
│   │   │   ├── group.js
│   │   │   ├── jtDevice.js
│   │   │   ├── log.js
│   │   │   ├── platform.js
│   │   │   ├── play.js
│   │   │   ├── playback.js
│   │   │   ├── recordPlan.js
│   │   │   ├── region.js
│   │   │   ├── role.js
│   │   │   ├── server.js
│   │   │   ├── streamProxy.js
│   │   │   ├── streamPush.js
│   │   │   ├── table.js
│   │   │   ├── user.js
│   │   │   └── userApiKey.js
│   │   ├── components/
│   │   │   ├── Breadcrumb/
│   │   │   │   └── index.vue
│   │   │   ├── Hamburger/
│   │   │   │   └── index.vue
│   │   │   └── SvgIcon/
│   │   │       └── index.vue
│   │   ├── directive/
│   │   │   └── el-drag-dialog/
│   │   │       ├── drag.js
│   │   │       └── index.js
│   │   ├── icons/
│   │   │   ├── index.js
│   │   │   └── svgo.yml
│   │   ├── layout/
│   │   │   ├── components/
│   │   │   │   ├── AppMain.vue
│   │   │   │   ├── Navbar.vue
│   │   │   │   ├── Sidebar/
│   │   │   │   │   ├── FixiOSBug.js
│   │   │   │   │   ├── Item.vue
│   │   │   │   │   ├── Link.vue
│   │   │   │   │   ├── Logo.vue
│   │   │   │   │   ├── SidebarItem.vue
│   │   │   │   │   └── index.vue
│   │   │   │   ├── TagsView/
│   │   │   │   │   ├── ScrollPane.vue
│   │   │   │   │   └── index.vue
│   │   │   │   ├── dialog/
│   │   │   │   │   └── changePassword.vue
│   │   │   │   └── index.js
│   │   │   ├── index.vue
│   │   │   └── mixin/
│   │   │       └── ResizeHandler.js
│   │   ├── main.js
│   │   ├── permission.js
│   │   ├── router/
│   │   │   └── index.js
│   │   ├── settings.js
│   │   ├── store/
│   │   │   ├── getters.js
│   │   │   ├── index.js
│   │   │   └── modules/
│   │   │       ├── app.js
│   │   │       ├── cloudRecord.js
│   │   │       ├── commonChanel.js
│   │   │       ├── device.js
│   │   │       ├── frontEnd.js
│   │   │       ├── gbRecord.js
│   │   │       ├── group.js
│   │   │       ├── jtDevice.js
│   │   │       ├── log.js
│   │   │       ├── platform.js
│   │   │       ├── play.js
│   │   │       ├── playback.js
│   │   │       ├── recordPlan.js
│   │   │       ├── region.js
│   │   │       ├── role.js
│   │   │       ├── server.js
│   │   │       ├── settings.js
│   │   │       ├── streamProxy.js
│   │   │       ├── streamPush.js
│   │   │       ├── tagsView.js
│   │   │       ├── user.js
│   │   │       └── userApiKeys.js
│   │   ├── styles/
│   │   │   ├── element-ui.scss
│   │   │   ├── iconfont.scss
│   │   │   ├── index.scss
│   │   │   ├── mixin.scss
│   │   │   ├── sidebar.scss
│   │   │   ├── transition.scss
│   │   │   └── variables.scss
│   │   ├── utils/
│   │   │   ├── auth.js
│   │   │   ├── diff.js
│   │   │   ├── get-page-title.js
│   │   │   ├── index.js
│   │   │   ├── request.js
│   │   │   └── validate.js
│   │   └── views/
│   │       ├── 404.vue
│   │       ├── channel/
│   │       │   ├── edit.vue
│   │       │   ├── group/
│   │       │   │   └── index.vue
│   │       │   ├── index.vue
│   │       │   ├── record.vue
│   │       │   └── region/
│   │       │       └── index.vue
│   │       ├── cloudRecord/
│   │       │   ├── cloudRecordPlayer.vue
│   │       │   ├── detail.vue
│   │       │   ├── index.vue
│   │       │   └── playerDialog.vue
│   │       ├── common/
│   │       │   ├── CommonChannelEdit.vue
│   │       │   ├── DeviceTree.vue
│   │       │   ├── GroupTree.vue
│   │       │   ├── MapComponent.vue
│   │       │   ├── MapComponent_bak.vue
│   │       │   ├── RegionTree.vue
│   │       │   ├── VideoTimeLine/
│   │       │   │   ├── WindowListItem.vue
│   │       │   │   ├── constant.js
│   │       │   │   └── index.vue
│   │       │   ├── channelPlayer/
│   │       │   │   ├── chooseChannelForJt.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── jtDeviceEdit.vue
│   │       │   │   ├── jtDevicePlayer.vue
│   │       │   │   ├── ptzCruising.vue
│   │       │   │   ├── ptzPreset.vue
│   │       │   │   ├── ptzScan.vue
│   │       │   │   ├── ptzSwitch.vue
│   │       │   │   └── ptzWiper.vue
│   │       │   ├── h265web.vue
│   │       │   ├── jessibuca.vue
│   │       │   ├── map/
│   │       │   │   ├── DragInteraction.js
│   │       │   │   └── TransformLonLat.js
│   │       │   ├── mediaInfo.vue
│   │       │   ├── ptzCruising.vue
│   │       │   ├── ptzPreset.vue
│   │       │   ├── ptzScan.vue
│   │       │   ├── ptzSwitch.vue
│   │       │   ├── ptzWiper.vue
│   │       │   ├── rtcPlayer.vue
│   │       │   └── weekTimePicker.vue
│   │       ├── dashboard/
│   │       │   ├── console/
│   │       │   │   ├── ConsoleCPU.vue
│   │       │   │   ├── ConsoleDisk.vue
│   │       │   │   ├── ConsoleMEM.vue
│   │       │   │   ├── ConsoleMediaServer.vue
│   │       │   │   ├── ConsoleNet.vue
│   │       │   │   ├── ConsoleNodeLoad.vue
│   │       │   │   └── ConsoleResource.vue
│   │       │   └── index.vue
│   │       ├── device/
│   │       │   ├── channel/
│   │       │   │   ├── edit.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── record.vue
│   │       │   ├── edit.vue
│   │       │   ├── index.vue
│   │       │   └── list.vue
│   │       ├── dialog/
│   │       │   ├── GbChannelSelect.vue
│   │       │   ├── GbDeviceSelect.vue
│   │       │   ├── MediaServerEdit.vue
│   │       │   ├── SyncChannelProgress.vue
│   │       │   ├── UnusualGroupChannelSelect.vue
│   │       │   ├── UnusualRegionChannelSelect.vue
│   │       │   ├── addUser.vue
│   │       │   ├── addUserApiKey.vue
│   │       │   ├── catalogEdit.vue
│   │       │   ├── changePasswordForAdmin.vue
│   │       │   ├── changePushKey.vue
│   │       │   ├── channelCode.vue
│   │       │   ├── channelMapInfobox.vue
│   │       │   ├── chooseCivilCode.vue
│   │       │   ├── chooseGroup.vue
│   │       │   ├── chooseTimeRange.vue
│   │       │   ├── commonChannelEditDialog.vue
│   │       │   ├── configInfo.vue
│   │       │   ├── devicePlayer.vue
│   │       │   ├── editRecordPlan.vue
│   │       │   ├── groupEdit.vue
│   │       │   ├── hasStreamChannel.vue
│   │       │   ├── importChannel.vue
│   │       │   ├── importChannelShowErrorData.vue
│   │       │   ├── linkChannelRecord.vue
│   │       │   ├── pushStreamEdit.vue
│   │       │   ├── queryTrace.vue
│   │       │   ├── recordDownload.vue
│   │       │   ├── regionCode.vue
│   │       │   ├── regionEdit.vue
│   │       │   ├── remarkUserApiKey.vue
│   │       │   ├── resetChannel.vue
│   │       │   ├── shareChannel.vue
│   │       │   └── shareChannelAdd.vue
│   │       ├── form/
│   │       │   └── index.vue
│   │       ├── jtDevice/
│   │       │   ├── channel/
│   │       │   │   ├── edit.vue
│   │       │   │   ├── index.vue
│   │       │   │   └── record.vue
│   │       │   ├── deviceParam/
│   │       │   │   ├── alarm.vue
│   │       │   │   ├── alarmSign.vue
│   │       │   │   ├── awakenParam.vue
│   │       │   │   ├── cameraTimer.vue
│   │       │   │   ├── canCollectionParam.vue
│   │       │   │   ├── carInfo.vue
│   │       │   │   ├── communication.vue
│   │       │   │   ├── driving.vue
│   │       │   │   ├── gnssParam.vue
│   │       │   │   ├── imageConfig.vue
│   │       │   │   ├── index.vue
│   │       │   │   ├── phoneNumber.vue
│   │       │   │   ├── position.vue
│   │       │   │   ├── server.vue
│   │       │   │   ├── videoAlarmSign.vue
│   │       │   │   └── videoParam.vue
│   │       │   ├── dialog/
│   │       │   │   ├── attribute.vue
│   │       │   │   ├── connectionServer.vue
│   │       │   │   ├── controlDoor.vue
│   │       │   │   ├── driverInfo.vue
│   │       │   │   ├── jtDevicePlayer.vue
│   │       │   │   ├── mediaAttribute.vue
│   │       │   │   ├── phoneBook.vue
│   │       │   │   ├── position.vue
│   │       │   │   ├── queryMediaList.vue
│   │       │   │   ├── queryMediaListDialog.vue
│   │       │   │   ├── shootingNow.vue
│   │       │   │   ├── telephoneCallback.vue
│   │       │   │   └── textMsg.vue
│   │       │   ├── edit.vue
│   │       │   ├── index.vue
│   │       │   └── list.vue
│   │       ├── live/
│   │       │   └── index.vue
│   │       ├── login/
│   │       │   └── index.vue
│   │       ├── map/
│   │       │   ├── dialog/
│   │       │   │   └── drawThinProgress.vue
│   │       │   ├── index.vue
│   │       │   └── queryTrace.vue
│   │       ├── mediaServer/
│   │       │   └── index.vue
│   │       ├── operations/
│   │       │   ├── historyLog.vue
│   │       │   ├── realLog.vue
│   │       │   ├── showLog.vue
│   │       │   └── systemInfo.vue
│   │       ├── platform/
│   │       │   ├── edit.vue
│   │       │   └── index.vue
│   │       ├── recordPlan/
│   │       │   └── index.vue
│   │       ├── streamProxy/
│   │       │   ├── edit.vue
│   │       │   └── index.vue
│   │       ├── streamPush/
│   │       │   ├── buildPushStreamUrl.vue
│   │       │   ├── edit.vue
│   │       │   └── index.vue
│   │       └── user/
│   │           ├── apiKeyManager.vue
│   │           └── index.vue
│   ├── tests/
│   │   └── unit/
│   │       ├── .eslintrc.js
│   │       ├── components/
│   │       │   ├── Breadcrumb.spec.js
│   │       │   ├── Hamburger.spec.js
│   │       │   └── SvgIcon.spec.js
│   │       └── utils/
│   │           ├── formatTime.spec.js
│   │           ├── param2Obj.spec.js
│   │           ├── parseTime.spec.js
│   │           └── validate.spec.js
│   └── vue.config.js
├── 打包/
│   └── config/
│       └── config.ini
└── 数据库/
    ├── 2.6.9/
    │   ├── 初始化-mysql-2.6.9.sql
    │   ├── 初始化-postgresql-kingbase-2.6.9.sql
    │   ├── 更新-mysql-2.6.9.sql
    │   └── 更新-postgresql-kingbase-2.6.9.sql
    ├── 2.7.0/
    │   ├── 初始化-mysql-2.7.0.sql
    │   ├── 初始化-postgresql-kingbase-2.7.0.sql
    │   ├── 更新-mysql-2.7.0.sql
    │   └── 更新-postgresql-kingbase-2.7.0.sql
    ├── 2.7.1/
    │   ├── 初始化-mysql-2.7.1.sql
    │   ├── 初始化-postgresql-kingbase-2.7.1.sql
    │   ├── 更新-mysql-2.7.1.sql
    │   └── 更新-postgresql-kingbase-2.7.1.sql
    ├── 2.7.3/
    │   ├── 初始化-mysql-2.7.3.sql
    │   ├── 初始化-postgresql-kingbase-2.7.3.sql
    │   ├── 更新-mysql-2.7.1升级到2.7.3.sql
    │   ├── 更新-mysql-2.7.3.sql
    │   ├── 更新-postgresql-kingbase-2.7.1升级到2.7.3.sql
    │   └── 更新-postgresql-kingbase-2.7.3.sql
    ├── 2.7.4/
    │   ├── 初始化-mysql-2.7.4.sql
    │   ├── 初始化-postgresql-kingbase-2.7.4.sql
    │   ├── 更新-mysql-2.7.4.sql
    │   └── 更新-postgresql-kingbase-2.7.4.sql
    ├── 2.7.4-h2/
    │   ├── h2-data.sql
    │   └── h2-schema.sql
    └── old/
        ├── 2.6.6-2.6.7更新.sql
        ├── 2.6.8升级2.6.9.sql
        ├── 2.6.8补丁更新.sql
        └── clean.sql
Download .txt
Showing preview only (669K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7879 symbols across 831 files)

FILE: doc/lib/js/docsify@4.js
  function c (line 1) | function c(i){var o=Object.create(null);return function(e){var n=f(e)?e:...
  function f (line 1) | function f(e){return"string"==typeof e||"number"==typeof e}
  function d (line 1) | function d(){}
  function o (line 1) | function o(e){return"function"==typeof e}
  function g (line 1) | function g(e){e=e.match(/^([^:/?#]+:)?(?:\/{2,}([^/?#]*))?([^?#]+)?(\?[^...
  function l (line 1) | function l(e,n){if(void 0===n&&(n=!1),"string"==typeof e){if(void 0!==wi...
  function b (line 1) | function b(e,n){return n?e.querySelector(n):v.querySelector(e)}
  function k (line 1) | function k(e,n){return[].slice.call(n?e.querySelectorAll(n):v.querySelec...
  function w (line 1) | function w(e,n){return e=v.createElement(e),n&&(e.innerHTML=n),e}
  function r (line 1) | function r(e,n){return e.appendChild(n)}
  function y (line 1) | function y(e,n){return e.insertBefore(n,e.children[0])}
  function p (line 1) | function p(e,n,i){o(n)?window.addEventListener(e,n):e.addEventListener(n...
  function x (line 1) | function x(e,n,i){o(n)?window.removeEventListener(e,n):e.removeEventList...
  function S (line 1) | function S(e,n,i){e&&e.classList[i?n:"toggle"](i||n)}
  function e (line 1) | function e(e,n){var i=(n=void 0===n?document:n).readyState;if("complete"...
  function A (line 1) | function A(e,n){return-1!==e.indexOf(n,e.length-n.length)}
  function F (line 1) | function F(e){var n={};return(e=e.trim().replace(/^(\?|#|&)/,""))&&e.spl...
  function E (line 1) | function E(e,n){void 0===n&&(n=[]);var i,o=[];for(i in e)-1<n.indexOf(i)...
  function L (line 1) | function L(e){return e.split("/").filter(function(e){return-1===e.indexO...
  function q (line 1) | function q(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];retu...
  function I (line 1) | function I(e){this.config=e}
  function N (line 1) | function N(e){var n=location.href.indexOf("#");location.replace(location...
  function e (line 1) | function e(e){o.call(this,e),this.mode="hash"}
  function e (line 1) | function e(e){n.call(this,e),this.mode="history"}
  function G (line 1) | function G(e){var n,i=e.loaded,o=e.total,t=e.step;Z||((e=w("div")).class...
  function X (line 1) | function X(t,e,n){void 0===e&&(e=!1),void 0===n&&(n={});function a(){r.a...
  function Q (line 1) | function Q(e,n){e.innerHTML=e.innerHTML.replace(/var\(\s*--theme-color.*...
  function K (line 1) | function K(){var e,n=l("section.cover");n&&(e=n.getBoundingClientRect()....
  function ee (line 1) | function ee(e,n,o,i){var t=[];null!=(n=l(n))&&(t=k(n,"a"));var a,r=decod...
  function ne (line 1) | function ne(e,n){for(var i=0;i<n.length;i++){var o=n[i];o.enumerable=o.e...
  function oe (line 1) | function oe(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[...
  function te (line 1) | function te(e,n){for(var i=0;i<n.length;i++){var o=n[i];o.enumerable=o.e...
  function re (line 1) | function re(){var e=0<arguments.length&&void 0!==arguments[0]?arguments[...
  function ue (line 1) | function ue(e){var n,i=m({auto2top:!1,autoHeader:!1,basePath:"",catchPlu...
  function le (line 1) | function le(e){if(ge){for(var n,i=l(".sidebar"),o=k(".anchor"),t=b(i,".s...
  function ve (line 1) | function ve(e,n){return decodeURIComponent(e)+"?id="+decodeURIComponent(n)}
  function he (line 1) | function he(e,n){var i,o;n&&(o=ue().topMargin,(i=b("#"+n))&&(i=i,void 0=...
  function be (line 1) | function be(e,n){return e(n={exports:{}},n.exports),n.exports}
  function ke (line 1) | function ke(e){return $e[e]}
  function e (line 1) | function e(){return{baseUrl:null,breaks:!1,gfm:!0,headerIds:!0,headerPre...
  function Fe (line 1) | function Fe(e){return e.replace(ze,function(e,n){return"colon"===(n=n.to...
  function qe (line 1) | function qe(e,n){Re[" "+e]||(je.test(e)?Re[" "+e]=e+"/":Re[" "+e]=Pe(e,"...
  function Pe (line 1) | function Pe(e,n,i){var o=e.length;if(0===o)return"";for(var t=0;t<o;){va...
  function en (line 1) | function en(e,n,i){var o=n.href,t=n.title?Je(n.title):null,n=e[1].replac...
  function e (line 1) | function e(e){this.options=e||We}
  function cn (line 1) | function cn(e){return e.replace(/---/g,"—").replace(/--/g,"–").replace(/...
  function un (line 1) | function un(e){for(var n,i="",o=e.length,t=0;t<o;t++)n=e.charCodeAt(t),i...
  function i (line 1) | function i(e){this.tokens=[],this.tokens.links=Object.create(null),this....
  function e (line 1) | function e(e){this.options=e||pn}
  function e (line 1) | function e(){}
  function e (line 1) | function e(){this.seen={}}
  function i (line 1) | function i(e){this.options=e||hn,this.options.renderer=this.options.rend...
  function xn (line 1) | function xn(e,i,o){if(null==e)throw new Error("marked(): input parameter...
  function An (line 1) | function An(e,i){if(void 0===i&&(i='<ul class="app-sub-sidebar">{inner}<...
  function $n (line 1) | function $n(e,n){return'<p class="'+e+'">'+n.slice(5).trim()+"</p>"}
  function zn (line 1) | function zn(e,o){var t=[],a={};return e.forEach(function(e){var n=e.leve...
  function Tn (line 1) | function Tn(e){return e.toLowerCase()}
  function Cn (line 1) | function Cn(e){if("string"!=typeof e)return"";var n=e.trim().replace(/[A...
  function jn (line 1) | function jn(e,t){return e.replace(/<(code|pre|script|template)[^>]*?>[\s...
  function On (line 1) | function On(e){var o={};return{str:e=(e=void 0===e?"":e)&&e.replace(/^('...
  function Ln (line 1) | function Ln(e){return(e=void 0===e?"":e).replace(/(<\/?a.*?>)/gi,"")}
  function c (line 1) | function c(e){r.highlightedCode=e,T.hooks.run("before-insert",r),r.eleme...
  function C (line 1) | function C(e,n,i,o){this.type=e,this.content=n,this.alias=i,this.length=...
  function R (line 1) | function R(e,n,i,o){e.lastIndex=n;i=e.exec(i);return i&&o&&i[1]&&(o=i[1]...
  function a (line 1) | function a(){var e={value:null,prev:null,next:null},n={value:null,prev:e...
  function j (line 1) | function j(e,n,i){var o=n.next,i={value:i,prev:n,next:o};return n.next=i...
  function O (line 1) | function O(e,n,i){for(var o=n.next,t=0;t<i&&o!==e.tail;t++)o=o.next;(n.n...
  function t (line 1) | function t(){T.manual||T.highlightAll()}
  function Mn (line 1) | function Mn(e,n){return"___"+e.toUpperCase()+n+"___"}
  function In (line 1) | function In(t,e){var a=this;this.config=t,this.router=e,this.cacheTree={...
  function Dn (line 1) | function Dn(e){var n=Zn(e);return 0===n?e:(n=new RegExp("^[ \\t]{"+n+"}"...
  function Vn (line 1) | function Vn(e,o){var a=e.compiler,t=e.raw;void 0===t&&(t="");var n=e.fet...
  function Yn (line 1) | function Yn(e,n,i){var o,t,a,r;return n="function"==typeof i?i(n):"strin...
  function Gn (line 1) | function Gn(e){function n(e){var n=Boolean(e.__vue__&&e.__vue__._isVue),...
  function Wn (line 1) | function Wn(n,i,o,t,a,e){n=e?n:n.replace(/\/$/,""),(n=R(n))&&X(a.router....
  function Xn (line 1) | function Xn(){var n=function(){return null};return[function(e){n(e)},fun...
  function n (line 1) | function n(){e.call(this),this.config=ue(this),this.initLifecycle(),this...
  function n (line 1) | function n(){e.apply(this,arguments)}
  function o (line 1) | function o(){i.callHook("doneEach"),e()}
  function n (line 1) | function n(){e.apply(this,arguments)}
  function n (line 1) | function n(e){return h.classList.toggle("close")}
  function n (line 1) | function n(){e.apply(this,arguments)}
  function n (line 1) | function n(){t.updatedAt&&(i=Yn(i,t.updatedAt,r.config.formatUpdated)),r...
  function n (line 1) | function n(){e.apply(this,arguments)}
  function u (line 1) | function u(){var e=r.shift();if(!e)return c(null);var n=A(o=(i="^",0===(...
  function e (line 1) | function e(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];i.ap...
  function n (line 1) | function n(){e.apply(this,arguments)}
  function Kn (line 1) | function Kn(e,n,i){return Qn&&Qn.abort&&Qn.abort(),Qn=X(e,!0,i)}

FILE: docker/mysql/db/wvp.sql
  type wvp_device (line 13) | create table IF NOT EXISTS wvp_device
  type wvp_device_alarm (line 54) | create table IF NOT EXISTS wvp_device_alarm
  type wvp_device_mobile_position (line 70) | create table IF NOT EXISTS wvp_device_mobile_position
  type wvp_device_channel (line 87) | create table IF NOT EXISTS wvp_device_channel
  type wvp_media_server (line 178) | create table IF NOT EXISTS wvp_media_server
  type wvp_platform (line 215) | create table IF NOT EXISTS wvp_platform
  type wvp_platform_channel (line 256) | create table IF NOT EXISTS wvp_platform_channel
  type wvp_platform_group (line 300) | create table IF NOT EXISTS wvp_platform_group
  type wvp_platform_region (line 309) | create table IF NOT EXISTS wvp_platform_region
  type wvp_stream_proxy (line 318) | create table IF NOT EXISTS wvp_stream_proxy
  type wvp_stream_push (line 345) | create table IF NOT EXISTS wvp_stream_push
  type wvp_cloud_record (line 363) | create table IF NOT EXISTS wvp_cloud_record
  type wvp_user (line 382) | create table IF NOT EXISTS wvp_user
  type wvp_user_role (line 395) | create table IF NOT EXISTS wvp_user_role
  type wvp_user_api_key (line 406) | create table IF NOT EXISTS wvp_user_api_key
  type wvp_common_group (line 428) | create table IF NOT EXISTS wvp_common_group
  type wvp_common_region (line 443) | create table IF NOT EXISTS wvp_common_region
  type wvp_record_plan (line 456) | create table IF NOT EXISTS wvp_record_plan
  type wvp_record_plan_item (line 466) | create table IF NOT EXISTS wvp_record_plan_item
  type wvp_user_api_key (line 524) | create table IF NOT EXISTS wvp_user_api_key (

FILE: src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
  class VManageBootstrap (line 25) | @ServletComponentScan("com.genersoft.iot.vmp.conf")
    method main (line 34) | public static void main(String[] args) {
    method restart (line 48) | public static void restart() {
    method configure (line 53) | @Override
    method onStartup (line 58) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/common/CivilCodePo.java
  class CivilCodePo (line 5) | public class CivilCodePo {
    method getInstance (line 13) | public static CivilCodePo getInstance(String[] infoArray) {
    method getCode (line 23) | public String getCode() {
    method setCode (line 27) | public void setCode(String code) {
    method getName (line 31) | public String getName() {
    method setName (line 35) | public void setName(String name) {
    method getParentCode (line 39) | public String getParentCode() {
    method setParentCode (line 43) | public void setParentCode(String parentCode) {

FILE: src/main/java/com/genersoft/iot/vmp/common/CommonCallback.java
  type CommonCallback (line 3) | public interface CommonCallback<T>{
    method run (line 4) | public void run(T t);

FILE: src/main/java/com/genersoft/iot/vmp/common/DeviceStatusCallback.java
  type DeviceStatusCallback (line 5) | public interface DeviceStatusCallback {
    method run (line 6) | public void run(String deviceId, SipTransactionInfo transactionInfo);

FILE: src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java
  class InviteInfo (line 9) | @Data
    method getInviteInfo (line 45) | public static InviteInfo getInviteInfo(String deviceId, Integer channe...

FILE: src/main/java/com/genersoft/iot/vmp/common/InviteSessionStatus.java
  type InviteSessionStatus (line 8) | public enum InviteSessionStatus {

FILE: src/main/java/com/genersoft/iot/vmp/common/InviteSessionType.java
  type InviteSessionType (line 3) | public enum InviteSessionType {

FILE: src/main/java/com/genersoft/iot/vmp/common/RemoteAddressInfo.java
  class RemoteAddressInfo (line 3) | public class RemoteAddressInfo {
    method RemoteAddressInfo (line 7) | public RemoteAddressInfo(String ip, int port) {
    method getIp (line 12) | public String getIp() {
    method setIp (line 16) | public void setIp(String ip) {
    method getPort (line 20) | public int getPort() {
    method setPort (line 24) | public void setPort(int port) {

FILE: src/main/java/com/genersoft/iot/vmp/common/ServerInfo.java
  class ServerInfo (line 6) | @Data
    method create (line 13) | public static ServerInfo create(String ip, int port) {

FILE: src/main/java/com/genersoft/iot/vmp/common/StatisticsInfo.java
  class StatisticsInfo (line 8) | @Data
    method toString (line 78) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java
  class StreamInfo (line 12) | @Data
    method setRtmp (line 109) | public void setRtmp(String host, Integer port, Integer sslPort, String...
    method setRtsp (line 119) | public void setRtsp(String host, Integer port, Integer sslPort, String...
    method setFlv (line 129) | public void setFlv(String host, Integer port, Integer sslPort, String ...
    method setWsFlv (line 138) | public void setWsFlv(String host, Integer port, Integer sslPort, Strin...
    method setFmp4 (line 147) | public void setFmp4(String host, Integer port, Integer sslPort, String...
    method setWsMp4 (line 156) | public void setWsMp4(String host, Integer port, Integer sslPort, Strin...
    method setHls (line 165) | public void setHls(String host, Integer port, Integer sslPort, String ...
    method setWsHls (line 175) | public void setWsHls(String host, Integer port, Integer sslPort, Strin...
    method setTs (line 185) | public void setTs(String host, Integer port, Integer sslPort, String a...
    method setWsTs (line 196) | public void setWsTs(String host, Integer port, Integer sslPort, String...
    method setRtc (line 207) | public void setRtc(String host, Integer port, Integer sslPort, String ...
    method changeStreamIp (line 221) | public void changeStreamIp(String localAddr) {
    class TransactionInfo (line 288) | public static class TransactionInfo{
    method clone (line 298) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/common/StreamURL.java
  class StreamURL (line 8) | @Schema(description = "流地址信息")
    method StreamURL (line 26) | public StreamURL() {
    method StreamURL (line 29) | public StreamURL(String protocol, String host, int port, String file) {
    method getProtocol (line 36) | public String getProtocol() {
    method setProtocol (line 40) | public void setProtocol(String protocol) {
    method getHost (line 44) | public String getHost() {
    method setHost (line 48) | public void setHost(String host) {
    method getPort (line 52) | public int getPort() {
    method setPort (line 56) | public void setPort(int port) {
    method getFile (line 60) | public String getFile() {
    method setFile (line 64) | public void setFile(String file) {
    method getUrl (line 68) | public String getUrl() {
    method toString (line 72) | @Override
    method clone (line 80) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/common/SubscribeCallback.java
  type SubscribeCallback (line 5) | public interface SubscribeCallback{
    method run (line 6) | public void run(String deviceId, SipTransactionInfo transactionInfo);

FILE: src/main/java/com/genersoft/iot/vmp/common/SystemAllInfo.java
  class SystemAllInfo (line 5) | public class SystemAllInfo {
    method getCpu (line 15) | public List<Object> getCpu() {
    method setCpu (line 19) | public void setCpu(List<Object> cpu) {
    method getMem (line 23) | public List<Object> getMem() {
    method setMem (line 27) | public void setMem(List<Object> mem) {
    method getNet (line 31) | public List<Object> getNet() {
    method setNet (line 35) | public void setNet(List<Object> net) {
    method getDisk (line 39) | public Object getDisk() {
    method setDisk (line 43) | public void setDisk(Object disk) {
    method getNetTotal (line 47) | public long getNetTotal() {
    method setNetTotal (line 51) | public void setNetTotal(long netTotal) {

FILE: src/main/java/com/genersoft/iot/vmp/common/VersionPo.java
  class VersionPo (line 5) | public class VersionPo {
    method setGIT_Revision (line 62) | public void setGIT_Revision(String GIT_Revision) {
    method setCreate_By (line 66) | public void setCreate_By(String create_By) {
    method setGIT_BRANCH (line 70) | public void setGIT_BRANCH(String GIT_BRANCH) {
    method setGIT_URL (line 74) | public void setGIT_URL(String GIT_URL) {
    method setBUILD_DATE (line 78) | public void setBUILD_DATE(String BUILD_DATE) {
    method setArtifactId (line 82) | public void setArtifactId(String artifactId) {
    method setGIT_Revision_SHORT (line 86) | public void setGIT_Revision_SHORT(String GIT_Revision_SHORT) {
    method setVersion (line 90) | public void setVersion(String version) {
    method setProject (line 94) | public void setProject(String project) {
    method setBuild_Jdk (line 98) | public void setBuild_Jdk(String build_Jdk) {
    method getGIT_Revision (line 102) | public String getGIT_Revision() {
    method getCreate_By (line 106) | public String getCreate_By() {
    method getGIT_BRANCH (line 110) | public String getGIT_BRANCH() {
    method getGIT_URL (line 114) | public String getGIT_URL() {
    method getBUILD_DATE (line 118) | public String getBUILD_DATE() {
    method getArtifactId (line 122) | public String getArtifactId() {
    method getGIT_Revision_SHORT (line 126) | public String getGIT_Revision_SHORT() {
    method getVersion (line 130) | public String getVersion() {
    method getProject (line 134) | public String getProject() {
    method getBuild_Jdk (line 138) | public String getBuild_Jdk() {
    method getGIT_DATE (line 142) | public String getGIT_DATE() {
    method setGIT_DATE (line 146) | public void setGIT_DATE(String GIT_DATE) {

FILE: src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
  class VideoManagerConstants (line 9) | public class VideoManagerConstants {

FILE: src/main/java/com/genersoft/iot/vmp/common/enums/ChannelDataType.java
  class ChannelDataType (line 7) | public class ChannelDataType {
    method getDateTypeDesc (line 20) | public static String getDateTypeDesc(Integer dataType) {

FILE: src/main/java/com/genersoft/iot/vmp/common/enums/DeviceControlType.java
  type DeviceControlType (line 12) | public enum DeviceControlType {
    method DeviceControlType (line 56) | DeviceControlType(String val, String desc) {
    method getVal (line 61) | public String getVal() {
    method getDesc (line 65) | public String getDesc() {
    method typeOf (line 69) | public static DeviceControlType typeOf(Element rootElement) {

FILE: src/main/java/com/genersoft/iot/vmp/common/enums/MediaApp.java
  class MediaApp (line 3) | public class MediaApp {
    method isKeywords (line 9) | public static boolean isKeywords(String app) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java
  class CivilCodeFileConf (line 24) | @Slf4j
    method run (line 33) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java
  class CloudRecordTimer (line 22) | @Slf4j
    method execute (line 36) | @Scheduled(cron = "0 0 0 * * ?")   //每天的0点执行

FILE: src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
  class DynamicTask (line 22) | @Slf4j
    method DynamicTask (line 31) | @PostConstruct
    method startCron (line 48) | public void startCron(String key, Runnable task, int cycleForCatalog) {
    method startDelay (line 80) | public void startDelay(String key, Runnable task, int delay) {
    method stop (line 109) | public boolean stop(String key) {
    method contains (line 122) | public boolean contains(String key) {
    method getAllKeys (line 129) | public Set<String> getAllKeys() {
    method get (line 133) | public Runnable get(String key) {
    method execute (line 143) | @Scheduled(cron="0 0/5 * * * ?")
    method isAlive (line 156) | public boolean isAlive(String key) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 18) | @Slf4j
    method exceptionHandler (line 27) | @ExceptionHandler(Exception.class)
    method exceptionHandler (line 39) | @ExceptionHandler(IllegalStateException.class)
    method exceptionHandler (line 50) | @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    method exceptionHandler (line 60) | @ExceptionHandler(IllegalArgumentException.class)
    method exceptionHandler (line 72) | @ExceptionHandler(ControllerException.class)
    method exceptionHandler (line 83) | @ExceptionHandler(BadCredentialsException.class)

FILE: src/main/java/com/genersoft/iot/vmp/conf/GlobalResponseAdvice.java
  class GlobalResponseAdvice (line 21) | @RestControllerAdvice
    method supports (line 25) | @Override
    method beforeBodyWrite (line 31) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
  class MediaConfig (line 16) | @Slf4j
    method getSdpIp (line 75) | public String getSdpIp() {
    method getStreamIp (line 94) | public String getStreamIp() {
    method buildMediaSer (line 102) | public MediaServer buildMediaSer(){
    method isValidIPAddress (line 130) | private boolean isValidIPAddress(String ipAddress) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java
  class MediaStatusTimerTask (line 8) | public class MediaStatusTimerTask {
    method execute (line 12) | public void execute(){

FILE: src/main/java/com/genersoft/iot/vmp/conf/MybatisConfig.java
  class MybatisConfig (line 19) | @Configuration
    method databaseIdProvider (line 26) | @Bean
    method sqlSessionFactory (line 48) | @Bean

FILE: src/main/java/com/genersoft/iot/vmp/conf/ScheduleConfig.java
  class ScheduleConfig (line 20) | @Configuration
    method configureTasks (line 33) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/ServiceInfo.java
  class ServiceInfo (line 9) | @Slf4j
    method onApplicationEvent (line 16) | @Override
    method setServerPort (line 23) | public void setServerPort(int serverPort) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java
  class SipConfig (line 11) | @Component

FILE: src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
  class SpringDocConfig (line 20) | @Configuration
    method springShopOpenApi (line 28) | @Bean
    method publicApi (line 54) | @Bean
    method publicApi2 (line 62) | @Bean
    method publicApi3 (line 70) | @Bean
    method publicApi4 (line 78) | @Bean
    method publicApi5 (line 86) | @Bean
    method publicApi6 (line 94) | @Bean
    method publicApi7 (line 102) | @Bean
    method publicApi99 (line 110) | @Bean

FILE: src/main/java/com/genersoft/iot/vmp/conf/SystemInfoTimerTask.java
  class SystemInfoTimerTask (line 16) | @Slf4j
    method execute (line 23) | @Scheduled(fixedRate = 2000)   //每1秒执行一次

FILE: src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java
  class ThreadPoolTaskConfig (line 15) | @Configuration
    method taskExecutor (line 51) | @Bean("taskExecutor") // bean的名称,默认为首字母小写的方法名

FILE: src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java
  class UserSetting (line 14) | @Component

FILE: src/main/java/com/genersoft/iot/vmp/conf/VersionConfig.java
  class VersionConfig (line 7) | @Component
    method setVersion (line 16) | public void setVersion(String version) {
    method setArtifactId (line 20) | public void setArtifactId(String artifactId) {
    method setDescription (line 24) | public void setDescription(String description) {
    method getVersion (line 28) | public String getVersion() {
    method getArtifactId (line 32) | public String getArtifactId() {
    method getDescription (line 36) | public String getDescription() {

FILE: src/main/java/com/genersoft/iot/vmp/conf/VersionInfo.java
  class VersionInfo (line 8) | @Component
    method getVersion (line 14) | public VersionPo getVersion() {

FILE: src/main/java/com/genersoft/iot/vmp/conf/WVPTimerTask.java
  class WVPTimerTask (line 12) | @Component
    method execute (line 24) | @Scheduled(fixedDelay = 2, timeUnit = TimeUnit.SECONDS)   //每3秒执行一次

FILE: src/main/java/com/genersoft/iot/vmp/conf/exception/ControllerException.java
  class ControllerException (line 8) | public class ControllerException extends RuntimeException{
    method ControllerException (line 13) | public ControllerException(int code, String msg) {
    method ControllerException (line 17) | public ControllerException(ErrorCode errorCode) {
    method getCode (line 22) | public int getCode() {
    method setCode (line 26) | public void setCode(int code) {
    method getMsg (line 30) | public String getMsg() {
    method setMsg (line 34) | public void setMsg(String msg) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/exception/ServiceException.java
  class ServiceException (line 6) | public class ServiceException extends Exception{
    method ServiceException (line 11) | public ServiceException(String msg) {
    method getMsg (line 15) | public String getMsg() {
    method setMsg (line 19) | public void setMsg(String msg) {
    method getMessage (line 23) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/exception/SsrcTransactionNotFoundException.java
  class SsrcTransactionNotFoundException (line 6) | public class SsrcTransactionNotFoundException extends Exception{
    method SsrcTransactionNotFoundException (line 14) | public SsrcTransactionNotFoundException(String deviceId, String channe...
    method getDeviceId (line 21) | public String getDeviceId() {
    method getChannelId (line 25) | public String getChannelId() {
    method getCallId (line 29) | public String getCallId() {
    method getStream (line 33) | public String getStream() {
    method getMessage (line 37) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FileCallback.java
  type FileCallback (line 5) | public interface FileCallback {
    method run (line 7) | OutputStream run(String path);

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpAuthority.java
  class FtpAuthority (line 6) | public class FtpAuthority implements Authority {
    method canAuthorize (line 8) | @Override
    method authorize (line 13) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpFileSystemFactory.java
  class FtpFileSystemFactory (line 14) | @Component
    method createFileSystemView (line 19) | @Override
    method addOutputStream (line 26) | public void addOutputStream(String filePath, OutputStream outputStream) {
    method removeOutputStream (line 30) | public void removeOutputStream(String filePath) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpFileSystemView.java
  class FtpFileSystemView (line 10) | public class FtpFileSystemView implements FileSystemView {
    method FtpFileSystemView (line 16) | public FtpFileSystemView(User user, FileCallback fileCallback) {
    method getHomeDirectory (line 25) | @Override
    method getWorkingDirectory (line 30) | @Override
    method changeWorkingDirectory (line 35) | @Override
    method getFile (line 41) | @Override
    method isRandomAccessible (line 53) | @Override
    method dispose (line 58) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpServerConfig.java
  class FtpServerConfig (line 16) | @Configuration
    method ftpServer (line 36) | @Bean

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java
  class FtpSetting (line 11) | @Component

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/Ftplet.java
  class Ftplet (line 15) | @Component
    method onUploadEnd (line 23) | @Override
    method onAppendEnd (line 33) | @Override
    method onUploadUniqueEnd (line 43) | @Override
    method sendEvent (line 53) | private void sendEvent(String filePath){

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/UserManager.java
  class UserManager (line 18) | @Component
    method getUserByName (line 27) | @Override
    method getAllUserNames (line 32) | @Override
    method delete (line 37) | @Override
    method save (line 42) | @Override
    method doesExist (line 45) | @Override
    method authenticate (line 50) | @Override
    method getAdminName (line 60) | @Override
    method isAdmin (line 65) | @Override
    method getRandomUser (line 70) | public BaseUser getRandomUser(){

FILE: src/main/java/com/genersoft/iot/vmp/conf/ftpServer/VirtualFtpFile.java
  class VirtualFtpFile (line 12) | public class VirtualFtpFile implements FtpFile {
    method getFile (line 34) | public static VirtualFtpFile getFile(String name) {
    method getDir (line 40) | public static VirtualFtpFile getDir(String name) {
    method getAbsolutePath (line 50) | @Override
    method getName (line 55) | @Override
    method isHidden (line 60) | @Override
    method isDirectory (line 65) | @Override
    method isFile (line 70) | @Override
    method doesExist (line 75) | @Override
    method isReadable (line 80) | @Override
    method isWritable (line 85) | @Override
    method isRemovable (line 90) | @Override
    method getOwnerName (line 95) | @Override
    method getGroupName (line 100) | @Override
    method getLinkCount (line 105) | @Override
    method getLastModified (line 110) | @Override
    method setLastModified (line 118) | @Override
    method getSize (line 124) | @Override
    method getPhysicalFile (line 129) | @Override
    method mkdir (line 135) | @Override
    method delete (line 140) | @Override
    method move (line 145) | @Override
    method listFiles (line 151) | @Override
    method createOutputStream (line 156) | @Override
    method createInputStream (line 161) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/RedisMsgListenConfig.java
  class RedisMsgListenConfig (line 21) | @Configuration
    method container (line 60) | @Bean

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java
  class RedisRpcConfig (line 30) | @Slf4j
    method addHandler (line 52) | public void addHandler(String path, RedisRpcClassHandler handler) {
    method onMessage (line 84) | @Override
    method handlerResponse (line 109) | private void handlerResponse(RedisRpcResponse response) {
    method handlerRequest (line 117) | private void handlerRequest(RedisRpcRequest request) {
    method sendResponse (line 164) | private void sendResponse(RedisRpcResponse response){
    method sendRequest (line 172) | private void sendRequest(RedisRpcRequest request){
    method request (line 182) | public RedisRpcResponse request(RedisRpcRequest request, long timeOut) {
    method request (line 186) | public RedisRpcResponse request(RedisRpcRequest request, long timeOut,...
    method request (line 203) | public void request(RedisRpcRequest request, CommonCallback<RedisRpcRe...
    method response (line 209) | public Boolean response(RedisRpcResponse response) {
    method unsubscribe (line 225) | private void unsubscribe(long key) {
    method subscribe (line 230) | private SynchronousQueue<RedisRpcResponse> subscribe(long key) {
    method setCallback (line 237) | private void setCallback(long key, CommonCallback<RedisRpcResponse> ca...
    method removeCallback (line 242) | public void removeCallback(long key)  {
    method getCallbackCount (line 247) | public int getCallbackCount(){

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/RedisTemplateConfig.java
  class RedisTemplateConfig (line 11) | @Configuration
    method redisTemplate (line 14) | @Bean
    method getRedisTemplateForMobilePosition (line 30) | @Bean

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcClassHandler.java
  class RedisRpcClassHandler (line 8) | @Data
    method RedisRpcClassHandler (line 14) | public RedisRpcClassHandler(RpcController controller, Method method) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcMessage.java
  class RedisRpcMessage (line 3) | public class RedisRpcMessage {
    method getRequest (line 9) | public RedisRpcRequest getRequest() {
    method setRequest (line 13) | public void setRequest(RedisRpcRequest request) {
    method getResponse (line 17) | public RedisRpcResponse getResponse() {
    method setResponse (line 21) | public void setResponse(RedisRpcResponse response) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcRequest.java
  class RedisRpcRequest (line 6) | public class RedisRpcRequest {
    method getFromId (line 34) | public String getFromId() {
    method setFromId (line 38) | public void setFromId(String fromId) {
    method getToId (line 42) | public String getToId() {
    method setToId (line 46) | public void setToId(String toId) {
    method getUri (line 50) | public String getUri() {
    method setUri (line 54) | public void setUri(String uri) {
    method getParam (line 58) | public Object getParam() {
    method setParam (line 62) | public void setParam(Object param) {
    method getSn (line 66) | public long getSn() {
    method setSn (line 70) | public void setSn(long sn) {
    method toString (line 74) | @Override
    method getResponse (line 85) | public RedisRpcResponse getResponse() {

FILE: src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcResponse.java
  class RedisRpcResponse (line 6) | public class RedisRpcResponse {
    method getFromId (line 40) | public String getFromId() {
    method setFromId (line 44) | public void setFromId(String fromId) {
    method getToId (line 48) | public String getToId() {
    method setToId (line 52) | public void setToId(String toId) {
    method getSn (line 56) | public long getSn() {
    method setSn (line 60) | public void setSn(long sn) {
    method getStatusCode (line 64) | public int getStatusCode() {
    method setStatusCode (line 68) | public void setStatusCode(int statusCode) {
    method getUri (line 72) | public String getUri() {
    method setUri (line 76) | public void setUri(String uri) {
    method getBody (line 80) | public Object getBody() {
    method setBody (line 84) | public void setBody(Object body) {
    method toString (line 88) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java
  class AnonymousAuthenticationEntryPoint (line 22) | @Component
    method commence (line 25) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/DefaultUserDetailsServiceImpl.java
  class DefaultUserDetailsServiceImpl (line 19) | @Slf4j
    method loadUserByUsername (line 26) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java
  class JwtAuthenticationFilter (line 27) | @Slf4j
    method doFilterInternal (line 38) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
  class JwtUtils (line 43) | @Slf4j
    method getApiKeyHeader (line 68) | public static String getApiKeyHeader() {
    method setUserService (line 72) | @Resource
    method setUserApiKeyService (line 77) | @Resource
    method setUserSetting (line 82) | @Resource
    method afterPropertiesSet (line 87) | @Override
    method generateRsaJsonWebKey (line 99) | private RsaJsonWebKey generateRsaJsonWebKey() throws JoseException {
    method getJwkInputStream (line 146) | private InputStream getJwkInputStream(String jwkFile) throws IOExcepti...
    method createDefaultRsaKey (line 171) | private RsaJsonWebKey createDefaultRsaKey() throws JoseException {
    method createAndPersistDefaultRsaKey (line 181) | private RsaJsonWebKey createAndPersistDefaultRsaKey(String configJwkFi...
    method determinePersistPath (line 216) | private Path determinePersistPath(String configJwkFile) {
    method createToken (line 229) | public static String createToken(String username, Long expirationTime,...
    method createToken (line 271) | public static String createToken(String username, Long expirationTime) {
    method createToken (line 275) | public static String createToken(String username) {
    method getHeader (line 279) | public static String getHeader() {
    method verifyToken (line 283) | public static JwtUser verifyToken(String token) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/LogoutHandler.java
  class LogoutHandler (line 16) | @Slf4j
    method onLogoutSuccess (line 20) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java
  class SecurityUtils (line 15) | public class SecurityUtils {
    method login (line 27) | public static LoginUser login(String username, String password, Authen...
    method getAuthentication (line 43) | public static Authentication getAuthentication(){
    method getUserInfo (line 52) | public static LoginUser getUserInfo(){
    method getUserId (line 69) | public static int getUserId(){
    method encryptPassword (line 80) | public static String encryptPassword(String password) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java
  class WebSecurityConfig (line 34) | @Configuration
    method authenticationManager (line 59) | @Bean
    method authProvider (line 64) | @Bean
    method filterChain (line 76) | @Bean
    method configurationSource (line 130) | CorsConfigurationSource configurationSource() {
    method passwordEncoder (line 156) | public BCryptPasswordEncoder passwordEncoder() {

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java
  class JwtUser (line 3) | public class JwtUser {
    type TokenStatus (line 5) | public enum TokenStatus{
    method getUserId (line 33) | public int getUserId() {
    method setUserId (line 37) | public void setUserId(int userId) {
    method getUserName (line 41) | public String getUserName() {
    method setUserName (line 45) | public void setUserName(String userName) {
    method getStatus (line 49) | public TokenStatus getStatus() {
    method setStatus (line 53) | public void setStatus(TokenStatus status) {
    method getPassword (line 57) | public String getPassword() {
    method setPassword (line 61) | public void setPassword(String password) {
    method getRoleId (line 65) | public int getRoleId() {
    method setRoleId (line 69) | public void setRoleId(int roleId) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/security/dto/LoginUser.java
  class LoginUser (line 15) | public class LoginUser implements UserDetails, CredentialsContainer {
    method LoginUser (line 37) | public LoginUser(User user, LocalDateTime loginTime) {
    method getAuthorities (line 43) | @Override
    method getPassword (line 48) | @Override
    method getUsername (line 53) | @Override
    method isAccountNonExpired (line 61) | @Override
    method isAccountNonLocked (line 72) | @Override
    method isCredentialsNonExpired (line 80) | @Override
    method isEnabled (line 88) | @Override
    method eraseCredentials (line 96) | @Override
    method getId (line 102) | public int getId() {
    method getRole (line 106) | public Role getRole() {
    method getPushKey (line 110) | public String getPushKey() {

FILE: src/main/java/com/genersoft/iot/vmp/conf/webLog/LogChannel.java
  class LogChannel (line 11) | @ServerEndpoint(value = "/channel/log")
    method onMessage (line 19) | @OnMessage(maxMessageSize = 1) // MaxMessage 1 byte
    method onOpen (line 29) | @OnOpen
    method onClose (line 38) | @OnClose
    method onError (line 45) | @OnError
    method push (line 58) | public static void push(String message) {

FILE: src/main/java/com/genersoft/iot/vmp/conf/webLog/WebSocketAppender.java
  class WebSocketAppender (line 11) | @Data
    method append (line 17) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/conf/websocket/WebSocketConfig.java
  class WebSocketConfig (line 8) | @Configuration
    method serverEndpointExporter (line 11) | @Bean

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java
  class SipLayer (line 24) | @Slf4j
    method run (line 42) | @Override
    method addListeningPoint (line 98) | private void addListeningPoint(String monitorIp, int port){
    method getUdpSipProvider (line 142) | public SipProviderImpl getUdpSipProvider(String ip) {
    method getUdpSipProvider (line 152) | public SipProviderImpl getUdpSipProvider() {
    method getTcpSipProvider (line 159) | public SipProviderImpl getTcpSipProvider() {
    method getTcpSipProvider (line 166) | public SipProviderImpl getTcpSipProvider(String ip) {
    method getLocalIp (line 176) | public String getLocalIp(String deviceLocalIp) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java
  class DigestServerAuthenticationHelper (line 48) | @Slf4j
    method DigestServerAuthenticationHelper (line 63) | public DigestServerAuthenticationHelper()
    method toHexString (line 68) | public static String toHexString(byte[] b) {
    method generateNonce (line 83) | private String generateNonce() {
    method generateChallenge (line 93) | public Response generateChallenge(HeaderFactory headerFactory, Respons...
    method doAuthenticateHashedPassword (line 116) | public boolean doAuthenticateHashedPassword(Request request, String ha...
    method doAuthenticatePlainTextPassword (line 172) | public boolean doAuthenticatePlainTextPassword(Request request, String...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java
  class AlarmChannelMessage (line 9) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/AudioBroadcastCatch.java
  class AudioBroadcastCatch (line 13) | @Data
    method AudioBroadcastCatch (line 17) | public AudioBroadcastCatch(
    method AudioBroadcastCatch (line 37) | public AudioBroadcastCatch() {
    method setSipTransactionInfoByRequest (line 86) | public void setSipTransactionInfoByRequest(SIPResponse sipResponse) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/AudioBroadcastCatchStatus.java
  type AudioBroadcastCatchStatus (line 7) | public enum AudioBroadcastCatchStatus {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/BaiduPoint.java
  class BaiduPoint (line 3) | public class BaiduPoint {
    method getBdLng (line 9) | public String getBdLng() {
    method setBdLng (line 13) | public void setBdLng(String bdLng) {
    method getBdLat (line 17) | public String getBdLat() {
    method setBdLat (line 21) | public void setBdLat(String bdLat) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/BasicParam.java
  class BasicParam (line 9) | @Data
    method getInstance (line 41) | public static BasicParam getInstance(String name, String expiration, I...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogChannelEvent.java
  class CatalogChannelEvent (line 11) | @Data
    method decode (line 20) | public static CatalogChannelEvent decode(Element element) throws Invoc...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java
  class CatalogData (line 12) | @Data
    type CatalogDataStatus (line 27) | public enum CatalogDataStatus{

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdType.java
  class CmdType (line 3) | public class CmdType {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java
  class CommonGBChannel (line 7) | @Data
    method encode (line 159) | public String encode(String serverDeviceId) {
    method encode (line 163) | public String encode(String event,String serverDeviceId) {
    method getFullContent (line 195) | private String getFullContent(String event, String serverDeviceId) {
    method build (line 359) | public static CommonGBChannel build(Group group) {
    method build (line 378) | public static CommonGBChannel build(Platform platform) {
    method build (line 392) | public static CommonGBChannel build(Region region) {
    method toString (line 399) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonRecordInfo.java
  class CommonRecordInfo (line 5) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java
  class Device (line 11) | @Data
    method checkWgs84 (line 216) | public boolean checkWgs84() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java
  class DeviceAlarm (line 12) | @Schema(description = "报警信息")
    method getAlarmPriorityDescription (line 40) | public String getAlarmPriorityDescription() {
    method getAlarmMethodDescription (line 66) | public String getAlarmMethodDescription() {
    method getAlarmTypeDescription (line 151) | public String getAlarmTypeDescription() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarmMethod.java
  type DeviceAlarmMethod (line 9) | public enum DeviceAlarmMethod {
    method DeviceAlarmMethod (line 33) | DeviceAlarmMethod(int val) {
    method getVal (line 37) | public int getVal() {
    method typeOf (line 46) | public static DeviceAlarmMethod typeOf(int code) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
  class DeviceChannel (line 15) | @Data
    method setPtzType (line 196) | public void setPtzType(int ptzType) {
    method decode (line 226) | public static DeviceChannel decode(Element element) throws InvocationT...
    method decodeWithOnlyDeviceId (line 246) | public static DeviceChannel decodeWithOnlyDeviceId(Element element) {
    method buildCommonGBChannelForStatus (line 254) | public CommonGBChannel buildCommonGBChannelForStatus() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java
  class DeviceChannelInPlatform (line 3) | public class DeviceChannelInPlatform extends DeviceChannel{
    method getPlatFormId (line 8) | public String getPlatFormId() {
    method setPlatFormId (line 12) | public void setPlatFormId(String platFormId) {
    method getCatalogId (line 16) | public String getCatalogId() {
    method setCatalogId (line 20) | public void setCatalogId(String catalogId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java
  class DeviceNotFoundEvent (line 8) | @Data
    method DeviceNotFoundEvent (line 13) | public DeviceNotFoundEvent(String callId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceType.java
  class DeviceType (line 5) | public class DeviceType implements Comparable<DeviceType>{
    method getInstance (line 21) | public static DeviceType getInstance(DeviceTypeEnum typeEnum) {
    method getName (line 30) | public String getName() {
    method setName (line 34) | public void setName(String name) {
    method getCode (line 38) | public String getCode() {
    method setCode (line 42) | public void setCode(String code) {
    method getOwnerName (line 46) | public String getOwnerName() {
    method setOwnerName (line 50) | public void setOwnerName(String ownerName) {
    method compareTo (line 54) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceTypeEnum.java
  type DeviceTypeEnum (line 6) | public enum DeviceTypeEnum {
    method DeviceTypeEnum (line 73) | DeviceTypeEnum(String code, String name, String ownerName) {
    method getName (line 79) | public String getName() {
    method getCode (line 83) | public String getCode() {
    method setCode (line 87) | public void setCode(String code) {
    method getOwnerName (line 91) | public String getOwnerName() {
    method setOwnerName (line 95) | public void setOwnerName(String ownerName) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomParam.java
  class DragZoomParam (line 7) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java
  class DragZoomRequest (line 13) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/DrawThinProcess.java
  class DrawThinProcess (line 6) | @Getter
    method DrawThinProcess (line 13) | public DrawThinProcess(double process, String msg) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndCode.java
  class FrontEndCode (line 10) | @Data
    method encode (line 14) | public static String encode(IFrontEndControlCode frontEndControlCode){
    method decode (line 18) | public static IFrontEndControlCode decode(@NotNull String cmdStr) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForAuxiliary.java
  class FrontEndControlCodeForAuxiliary (line 7) | public class FrontEndControlCodeForAuxiliary implements  IFrontEndContro...
    method getType (line 11) | @Override
    method encode (line 30) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForFI.java
  class FrontEndControlCodeForFI (line 7) | public class FrontEndControlCodeForFI implements  IFrontEndControlCode {
    method getType (line 11) | @Override
    method encode (line 44) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForPTZ.java
  class FrontEndControlCodeForPTZ (line 7) | public class FrontEndControlCodeForPTZ implements  IFrontEndControlCode {
    method getType (line 11) | @Override
    method encode (line 58) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForPreset.java
  class FrontEndControlCodeForPreset (line 7) | public class FrontEndControlCodeForPreset implements  IFrontEndControlCo...
    method getType (line 11) | @Override
    method encode (line 38) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForScan.java
  class FrontEndControlCodeForScan (line 7) | public class FrontEndControlCodeForScan implements  IFrontEndControlCode {
    method getType (line 11) | @Override
    method encode (line 37) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForTour.java
  class FrontEndControlCodeForTour (line 7) | public class FrontEndControlCodeForTour implements  IFrontEndControlCode {
    method getType (line 11) | @Override
    method encode (line 51) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForWiper.java
  class FrontEndControlCodeForWiper (line 7) | public class FrontEndControlCodeForWiper implements  IFrontEndControlCode {
    method getType (line 11) | @Override
    method encode (line 23) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlType.java
  type FrontEndControlType (line 3) | public enum FrontEndControlType {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GBStringMsgParser.java
  class GBStringMsgParser (line 20) | @Slf4j
    method GBStringMsgParser (line 28) | public GBStringMsgParser() {
    method parseSIPMessage (line 48) | public SIPMessage parseSIPMessage(byte[] msgBuffer, boolean readBody, ...
    method trimEndOfLine (line 160) | protected static String trimEndOfLine(String line) {
    method processFirstLine (line 177) | protected SIPMessage processFirstLine(String firstLine, ParseException...
    method processHeader (line 218) | protected void processHeader(String header, SIPMessage message, ParseE...
    method parseAddress (line 269) | public AddressImpl parseAddress(String address) throws ParseException {
    method parseHost (line 301) | public Host parseHost(String host) throws ParseException {
    method parseTelephoneNumber (line 317) | public TelephoneNumber parseTelephoneNumber(String telephone_number)
    method parseSIPUrl (line 334) | public SipUri parseSIPUrl(String url) throws ParseException {
    method parseUrl (line 352) | public GenericURI parseUrl(String url) throws ParseException {
    method parseSIPHeader (line 365) | public static SIPHeader parseSIPHeader(String header) throws ParseExce...
    method parseSIPRequestLine (line 428) | public RequestLine parseSIPRequestLine(String requestLine)
    method parseSIPStatusLine (line 445) | public StatusLine parseSIPStatusLine(String statusLine)
    method setComputeContentLengthFromMessage (line 451) | public static void setComputeContentLengthFromMessage(

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Gb28181Sdp.java
  class Gb28181Sdp (line 8) | public class Gb28181Sdp  {
    method getInstance (line 14) | public static Gb28181Sdp getInstance(SessionDescription baseSdb, Strin...
    method getBaseSdb (line 23) | public SessionDescription getBaseSdb() {
    method setBaseSdb (line 27) | public void setBaseSdb(SessionDescription baseSdb) {
    method getSsrc (line 31) | public String getSsrc() {
    method setSsrc (line 35) | public void setSsrc(String ssrc) {
    method getMediaDescription (line 39) | public String getMediaDescription() {
    method setMediaDescription (line 43) | public void setMediaDescription(String mediaDescription) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbCode.java
  class GbCode (line 9) | @Data
    method decode (line 31) | public static GbCode decode(String code){
    method ecode (line 45) | public String ecode(){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbSipDate.java
  class GbSipDate (line 12) | public class GbSipDate extends SIPDate {
    method GbSipDate (line 19) | public GbSipDate(long timeMillis) {
    method encode (line 99) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbSteamIdentification.java
  type GbSteamIdentification (line 6) | public enum GbSteamIdentification {
    method GbSteamIdentification (line 29) | GbSteamIdentification(String value, String[] indexArray) {
    method getValue (line 37) | public String getValue() {
    method getIndexArray (line 41) | public String[] getIndexArray() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java
  class GbStream (line 9) | @Schema(description = "直播流关联国标上级平台")
    method getGbStreamId (line 36) | @Override
    method setGbStreamId (line 41) | @Override
    method getApp (line 46) | public String getApp() {
    method setApp (line 50) | public void setApp(String app) {
    method getStream (line 54) | public String getStream() {
    method setStream (line 58) | public void setStream(String stream) {
    method getGbId (line 62) | public String getGbId() {
    method setGbId (line 66) | public void setGbId(String gbId) {
    method getName (line 70) | public String getName() {
    method setName (line 74) | public void setName(String name) {
    method getLongitude (line 78) | public double getLongitude() {
    method setLongitude (line 82) | public void setLongitude(double longitude) {
    method getLatitude (line 86) | public double getLatitude() {
    method setLatitude (line 90) | public void setLatitude(double latitude) {
    method getStreamType (line 94) | public String getStreamType() {
    method setStreamType (line 98) | public void setStreamType(String streamType) {
    method isStatus (line 102) | public boolean isStatus() {
    method setStatus (line 106) | public void setStatus(boolean status) {
    method getMediaServerId (line 110) | public String getMediaServerId() {
    method setMediaServerId (line 114) | public void setMediaServerId(String mediaServerId) {
    method getCreateTime (line 118) | public String getCreateTime() {
    method setCreateTime (line 122) | public void setCreateTime(String createTime) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStringMsgParserFactory.java
  class GbStringMsgParserFactory (line 7) | public class GbStringMsgParserFactory implements MessageParserFactory {
    method createMessageParser (line 18) | public MessageParser createMessageParser(SIPTransactionStack stack) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Group.java
  class Group (line 11) | @Data
    method getInstance (line 74) | public static Group getInstance(DeviceChannel channel) {
    method compareTo (line 96) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/GroupTree.java
  class GroupTree (line 10) | @EqualsAndHashCode(callSuper = true)

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/HandlerCatchData.java
  class HandlerCatchData (line 10) | public class HandlerCatchData {
    method HandlerCatchData (line 15) | public HandlerCatchData(RequestEvent evt, Device device, Element rootE...
    method getEvt (line 21) | public RequestEvent getEvt() {
    method setEvt (line 25) | public void setEvt(RequestEvent evt) {
    method getDevice (line 29) | public Device getDevice() {
    method setDevice (line 33) | public void setDevice(Device device) {
    method getRootElement (line 37) | public Element getRootElement() {
    method setRootElement (line 41) | public void setRootElement(Element rootElement) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/HomePositionRequest.java
  class HomePositionRequest (line 12) | public class HomePositionRequest {
    class HomePosition (line 29) | public static class HomePosition {
      method getEnabled (line 46) | public String getEnabled() {
      method setEnabled (line 50) | public void setEnabled(String enabled) {
      method getResetTime (line 54) | public String getResetTime() {
      method setResetTime (line 58) | public void setResetTime(String resetTime) {
      method getPresetIndex (line 62) | public String getPresetIndex() {
      method setPresetIndex (line 66) | public void setPresetIndex(String presetIndex) {
    method getSn (line 71) | public String getSn() {
    method setSn (line 75) | public void setSn(String sn) {
    method getDeviceId (line 79) | public String getDeviceId() {
    method setDeviceId (line 83) | public void setDeviceId(String deviceId) {
    method getHomePosition (line 87) | public HomePosition getHomePosition() {
    method setHomePosition (line 91) | public void setHomePosition(HomePosition homePosition) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Host.java
  class Host (line 5) | public class Host {
    method getIp (line 12) | public String getIp() {
    method setIp (line 16) | public void setIp(String ip) {
    method getPort (line 20) | public int getPort() {
    method setPort (line 24) | public void setPort(int port) {
    method getAddress (line 28) | public String getAddress() {
    method setAddress (line 32) | public void setAddress(String address) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/IFrontEndControlCode.java
  type IFrontEndControlCode (line 3) | public interface IFrontEndControlCode {
    method getType (line 5) | FrontEndControlType getType();
    method encode (line 6) | String encode();

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/IndustryCodeType.java
  class IndustryCodeType (line 5) | public class IndustryCodeType implements Comparable<IndustryCodeType>{
    method getInstance (line 22) | public static IndustryCodeType getInstance(IndustryCodeTypeEnum typeEn...
    method getName (line 31) | public String getName() {
    method setName (line 35) | public void setName(String name) {
    method getCode (line 39) | public String getCode() {
    method setCode (line 43) | public void setCode(String code) {
    method getNotes (line 47) | public String getNotes() {
    method setNotes (line 51) | public void setNotes(String notes) {
    method compareTo (line 55) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/IndustryCodeTypeEnum.java
  type IndustryCodeTypeEnum (line 8) | public enum IndustryCodeTypeEnum {
    method IndustryCodeTypeEnum (line 50) | IndustryCodeTypeEnum(String code, String name, String notes) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteDecodeException.java
  class InviteDecodeException (line 5) | @Data
    method InviteDecodeException (line 10) | public InviteDecodeException(int code, String msg) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteMessageInfo.java
  class InviteMessageInfo (line 6) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamCallback.java
  type InviteStreamCallback (line 3) | public interface InviteStreamCallback {
    method call (line 4) | void call(InviteStreamInfo inviteStreamInfo);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamInfo.java
  class InviteStreamInfo (line 6) | public class InviteStreamInfo {
    method InviteStreamInfo (line 8) | public InviteStreamInfo(MediaServer mediaServerItem, JSONObject respon...
    method getMediaServerItem (line 22) | public MediaServer getMediaServerItem() {
    method setMediaServerItem (line 26) | public void setMediaServerItem(MediaServer mediaServerItem) {
    method getResponse (line 30) | public JSONObject getResponse() {
    method setResponse (line 34) | public void setResponse(JSONObject response) {
    method getCallId (line 38) | public String getCallId() {
    method setCallId (line 42) | public void setCallId(String callId) {
    method getApp (line 46) | public String getApp() {
    method setApp (line 50) | public void setApp(String app) {
    method getStream (line 54) | public String getStream() {
    method setStream (line 58) | public void setStream(String stream) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java
  type InviteStreamType (line 3) | public enum InviteStreamType {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/MessageResponseTask.java
  class MessageResponseTask (line 12) | public class MessageResponseTask<T> implements Delayed {
    method getDelay (line 34) | @Override
    method compareTo (line 39) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java
  class MobilePosition (line 11) | @Data
    method toString (line 72) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/NetworkIdentificationType.java
  class NetworkIdentificationType (line 5) | public class NetworkIdentificationType implements Comparable<NetworkIden...
    method getInstance (line 17) | public static NetworkIdentificationType getInstance(NetworkIdentificat...
    method getName (line 25) | public String getName() {
    method setName (line 29) | public void setName(String name) {
    method getCode (line 33) | public String getCode() {
    method setCode (line 37) | public void setCode(String code) {
    method compareTo (line 41) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/NetworkIdentificationTypeEnum.java
  type NetworkIdentificationTypeEnum (line 6) | public enum NetworkIdentificationTypeEnum {
    method NetworkIdentificationTypeEnum (line 30) | NetworkIdentificationTypeEnum(String code, String name) {
    method getName (line 35) | public String getName() {
    method setName (line 39) | public void setName(String name) {
    method getCode (line 43) | public String getCode() {
    method setCode (line 47) | public void setCode(String code) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/NotifyCatalogChannel.java
  class NotifyCatalogChannel (line 4) | public class NotifyCatalogChannel {
    type Type (line 11) | public enum Type {
    method getInstance (line 16) | public static NotifyCatalogChannel getInstance(Type type, DeviceChanne...
    method getType (line 23) | public Type getType() {
    method setType (line 27) | public void setType(Type type) {
    method getChannel (line 31) | public DeviceChannel getChannel() {
    method setChannel (line 35) | public void setChannel(DeviceChannel channel) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/OpenRTPServerResult.java
  class OpenRTPServerResult (line 7) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Platform.java
  class Platform (line 9) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformCatalog.java
  class PlatformCatalog (line 9) | @Schema(description = "目录信息")
    method getId (line 41) | public String getId() {
    method setId (line 45) | public void setId(String id) {
    method getName (line 49) | public String getName() {
    method setName (line 53) | public void setName(String name) {
    method getPlatformId (line 57) | public String getPlatformId() {
    method setPlatformId (line 61) | public void setPlatformId(String platformId) {
    method getParentId (line 65) | public String getParentId() {
    method setParentId (line 69) | public void setParentId(String parentId) {
    method getChildrenCount (line 73) | public int getChildrenCount() {
    method setChildrenCount (line 77) | public void setChildrenCount(int childrenCount) {
    method getType (line 81) | public int getType() {
    method setType (line 85) | public void setType(int type) {
    method setTypeForCatalog (line 89) | public void setTypeForCatalog() {
    method setTypeForGb (line 93) | public void setTypeForGb() {
    method setTypeForStream (line 97) | public void setTypeForStream() {
    method getCivilCode (line 101) | public String getCivilCode() {
    method setCivilCode (line 105) | public void setCivilCode(String civilCode) {
    method getBusinessGroupId (line 109) | public String getBusinessGroupId() {
    method setBusinessGroupId (line 113) | public void setBusinessGroupId(String businessGroupId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformCatch.java
  class PlatformCatch (line 5) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformChannel.java
  class PlatformChannel (line 7) | @EqualsAndHashCode(callSuper = true)

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformGbStream.java
  class PlatformGbStream (line 5) | public class PlatformGbStream {
    method getGbStreamId (line 16) | public Integer getGbStreamId() {
    method setGbStreamId (line 20) | public void setGbStreamId(Integer gbStreamId) {
    method getPlatformId (line 24) | public String getPlatformId() {
    method setPlatformId (line 28) | public void setPlatformId(String platformId) {
    method getCatalogId (line 32) | public String getCatalogId() {
    method setCatalogId (line 36) | public void setCatalogId(String catalogId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformKeepaliveCallback.java
  type PlatformKeepaliveCallback (line 3) | public interface PlatformKeepaliveCallback {
    method run (line 4) | public void run(String platformServerGbId, int failCount);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlatformRegister.java
  class PlatformRegister (line 3) | public class PlatformRegister {
    method getReply (line 8) | public int getReply() {
    method setReply (line 12) | public void setReply(int reply) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/PlayException.java
  class PlayException (line 5) | @Data
    method PlayException (line 10) | public PlayException(int code, String msg) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Preset.java
  class Preset (line 6) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordInfo.java
  class RecordInfo (line 16) | @Setter

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/RecordItem.java
  class RecordItem (line 18) | @Setter
    method compareTo (line 53) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/RedisGroupMessage.java
  class RedisGroupMessage (line 5) | @Data
    method toString (line 36) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/Region.java
  class Region (line 13) | @Data
    method getInstance (line 58) | public static Region getInstance(String commonRegionDeviceId, String c...
    method getInstance (line 68) | public static Region getInstance(CivilCodePo civilCodePo) {
    method getInstance (line 80) | public static Region getInstance(DeviceChannel channel) {
    method compareTo (line 93) | @Override
    method equals (line 98) | @Override
    method hashCode (line 118) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/RegionTree.java
  class RegionTree (line 10) | @EqualsAndHashCode(callSuper = true)

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SDPInfo.java
  class SDPInfo (line 5) | public class SDPInfo {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SendRtpInfo.java
  class SendRtpInfo (line 9) | @Data
    method getInstance (line 147) | public static SendRtpInfo getInstance(RequestPushStreamMsg requestPush...
    method getInstance (line 164) | public static SendRtpInfo getInstance(String app, String stream, Strin...
    method getInstance (line 180) | public static SendRtpInfo getInstance(Integer localPort, MediaServer m...
    method toString (line 210) | @Override
    method setPlayTypeByChannelDataType (line 241) | public void setPlayTypeByChannelDataType(Integer dataType, String sess...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipMsgInfo.java
  class SipMsgInfo (line 7) | public class SipMsgInfo {
    method SipMsgInfo (line 13) | public SipMsgInfo(RequestEvent evt, Device device, Element rootElement) {
    method SipMsgInfo (line 19) | public SipMsgInfo(RequestEvent evt, Platform platform, Element rootEle...
    method getEvt (line 25) | public RequestEvent getEvt() {
    method setEvt (line 29) | public void setEvt(RequestEvent evt) {
    method getDevice (line 33) | public Device getDevice() {
    method setDevice (line 37) | public void setDevice(Device device) {
    method getPlatform (line 41) | public Platform getPlatform() {
    method setPlatform (line 45) | public void setPlatform(Platform platform) {
    method getRootElement (line 49) | public Element getRootElement() {
    method setRootElement (line 53) | public void setRootElement(Element rootElement) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipSendFailEvent.java
  class SipSendFailEvent (line 6) | @Data
    method getInstance (line 13) | public static SipSendFailEvent getInstance(String callId, String msg){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SipTransactionInfo.java
  class SipTransactionInfo (line 8) | @Data
    method SipTransactionInfo (line 22) | public SipTransactionInfo(SIPResponse response, boolean asSender) {
    method SipTransactionInfo (line 34) | public SipTransactionInfo(SIPResponse response) {
    method SipTransactionInfo (line 46) | public SipTransactionInfo() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SsrcTransaction.java
  class SsrcTransaction (line 7) | @Data
    method buildForDevice (line 60) | public static SsrcTransaction buildForDevice(String deviceId, Integer ...
    method buildForPlatform (line 74) | public static SsrcTransaction buildForPlatform(String platformId, Inte...
    method SsrcTransaction (line 89) | public SsrcTransaction() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeHolder.java
  class SubscribeHolder (line 17) | @Slf4j
    method putCatalogSubscribe (line 32) | public void putCatalogSubscribe(String platformId, SubscribeInfo subsc...
    method getCatalogSubscribe (line 45) | public SubscribeInfo getCatalogSubscribe(String platformId) {
    method removeCatalogSubscribe (line 50) | public void removeCatalogSubscribe(String platformId) {
    method putMobilePositionSubscribe (line 55) | public void putMobilePositionSubscribe(String platformId, SubscribeInf...
    method getMobilePositionSubscribe (line 85) | public SubscribeInfo getMobilePositionSubscribe(String platformId) {
    method removeMobilePositionSubscribe (line 90) | public void removeMobilePositionSubscribe(String platformId) {
    method getAllCatalogSubscribePlatform (line 95) | public List<String> getAllCatalogSubscribePlatform(List<Platform> plat...
    method getAllMobilePositionSubscribePlatform (line 109) | public List<String> getAllMobilePositionSubscribePlatform(List<Platfor...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SubscribeInfo.java
  class SubscribeInfo (line 9) | @Data
    method getInstance (line 46) | public static SubscribeInfo getInstance(SIPResponse response, String i...
    method buildSimulated (line 56) | public static SubscribeInfo buildSimulated(String platFormServerId, St...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/SyncStatus.java
  class SyncStatus (line 12) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/TalkRtpInfo.java
  class TalkRtpInfo (line 5) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/bean/VectorTileSource.java
  class VectorTileSource (line 14) | @Getter
    method VectorTileSource (line 35) | public VectorTileSource() {
    method getDelay (line 39) | @Override
    method compareTo (line 44) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/conf/DefaultProperties.java
  class DefaultProperties (line 13) | public class DefaultProperties {
    method getProperties (line 15) | public static Properties getProperties(String name, boolean sipLog, bo...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/conf/ServerLoggerImpl.java
  class ServerLoggerImpl (line 12) | public class ServerLoggerImpl implements ServerLogger {
    method closeLogFile (line 20) | @Override
    method logMessage (line 25) | @Override
    method logMessage (line 38) | @Override
    method logMessage (line 50) | @Override
    method logException (line 62) | @Override
    method setStackProperties (line 70) | @Override
    method setSipStack (line 81) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/conf/StackLoggerImpl.java
  class StackLoggerImpl (line 10) | @Component
    method getLocationAwareLogger (line 22) | private static LocationAwareLogger getLocationAwareLogger() {
    method log (line 32) | private static void log(int level, String message) {
    method log (line 42) | private static void log(int level, String message, Throwable throwable) {
    method logStackTrace (line 47) | @Override
    method logStackTrace (line 52) | @Override
    method getLineCount (line 57) | @Override
    method logException (line 62) | @Override
    method logDebug (line 67) | @Override
    method logDebug (line 72) | @Override
    method logTrace (line 77) | @Override
    method logFatalError (line 82) | @Override
    method logError (line 87) | @Override
    method isLoggingEnabled (line 92) | @Override
    method isLoggingEnabled (line 97) | @Override
    method logError (line 102) | @Override
    method logWarning (line 107) | @Override
    method logInfo (line 112) | @Override
    method disableLogging (line 117) | @Override
    method enableLogging (line 122) | @Override
    method setBuildTimeStamp (line 127) | @Override
    method setStackProperties (line 132) | @Override
    method getLoggerName (line 137) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/AlarmController.java
  class AlarmController (line 31) | @Tag(name = "报警信息管理")
    method delete (line 61) | @DeleteMapping("/delete")
    method delete (line 98) | @GetMapping("/test/notify/alarm")
    method getAll (line 147) | @Operation(summary = "分页查询报警", security = @SecurityRequirement(name = ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/ChannelController.java
  class ChannelController (line 44) | @Tag(name  = "全局通道管理")
    method getOne (line 66) | @Operation(summary = "查询通道信息", security = @SecurityRequirement(name = ...
    method getIndustryCodeList (line 73) | @Operation(summary = "获取行业编码列表", security = @SecurityRequirement(name ...
    method getDeviceTypeList (line 79) | @Operation(summary = "获取编码列表", security = @SecurityRequirement(name = ...
    method getNetworkIdentificationTypeList (line 85) | @Operation(summary = "获取编码列表", security = @SecurityRequirement(name = ...
    method update (line 91) | @Operation(summary = "更新通道", security = @SecurityRequirement(name = Jw...
    method reset (line 108) | @Operation(summary = "重置国标通道", security = @SecurityRequirement(name = ...
    method add (line 116) | @Operation(summary = "增加通道", security = @SecurityRequirement(name = Jw...
    method queryList (line 123) | @Operation(summary = "获取通道列表", security = @SecurityRequirement(name = ...
    method queryListByCivilCode (line 152) | @Operation(summary = "获取关联行政区划通道列表", security = @SecurityRequirement(n...
    method queryListByCivilCodeForUnusual (line 172) | @Operation(summary = "存在行政区划但无法挂载的通道列表", security = @SecurityRequireme...
    method queryListByParentForUnusual (line 190) | @Operation(summary = "存在父节点编号但无法挂载的通道列表", security = @SecurityRequirem...
    method clearChannelCivilCode (line 207) | @Operation(summary = "清除存在行政区划但无法挂载的通道列表", security = @SecurityRequire...
    method clearChannelParent (line 214) | @Operation(summary = "清除存在分组节点但无法挂载的通道列表", security = @SecurityRequire...
    method queryListByParentId (line 221) | @Operation(summary = "获取关联业务分组通道列表", security = @SecurityRequirement(n...
    method addChannelToRegion (line 240) | @Operation(summary = "通道设置行政区划", security = @SecurityRequirement(name ...
    method deleteChannelToRegion (line 248) | @Operation(summary = "通道删除行政区划", security = @SecurityRequirement(name ...
    method addChannelToRegionByGbDevice (line 255) | @Operation(summary = "通道设置行政区划-根据国标设备", security = @SecurityRequiremen...
    method deleteChannelToRegionByGbDevice (line 263) | @Operation(summary = "通道删除行政区划-根据国标设备", security = @SecurityRequiremen...
    method addChannelToGroup (line 270) | @Operation(summary = "通道设置业务分组", security = @SecurityRequirement(name ...
    method deleteChannelToGroup (line 279) | @Operation(summary = "通道删除业务分组", security = @SecurityRequirement(name ...
    method addChannelToGroupByGbDevice (line 288) | @Operation(summary = "通道设置业务分组-根据国标设备", security = @SecurityRequiremen...
    method deleteChannelToGroupByGbDevice (line 297) | @Operation(summary = "通道删除业务分组-根据国标设备", security = @SecurityRequiremen...
    method play (line 304) | @Operation(summary = "播放通道", security = @SecurityRequirement(name = Jw...
    method stopPlay (line 346) | @Operation(summary = "停止播放通道", security = @SecurityRequirement(name = ...
    method queryRecord (line 355) | @Operation(summary = "录像查询", security = @SecurityRequirement(name = Jw...
    method playback (line 388) | @Operation(summary = "录像回放", security = @SecurityRequirement(name = Jw...
    method stopPlayback (line 435) | @Operation(summary = "停止录像回放", security = @SecurityRequirement(name = ...
    method pausePlayback (line 446) | @Operation(summary = "暂停录像回放", security = @SecurityRequirement(name = ...
    method resumePlayback (line 457) | @Operation(summary = "恢复录像回放", security = @SecurityRequirement(name = ...
    method seekPlayback (line 468) | @Operation(summary = "拖动录像回放", security = @SecurityRequirement(name = ...
    method seekPlayback (line 481) | @Operation(summary = "拖动录像回放", security = @SecurityRequirement(name = ...
    method queryListForMap (line 494) | @Operation(summary = "为地图获取通道列表", security = @SecurityRequirement(name...
    method resetLevel (line 512) | @Operation(summary = "为地图去除抽稀结果", security = @SecurityRequirement(name...
    method drawThin (line 518) | @Operation(summary = "执行抽稀", security = @SecurityRequirement(name = Jw...
    method clearThin (line 527) | @Operation(summary = "清除未保存的抽稀结果", security = @SecurityRequirement(nam...
    method saveThin (line 534) | @Operation(summary = "保存的抽稀结果", security = @SecurityRequirement(name =...
    method thinProgress (line 541) | @Operation(summary = "获取抽稀执行的进度", security = @SecurityRequirement(name...
    method getTile (line 548) | @Operation(summary = "为地图提供标准mvt图层", security = @SecurityRequirement(n...
    method getThinTile (line 569) | @Operation(summary = "为地图提供经过抽稀的标准mvt图层", security = @SecurityRequirem...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/ChannelFrontEndController.java
  class ChannelFrontEndController (line 26) | @Tag(name  = "全局通道前端控制")
    method ptz (line 39) | @Operation(summary = "云台控制", security = @SecurityRequirement(name = Jw...
    method iris (line 132) | @Operation(summary = "光圈控制", security = @SecurityRequirement(name = Jw...
    method focus (line 186) | @Operation(summary = "聚焦控制", security = @SecurityRequirement(name = Jw...
    method queryPreset (line 238) | @Operation(summary = "查询预置位", security = @SecurityRequirement(name = J...
    method controlPreset (line 269) | private DeferredResult<WVPResult<String>> controlPreset(Integer channe...
    method addPreset (line 293) | @Operation(summary = "预置位指令-设置预置位", security = @SecurityRequirement(na...
    method callPreset (line 307) | @Operation(summary = "预置位指令-调用预置位", security = @SecurityRequirement(na...
    method deletePreset (line 319) | @Operation(summary = "预置位指令-删除预置位", security = @SecurityRequirement(na...
    method tourControl (line 332) | private DeferredResult<WVPResult<String>> tourControl(Integer channelI...
    method addTourPoint (line 355) | @Operation(summary = "巡航指令-加入巡航点", security = @SecurityRequirement(nam...
    method deleteCruisePoint (line 370) | @Operation(summary = "巡航指令-删除一个巡航点", security = @SecurityRequirement(n...
    method setCruiseSpeed (line 384) | @Operation(summary = "巡航指令-设置巡航速度", security = @SecurityRequirement(na...
    method setCruiseTime (line 399) | @Operation(summary = "巡航指令-设置巡航停留时间", security = @SecurityRequirement(...
    method startCruise (line 414) | @Operation(summary = "巡航指令-开始巡航", security = @SecurityRequirement(name...
    method stopCruise (line 425) | @Operation(summary = "巡航指令-停止巡航", security = @SecurityRequirement(name...
    method scanControl (line 436) | private DeferredResult<WVPResult<String>> scanControl(Integer channelI...
    method startScan (line 460) | @Operation(summary = "扫描指令-开始自动扫描", security = @SecurityRequirement(na...
    method stopScan (line 472) | @Operation(summary = "扫描指令-停止自动扫描", security = @SecurityRequirement(na...
    method setScanLeft (line 483) | @Operation(summary = "扫描指令-设置自动扫描左边界", security = @SecurityRequirement...
    method setScanRight (line 494) | @Operation(summary = "扫描指令-设置自动扫描右边界", security = @SecurityRequirement...
    method setScanSpeed (line 506) | @Operation(summary = "扫描指令-设置自动扫描速度", security = @SecurityRequirement(...
    method wiper (line 520) | @Operation(summary = "辅助开关控制指令-雨刷控制", security = @SecurityRequirement(...
    method auxiliarySwitch (line 561) | @Operation(summary = "辅助开关控制指令", security = @SecurityRequirement(name ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceConfig.java
  class DeviceConfig (line 26) | @Slf4j
    method homePositionApi (line 35) | @GetMapping("/basicParam")
    method configDownloadApi (line 60) | @Operation(summary = "设备配置查询", security = @SecurityRequirement(name = ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceControl.java
  class DeviceControl (line 25) | @Tag(name  = "国标设备控制")
    method teleBootApi (line 35) | @Operation(summary = "远程启动", security = @SecurityRequirement(name = Jw...
    method recordApi (line 48) | @Operation(summary = "录像控制", security = @SecurityRequirement(name = Jw...
    method guardApi (line 71) | @Operation(summary = "布防/撤防", security = @SecurityRequirement(name = J...
    method resetAlarm (line 92) | @Operation(summary = "报警复位", security = @SecurityRequirement(name = Jw...
    method iFrame (line 128) | @Operation(summary = "强制关键帧", security = @SecurityRequirement(name = J...
    method homePositionApi (line 141) | @Operation(summary = "看守位控制", security = @SecurityRequirement(name = J...
    method dragZoomIn (line 167) | @Operation(summary = "拉框放大", security = @SecurityRequirement(name = Jw...
    method dragZoomOut (line 200) | @Operation(summary = "拉框缩小", security = @SecurityRequirement(name = Jw...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/DeviceQuery.java
  class DeviceQuery (line 41) | @Tag(name  = "国标设备查询", description = "国标设备查询")
    method devices (line 72) | @Operation(summary = "查询国标设备", security = @SecurityRequirement(name = ...
    method devices (line 81) | @Operation(summary = "分页查询国标设备", security = @SecurityRequirement(name ...
    method channels (line 96) | @GetMapping("/devices/{deviceId}/channels")
    method streamChannels (line 116) | @GetMapping("/streams")
    method devicesSync (line 130) | @Operation(summary = "同步设备通道", security = @SecurityRequirement(name = ...
    method delete (line 149) | @Operation(summary = "移除设备", security = @SecurityRequirement(name = Jw...
    method subChannels (line 165) | @Operation(summary = "分页查询子目录通道", security = @SecurityRequirement(name...
    method changeAudio (line 191) | @Operation(summary = "开启/关闭通道的音频", security = @SecurityRequirement(nam...
    method updateChannelStreamIdentification (line 201) | @Operation(summary = "修改通道的码流类型", security = @SecurityRequirement(name...
    method getChannel (line 206) | @Operation(summary = "获取单个通道详情", security = @SecurityRequirement(name ...
    method updateTransport (line 215) | @Operation(summary = "修改数据流传输模式", security = @SecurityRequirement(name...
    method addDevice (line 230) | @Operation(summary = "添加设备信息", security = @SecurityRequirement(name = ...
    method updateDevice (line 248) | @Operation(summary = "更新设备信息", security = @SecurityRequirement(name = ...
    method deviceStatusApi (line 258) | @Operation(summary = "设备状态查询", security = @SecurityRequirement(name = ...
    method alarmApi (line 278) | @Operation(summary = "设备报警查询", security = @SecurityRequirement(name = ...
    method deviceInfo (line 311) | @Operation(summary = "设备信息查询", security = @SecurityRequirement(name = ...
    method getSyncStatusInPath (line 334) | @GetMapping("/{deviceId}/sync_status")
    method getSyncStatus (line 364) | @GetMapping("/sync_status")
    method getSnap (line 391) | @GetMapping("/snap/{deviceId}/{channelId}")
    method getRawChannel (line 410) | @GetMapping("/channel/raw")
    method subscribeCatalog (line 417) | @GetMapping("/subscribe/catalog")
    method subscribeMobilePosition (line 425) | @GetMapping("/subscribe/mobile-position")

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/GBRecordController.java
  class GBRecordController (line 38) | @Tag(name  = "国标录像")
    method recordinfo (line 62) | @Operation(summary = "录像查询", security = @SecurityRequirement(name = Jw...
    method download (line 106) | @Operation(summary = "开始历史媒体下载", security = @SecurityRequirement(name ...
    method downloadStop (line 165) | @Operation(summary = "停止历史媒体下载", security = @SecurityRequirement(name ...
    method getProgress (line 191) | @Operation(summary = "获取历史媒体下载进度", security = @SecurityRequirement(nam...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/GroupController.java
  class GroupController (line 20) | @Slf4j
    method add (line 29) | @Operation(summary = "添加分组")
    method queryForTree (line 37) | @Operation(summary = "查询分组节点")
    method queryTree (line 53) | @Operation(summary = "查询分组")
    method update (line 64) | @Operation(summary = "更新分组")
    method delete (line 72) | @Operation(summary = "删除分组")
    method getPath (line 84) | @Operation(summary = "获取所属的行政区划下的行政区划")

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/MediaController.java
  class MediaController (line 32) | @Tag(name  = "媒体流相关")
    method getStreamInfoByAppAndStream (line 54) | @Operation(summary = "根据应用名和流id获取播放地址", security = @SecurityRequiremen...
    method getPlayUrl (line 135) | @GetMapping(value = "/getPlayUrl")

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/MobilePositionController.java
  class MobilePositionController (line 32) | @Tag(name  = "位置信息管理")
    method positions (line 58) | @Operation(summary = "查询历史轨迹", security = @SecurityRequirement(name = ...
    method latestPosition (line 83) | @Operation(summary = "查询设备最新位置", security = @SecurityRequirement(name ...
    method realTimePosition (line 95) | @Operation(summary = "获取移动位置信息", security = @SecurityRequirement(name ...
    method positionSubscribe (line 135) | @Operation(summary = "订阅位置信息", security = @SecurityRequirement(name = ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlatformController.java
  class PlatformController (line 30) | @Tag(name  = "级联平台管理")
    method serverConfig (line 49) | @Operation(summary = "获取国标服务的配置", security = @SecurityRequirement(name...
    method getPlatform (line 60) | @Operation(summary = "获取级联服务器信息", security = @SecurityRequirement(name...
    method platforms (line 72) | @GetMapping("/query")
    method add (line 90) | @Operation(summary = "添加上级平台信息", security = @SecurityRequirement(name ...
    method updatePlatform (line 134) | @Operation(summary = "更新上级平台信息", security = @SecurityRequirement(name ...
    method deletePlatform (line 155) | @Operation(summary = "删除上级平台", security = @SecurityRequirement(name = ...
    method exitPlatform (line 172) | @Operation(summary = "查询上级平台是否存在", security = @SecurityRequirement(nam...
    method queryChannelList (line 181) | @Operation(summary = "分页查询级联平台的所有所有通道", security = @SecurityRequiremen...
    method addChannel (line 206) | @Operation(summary = "向上级平台添加国标通道", security = @SecurityRequirement(na...
    method delChannelForGB (line 228) | @Operation(summary = "从上级平台移除国标通道", security = @SecurityRequirement(na...
    method pushChannel (line 250) | @Operation(summary = "推送通道", security = @SecurityRequirement(name = Jw...
    method addChannelByDevice (line 259) | @Operation(summary = "添加通道-通过设备", security = @SecurityRequirement(name...
    method removeChannelByDevice (line 269) | @Operation(summary = "移除通道-通过设备", security = @SecurityRequirement(name...
    method updateCustomChannel (line 279) | @Operation(summary = "自定义共享通道信息", security = @SecurityRequirement(name...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlayController.java
  class PlayController (line 50) | @Tag(name  = "国标设备点播")
    method play (line 80) | @Operation(summary = "开始点播", security = @SecurityRequirement(name = Jw...
    method playStop (line 146) | @Operation(summary = "停止点播", security = @SecurityRequirement(name = Jw...
    method playConvertStop (line 172) | @Operation(summary = "结束转码", security = @SecurityRequirement(name = Jw...
    method broadcastApi (line 191) | @Operation(summary = "语音广播命令", security = @SecurityRequirement(name = ...
    method stopBroadcast (line 206) | @Operation(summary = "停止语音广播")
    method getSSRC (line 222) | @Operation(summary = "获取所有的ssrc", security = @SecurityRequirement(name...
    method getSnap (line 245) | @Operation(summary = "获取截图", security = @SecurityRequirement(name = Jw...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/PlaybackController.java
  class PlaybackController (line 47) | @Tag(name = "视频回放")
    method start (line 74) | @Operation(summary = "开始视频回放", security = @SecurityRequirement(name = ...
    method playStop (line 141) | @Operation(summary = "停止视频回放", security = @SecurityRequirement(name = ...
    method playbackPause (line 165) | @Operation(summary = "回放暂停", security = @SecurityRequirement(name = Jw...
    method playResume (line 180) | @Operation(summary = "回放恢复", security = @SecurityRequirement(name = Jw...
    method playbackSeek (line 194) | @Operation(summary = "回放拖动播放", security = @SecurityRequirement(name = ...
    method playSpeed (line 207) | @Operation(summary = "回放倍速播放", security = @SecurityRequirement(name = ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/PtzController.java
  class PtzController (line 26) | @Tag(name  = "前端设备控制")
    method frontEndCommand (line 44) | @Operation(summary = "通用前端控制命令(参考国标文档A.3.1指令格式)", security = @Security...
    method ptz (line 75) | @Operation(summary = "云台控制", security = @SecurityRequirement(name = Jw...
    method iris (line 148) | @Operation(summary = "光圈控制", security = @SecurityRequirement(name = Jw...
    method focus (line 183) | @Operation(summary = "聚焦控制", security = @SecurityRequirement(name = Jw...
    method queryPreset (line 218) | @Operation(summary = "查询预置位", security = @SecurityRequirement(name = J...
    method addPreset (line 240) | @Operation(summary = "预置位指令-设置预置位", security = @SecurityRequirement(na...
    method callPreset (line 252) | @Operation(summary = "预置位指令-调用预置位", security = @SecurityRequirement(na...
    method deletePreset (line 264) | @Operation(summary = "预置位指令-删除预置位", security = @SecurityRequirement(na...
    method addCruisePoint (line 276) | @Operation(summary = "巡航指令-加入巡航点", security = @SecurityRequirement(nam...
    method deleteCruisePoint (line 289) | @Operation(summary = "巡航指令-删除一个巡航点", security = @SecurityRequirement(n...
    method setCruiseSpeed (line 305) | @Operation(summary = "巡航指令-设置巡航速度", security = @SecurityRequirement(na...
    method setCruiseTime (line 323) | @Operation(summary = "巡航指令-设置巡航停留时间", security = @SecurityRequirement(...
    method startCruise (line 341) | @Operation(summary = "巡航指令-开始巡航", security = @SecurityRequirement(name...
    method stopCruise (line 353) | @Operation(summary = "巡航指令-停止巡航", security = @SecurityRequirement(name...
    method startScan (line 365) | @Operation(summary = "扫描指令-开始自动扫描", security = @SecurityRequirement(na...
    method stopScan (line 377) | @Operation(summary = "扫描指令-停止自动扫描", security = @SecurityRequirement(na...
    method setScanLeft (line 389) | @Operation(summary = "扫描指令-设置自动扫描左边界", security = @SecurityRequirement...
    method setScanRight (line 401) | @Operation(summary = "扫描指令-设置自动扫描右边界", security = @SecurityRequirement...
    method setScanSpeed (line 414) | @Operation(summary = "扫描指令-设置自动扫描速度", security = @SecurityRequirement(...
    method wiper (line 433) | @Operation(summary = "辅助开关控制指令-雨刷控制", security = @SecurityRequirement(...
    method auxiliarySwitch (line 458) | @Operation(summary = "辅助开关控制指令", security = @SecurityRequirement(name ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java
  class RegionController (line 21) | @Tag(name = "区域管理")
    method add (line 31) | @Operation(summary = "添加区域")
    method query (line 39) | @Operation(summary = "查询区域")
    method queryForTree (line 53) | @Operation(summary = "查询区域节点")
    method queryTree (line 67) | @Operation(summary = "查询区域")
    method update (line 78) | @Operation(summary = "更新区域")
    method delete (line 86) | @Operation(summary = "删除区域")
    method queryRegionByDeviceId (line 98) | @Operation(summary = "根据区域Id查询区域")
    method getAllChild (line 111) | @Operation(summary = "获取所属的行政区划下的行政区划")
    method getPath (line 122) | @Operation(summary = "获取所属的行政区划下的行政区划")
    method sync (line 130) | @Operation(summary = "从通道中同步行政区划")
    method getDescription (line 137) | @Operation(summary = "根据行政区划编号从文件中查询层级和描述")
    method addByCivilCode (line 144) | @Operation(summary = "根据行政区划编号从文件中查询层级并添加")

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/SseController.java
  class SseController (line 23) | @Tag(name = "SSE 推送")
    method emit (line 36) | @GetMapping("/emit")

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/AudioBroadcastEvent.java
  type AudioBroadcastEvent (line 7) | public interface AudioBroadcastEvent {
    method call (line 8) | void call(String msg);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelForThin.java
  class ChannelForThin (line 5) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelListForRpcParam.java
  class ChannelListForRpcParam (line 10) | @Getter

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelReduce.java
  class ChannelReduce (line 9) | @Schema(description = "精简的channel信息展示")
    method getId (line 66) | public int getId() {
    method setId (line 70) | public void setId(int id) {
    method getChannelId (line 74) | public String getChannelId() {
    method setChannelId (line 78) | public void setChannelId(String channelId) {
    method getDeviceId (line 82) | public String getDeviceId() {
    method setDeviceId (line 86) | public void setDeviceId(String deviceId) {
    method getName (line 90) | public String getName() {
    method setName (line 94) | public void setName(String name) {
    method getManufacturer (line 98) | public String getManufacturer() {
    method setManufacturer (line 102) | public void setManufacturer(String manufacturer) {
    method getHostAddress (line 106) | public String getHostAddress() {
    method setHostAddress (line 110) | public void setHostAddress(String hostAddress) {
    method getSubCount (line 114) | public int getSubCount() {
    method setSubCount (line 118) | public void setSubCount(int subCount) {
    method getPlatformId (line 122) | public String getPlatformId() {
    method setPlatformId (line 126) | public void setPlatformId(String platformId) {
    method getCatalogId (line 130) | public String getCatalogId() {
    method setCatalogId (line 134) | public void setCatalogId(String catalogId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToGroupByGbDeviceParam.java
  class ChannelToGroupByGbDeviceParam (line 7) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToGroupParam.java
  class ChannelToGroupParam (line 7) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionByGbDeviceParam.java
  class ChannelToRegionByGbDeviceParam (line 7) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ChannelToRegionParam.java
  class ChannelToRegionParam (line 8) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/DrawThinParam.java
  class DrawThinParam (line 8) | @Getter

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/Extent.java
  class Extent (line 6) | @Getter

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/PlayResult.java
  class PlayResult (line 8) | public class PlayResult {
    method getResult (line 15) | public DeferredResult<WVPResult<StreamInfo>> getResult() {
    method setResult (line 19) | public void setResult(DeferredResult<WVPResult<StreamInfo>> result) {
    method getUuid (line 23) | public String getUuid() {
    method setUuid (line 27) | public void setUuid(String uuid) {
    method getDevice (line 31) | public Device getDevice() {
    method setDevice (line 35) | public void setDevice(Device device) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/ResetParam.java
  class ResetParam (line 8) | @Getter

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/controller/bean/UpdateChannelParam.java
  class UpdateChannelParam (line 8) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java
  type CommonGBChannelMapper (line 17) | @Mapper
    method queryByDeviceId (line 22) | @SelectProvider(type = ChannelProvider.class, method = "queryByDeviceId")
    method insert (line 25) | @Insert(" <script>" +
    method queryById (line 111) | @SelectProvider(type = ChannelProvider.class, method = "queryById")
    method delete (line 114) | @Delete(value = {"delete from wvp_device_channel where id = #{gbId} "})
    method update (line 117) | @Update(value = {" <script>" +
    method updateStatusById (line 158) | @Update(value = {" <script>" +
    method updateStatusForListById (line 165) | @Update("<script> " +
    method queryInListByStatus (line 172) | @SelectProvider(type = ChannelProvider.class, method = "queryInListByS...
    method batchAdd (line 176) | @Insert(" <script>" +
    method updateStatus (line 230) | @Update("<script> " +
    method reset (line 237) | @Update(value = {" <script>" +
    method queryByIds (line 248) | @SelectProvider(type = ChannelProvider.class, method = "queryByIds")
    method batchDelete (line 251) | @Delete(value = {" <script>" +
    method queryListByCivilCode (line 258) | @SelectProvider(type = ChannelProvider.class, method = "queryListByCiv...
    method queryListByParentId (line 264) | @SelectProvider(type = ChannelProvider.class, method = "queryListByPar...
    method queryForRegionTreeByCivilCode (line 270) | @Select("<script>" +
    method removeCivilCode (line 285) | @Update(value = {" <script>" +
    method updateRegion (line 294) | @Update(value = {" <script>" +
    method queryByIdsOrCivilCode (line 302) | @SelectProvider(type = ChannelProvider.class, method = "queryByIdsOrCi...
    method removeCivilCodeByChannels (line 305) | @Update(value = {" <script>" +
    method removeCivilCodeByChannelIds (line 313) | @Update(value = {" <script>" +
    method queryByCivilCode (line 321) | @SelectProvider(type = ChannelProvider.class, method = "queryByCivilCo...
    method queryByDataTypeAndDeviceIds (line 324) | @SelectProvider(type = ChannelProvider.class, method = "queryByDataTyp...
    method queryByGbDeviceIds (line 327) | @SelectProvider(type = ChannelProvider.class, method = "queryByGbDevic...
    method queryByGbDeviceIdsForIds (line 330) | @Select(value = {" <script>" +
    method queryByGroupList (line 337) | @SelectProvider(type = ChannelProvider.class, method = "queryByGroupLi...
    method removeParentIdByChannels (line 340) | @Update(value = {" <script>" +
    method queryByBusinessGroup (line 348) | @SelectProvider(type = ChannelProvider.class, method = "queryByBusines...
    method queryByParentId (line 351) | @SelectProvider(type = ChannelProvider.class, method = "queryByParentId")
    method updateBusinessGroupByChannelList (line 354) | @Update(value = {" <script>" +
    method updateParentIdByChannelList (line 362) | @Update(value = {" <script>" +
    method queryForGroupTreeByParentId (line 370) | @Select("<script>" +
    method updateGroup (line 388) | @Update(value = {" <script>" +
    method batchUpdate (line 397) | @Update({"<script>" +
    method queryWithPlatform (line 440) | @SelectProvider(type = ChannelProvider.class, method = "queryWithPlatf...
    method queryShareChannelByParentId (line 443) | @SelectProvider(type = ChannelProvider.class, method = "queryShareChan...
    method queryShareChannelByCivilCode (line 446) | @SelectProvider(type = ChannelProvider.class, method = "queryShareChan...
    method updateCivilCodeByChannelList (line 449) | @Update(value = {" <script>" +
    method queryListByStreamPushList (line 457) | @SelectProvider(type = ChannelProvider.class, method = "queryListByStr...
    method updateGpsByDeviceId (line 460) | @Update(value = {" <script>" +
    method queryList (line 474) | @SelectProvider(type = ChannelProvider.class, method = "queryList")
    method removeRecordPlan (line 479) | @Update(value = {" <script>" +
    method addRecordPlan (line 487) | @Update(value = {" <script>" +
    method addRecordPlanForAll (line 495) | @Update(value = {" <script>" +
    method removeRecordPlanByPlanId (line 501) | @Update(value = {" <script>" +
    method queryForRecordPlanForWebList (line 509) | @Select("<script>" +
    method queryByDataId (line 567) | @SelectProvider(type = ChannelProvider.class, method = "queryByDataId")
    method queryListByCivilCodeForUnusual (line 570) | @SelectProvider(type = ChannelProvider.class, method = "queryListByCiv...
    method queryAllForUnusualCivilCode (line 573) | @SelectProvider(type = ChannelProvider.class, method = "queryAllForUnu...
    method queryListByParentForUnusual (line 576) | @SelectProvider(type = ChannelProvider.class, method = "queryListByPar...
    method queryAllForUnusualParent (line 579) | @SelectProvider(type = ChannelProvider.class, method = "queryAllForUnu...
    method removeParentIdByChannelIds (line 582) | @Update(value = {" <script>" +
    method queryOnlineListsByGbDeviceId (line 591) | @SelectProvider(type = ChannelProvider.class, method = "queryOnlineLis...
    method queryCommonChannelByDeviceChannel (line 594) | @SelectProvider(type = ChannelProvider.class, method = "queryCommonCha...
    method updateStream (line 597) | @Update("UPDATE wvp_device_channel SET stream_id = #{stream} where id ...
    method updateGps (line 600) | @Update("<script> " +
    method queryListForSy (line 615) | @SelectProvider(type = ChannelProvider.class, method = "queryListForSy")
    method queryGbChannelByChannelDeviceIdAndGbDeviceId (line 619) | @SelectProvider(type = ChannelProvider.class, method = "queryGbChannel...
    method queryListByDeviceIds (line 622) | @SelectProvider(type = ChannelProvider.class, method = "queryListByDev...
    method queryListWithChildForSy (line 625) | @SelectProvider(type = ChannelProvider.class, method = "queryListWithC...
    method queryListByAddressAndDirectionType (line 628) | @SelectProvider(type = ChannelProvider.class, method = "queryListByAdd...
    method queryListInBox (line 631) | @SelectProvider(type = ChannelProvider.class, method = "queryListInBox")
    method queryListInCircle (line 636) | @SelectProvider(type = ChannelProvider.class, method = "queryListInCir...
    method queryListInPolygon (line 643) | @SelectProvider(type = ChannelProvider.class, method = "queryListInPol...
    method queryListForSyMobile (line 649) | @SelectProvider(type = ChannelProvider.class, method = "queryListForSy...
    method queryCameraChannelById (line 652) | @SelectProvider(type = ChannelProvider.class, method = "queryCameraCha...
    method saveLevel (line 655) | @Update("<script> " +
    method queryCameraChannelByIds (line 663) | @SelectProvider(type = ChannelProvider.class, method = "queryCameraCha...
    method queryOldChanelListByChannels (line 666) | @SelectProvider(type = ChannelProvider.class, method = "queryOldChanel...
    method queryMeetingChannelList (line 669) | @SelectProvider(type = ChannelProvider.class, method = "queryMeetingCh...
    method resetLevel (line 672) | @Update("UPDATE wvp_device_channel SET map_level=null")
    method queryCameraChannelInBox (line 675) | @SelectProvider(type = ChannelProvider.class, method = "queryCameraCha...
    method queryExtent (line 679) | @Select("select " +
    method queryAllWithPosition (line 688) | @SelectProvider(type = ChannelProvider.class, method = "queryAllWithPo...
    method queryListInExtent (line 691) | @SelectProvider(type = ChannelProvider.class, method = "queryListInExt...
    method queryListOutExtent (line 695) | @SelectProvider(type = ChannelProvider.class, method = "queryListOutEx...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceAlarmMapper.java
  type DeviceAlarmMapper (line 16) | @Mapper
    method add (line 20) | @Insert("INSERT INTO wvp_device_alarm (device_id, channel_id, alarm_pr...
    method query (line 25) | @Select( value = {" <script>" +
    method clearAlarmBeforeTime (line 41) | @Delete(" <script>" +

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceChannelMapper.java
  type DeviceChannelMapper (line 16) | @Mapper
    method add (line 21) | @Insert("<script> " +
    method update (line 38) | @Update(value = {" <script>" +
    method queryChannels (line 87) | @SelectProvider(type = DeviceChannelProvider.class, method = "queryCha...
    method queryChannelsByDeviceDbId (line 94) | @SelectProvider(type = DeviceChannelProvider.class, method = "queryCha...
    method queryChaneIdListByDeviceDbIds (line 97) | @Select("<script> " +
    method cleanChannelsByDeviceId (line 103) | @Delete("DELETE FROM wvp_device_channel WHERE data_type =1 and data_de...
    method deleteForNotify (line 106) | @Delete("DELETE FROM wvp_device_channel WHERE data_type=#{dataType} an...
    method queryChannelsWithDeviceInfo (line 109) | @Select(value = {" <script>" +
    method startPlay (line 161) | @Update(value = {"UPDATE wvp_device_channel SET stream_id=#{streamId} ...
    method queryChannelListInAll (line 165) | @Select(value = {" <script>" +
    method offline (line 194) | @Update(value = {"UPDATE wvp_device_channel SET status='OFF' WHERE id=...
    method batchAdd (line 197) | @Insert("<script> " +
    method online (line 216) | @Update(value = {"UPDATE wvp_device_channel SET status='ON' WHERE id=#...
    method batchUpdate (line 219) | @Update({"<script>" +
    method updatePosition (line 271) | @Update(value = {" <script>" +
    method queryAllChannelsForRefresh (line 281) | @Select("select " +
    method getDeviceByChannelDeviceId (line 331) | @Select("select de.* from wvp_device de left join wvp_device_channel d...
    method batchDel (line 335) | @Delete({"<script>" +
    method batchUpdateStatus (line 342) | @Update({"<script>" +
    method getOnlineCount (line 349) | @Select("select count(1) from wvp_device_channel where status = 'ON'")
    method getAllChannelCount (line 352) | @Select("select count(1) from wvp_device_channel")
    method updateChannelStreamIdentification (line 355) | @Update("<script>" +
    method updateAllChannelStreamIdentification (line 360) | @Update("<script>" +
    method batchUpdatePosition (line 365) | @Update({"<script>" +
    method getOne (line 379) | @SelectProvider(type = DeviceChannelProvider.class, method = "getOne")
    method getOneForSource (line 382) | @Select(value = {" <script>" +
    method getOneByDeviceId (line 435) | @SelectProvider(type = DeviceChannelProvider.class, method = "getOneBy...
    method getOneByDeviceIdForSource (line 439) | @Select(value = {" <script>" +
    method stopPlayById (line 493) | @Update(value = {"UPDATE wvp_device_channel SET stream_id=null WHERE i...
    method changeAudio (line 496) | @Update(value = {" <script>" +
    method updateStatus (line 503) | @Update("UPDATE wvp_device_channel SET status=#{status} WHERE data_typ...
    method updateChannelForNotify (line 507) | @Update({"<script>" +
    method getOneBySourceChannelId (line 557) | @Select(value = {" <script>" +
    method offlineByDeviceId (line 610) | @Update(value = {"UPDATE wvp_device_channel SET status = 'OFF' WHERE d...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMapper.java
  type DeviceMapper (line 13) | @Mapper
    method getDeviceByDeviceId (line 17) | @Select("SELECT " +
    method add (line 53) | @Insert("INSERT INTO wvp_device (" +
    method update (line 123) | @Update(value = {" <script>" +
    method getDevices (line 151) | @Select(
    method del (line 192) | @Delete("DELETE FROM wvp_device WHERE device_id=#{deviceId}")
    method getOnlineDevices (line 195) | @Select("SELECT " +
    method getOnlineDevicesByServerId (line 229) | @Select("SELECT " +
    method getDeviceByHostAndPort (line 264) | @Select("SELECT " +
    method updateCustom (line 297) | @Update(value = {" <script>" +
    method addCustomDevice (line 307) | @Insert("INSERT INTO wvp_device (" +
    method getAll (line 342) | @Select("select * FROM wvp_device")
    method queryDeviceWithAsMessageChannel (line 345) | @Select("select * FROM wvp_device where  as_message_channel = true")
    method getDeviceList (line 348) | @Select(" <script>" +
    method getRawChannel (line 397) | @Select("select * from wvp_device_channel where id = #{id}")
    method query (line 400) | @Select("select * from wvp_device where id = #{id}")
    method queryByChannelId (line 403) | @Select("select wd.* from wvp_device wd left join wvp_device_channel w...
    method getDeviceBySourceChannelDeviceId (line 406) | @Select("select wd.* from wvp_device wd left join wvp_device_channel w...
    method updateSubscribeCatalog (line 409) | @Update(value = {" <script>" +
    method updateSubscribeMobilePosition (line 416) | @Update(value = {" <script>" +
    method offlineByList (line 423) | @Update(value = {" <script>" +
    method batchUpdate (line 432) | @Update({"<script>" +
    method queryByDeviceIds (line 464) | @Select(value = {" <script>" +

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/DeviceMobilePositionMapper.java
  type DeviceMobilePositionMapper (line 12) | @Mapper
    method insertNewPosition (line 15) | @Insert("INSERT INTO wvp_device_mobile_position (device_id,channel_id,...
    method queryPositionByDeviceIdAndTime (line 19) | @Select(value = {" <script>" +
    method queryLatestPositionByDevice (line 29) | @Select("SELECT * FROM wvp_device_mobile_position WHERE device_id = #{...
    method clearMobilePositionsByDeviceId (line 33) | @Delete("DELETE FROM wvp_device_mobile_position WHERE device_id = #{de...
    method batchadd (line 36) | @Insert("<script> " +

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
  type GroupMapper (line 15) | @Mapper
    method add (line 18) | @Insert("INSERT INTO wvp_common_group (device_id, name, parent_id, par...
    method addBusinessGroup (line 23) | @Insert("INSERT INTO wvp_common_group (device_id, name, business_group...
    method delete (line 28) | @Delete("DELETE FROM wvp_common_group WHERE id=#{id}")
    method update (line 31) | @Update(" UPDATE wvp_common_group " +
    method query (line 38) | @Select(value = {" <script>" +
    method getChildren (line 46) | @Select("SELECT * from wvp_common_group WHERE parent_id = #{parentId} ")
    method queryOne (line 49) | @Select("SELECT * from wvp_common_group WHERE id = #{id} ")
    method batchAdd (line 53) | @Insert(" <script>" +
    method queryForTree (line 73) | @Select(" <script>" +
    method queryForTreeByBusinessGroup (line 88) | @Select(" <script>" +
    method queryBusinessGroupForTree (line 100) | @Select(" <script>" +
    method queryOneByDeviceId (line 111) | @Select("SELECT * from wvp_common_group WHERE device_id = #{deviceId} ...
    method queryOneByOnlyDeviceId (line 114) | @Select("SELECT * from wvp_common_group WHERE device_id = #{deviceId}")
    method batchDelete (line 117) | @Delete("<script>" +
    method queryBusinessGroup (line 123) | @Select("SELECT * from wvp_common_group WHERE device_id = #{businessGr...
    method queryByBusinessGroup (line 126) | @Select("SELECT * from wvp_common_group WHERE business_group = #{busin...
    method queryByBusinessGroupForMap (line 129) | @Select("SELECT * from wvp_common_group WHERE business_group = #{busin...
    method deleteByBusinessGroup (line 133) | @Delete("DELETE FROM wvp_common_group WHERE business_group = #{busines...
    method updateChild (line 136) | @Update(" UPDATE wvp_common_group " +
    method queryInGroupListByDeviceId (line 141) | @Select(" <script>" +
    method queryInChannelList (line 148) | @Select(" <script>" +
    method queryParentInChannelList (line 157) | @Select(" <script>" +
    method queryForPlatform (line 166) | @Select(" <script>" +
    method queryNotShareGroupForPlatformByChannelList (line 180) | @Select(" <script>" +
    method queryNotShareGroupForPlatformByGroupList (line 189) | @Select(" <script>" +
    method queryByChannelList (line 199) | @Select(" <script>" +
    method updateParentId (line 209) | @Update(value = " <script>" +
    method updateParentIdWithBusinessGroup (line 241) | @Update(value = " <script>" +
    method queryForPlatformByGroupId (line 291) | @Select(" <script>" +
    method deletePlatformGroup (line 300) | @Delete("DELETE FROM wvp_platform_group WHERE group_id = #{groupId}")
    method queryGroupByAlias (line 303) | @Select("SELECT * from wvp_common_group WHERE alias = #{alias} ")
    method queryGroupByAliasAndBusinessGroup (line 306) | @Select("SELECT * from wvp_common_group WHERE alias = #{alias} and  bu...
    method queryCountWithChild (line 310) | @Select("<script>" +
    method queryGroupByAliasMap (line 324) | @Select("SELECT * from wvp_common_group where alias is not null")
    method deleteHasAlias (line 328) | @Delete("DELETE FROM wvp_common_group where alias is not null")
    method fixParentId (line 331) | @Update(value = " UPDATE wvp_common_group g1" +

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/PlatformChannelMapper.java
  type PlatformChannelMapper (line 11) | @Mapper
    method addChannels (line 16) | @Insert("<script> "+
    method delChannelForDeviceId (line 24) | @Delete("<script> "+
    method queryDeviceByPlatformIdAndChannelId (line 33) | @Select("select d.*\n" +
    method queryPlatFormListForGBWithGBId (line 40) | @Select("<script> " +
    method queryDeviceInfoByPlatformIdAndChannelId (line 54) | @Select("select dc.channel_id, dc.device_id,dc.name,d.manufacturer,d.m...
    method queryParentPlatformByChannelId (line 61) | @Select(" SELECT wp.* from wvp_platform_channel pgc " +
    method queryForPlatformForWebList (line 67) | @Select("<script>" +
    method queryOneWithPlatform (line 160) | @Select("select\n" +
    method queryNotShare (line 208) | @Select("<script>" +
    method queryShare (line 258) | @Select("<script>" +
    method removeChannelsWithPlatform (line 315) | @Delete("<script> " +
    method removeChannels (line 325) | @Delete("<script> " +
    method addPlatformGroup (line 335) | @Insert("<script> "+
    method addPlatformRegion (line 343) | @Insert("<script> "+
    method removePlatformGroup (line 351) | @Delete("<script> "+
    method removePlatformGroupById (line 357) | @Delete("<script> "+
    method removePlatformRegionById (line 362) | @Delete("<script> "+
    method queryShareChildrenGroup (line 367) | @Select(" <script>" +
    method queryShareChildrenRegion (line 375) | @Select(" <script>" +
    method queryShareParentGroupByGroupSet (line 383) | @Select(" <script>" +
    method queryShareParentRegionByRegionSet (line 392) | @Select(" <script>" +
    method queryPlatFormListByChannelList (line 401) | @Select("<script> " +
    method queryPlatFormListByChannelId (line 416) | @Select("<script> " +
    method removeChannelsByPlatformId (line 430) | @Delete("<script> "+
    method removePlatformGroupsByPlatformId (line 435) | @Delete("<script> "+
    method removePlatformRegionByPlatformId (line 440) | @Delete("<script> "+
    method updateCustomChannel (line 445) | @Update(value = {" <script>" +
    method queryShareChannel (line 486) | @Select("<script>" +
    method queryShareGroup (line 534) | @Select(" <script>" +
    method queryShareRegion (line 543) | @Select(" <script>" +

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/PlatformMapper.java
  type PlatformMapper (line 12) | @Mapper
    method add (line 16) | @Insert("INSERT INTO wvp_platform (enable, name, server_gb_id, server_...
    method update (line 26) | @Update("UPDATE wvp_platform " +
    method delete (line 63) | @Delete("DELETE FROM wvp_platform WHERE id=#{id}")
    method queryList (line 66) | @Select(" <script>" +
    method queryEnableParentPlatformListByServerId (line 80) | @Select("SELECT * FROM wvp_platform WHERE server_id=#{serverId} and en...
    method queryEnablePlatformListWithAsMessageChannel (line 83) | @Select("SELECT * FROM wvp_platform WHERE enable=true and as_message_c...
    method getParentPlatByServerGBId (line 86) | @Select("SELECT * FROM wvp_platform WHERE server_gb_id=#{platformGbId}")
    method query (line 89) | @Select("SELECT * FROM wvp_platform WHERE id=#{id}")
    method updateStatus (line 92) | @Update("UPDATE wvp_platform SET status=#{online}, server_id = #{serve...
    method queryServerIdsWithEnableAndNotInServer (line 95) | @Select("SELECT server_id FROM wvp_platform WHERE enable=true and serv...
    method queryByServerId (line 98) | @Select("SELECT * FROM wvp_platform WHERE server_id = #{serverId}")
    method queryAll (line 101) | @Select("SELECT * FROM wvp_platform ")
    method queryServerIdsWithEnableAndServer (line 104) | @Select("SELECT * FROM wvp_platform WHERE enable=true and server_id = ...
    method offlineAll (line 107) | @Update("UPDATE wvp_platform SET status=false where server_id = #{serv...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java
  type RegionMapper (line 12) | @Mapper
    method add (line 15) | @Insert("INSERT INTO wvp_common_region (device_id, name, parent_id, pa...
    method delete (line 20) | @Delete("DELETE FROM wvp_common_region WHERE id=#{id}")
    method update (line 23) | @Update(" UPDATE wvp_common_region " +
    method query (line 28) | @Select(value = {" <script>" +
    method getChildren (line 36) | @Select("SELECT * from wvp_common_region WHERE parent_id = #{parentId}...
    method queryOne (line 39) | @Select("SELECT * from wvp_common_region WHERE id = #{id} ")
    method getUninitializedCivilCode (line 42) | @Select(" select dc.civil_code as civil_code " +
    method queryInList (line 48) | @Select(" <script>" +
    method batchAdd (line 56) | @Insert(" <script>" +
    method queryForTree (line 72) | @Select(" <script>" +
    method batchDelete (line 86) | @Delete("<script>" +
    method queryInRegionListByDeviceId (line 92) | @Select(" <script>" +
    method queryByPlatform (line 99) | @Select(" <script>" +
    method updateParentId (line 110) | @Update(value = " <script>" +
    method updateChild (line 142) | @Update(" <script>" +
    method queryByDeviceId (line 149) | @Select("SELECT * from wvp_common_region WHERE device_id = #{deviceId} ")
    method queryParentInChannelList (line 152) | @Select(" <script>" +
    method queryByChannelList (line 161) | @Select(" <script>" +
    method queryNotShareRegionForPlatformByChannelList (line 171) | @Select(" <script>" +
    method queryNotShareRegionForPlatformByRegionList (line 180) | @Select(" <script>" +
    method queryInCivilCodePoList (line 190) | @Select(" <script>" +

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java
  class ChannelProvider (line 13) | public class ChannelProvider {
    method queryByDeviceId (line 207) | public String queryByDeviceId(Map<String, Object> params ){
    method queryById (line 211) | public String queryById(Map<String, Object> params ){
    method queryByDataId (line 215) | public String queryByDataId(Map<String, Object> params ){
    method queryListByCivilCode (line 219) | public String queryListByCivilCode(Map<String, Object> params ){
    method queryListByParentId (line 245) | public String queryListByParentId(Map<String, Object> params ){
    method queryList (line 271) | public String queryList(Map<String, Object> params ){
    method queryInListByStatus (line 302) | public String queryInListByStatus(Map<String, Object> params ){
    method queryByIds (line 320) | public String queryByIds(Map<String, Object> params ){
    method queryByDataTypeAndDeviceIds (line 338) | public String queryByDataTypeAndDeviceIds(Map<String, Object> params ){
    method queryByGbDeviceIds (line 356) | public String queryByGbDeviceIds(Map<String, Object> params ){
    method queryByDeviceIds (line 376) | public String queryByDeviceIds(Map<String, Object> params ){
    method queryByIdsOrCivilCode (line 394) | public String queryByIdsOrCivilCode(Map<String, Object> params ){
    method queryByCivilCode (line 420) | public String queryByCivilCode(Map<String, Object> params ){
    method queryByBusinessGroup (line 427) | public String queryByBusinessGroup(Map<String, Object> params ){
    method queryByParentId (line 434) | public String queryByParentId(Map<String, Object> params ){
    method queryByGroupList (line 441) | public String queryByGroupList(Map<String, Object> params ){
    method queryListByStreamPushList (line 460) | public String queryListByStreamPushList(Map<String, Object> params ){
    method queryWithPlatform (line 479) | public String queryWithPlatform(Map<String, Object> params ){
    method queryShareChannelByParentId (line 486) | public String queryShareChannelByParentId(Map<String, Object> params ){
    method queryShareChannelByCivilCode (line 493) | public String queryShareChannelByCivilCode(Map<String, Object> params ){
    method queryListByCivilCodeForUnusual (line 500) | public String queryListByCivilCodeForUnusual(Map<String, Object> param...
    method queryListByParentForUnusual (line 523) | public String queryListByParentForUnusual(Map<String, Object> params ){
    method queryCommonChannelByDeviceChannel (line 546) | public String queryCommonChannelByDeviceChannel(Map<String, Object> pa...
    method queryCameraChannelInBox (line 551) | public String queryCameraChannelInBox(Map<String, Object> params ){
    method queryOldChanelListByChannels (line 561) | public String queryOldChanelListByChannels(Map<String, Object> params ){
    method queryAllForUnusualCivilCode (line 579) | public String queryAllForUnusualCivilCode(Map<String, Object> params ){
    method queryAllForUnusualParent (line 588) | public String queryAllForUnusualParent(Map<String, Object> params ){
    method queryOnlineListsByGbDeviceId (line 597) | public String queryOnlineListsByGbDeviceId(Map<String, Object> params ){
    method queryListForSy (line 604) | public String queryListForSy(Map<String, Object> params ){
    method queryListWithChildForSy (line 619) | public String queryListWithChildForSy(Map<String, Object> params ){
    method queryListInBox (line 693) | public String queryListInBox(Map<String, Object> params ){
    method queryListInCircleForMysql (line 721) | public String queryListInCircleForMysql(Map<String, Object> params ){
    method queryListInCircleForKingBase (line 750) | public String queryListInCircleForKingBase(Map<String, Object> params ){
    method queryListInPolygonForMysql (line 779) | public String queryListInPolygonForMysql(Map<String, Object> params ){
    method queryListInPolygonForKingBase (line 817) | public String queryListInPolygonForKingBase(Map<String, Object> params ){
    method queryGbChannelByChannelDeviceIdAndGbDeviceId (line 855) | public String queryGbChannelByChannelDeviceIdAndGbDeviceId(Map<String,...
    method queryListByAddressAndDirectionType (line 865) | public String queryListByAddressAndDirectionType(Map<String, Object> p...
    method queryListByDeviceIds (line 876) | public String queryListByDeviceIds(Map<String, Object> params ){
    method queryCameraChannelByIds (line 886) | public String queryCameraChannelByIds(Map<String, Object> params ){
    method queryListForSyMobile (line 904) | public String queryListForSyMobile(Map<String, Object> params ){
    method queryMeetingChannelList (line 914) | public String queryMeetingChannelList(Map<String, Object> params ){
    method queryCameraChannelById (line 922) | public String queryCameraChannelById(Map<String, Object> params ){
    method queryAllWithPosition (line 926) | public String queryAllWithPosition(Map<String, Object> params ){
    method queryListInExtent (line 933) | public String queryListInExtent(Map<String, Object> params ){
    method queryListOutExtent (line 944) | public String queryListOutExtent(Map<String, Object> params ){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/DeviceChannelProvider.java
  class DeviceChannelProvider (line 9) | public class DeviceChannelProvider {
    method getBaseSelectSql (line 11) | public String getBaseSelectSql(){
    method queryChannels (line 64) | public String queryChannels(Map<String, Object> params ){
    method queryChannelsByDeviceDbId (line 122) | public String queryChannelsByDeviceDbId(Map<String, Object> params ){
    method queryAllChannels (line 129) | public String queryAllChannels(Map<String, Object> params ){
    method getOne (line 136) | public String getOne(Map<String, Object> params ){
    method getOneByDeviceId (line 143) | public String getOneByDeviceId(Map<String, Object> params ){
    method queryByDeviceId (line 152) | public String queryByDeviceId(Map<String, Object> params ){
    method queryById (line 156) | public String queryById(Map<String, Object> params ){
    method queryList (line 161) | public String queryList(Map<String, Object> params ){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/EventPublisher.java
  class EventPublisher (line 28) | @Slf4j
    method deviceAlarmEventPublish (line 45) | public void deviceAlarmEventPublish(DeviceAlarm deviceAlarm) {
    method mediaServerOfflineEventPublish (line 51) | public void mediaServerOfflineEventPublish(MediaServer mediaServer){
    method mediaServerOnlineEventPublish (line 57) | public void mediaServerOnlineEventPublish(MediaServer mediaServer) {
    method channelEventPublish (line 63) | public void channelEventPublish(CommonGBChannel commonGBChannel, Chann...
    method channelEventPublishForUpdate (line 67) | public void channelEventPublishForUpdate(CommonGBChannel commonGBChann...
    method channelEventPublishForUpdate (line 73) | public void channelEventPublishForUpdate(List<CommonGBChannel> channel...
    method channelEventPublish (line 79) | public void channelEventPublish(List<CommonGBChannel> channelList, Cha...
    method catalogEventPublish (line 85) | public void catalogEventPublish(Platform platform, CommonGBChannel dev...
    method catalogEventPublish (line 88) | public void catalogEventPublish(Platform platform, List<CommonGBChanne...
    method mobilePositionEventPublish (line 116) | public void mobilePositionEventPublish(MobilePosition mobilePosition) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/MessageSubscribe.java
  class MessageSubscribe (line 16) | @Slf4j
    method execute (line 24) | @Scheduled(fixedDelay = 200)   //每200毫秒执行
    method addSubscribe (line 41) | public void addSubscribe(MessageEvent<?> event) {
    method getSubscribe (line 51) | public MessageEvent<?> getSubscribe(String key) {
    method removeSubscribe (line 55) | public void removeSubscribe(String key) {
    method isEmpty (line 66) | public boolean isEmpty(){
    method size (line 70) | public Integer size() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/SipSubscribe.java
  class SipSubscribe (line 24) | @Slf4j
    method execute (line 33) | @Scheduled(fixedDelay = 200)   //每200毫秒执行
    type Event (line 53) | public interface Event { void response(EventResult eventResult);
      method response (line 53) | void response(EventResult eventResult);
    type EventResultType (line 59) | public enum EventResultType{
    class EventResult (line 78) | public static class EventResult<T>{
      method EventResult (line 85) | public EventResult() {
      method EventResult (line 88) | public EventResult(T event) {
    method addSubscribe (line 149) | public void addSubscribe(String key, SipEvent event) {
    method getSubscribe (line 159) | public SipEvent getSubscribe(String key) {
    method removeSubscribe (line 163) | public void removeSubscribe(String key) {
    method isEmpty (line 174) | public boolean isEmpty(){
    method size (line 178) | public Integer size() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEvent.java
  class AlarmEvent (line 14) | public class AlarmEvent extends ApplicationEvent {
    method AlarmEvent (line 19) | public AlarmEvent(Object source) {
    method getAlarmInfo (line 25) | public DeviceAlarm getAlarmInfo() {
    method setAlarmInfo (line 29) | public void setAlarmInfo(DeviceAlarm deviceAlarm) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/alarm/AlarmEventListener.java
  class AlarmEventListener (line 18) | @Slf4j
    method onApplicationEvent (line 25) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/channel/ChannelEvent.java
  class ChannelEvent (line 15) | @Setter
    method ChannelEvent (line 22) | public ChannelEvent(Object source) {
    type ChannelEventMessageType (line 34) | public enum ChannelEventMessageType {
    method getInstance (line 38) | public static ChannelEvent getInstance(Object source, ChannelEventMess...
    method getInstanceForUpdate (line 45) | public static ChannelEvent getInstanceForUpdate(Object source, List<Co...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordInfoEndEvent.java
  class RecordInfoEndEvent (line 15) | @Setter
    method RecordInfoEndEvent (line 22) | public RecordInfoEndEvent(Object source) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordInfoEvent.java
  class RecordInfoEvent (line 16) | @Setter
    method RecordInfoEvent (line 23) | public RecordInfoEvent(Object source) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/record/RecordInfoEventListener.java
  class RecordInfoEventListener (line 16) | @Slf4j
    type RecordEndEventHandler (line 21) | public interface RecordEndEventHandler{
      method handler (line 22) | void  handler(RecordInfo recordInfo);
    method onApplicationEvent (line 25) | @Override
    method addEndEventHandler (line 49) | public void addEndEventHandler(String device, String channelId, Record...
    method delEndEventHandler (line 56) | public void delEndEventHandler(String device, String channelId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/sip/MessageEvent.java
  class MessageEvent (line 10) | @Data
    method getDelay (line 29) | @Override
    method compareTo (line 34) | @Override
    method getKey (line 39) | public String getKey(){
    method getInstance (line 43) | public static <T> MessageEvent<T> getInstance(String cmdType, String s...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/sip/SipEvent.java
  class SipEvent (line 11) | @Data
    method getInstance (line 33) | public static SipEvent getInstance(String key, SipSubscribe.Event okEv...
    method getDelay (line 42) | @Override
    method compareTo (line 47) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEvent.java
  class CatalogEvent (line 11) | @Setter
    method CatalogEvent (line 15) | public CatalogEvent(Object source) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/catalog/CatalogEventLister.java
  class CatalogEventLister (line 26) | @Slf4j
    method onApplicationEvent (line 45) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/mobilePosition/MobilePositionEvent.java
  class MobilePositionEvent (line 9) | public class MobilePositionEvent extends ApplicationEvent {
    method MobilePositionEvent (line 10) | public MobilePositionEvent(Object source) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/event/subscribe/mobilePosition/MobilePositionEventLister.java
  class MobilePositionEventLister (line 25) | @Slf4j
    method onApplicationEvent (line 44) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceAlarmService.java
  type IDeviceAlarmService (line 11) | public interface IDeviceAlarmService {
    method getAllAlarm (line 26) | PageInfo<DeviceAlarm> getAllAlarm(int page, int count, String deviceId...
    method add (line 33) | void add(DeviceAlarm deviceAlarm);
    method clearAlarmBeforeTime (line 41) | int clearAlarmBeforeTime(Integer id, List<String> deviceIdList, String...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceChannelService.java
  type IDeviceChannelService (line 18) | public interface IDeviceChannelService {
    method updateChannels (line 23) | int updateChannels(Device device, List<DeviceChannel> channels);
    method getOverview (line 29) | ResourceBaseInfo getOverview();
    method getOne (line 34) | DeviceChannel getOne(String deviceId, String channelId);
    method getOneForSource (line 36) | DeviceChannel getOneForSource(String deviceId, String channelId);
    method updateChannelStreamIdentification (line 41) | void updateChannelStreamIdentification(DeviceChannel channel);
    method queryChaneListByDeviceId (line 43) | List<DeviceChannel> queryChaneListByDeviceId(String deviceId);
    method updateChannelGPS (line 45) | void updateChannelGPS(Device device, DeviceChannel deviceChannel, Mobi...
    method startPlay (line 47) | void startPlay(Integer channelId, String stream);
    method stopPlay (line 49) | void stopPlay(Integer channelId);
    method online (line 51) | void online(DeviceChannel channel);
    method offline (line 53) | void offline(DeviceChannel channel);
    method deleteForNotify (line 55) | void deleteForNotify(DeviceChannel channel);
    method cleanChannelsForDevice (line 57) | void cleanChannelsForDevice(int deviceId);
    method resetChannels (line 59) | boolean resetChannels(int deviceDbId, List<DeviceChannel> deviceChanne...
    method getSubChannels (line 61) | PageInfo<DeviceChannel> getSubChannels(int deviceDbId, String channelI...
    method queryChannelExtendsByDeviceId (line 63) | List<DeviceChannelExtend> queryChannelExtendsByDeviceId(String deviceI...
    method queryChannelsByDeviceId (line 65) | PageInfo<DeviceChannel> queryChannelsByDeviceId(String deviceId, Strin...
    method queryChannels (line 67) | PageInfo<DeviceChannel> queryChannels(String query, Boolean queryParen...
    method queryDeviceWithAsMessageChannel (line 69) | List<Device> queryDeviceWithAsMessageChannel();
    method getRawChannel (line 71) | DeviceChannel getRawChannel(int id);
    method getOneById (line 73) | DeviceChannel getOneById(Integer channelId);
    method getOneForSourceById (line 75) | DeviceChannel getOneForSourceById(Integer channelId);
    method getBroadcastChannel (line 77) | DeviceChannel getBroadcastChannel(int deviceDbId);
    method changeAudio (line 79) | void changeAudio(Integer channelId, Boolean audio);
    method updateChannelStatusForNotify (line 81) | void updateChannelStatusForNotify(DeviceChannel channel);
    method addChannel (line 83) | void addChannel(DeviceChannel channel);
    method updateChannelForNotify (line 85) | void updateChannelForNotify(DeviceChannel channel);
    method getOneForSource (line 87) | DeviceChannel getOneForSource(int deviceDbId, String channelId);
    method getOneBySourceId (line 89) | DeviceChannel getOneBySourceId(int deviceDbId, String channelId);
    method queryChaneIdListByDeviceDbIds (line 91) | List<Integer> queryChaneIdListByDeviceDbIds(List<Integer> deviceDbId);
    method handlePtzCmd (line 93) | void handlePtzCmd(@NotNull Integer dataDeviceId, @NotNull Integer gbId...
    method queryRecordInfo (line 95) | void queryRecordInfo(Device device, DeviceChannel channel, String star...
    method queryRecordInfo (line 97) | void queryRecordInfo(CommonGBChannel channel, String startTime, String...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IDeviceService.java
  type IDeviceService (line 17) | public interface IDeviceService {
    method online (line 23) | void online(Device device, SipTransactionInfo sipTransactionInfo);
    method offline (line 29) | void offline(String deviceId, String reason, boolean check);
    method addCatalogSubscribe (line 36) | boolean addCatalogSubscribe(Device device, SipTransactionInfo transact...
    method removeCatalogSubscribe (line 43) | boolean removeCatalogSubscribe(Device device, CommonCallback<Boolean> ...
    method addMobilePositionSubscribe (line 50) | boolean addMobilePositionSubscribe(Device device, SipTransactionInfo t...
    method removeMobilePositionSubscribe (line 57) | boolean removeMobilePositionSubscribe(Device device, CommonCallback<Bo...
    method getChannelSyncStatus (line 64) | SyncStatus getChannelSyncStatus(String deviceId);
    method isSyncRunning (line 71) | Boolean isSyncRunning(String deviceId);
    method sync (line 77) | void sync(Device device);
    method getDeviceByDeviceId (line 84) | Device getDeviceByDeviceId(String deviceId);
    method getAllOnlineDevice (line 90) | List<Device> getAllOnlineDevice(String serverId);
    method getAllByStatus (line 92) | List<Device> getAllByStatus(Boolean status);
    method expire (line 99) | boolean expire(Device device);
    method getDeviceStatus (line 105) | Boolean getDeviceStatus(Device device);
    method getDeviceByHostAndPort (line 113) | Device getDeviceByHostAndPort(String host, int port);
    method updateDevice (line 119) | void updateDevice(Device device);
    method updateDeviceList (line 121) | @Transactional
    method isExist (line 129) | boolean isExist(String deviceId);
    method addCustomDevice (line 135) | void addCustomDevice(Device device);
    method updateCustomDevice (line 141) | void updateCustomDevice(Device device);
    method delete (line 148) | boolean delete(String deviceId);
    method getOverview (line 154) | ResourceBaseInfo getOverview();
    method getAll (line 159) | List<Device> getAll();
    method getAll (line 161) | PageInfo<Device> getAll(int page, int count, String query, Boolean sta...
    method getDevice (line 163) | Device getDevice(Integer gbDeviceDbId);
    method getDeviceByChannelId (line 165) | Device getDeviceByChannelId(Integer channelId);
    method getDeviceBySourceChannelDeviceId (line 167) | Device getDeviceBySourceChannelDeviceId(String requesterId);
    method subscribeCatalog (line 169) | void subscribeCatalog(int id, int cycle);
    method subscribeMobilePosition (line 171) | void subscribeMobilePosition(int id, int cycle, int interval);
    method devicesSync (line 173) | WVPResult<SyncStatus> devicesSync(Device device);
    method deviceBasicConfig (line 175) | void deviceBasicConfig(Device device, BasicParam basicParam, ErrorCall...
    method deviceConfigQuery (line 177) | void deviceConfigQuery(Device device, String channelId, String configT...
    method teleboot (line 179) | void teleboot(Device device);
    method record (line 181) | void record(Device device, String channelId, String recordCmdStr, Erro...
    method guard (line 183) | void guard(Device device, String guardCmdStr, ErrorCallback<String> ca...
    method resetAlarm (line 185) | void resetAlarm(Device device, String channelId, String alarmMethod, S...
    method iFrame (line 187) | void iFrame(Device device, String channelId);
    method homePosition (line 189) | void homePosition(Device device, String channelId, Boolean enabled, In...
    method dragZoomIn (line 191) | void dragZoomIn(Device device, String channelId, int length, int width...
    method dragZoomOut (line 193) | void dragZoomOut(Device device, String channelId, int length, int widt...
    method deviceStatus (line 195) | void deviceStatus(Device device, ErrorCallback<String> callback);
    method updateDeviceHeartInfo (line 197) | void updateDeviceHeartInfo(Device device);
    method alarm (line 199) | void alarm(Device device, String startPriority, String endPriority, St...
    method deviceInfo (line 201) | void deviceInfo(Device device, ErrorCallback<Object> callback);
    method queryPreset (line 203) | void queryPreset(Device device, String channelId, ErrorCallback<List<P...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelControlService.java
  type IGbChannelControlService (line 8) | public interface IGbChannelControlService {
    method ptz (line 11) | void ptz(CommonGBChannel channel, FrontEndControlCodeForPTZ frontEndCo...
    method fi (line 12) | void fi(CommonGBChannel channel, FrontEndControlCodeForFI frontEndCont...
    method preset (line 13) | void preset(CommonGBChannel channel, FrontEndControlCodeForPreset fron...
    method tour (line 14) | void tour(CommonGBChannel channel, FrontEndControlCodeForTour frontEnd...
    method scan (line 15) | void scan(CommonGBChannel channel, FrontEndControlCodeForScan frontEnd...
    method wiper (line 16) | void wiper(CommonGBChannel channel, FrontEndControlCodeForWiper contro...
    method auxiliary (line 17) | void auxiliary(CommonGBChannel channel, FrontEndControlCodeForAuxiliar...
    method queryPreset (line 18) | void queryPreset(CommonGBChannel channel, ErrorCallback<List<Preset>> ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelPlayService.java
  type IGbChannelPlayService (line 13) | public interface IGbChannelPlayService {
    method startInvite (line 15) | void startInvite(CommonGBChannel channel, InviteMessageInfo inviteInfo...
    method stopInvite (line 17) | void stopInvite(InviteSessionType type, CommonGBChannel channel, Strin...
    method playback (line 19) | void playback(CommonGBChannel channel, Long startTime, Long stopTime, ...
    method download (line 21) | void download(CommonGBChannel channel, Long startTime, Long stopTime, ...
    method stopPlay (line 24) | void stopPlay(CommonGBChannel channel);
    method play (line 26) | void play(CommonGBChannel channel, Platform platform, Boolean record, ...
    method stopPlayback (line 28) | void stopPlayback(CommonGBChannel channel, String stream);
    method stopDownload (line 30) | void stopDownload(CommonGBChannel channel, String stream);
    method playbackPause (line 32) | void playbackPause(CommonGBChannel channel, String streamId);
    method playbackResume (line 34) | void playbackResume(CommonGBChannel channel, String streamId);
    method playbackSeek (line 36) | void playbackSeek(CommonGBChannel channel, String stream, long seekTime);
    method playbackSpeed (line 38) | void playbackSpeed(CommonGBChannel channel, String stream, Double speed);
    method queryRecord (line 40) | void queryRecord(CommonGBChannel channel, String startTime, String end...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java
  type IGbChannelService (line 13) | public interface IGbChannelService {
    method queryByDeviceId (line 15) | CommonGBChannel queryByDeviceId(String gbDeviceId);
    method add (line 17) | int add(CommonGBChannel commonGBChannel);
    method delete (line 19) | int delete(int gbId);
    method delete (line 21) | void delete(Collection<Integer> ids);
    method update (line 23) | int update(CommonGBChannel commonGBChannel);
    method offline (line 25) | int offline(CommonGBChannel commonGBChannel);
    method offline (line 27) | int offline(List<CommonGBChannel> commonGBChannelList, boolean permiss...
    method online (line 29) | int online(CommonGBChannel commonGBChannel);
    method online (line 31) | int online(List<CommonGBChannel> commonGBChannelList, boolean permissi...
    method batchAdd (line 33) | void batchAdd(List<CommonGBChannel> commonGBChannels);
    method updateStatus (line 35) | void updateStatus(List<CommonGBChannel> channelList);
    method getOne (line 37) | CommonGBChannel getOne(int id);
    method getIndustryCodeList (line 39) | List<IndustryCodeType> getIndustryCodeList();
    method getDeviceTypeList (line 41) | List<DeviceType> getDeviceTypeList();
    method getNetworkIdentificationTypeList (line 43) | List<NetworkIdentificationType> getNetworkIdentificationTypeList();
    method reset (line 45) | void reset(int id, List<String> chanelFields);
    method queryListByCivilCode (line 47) | PageInfo<CommonGBChannel> queryListByCivilCode(int page, int count, St...
    method queryListByParentId (line 49) | PageInfo<CommonGBChannel> queryListByParentId(int page, int count, Str...
    method removeCivilCode (line 51) | void removeCivilCode(List<Region> allChildren);
    method addChannelToRegion (line 53) | void addChannelToRegion(String civilCode, List<Integer> channelIds);
    method deleteChannelToRegion (line 55) | void deleteChannelToRegion(String civilCode, List<Integer> channelIds);
    method deleteChannelToRegionByCivilCode (line 57) | void deleteChannelToRegionByCivilCode(String civilCode);
    method deleteChannelToRegionByChannelIds (line 59) | void deleteChannelToRegionByChannelIds(List<Integer> channelIds);
    method addChannelToRegionByGbDevice (line 61) | void addChannelToRegionByGbDevice(String civilCode, List<Integer> devi...
    method deleteChannelToRegionByGbDevice (line 63) | void deleteChannelToRegionByGbDevice(List<Integer> deviceIds);
    method removeParentIdByBusinessGroup (line 65) | void removeParentIdByBusinessGroup(String businessGroup);
    method removeParentIdByGroupList (line 67) | void removeParentIdByGroupList(List<Group> groupList);
    method updateBusinessGroup (line 69) | void updateBusinessGroup(String oldBusinessGroup, String newBusinessGr...
    method updateParentIdGroup (line 71) | void updateParentIdGroup(String oldParentId, String newParentId);
    method addChannelToGroup (line 73) | void addChannelToGroup(String parentId, String businessGroup, List<Int...
    method deleteChannelToGroup (line 75) | void deleteChannelToGroup(String parentId, String businessGroup, List<...
    method addChannelToGroupByGbDevice (line 77) | void addChannelToGroupByGbDevice(String parentId, String businessGroup...
    method deleteChannelToGroupByGbDevice (line 79) | void deleteChannelToGroupByGbDevice(List<Integer> deviceIds);
    method batchUpdateForStreamPushRedisMsg (line 81) | void batchUpdateForStreamPushRedisMsg(List<CommonGBChannel> commonGBCh...
    method queryOneWithPlatform (line 83) | CommonGBChannel queryOneWithPlatform(Integer platformId, String channe...
    method updateCivilCode (line 85) | void updateCivilCode(String oldCivilCode, String newCivilCode);
    method queryListByStreamPushList (line 87) | List<CommonGBChannel> queryListByStreamPushList(List<StreamPush> strea...
    method queryList (line 89) | PageInfo<CommonGBChannel> queryList(int page, int count, String query,...
    method queryListByCivilCodeForUnusual (line 91) | PageInfo<CommonGBChannel> queryListByCivilCodeForUnusual(int page, int...
    method clearChannelCivilCode (line 93) | void clearChannelCivilCode(Boolean all, List<Integer> channelIds);
    method queryListByParentForUnusual (line 95) | PageInfo<CommonGBChannel> queryListByParentForUnusual(int page, int co...
    method clearChannelParent (line 97) | void clearChannelParent(Boolean all, List<Integer> channelIds);
    method updateGPSFromGPSMsgInfo (line 99) | void updateGPSFromGPSMsgInfo(List<GPSMsgInfo> gpsMsgInfoList);
    method updateGPS (line 101) | void updateGPS(List<CommonGBChannel> channelList);
    method queryListForMap (line 103) | List<CommonGBChannel> queryListForMap(String query, Boolean online, Bo...
    method queryCommonChannelByDeviceChannel (line 105) | CommonGBChannel queryCommonChannelByDeviceChannel(DeviceChannel channel);
    method resetLevel (line 107) | void resetLevel();
    method getTile (line 109) | byte[] getTile(int z, int x, int y, String geoCoordSys);
    method drawThin (line 111) | String drawThin(Map<Integer, Double> zoomParam, Extent extent, String ...
    method thinProgress (line 113) | DrawThinProcess thinProgress(String id);
    method saveThin (line 115) | void saveThin(String id);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java
  type IGroupService (line 12) | public interface IGroupService {
    method add (line 14) | void add(Group group);
    method queryAllChildren (line 16) | List<Group> queryAllChildren(Integer id);
    method update (line 18) | void update(Group group);
    method queryGroupByDeviceId (line 20) | Group queryGroupByDeviceId(String regionDeviceId);
    method queryForTree (line 22) | List<GroupTree> queryForTree(String query, Integer parent, Boolean has...
    method delete (line 24) | boolean delete(int id);
    method batchAdd (line 26) | boolean batchAdd(List<Group> groupList);
    method getPath (line 28) | List<Group> getPath(String deviceId, String businessGroup);
    method queryList (line 30) | PageInfo<Group> queryList(Integer page, Integer count, String query);
    method queryGroupByAlias (line 32) | Group queryGroupByAlias(String groupAlias);
    method queryGroupByAliasMap (line 34) | Map<String, Group> queryGroupByAliasMap();
    method saveByAlias (line 36) | void saveByAlias(Collection<Group> groups);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IInviteStreamService.java
  type IInviteStreamService (line 13) | public interface IInviteStreamService {
    method updateInviteInfo (line 18) | void updateInviteInfo(InviteInfo inviteInfo);
    method updateInviteInfo (line 20) | void updateInviteInfo(InviteInfo inviteInfo, Long time);
    method updateInviteInfoForStream (line 22) | InviteInfo updateInviteInfoForStream(InviteInfo inviteInfo, String str...
    method getInviteInfo (line 27) | InviteInfo getInviteInfo(InviteSessionType type, Integer channelId, St...
    method removeInviteInfo (line 32) | void removeInviteInfo(InviteSessionType type, Integer channelId, Strin...
    method removeInviteInfo (line 36) | void removeInviteInfo(InviteInfo inviteInfo);
    method removeInviteInfoByDeviceAndChannel (line 40) | void removeInviteInfoByDeviceAndChannel(InviteSessionType inviteSessio...
    method getAllInviteInfo (line 42) | List<InviteInfo> getAllInviteInfo();
    method getInviteInfoByDeviceAndChannel (line 47) | InviteInfo getInviteInfoByDeviceAndChannel(InviteSessionType type, Int...
    method getInviteInfoByStream (line 52) | InviteInfo getInviteInfoByStream(InviteSessionType type, String stream);
    method once (line 58) | void once(InviteSessionType type, Integer channelId, String stream,  E...
    method call (line 63) | void call(InviteSessionType type,  Integer channelId, String stream,  ...
    method clearInviteInfo (line 68) | void clearInviteInfo(String deviceId);
    method getStreamInfoCount (line 73) | int getStreamInfoCount(String mediaServerId);
    method getInviteInfoBySSRC (line 79) | InviteInfo getInviteInfoBySSRC(String ssrc);
    method updateInviteInfoForSSRC (line 84) | InviteInfo updateInviteInfoForSSRC(InviteInfo inviteInfo, String ssrcI...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IPTZService.java
  type IPTZService (line 11) | public interface IPTZService {
    method ptz (line 13) | void ptz(Device device, String channelId, int cmdCode, int horizonSpee...
    method frontEndCommand (line 15) | void frontEndCommand(Device device, String channelId, int cmdCode, int...
    method frontEndCommand (line 17) | void frontEndCommand(CommonGBChannel channel, Integer cmdCode, Integer...
    method queryPresetList (line 19) | void queryPresetList(CommonGBChannel channel, ErrorCallback<List<Prese...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlatformChannelService.java
  type IPlatformChannelService (line 12) | public interface IPlatformChannelService {
    method queryChannelList (line 14) | PageInfo<PlatformChannel> queryChannelList(int page, int count, String...
    method addAllChannel (line 16) | int addAllChannel(Integer platformId);
    method removeAllChannel (line 18) | int removeAllChannel(Integer platformId);
    method addChannels (line 20) | int addChannels(Integer platformId, List<Integer> channelIds);
    method removeChannels (line 22) | int removeChannels(Integer platformId, List<Integer> channelIds);
    method removeChannels (line 24) | void removeChannels(List<Integer> ids);
    method removeChannel (line 26) | void removeChannel(int gbId);
    method queryByPlatform (line 28) | List<CommonGBChannel> queryByPlatform(Platform platform);
    method pushChannel (line 30) | void pushChannel(Integer platformId);
    method addChannelByDevice (line 32) | void addChannelByDevice(Integer platformId, List<Integer> deviceIds);
    method removeChannelByDevice (line 34) | void removeChannelByDevice(Integer platformId, List<Integer> deviceIds);
    method updateCustomChannel (line 36) | void updateCustomChannel(PlatformChannel channel);
    method checkGroupRemove (line 38) | void checkGroupRemove(List<CommonGBChannel> channelList, List<Group> g...
    method checkGroupAdd (line 40) | void checkGroupAdd(List<CommonGBChannel> channelList);
    method queryPlatFormListByChannelDeviceId (line 42) | List<Platform> queryPlatFormListByChannelDeviceId(Integer channelId, L...
    method queryChannelByPlatformIdAndChannelId (line 44) | CommonGBChannel queryChannelByPlatformIdAndChannelId(Integer platformI...
    method queryChannelByPlatformIdAndChannelIds (line 46) | List<CommonGBChannel> queryChannelByPlatformIdAndChannelIds(Integer pl...
    method checkRegionAdd (line 48) | void checkRegionAdd(List<CommonGBChannel> channelList);
    method checkRegionRemove (line 50) | void checkRegionRemove(List<CommonGBChannel> channelList, List<Region>...
    method queryByPlatformBySharChannelId (line 52) | List<Platform> queryByPlatformBySharChannelId(String gbId);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlatformService.java
  type IPlatformService (line 21) | public interface IPlatformService {
    method queryPlatformByServerGBId (line 23) | Platform queryPlatformByServerGBId(String platformGbId);
    method queryPlatformList (line 31) | PageInfo<Platform> queryPlatformList(int page, int count, String query);
    method add (line 37) | boolean add(Platform parentPlatform);
    method update (line 43) | boolean update(Platform parentPlatform);
    method online (line 49) | void online(Platform parentPlatform, SipTransactionInfo sipTransaction...
    method offline (line 55) | void offline(Platform parentPlatform);
    method sendNotifyMobilePosition (line 61) | void sendNotifyMobilePosition(String platformId);
    method broadcastInvite (line 66) | void broadcastInvite(Platform platform, CommonGBChannel channel, Strin...
    method stopBroadcast (line 72) | void stopBroadcast(Platform platform, CommonGBChannel channel, String ...
    method addSimulatedSubscribeInfo (line 74) | void addSimulatedSubscribeInfo(Platform parentPlatform);
    method queryOne (line 76) | Platform queryOne(Integer platformId);
    method queryEnablePlatformList (line 78) | List<Platform> queryEnablePlatformList(String serverId);
    method delete (line 80) | boolean delete(Integer platformId);
    method queryAll (line 82) | List<Platform> queryAll(String serverId);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IPlayService.java
  type IPlayService (line 24) | public interface IPlayService {
    method play (line 26) | SSRCInfo play(MediaServer mediaServerItem, String deviceId, String cha...
    method play (line 28) | void play(Device device, DeviceChannel channel, ErrorCallback<StreamIn...
    method onPublishHandlerForPlay (line 30) | StreamInfo onPublishHandlerForPlay(MediaServer mediaServerItem, MediaI...
    method getNewMediaServerItem (line 32) | MediaServer getNewMediaServerItem(Device device);
    method playBack (line 34) | void playBack(Device device, DeviceChannel channel, String startTime, ...
    method zlmServerOffline (line 35) | void zlmServerOffline(MediaServer mediaServer);
    method download (line 37) | void download(Device device, DeviceChannel channel, String startTime, ...
    method getDownLoadInfo (line 39) | StreamInfo getDownLoadInfo(Device device, DeviceChannel channel, Strin...
    method zlmServerOnline (line 41) | void zlmServerOnline(MediaServer mediaServer);
    method audioBroadcast (line 43) | AudioBroadcastResult audioBroadcast(String deviceId, String channelDev...
    method audioBroadcastCmd (line 45) | boolean audioBroadcastCmd(Device device, DeviceChannel channel, MediaS...
    method audioBroadcastInUse (line 47) | boolean audioBroadcastInUse(Device device, DeviceChannel channel);
    method stopAudioBroadcast (line 49) | void stopAudioBroadcast(Device device, DeviceChannel channel);
    method playbackPause (line 51) | void playbackPause(String streamId) throws ServiceException, InvalidAr...
    method playbackResume (line 53) | void playbackResume(String streamId) throws ServiceException, InvalidA...
    method playbackSeek (line 55) | void playbackSeek(String streamId, long seekTime) throws InvalidArgume...
    method playbackSpeed (line 57) | void playbackSpeed(String streamId, double speed) throws InvalidArgume...
    method startPushStream (line 59) | void startPushStream(SendRtpInfo sendRtpItem, DeviceChannel channel, S...
    method startSendRtpStreamFailHand (line 61) | void startSendRtpStreamFailHand(SendRtpInfo sendRtpItem, Platform plat...
    method talkCmd (line 63) | void talkCmd(Device device, DeviceChannel channel, MediaServer mediaSe...
    method stopTalk (line 65) | void stopTalk(Device device, DeviceChannel channel, Boolean streamIsRe...
    method getSnap (line 67) | void getSnap(String deviceId, String channelId, String fileName, Error...
    method stop (line 69) | void stop(InviteSessionType type, Device device, DeviceChannel channel...
    method stop (line 71) | void stop(InviteInfo inviteInfo);
    method play (line 73) | void play(CommonGBChannel channel, Boolean record, ErrorCallback<Strea...
    method stopPlay (line 75) | void stopPlay(InviteSessionType inviteSessionType, CommonGBChannel cha...
    method stop (line 77) | void stop(InviteSessionType inviteSessionType, CommonGBChannel channel...
    method playBack (line 79) | void playBack(CommonGBChannel channel, Long startTime, Long stopTime, ...
    method download (line 81) | void download(CommonGBChannel channel, Long startTime, Long stopTime, ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/IRegionService.java
  type IRegionService (line 10) | public interface IRegionService {
    method add (line 12) | void add(Region region);
    method deleteByDeviceId (line 14) | boolean deleteByDeviceId(Integer regionDeviceId);
    method query (line 19) | PageInfo<Region> query(String query, int page, int count);
    method update (line 24) | void update(Region region);
    method getAllChild (line 26) | List<Region> getAllChild(String parent);
    method queryRegionByDeviceId (line 28) | Region queryRegionByDeviceId(String regionDeviceId);
    method queryForTree (line 30) | List<RegionTree> queryForTree(Integer parent, Boolean hasChannel);
    method syncFromChannel (line 32) | void syncFromChannel();
    method delete (line 34) | boolean delete(int id);
    method batchAdd (line 36) | boolean batchAdd(List<Region> regionList);
    method getPath (line 38) | List<Region> getPath(String deviceId);
    method getDescription (line 40) | String getDescription(String civilCode);
    method addByCivilCode (line 42) | void addByCivilCode(String civilCode);
    method queryList (line 44) | PageInfo<Region> queryList(int page, int count, String query);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourceDownloadService.java
  type ISourceDownloadService (line 10) | public interface ISourceDownloadService {
    method download (line 12) | void download(CommonGBChannel channel, Long startTime, Long stopTime, ...
    method stopDownload (line 14) | void stopDownload(CommonGBChannel channel, String stream);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePTZService.java
  type ISourcePTZService (line 11) | public interface ISourcePTZService {
    method ptz (line 13) | void ptz(CommonGBChannel channel, FrontEndControlCodeForPTZ frontEndCo...
    method preset (line 15) | void preset(CommonGBChannel channel, FrontEndControlCodeForPreset fron...
    method fi (line 17) | void fi(CommonGBChannel channel, FrontEndControlCodeForFI frontEndCont...
    method tour (line 19) | void tour(CommonGBChannel channel, FrontEndControlCodeForTour frontEnd...
    method scan (line 21) | void scan(CommonGBChannel channel, FrontEndControlCodeForScan frontEnd...
    method auxiliary (line 23) | void auxiliary(CommonGBChannel channel, FrontEndControlCodeForAuxiliar...
    method wiper (line 25) | void wiper(CommonGBChannel channel, FrontEndControlCodeForWiper frontE...
    method queryPreset (line 27) | void queryPreset(CommonGBChannel channel, ErrorCallback<List<Preset>> ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePlayService.java
  type ISourcePlayService (line 11) | public interface ISourcePlayService {
    method play (line 13) | void play(CommonGBChannel channel, Platform platform, Boolean record, ...
    method stopPlay (line 15) | void stopPlay(CommonGBChannel channel);

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/ISourcePlaybackService.java
  type ISourcePlaybackService (line 13) | public interface ISourcePlaybackService {
    method playback (line 15) | void playback(CommonGBChannel channel, Long startTime, Long stopTime, ...
    method stopPlayback (line 17) | void stopPlayback(CommonGBChannel channel, String stream);
    method playbackPause (line 19) | void playbackPause(CommonGBChannel channel, String stream);
    method playbackResume (line 21) | void playbackResume(CommonGBChannel channel, String stream);
    method playbackSeek (line 23) | void playbackSeek(CommonGBChannel channel, String stream, long seekTime);
    method playbackSpeed (line 25) | void playbackSpeed(CommonGBChannel channel, String stream, Double speed);
    method queryRecord (line 27) | void queryRecord(CommonGBChannel channel, String startTime, String end...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceAlarmServiceImpl.java
  class DeviceAlarmServiceImpl (line 13) | @Service
    method getAllAlarm (line 19) | @Override
    method add (line 26) | @Override
    method clearAlarmBeforeTime (line 31) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceChannelServiceImpl.java
  class DeviceChannelServiceImpl (line 57) | @Slf4j
    method onApplicationEvent (line 100) | @Async("taskExecutor")
    method updateChannels (line 113) | @Override
    method getOverview (line 204) | @Override
    method online (line 211) | @Override
    method offline (line 216) | @Override
    method deleteForNotify (line 221) | @Override
    method getOne (line 226) | @Override
    method getOneForSource (line 235) | @Override
    method getOneForSource (line 244) | @Override
    method getOneBySourceId (line 249) | @Override
    method updateChannelStreamIdentification (line 254) | @Override
    method queryChaneListByDeviceId (line 270) | @Override
    method queryChaneIdListByDeviceDbIds (line 279) | @Override
    method handlePtzCmd (line 284) | @Override
    method updateChannelGPS (line 317) | @Override
    method startPlay (line 373) | @Override
    method stopPlay (line 378) | @Override
    method cleanChannelsForDevice (line 383) | @Override
    method resetChannels (line 388) | @Override
    method getSubChannels (line 518) | @Override
    method queryChannelExtendsByDeviceId (line 543) | @Override
    method queryChannelsByDeviceId (line 548) | @Override
    method queryChannels (line 564) | @Override
    method queryDeviceWithAsMessageChannel (line 576) | @Override
    method getRawChannel (line 581) | @Override
    method getOneById (line 586) | @Override
    method getOneForSourceById (line 591) | @Override
    method getBroadcastChannel (line 596) | @Override
    method changeAudio (line 611) | @Override
    method updateChannelStatusForNotify (line 616) | @Override
    method addChannel (line 621) | @Override
    method updateChannelForNotify (line 628) | @Override
    method queryRecordInfo (line 633) | @Override
    method queryRecordInfo (line 667) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/DeviceServiceImpl.java
  class DeviceServiceImpl (line 65) | @Slf4j
    method getDeviceByDeviceIdFromDb (line 127) | private Device getDeviceByDeviceIdFromDb(String deviceId) {
    method run (line 131) | @Override
    method offlineByIds (line 231) | private void offlineByIds(List<Device> offlineDevices) {
    method cleanOfflineDevice (line 243) | private void cleanOfflineDevice(Device device) {
    method deviceStatusExpire (line 279) | private void deviceStatusExpire(String deviceId, SipTransactionInfo tr...
    method online (line 284) | @Override
    method offline (line 388) | @Override
    method channelOfflineByDevice (line 421) | private void channelOfflineByDevice(Device device) {
    method isDevice (line 432) | private boolean isDevice(String deviceId) {
    method lostCheckForSubscribe (line 442) | @Scheduled(fixedDelay = 10, timeUnit = TimeUnit.SECONDS)
    method lostCheckForStatus (line 465) | @Scheduled(fixedDelay = 30, timeUnit = TimeUnit.SECONDS)
    method catalogSubscribeExpire (line 483) | private void catalogSubscribeExpire(String deviceId, SipTransactionInf...
    method mobilPositionSubscribeExpire (line 495) | private void mobilPositionSubscribeExpire(String deviceId, SipTransact...
    method addCatalogSubscribe (line 507) | @Override
    method removeCatalogSubscribe (line 544) | @Override
    method addMobilePositionSubscribe (line 574) | @Override
    method removeMobilePositionSubscribe (line 608) | @Override
    method getChannelSyncStatus (line 639) | @Override
    method isSyncRunning (line 651) | @Override
    method sync (line 656) | @Override
    method getDeviceByDeviceId (line 678) | @Override
    method getAllOnlineDevice (line 690) | @Override
    method getAllByStatus (line 695) | @Override
    method expire (line 700) | @Override
    method getDeviceStatus (line 707) | @Override
    method getDeviceByHostAndPort (line 727) | @Override
    method updateDevice (line 732) | @Override
    method updateDeviceList (line 742) | @Transactional
    method isExist (line 776) | @Override
    method addCustomDevice (line 781) | @Override
    method updateCustomDevice (line 792) | @Override
    method delete (line 816) | @Override
    method getOverview (line 847) | @Override
    method getAll (line 854) | @Override
    method getAll (line 859) | @Override
    method getDevice (line 871) | @Override
    method getDeviceByChannelId (line 876) | @Override
    method getDeviceBySourceChannelDeviceId (line 881) | @Override
    method subscribeCatalog (line 886) | @Override
    method subscribeMobilePosition (line 917) | @Override
    method updateDeviceHeartInfo (line 961) | @Override
    method devicesSync (line 982) | @Override
    method deviceBasicConfig (line 1011) | @Override
    method deviceConfigQuery (line 1030) | @Override
    method teleboot (line 1048) | @Override
    method record (line 1062) | @Override
    method guard (line 1080) | @Override
    method resetAlarm (line 1097) | @Override
    method iFrame (line 1114) | @Override
    method homePosition (line 1129) | @Override
    method dragZoomIn (line 1146) | @Override
    method dragZoomOut (line 1171) | @Override
    method deviceStatus (line 1196) | @Override
    method alarm (line 1223) | @Override
    method deviceInfo (line 1249) | @Override
    method queryPreset (line 1266) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelControlServiceImpl.java
  class GbChannelControlServiceImpl (line 16) | @Service
    method ptz (line 25) | @Override
    method preset (line 38) | @Override
    method fi (line 51) | @Override
    method tour (line 64) | @Override
    method scan (line 77) | @Override
    method auxiliary (line 90) | @Override
    method wiper (line 103) | @Override
    method queryPreset (line 116) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelPlayServiceImpl.java
  class GbChannelPlayServiceImpl (line 24) | @Slf4j
    method startInvite (line 47) | @Override
    method stopInvite (line 70) | @Override
    method play (line 91) | @Override
    method playback (line 111) | @Override
    method download (line 124) | @Override
    method stopPlay (line 138) | @Override
    method stopPlayback (line 151) | @Override
    method stopDownload (line 164) | @Override
    method playbackPause (line 177) | @Override
    method playbackResume (line 190) | @Override
    method playbackSeek (line 203) | @Override
    method playbackSpeed (line 216) | @Override
    method queryRecord (line 229) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java
  class GbChannelServiceImpl (line 50) | @Slf4j
    method run (line 84) | @Override
    method queryByDeviceId (line 110) | @Override
    method add (line 120) | @Override
    method delete (line 144) | @Override
    method delete (line 167) | @Override
    method update (line 189) | @Override
    method offline (line 232) | @Override
    method offline (line 250) | @Override
    method online (line 283) | @Override
    method online (line 301) | @Override
    method batchAdd (line 334) | @Override
    method batchUpdateForStreamPushRedisMsg (line 364) | @Override
    method updateStatus (line 397) | @Override
    method getOne (line 430) | @Override
    method getIndustryCodeList (line 435) | @Override
    method getDeviceTypeList (line 446) | @Override
    method getNetworkIdentificationTypeList (line 457) | @Override
    method reset (line 468) | @Override
    method queryListByCivilCode (line 503) | @Override
    method queryListByParentId (line 515) | @Override
    method removeCivilCode (line 527) | @Override
    method addChannelToRegion (line 534) | @Override
    method deleteChannelToRegion (line 557) | @Override
    method deleteChannelToRegionByCivilCode (line 568) | @Override
    method deleteChannelToRegionByChannelIds (line 594) | @Override
    method addChannelToRegionByGbDevice (line 614) | @Override
    method deleteChannelToRegionByGbDevice (line 636) | @Override
    method removeParentIdByBusinessGroup (line 646) | @Override
    method removeParentIdByGroupList (line 659) | @Override
    method updateBusinessGroup (line 669) | @Override
    method updateParentIdGroup (line 691) | @Override
    method addChannelToGroup (line 712) | @Override
    method deleteChannelToGroup (line 738) | @Override
    method addChannelToGroupByGbDevice (line 756) | @Override
    method deleteChannelToGroupByGbDevice (line 787) | @Override
    method queryOneWithPlatform (line 797) | @Override
    method updateCivilCode (line 808) | @Override
    method queryListByStreamPushList (line 829) | @Override
    method queryList (line 834) | @Override
    method queryListByCivilCodeForUnusual (line 847) | @Override
    method clearChannelCivilCode (line 859) | @Override
    method queryListByParentForUnusual (line 871) | @Override
    method clearChannelParent (line 883) | @Override
    method updateGPSFromGPSMsgInfo (line 894) | @Override
    method updateGPS (line 924) | @Transactional
    method queryListForMap (line 941) | @Override
    method queryCommonChannelByDeviceChannel (line 951) | @Override
    method resetLevel (line 956) | @Override
    method getTile (line 961) | @Override
    method getStringObjectMap (line 1005) | @NotNull
    method drawThin (line 1021) | @Override
    method saveTile (line 1150) | private void saveTile(String id, int z, String geoCoordSys, Collection...
    method saveProcess (line 1180) | private void saveProcess(String id, double process, String msg) {
    method thinProgress (line 1186) | @Override
    method saveThin (line 1192) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java
  class GroupServiceImpl (line 29) | @Service
    method add (line 48) | @Override
    method addGroup (line 74) | private void addGroup(Group group) {
    method addBusinessGroup (line 90) | private void addBusinessGroup(Group group) {
    method queryAllChildren (line 97) | @Override
    method update (line 109) | @Override
    method queryGroupByDeviceId (line 171) | @Override
    method queryForTree (line 176) | @Override
    method delete (line 194) | @Override
    method batchAdd (line 238) | @Override
    method getPath (line 266) | @Override
    method getAllParent (line 282) | private List<Group> getAllParent(Group group) {
    method queryList (line 296) | @Override
    method queryGroupByAlias (line 308) | @Override
    method queryGroupByAliasMap (line 313) | @Override
    method saveByAlias (line 318) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/InviteStreamServiceImpl.java
  class InviteStreamServiceImpl (line 29) | @Slf4j
    method onApplicationEvent (line 50) | @Async("taskExecutor")
    method updateInviteInfo (line 65) | @Override
    method updateInviteInfo (line 74) | @Override
    method updateInviteInfoForStream (line 131) | @Override
    method getInviteInfo (line 157) | @Override
    method getAllInviteInfo (line 177) | @Override
    method getInviteInfoByDeviceAndChannel (line 191) | @Override
    method getInviteInfoByStream (line 196) | @Override
    method removeInviteInfo (line 201) | @Override
    method removeInviteInfoByDeviceAndChannel (line 217) | @Override
    method removeInviteInfo (line 222) | @Override
    method once (line 227) | @Override
    method buildKey (line 235) | private String buildKey(InviteSessionType type, Integer channelId, Str...
    method clearInviteInfo (line 245) | @Override
    method getStreamInfoCount (line 255) | @Override
    method call (line 278) | @Override
    method buildSubStreamKey (line 294) | private String buildSubStreamKey(InviteSessionType type, Integer chann...
    method getInviteInfoBySSRC (line 302) | @Override
    method updateInviteInfoForSSRC (line 316) | @Override
    method execute (line 334) | @Scheduled(fixedRate = 10000)   //定时检测,清理错误的redis数据,防止因为错误数据导致的点播不可用

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PTZServiceImpl.java
  class PTZServiceImpl (line 27) | @Slf4j
    method ptz (line 48) | @Override
    method frontEndCommand (line 58) | @Override
    method frontEndCommand (line 79) | @Override
    method queryPresetList (line 94) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlatformChannelServiceImpl.java
  class PlatformChannelServiceImpl (line 32) | @Slf4j
    method onApplicationEvent (line 68) | @EventListener
    method onApplicationEvent (line 163) | @EventListener
    method queryChannelList (line 221) | @Override
    method getGroupNotShareByChannelList (line 236) | @Transactional
    method getRegionNotShareByChannelList (line 253) | private Set<Region> getRegionNotShareByChannelList(List<CommonGBChanne...
    method deleteEmptyGroup (line 269) | @Transactional
    method deleteEmptyRegion (line 306) | private Set<Region> deleteEmptyRegion(Set<Region> regionSet, Integer p...
    method getAllGroup (line 339) | private Set<Group> getAllGroup(Set<Group> groupList ) {
    method getAllRegion (line 352) | private Set<Region> getAllRegion(Set<Region> regionSet ) {
    method addAllChannel (line 366) | @Override
    method addChannels (line 374) | @Override
    method addChannelList (line 382) | @Transactional
    method removeAllChannel (line 436) | @Override
    method addChannelByDevice (line 485) | @Override
    method removeChannelByDevice (line 492) | @Override
    method removeChannelList (line 499) | @Transactional
    method removeChannels (line 551) | @Override
    method removeChannels (line 562) | @Override
    method removeChannel (line 576) | @Override
    method queryByPlatform (line 591) | @Override
    method pushChannel (line 627) | @Override
    method updateCustomChannel (line 656) | @Override
    method checkGroupRemove (line 684) | @Override
    method checkRegionRemove (line 725) | @Override
    method checkGroupAdd (line 765) | @Override
    method checkRegionAdd (line 799) | @Override
    method queryPlatFormListByChannelDeviceId (line 831) | @Override
    method queryChannelByPlatformIdAndChannelId (line 836) | @Override
    method queryChannelByPlatformIdAndChannelIds (line 841) | @Override
    method queryByPlatformBySharChannelId (line 846) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlatformServiceImpl.java
  class PlatformServiceImpl (line 65) | @Slf4j
    method run (line 121) | @Override
    method statusLostCheck (line 171) | @Scheduled(fixedDelay = 20, timeUnit = TimeUnit.SECONDS)   //每3秒执行一次
    method sendRegister (line 194) | private void sendRegister(Platform platform, SipTransactionInfo sipTra...
    method sendUnRegister (line 205) | private void sendUnRegister(Platform platform, SipTransactionInfo sipT...
    method execute (line 218) | @Scheduled(fixedDelay = 2, timeUnit = TimeUnit.SECONDS)   //每3秒执行一次
    method getIpWithSameNetwork (line 276) | private String getIpWithSameNetwork(String ip){
    method onApplicationEvent (line 306) | @Async("taskExecutor")
    method onApplicationEvent (line 333) | @Async("taskExecutor")
    method queryPlatformByServerGBId (line 354) | @Override
    method queryPlatformList (line 359) | @Override
    method add (line 371) | @Override
    method update (line 391) | @Override
    method online (line 417) | @Override
    method registerExpire (line 447) | private void registerExpire(String platformServerId, SipTransactionInf...
    method keepaliveExpire (line 457) | private void keepaliveExpire(String platformServerId, int failCount) {
    method addSimulatedSubscribeInfo (line 502) | @Override
    method offline (line 509) | @Override
    method stopAllPush (line 525) | private void stopAllPush(String platformId) {
    method sendNotifyMobilePosition (line 537) | @Override
    method broadcastInvite (line 582) | @Override
    method onPublishHandlerForBroadcast (line 685) | public void onPublishHandlerForBroadcast(MediaServer mediaServerItem, ...
    method inviteOKHandler (line 697) | private void inviteOKHandler(SipSubscribe.EventResult eventResult, SSR...
    method tcpActiveHandler (line 804) | private void tcpActiveHandler(Platform platform, CommonGBChannel chann...
    method stopBroadcast (line 850) | @Override
    method queryOne (line 871) | @Override
    method queryEnablePlatformList (line 876) | @Override
    method delete (line 881) | @Override
    method queryAll (line 917) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/PlayServiceImpl.java
  class PlayServiceImpl (line 65) | @SuppressWarnings(value = {"rawtypes", "unchecked"})
    method onApplicationEvent (line 133) | @Async("taskExecutor")
    method onApplicationEvent (line 177) | @Async("taskExecutor")
    method onApplicationEvent (line 246) | @Async("taskExecutor")
    method play (line 288) | @Override
    method play (line 304) | @Override
    method play (line 324) | private SSRCInfo play(MediaServer mediaServer, Device device, DeviceCh...
    method talk (line 485) | private void talk(MediaServer mediaServerItem, Device device, DeviceCh...
    method tcpActiveHandler (line 610) | private void tcpActiveHandler(Device device, DeviceChannel channel, St...
    method snapOnPlay (line 671) | private void snapOnPlay(MediaServer mediaServerItemInuse, String devic...
    method onPublishHandlerForPlay (line 679) | public StreamInfo onPublishHandlerForPlay(MediaServer mediaServerItem,...
    method onPublishHandlerForPlayback (line 695) | private StreamInfo onPublishHandlerForPlayback(MediaServer mediaServer...
    method getNewMediaServerItem (line 711) | @Override
    method playBack (line 728) | @Override
    method playBack (line 754) | private void playBack(MediaServer mediaServer,
    method InviteOKHandler (line 848) | private void InviteOKHandler(SipSubscribe.EventResult eventResult, SSR...
    method download (line 941) | @Override
    method download (line 961) | private void download(MediaServer mediaServer, Device device, DeviceCh...
    method getDownLoadInfo (line 1070) | @Override
    method onPublishHandlerForDownload (line 1142) | private StreamInfo onPublishHandlerForDownload(MediaServer mediaServer...
    method onPublishHandler (line 1160) | public StreamInfo onPublishHandler(MediaServer mediaServerItem, MediaI...
    method zlmServerOffline (line 1168) | @Override
    method audioBroadcast (line 1210) | @Override
    method audioBroadcastCmd (line 1240) | @Override
    method audioBroadcastInUse (line 1284) | @Override
    method stopAudioBroadcast (line 1302) | @Override
    method zlmServerOnline (line 1334) | @Override
    method playbackPause (line 1353) | @Override
    method playbackResume (line 1391) | @Override
    method playbackSeek (line 1426) | @Override
    method playbackSpeed (line 1439) | @Override
    method startPushStream (line 1452) | @Override
    method startSendRtpStreamFailHand (line 1477) | @Override
    method talkCmd (line 1505) | @Override
    method stopTalk (line 1556) | private void stopTalk(Device device, DeviceChannel channel) {
    method stopTalk (line 1560) | @Override
    method getSnap (line 1593) | @Override
    method stop (line 1633) | @Override
    method stop (line 1665) | @Override
    method play (line 1696) | @Override
    method stopPlay (line 1714) | @Override
    method stop (line 1726) | @Override
    method playBack (line 1737) | @Override
    method download (line 1758) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java
  class RegionServiceImpl (line 33) | @Service
    method add (line 49) | @Override
    method deleteByDeviceId (line 66) | @Override
    method getAllChildren (line 79) | private List<Region> getAllChildren(Integer deviceId) {
    method query (line 96) | @Override
    method update (line 108) | @Override
    method getAllChild (line 133) | @Override
    method queryRegionByDeviceId (line 140) | @Override
    method queryForTree (line 145) | @Override
    method syncFromChannel (line 158) | @Override
    method delete (line 201) | @Override
    method batchAdd (line 206) | @Override
    method getPath (line 232) | @Override
    method getAllParent (line 245) | private List<Region> getAllParent(Region region) {
    method getDescription (line 259) | @Override
    method addByCivilCode (line 280) | @Override
    method queryList (line 321) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourceDownloadServiceForGbImpl.java
  class SourceDownloadServiceForGbImpl (line 14) | @Slf4j
    method download (line 21) | @Override
    method stopDownload (line 26) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePTZServiceForGbImpl.java
  class SourcePTZServiceForGbImpl (line 15) | @Slf4j
    method ptz (line 22) | @Override
    method preset (line 76) | @Override
    method fi (line 107) | @Override
    method tour (line 154) | @Override
    method scan (line 224) | @Override
    method auxiliary (line 283) | @Override
    method wiper (line 320) | @Override
    method queryPreset (line 347) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePlayServiceForGbImpl.java
  class SourcePlayServiceForGbImpl (line 19) | @Slf4j
    method play (line 26) | @Override
    method stopPlay (line 42) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/SourcePlaybackServiceForGbImpl.java
  class SourcePlaybackServiceForGbImpl (line 23) | @Slf4j
    method playback (line 33) | @Override
    method stopPlayback (line 44) | @Override
    method playbackPause (line 54) | @Override
    method playbackResume (line 64) | @Override
    method playbackSeek (line 74) | @Override
    method playbackSpeed (line 84) | @Override
    method queryRecord (line 94) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/session/AudioBroadcastManager.java
  class AudioBroadcastManager (line 19) | @Slf4j
    method update (line 29) | public void update(AudioBroadcastCatch audioBroadcastCatch) {
    method del (line 33) | public void del(Integer channelId) {
    method getAll (line 38) | public List<AudioBroadcastCatch> getAll(){
    method exit (line 44) | public boolean exit(Integer channelId) {
    method get (line 48) | public AudioBroadcastCatch get(Integer channelId) {
    method getByDeviceId (line 52) | public List<AudioBroadcastCatch> getByDeviceId(String deviceId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/session/CatalogDataManager.java
  class CatalogDataManager (line 22) | @Slf4j
    method buildMapKey (line 42) | public String buildMapKey(String deviceId, int sn ) {
    method addReady (line 46) | public void addReady(Device device, int sn ) {
    method put (line 77) | public void put(String deviceId, int sn, int total, Device device, Lis...
    method getDeviceChannelList (line 113) | public List<DeviceChannel> getDeviceChannelList(String deviceId, int s...
    method getRegionList (line 129) | public List<Region> getRegionList(String deviceId, int sn) {
    method getGroupList (line 145) | public List<Group> getGroupList(String deviceId, int sn) {
    method getSyncStatus (line 161) | public SyncStatus getSyncStatus(String deviceId) {
    method isSyncRunning (line 189) | public boolean isSyncRunning(String deviceId) {
    method run (line 212) | @Override
    method timerTask (line 218) | @Scheduled(fixedDelay = 5 * 1000)   //每5秒执行一次, 发现数据5秒未更新则移除数据并认为数据接收超时
    method setChannelSyncEnd (line 291) | public void setChannelSyncEnd(String deviceId, int sn, String errorMsg) {
    method size (line 301) | public int size(String deviceId, int sn) {
    method sumNum (line 309) | public int sumNum(String deviceId, int sn) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/session/CommonSessionManager.java
  class CommonSessionManager (line 14) | @Component
    class CommonSession (line 22) | class CommonSession{
    method add (line 37) | public void add(String sessionId, CommonCallback<Object> callback, Com...
    method add (line 52) | public void add(String sessionId, CommonCallback<Object> callback) {
    method get (line 56) | public CommonCallback<Object> get(String sessionId, boolean destroy) {
    method get (line 64) | public CommonCallback<Object> get(String sessionId) {
    method delete (line 68) | public void delete(String sessionID) {
    method execute (line 72) | @Scheduled(fixedRate= 60)   //每分钟执行一次

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/session/SSRCFactory.java
  class SSRCFactory (line 17) | @Slf4j
    method initMediaServerSSRC (line 41) | public void initMediaServerSSRC(String mediaServerId, Set<String> used...
    method getPlaySsrc (line 66) | public String getPlaySsrc(String mediaServerId) {
    method getPlayBackSsrc (line 73) | public String getPlayBackSsrc(String mediaServerId) {
    method releaseSsrc (line 82) | public void releaseSsrc(String mediaServerId, String ssrc) {
    method getSN (line 94) | private String getSN(String mediaServerId) {
    method reset (line 111) | public void reset(String mediaServerId) {
    method hasMediaServerSSRC (line 120) | public boolean hasMediaServerSSRC(String mediaServerId) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/session/SipInviteSessionManager.java
  class SipInviteSessionManager (line 16) | @Component
    method put (line 28) | public void put(SsrcTransaction ssrcTransaction){
    method getSsrcTransactionByStream (line 36) | public SsrcTransaction getSsrcTransactionByStream(String app, String s...
    method getSsrcTransactionByCallId (line 41) | public SsrcTransaction getSsrcTransactionByCallId(String callId){
    method getSsrcTransactionByDeviceId (line 46) | public List<SsrcTransaction> getSsrcTransactionByDeviceId(String devic...
    method removeByStream (line 59) | public void removeByStream(String app, String stream) {
    method removeByCallId (line 70) | public void removeByCallId(String callId) {
    method getAll (line 81) | public List<SsrcTransaction> getAll() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/session/SseSessionManager.java
  class SseSessionManager (line 13) | @Component
    method conect (line 22) | public SseEmitter conect(String browserId){
    method execute (line 48) | @Scheduled(fixedRate = 1000)   //每1秒执行一次
    method sendForAll (line 57) | public void sendForAll(String event, Object data) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceStatus/DeviceStatusTask.java
  class DeviceStatusTask (line 12) | @Slf4j
    method getInstance (line 27) | public static DeviceStatusTask getInstance(String deviceId, SipTransac...
    method expired (line 36) | public void expired() {
    method getDelay (line 44) | @Override
    method compareTo (line 49) | @Override
    method getInfo (line 54) | public DeviceStatusTaskInfo getInfo(){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceStatus/DeviceStatusTaskInfo.java
  class DeviceStatusTaskInfo (line 6) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceStatus/DeviceStatusTaskRunner.java
  class DeviceStatusTaskRunner (line 20) | @Slf4j
    method expirationCheck (line 37) | @Scheduled(fixedDelay = 500, timeUnit = TimeUnit.MILLISECONDS)
    method addTask (line 55) | public void addTask(DeviceStatusTask task) {
    method removeTask (line 66) | public boolean removeTask(String key) {
    method getTransactionInfo (line 83) | public SipTransactionInfo getTransactionInfo(String key) {
    method updateDelay (line 91) | public boolean updateDelay(String key, long expirationTime) {
    method containsKey (line 107) | public boolean containsKey(String key) {
    method getAllTaskInfo (line 111) | public List<DeviceStatusTaskInfo> getAllTaskInfo(){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceSubscribe/SubscribeTask.java
  class SubscribeTask (line 11) | @Data
    method expired (line 25) | public abstract void expired();
    method getKey (line 27) | public abstract String getKey();
    method getName (line 29) | public abstract String getName();
    method getDelay (line 31) | @Override
    method compareTo (line 36) | @Override
    method getInfo (line 41) | public SubscribeTaskInfo getInfo(){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceSubscribe/SubscribeTaskInfo.java
  class SubscribeTaskInfo (line 6) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceSubscribe/SubscribeTaskRunner.java
  class SubscribeTaskRunner (line 20) | @Slf4j
    method expirationCheck (line 37) | @Scheduled(fixedDelay = 500, timeUnit = TimeUnit.MILLISECONDS)
    method addSubscribe (line 55) | public void addSubscribe(SubscribeTask task) {
    method removeSubscribe (line 66) | public boolean removeSubscribe(String key) {
    method getTransactionInfo (line 83) | public SipTransactionInfo getTransactionInfo(String key) {
    method updateDelay (line 91) | public boolean updateDelay(String key, long expirationTime) {
    method containsKey (line 106) | public boolean containsKey(String key) {
    method getAllTaskInfo (line 110) | public List<SubscribeTaskInfo> getAllTaskInfo(){

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceSubscribe/impl/SubscribeTaskForCatalog.java
  class SubscribeTaskForCatalog (line 9) | @Slf4j
    method getInstance (line 14) | public static SubscribeTask getInstance(Device device, SubscribeCallba...
    method expired (line 26) | @Override
    method getKey (line 35) | @Override
    method getName (line 40) | @Override
    method getKey (line 45) | public static String getKey(Device device) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/deviceSubscribe/impl/SubscribeTaskForMobilPosition.java
  class SubscribeTaskForMobilPosition (line 9) | @Slf4j
    method getInstance (line 14) | public static SubscribeTask getInstance(Device device, SubscribeCallba...
    method expired (line 26) | @Override
    method getKey (line 35) | @Override
    method getName (line 40) | @Override
    method getKey (line 45) | public static String getKey(Device device) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/platformStatus/PlatformKeepaliveTask.java
  class PlatformKeepaliveTask (line 15) | @Slf4j
    method PlatformKeepaliveTask (line 41) | public PlatformKeepaliveTask(String platformServerId, long delayTime, ...
    method expired (line 47) | public void expired() {
    method getDelay (line 55) | @Override
    method compareTo (line 60) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/platformStatus/PlatformRegisterTask.java
  class PlatformRegisterTask (line 16) | @Slf4j
    method PlatformRegisterTask (line 39) | public PlatformRegisterTask(String platformServerId, long delayTime, S...
    method expired (line 46) | public void expired() {
    method getDelay (line 54) | @Override
    method compareTo (line 59) | @Override
    method getInfo (line 64) | public PlatformRegisterTaskInfo getInfo() {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/platformStatus/PlatformRegisterTaskInfo.java
  class PlatformRegisterTaskInfo (line 10) | @Slf4j

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/task/platformStatus/PlatformStatusTaskRunner.java
  class PlatformStatusTaskRunner (line 20) | @Slf4j
    method expirationCheckForRegister (line 41) | @Scheduled(fixedDelay = 500, timeUnit = TimeUnit.MILLISECONDS)
    method expirationCheckForKeepalive (line 58) | @Scheduled(fixedDelay = 500, timeUnit = TimeUnit.MILLISECONDS)
    method addRegisterTask (line 76) | public void addRegisterTask(PlatformRegisterTask task) {
    method removeRegisterTask (line 87) | public boolean removeRegisterTask(String platformServerId) {
    method getRegisterTransactionInfo (line 103) | public SipTransactionInfo getRegisterTransactionInfo(String platformSe...
    method containsRegister (line 111) | public boolean containsRegister(String platformServerId) {
    method getAllRegisterTaskInfo (line 115) | public List<PlatformRegisterTaskInfo> getAllRegisterTaskInfo(){
    method addKeepAliveTask (line 119) | public void addKeepAliveTask(PlatformKeepaliveTask task) {
    method removeKeepAliveTask (line 128) | public boolean removeKeepAliveTask(String platformServerId) {
    method containsKeepAlive (line 142) | public boolean containsKeepAlive(String platformServerId) {
    method getRegisterTransactionInfoByServerId (line 146) | public List<PlatformRegisterTaskInfo> getRegisterTransactionInfoByServ...

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/transmit/ISIPProcessorObserver.java
  type ISIPProcessorObserver (line 5) | public interface ISIPProcessorObserver extends SipListener {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPProcessorObserver.java
  class SIPProcessorObserver (line 26) | @Slf4j
    method addRequestProcessor (line 44) | public void addRequestProcessor(String method, ISIPRequestProcessor pr...
    method addResponseProcessor (line 53) | public void addResponseProcessor(String method, ISIPResponseProcessor ...
    method processRequest (line 61) | @Override
    method processResponse (line 79) | @Override
    method processTimeout (line 136) | @Override
    method processIOException (line 162) | @Override
    method processTransactionTerminated (line 167) | @Override
    method processDialogTerminated (line 192) | @Override

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/transmit/SIPSender.java
  class SIPSender (line 31) | @Slf4j
    method transmitRequest (line 47) | public void transmitRequest(String ip, Message message) throws SipExce...
    method transmitRequest (line 51) | public void transmitRequest(String ip, Message message, SipSubscribe.E...
    method transmitRequest (line 55) | public void transmitRequest(String ip, Message message, SipSubscribe.E...
    method transmitRequest (line 59) | public void transmitRequest(String ip, Message message, SipSubscribe.E...
    method getNewCallIdHeader (line 144) | public CallIdHeader getNewCallIdHeader(String ip, String transport) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
  class DeferredResultHolder (line 18) | @SuppressWarnings(value = {"rawtypes", "unchecked"})
    method put (line 38) | public void put(String key, String id, DeferredResultEx result) {
    method put (line 47) | public void put(String key, String id, DeferredResult result) {
    method get (line 52) | public DeferredResultEx get(String key, String id) {
    method getAllByKey (line 60) | public Collection<DeferredResultEx> getAllByKey(String key) {
    method exist (line 68) | public boolean exist(String key, String id){
    method invokeResult (line 84) | public void invokeResult(RequestMessage msg) {
    method invokeAllResult (line 104) | public void invokeAllResult(RequestMessage msg) {

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/RequestMessage.java
  class RequestMessage (line 10) | @Data

FILE: src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommander.java
  type ISIPCommander (line 26) | public interface ISIPCommander {
    method ptzCmd (line 39) | void ptzCmd(Device device,String channelId,int leftRight, int upDown, ...
    method frontEndCmd (line 51) | void frontEndCmd(Device device, String channelId, int cmdCode, int par...
    method fronEndCmd (line 59) | void fronEndCmd(Device device, String channelId, String cmdString, Sip...
    method playStreamCmd (line 66) | void playStreamCmd(MediaServer mediaServerItem, SSRCInfo ssrcInfo, Dev...
    method playbackStreamCmd (line 76) | void playbackStreamCmd(MediaServer mediaServerItem, SSRCInfo ssrcInf, ...
    method downloadStreamCmd (line 87) | void downloadStreamCmd(MediaServer mediaServerItem, SSRCInfo ssrcInfo,...
    method streamByeCmd (line 95) | void streamByeCmd(Device device, String channelId, String app, String ...
    method talkStreamCmd (line 97) | void talkStreamCmd(MediaServer mediaServerItem, SendRtpInfo sendRtpIte...
    method streamByeCmd (line 99) | void streamByeCmd(Device device, String channelId, SipTransactionInfo ...
    method playPauseCmd (line 104) | void playPauseCmd(Device device, DeviceChannel channel, StreamInfo str...
    method playResumeCmd (line 109) | void playResumeCmd(Device device, DeviceChannel channel, StreamInfo st...
    method playSeekCmd (line 114) | void playSeekCmd(Device device, DeviceChannel channel, StreamInfo stre...
    method playSpeedCmd (line 119) | void playSpeedCmd(Device device, DeviceChannel channel, StreamInfo str...
    method playbackControlCmd (line 127) | void playbackControlCmd(Device device, DeviceChannel channel, StreamIn...
    method streamByeCmdForDeviceInvite (line 130) | void streamByeCmdForDeviceInvite(Device dev
Condensed preview — 1142 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,021K chars).
[
  {
    "path": ".dockerignore",
    "chars": 14,
    "preview": "docker/volumes"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug.md",
    "chars": 449,
    "preview": "---\nname: \"[ BUG ] \"\nabout: 关于wvp的bug,与zlm有关的建议直接在zlm的issue中提问\ntitle: 'BUG'\nlabels: 'wvp的bug'\nassignees: ''\n\n---\n\n**环境信息"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/new.md",
    "chars": 125,
    "preview": "---\nname: \"[ 新功能 ]\"\nabout: 新功能\ntitle: '希望wVP实现的新功能,此功能应与你的具体业务无关'\nlabels: ''\nassignees: ''\n\n---\n\n**项目的详细需求**\n\n**这样的实现什么作"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/solve.md",
    "chars": 393,
    "preview": "---\nname: \"[ 技术咨询 ] \"\nabout: 对于使用中遇到问题\ntitle: '技术咨询'\nlabels: '技术咨询'\nassignees: ''\n\n---\n\n**环境信息:**\n\n - 1. 部署方式 wvp-pro do"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 2199,
    "preview": "name: release-ubuntu\n\non:\n  push:\n    tags:\n      - \"v*.*.*\" # 触发条件是推送标签 如git tag v2.7.4 git push origin v2.7.4\n\njobs:\n "
  },
  {
    "path": ".gitignore",
    "chars": 453,
    "preview": "# Compiled class file\n*.class\n\n# Log file\n*.log\nlogs/*\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\nsr"
  },
  {
    "path": ".gitmodules",
    "chars": 133,
    "preview": "[submodule \"be.teletask.onvif-java\"]\n\tpath = be.teletask.onvif-java\n\turl = https://gitee.com/pan648540858/be.teletask.on"
  },
  {
    "path": "LICENSE",
    "chars": 1064,
    "preview": "MIT License\n\nCopyright (c) 2020 swwhaha\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof"
  },
  {
    "path": "README.md",
    "chars": 5939,
    "preview": "![logo](doc/_media/logo.png)\n# 开箱即用的国标28181和部标808+1078协议视频平台\n\n[![Build Status](https://travis-ci.org/xia-chu/ZLMediaKit."
  },
  {
    "path": "bin/wvp.sh",
    "chars": 2456,
    "preview": "#!/bin/bash\n\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[0;33m'\nBLUE='\\033[0;34m'\nNC='\\033[0m'\n\nfunction log() {\n\tm"
  },
  {
    "path": "doc/README.md",
    "chars": 2474,
    "preview": "# 介绍\n\n> 开箱即用的28181协议视频平台\n\n# 概述\n\n- WVP-PRO基于GB/T\n  28181-2016标准实现的流媒体平台,依托优秀的开源流媒体服务[ZLMediaKit](https://github.com/ZLMed"
  },
  {
    "path": "doc/_content/ability/auto_play.md",
    "chars": 22,
    "preview": "<!-- 自动点播 -->\n\n# 自动点播\n"
  },
  {
    "path": "doc/_content/ability/cascade.md",
    "chars": 858,
    "preview": "<!-- 国标级联的使用 -->\n\n# 国标级联的使用\n\n国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。\n\n## 1 接入平台\n\n### 1.1 wvp-pro\n\n#### 1.1.1 wvp-pro管"
  },
  {
    "path": "doc/_content/ability/cascade2.md",
    "chars": 1826,
    "preview": "<!-- 国标级联的使用 -->\n\n# 国标级联的使用\n\n国标28181不同平台之间支持两种连接方式,平级和上下级,WVP目前支持向上级级联。\n\n## 添加上级平台\n\n在国标级联页面点击“添加”按钮,以推送到上级WVP为例子,参看[接入设备"
  },
  {
    "path": "doc/_content/ability/channel.md",
    "chars": 812,
    "preview": "# 通道管理\n\n通道管理为了对已经分配国标编号的通道进行统一的行政区划和业务分组管理,国标中对于组织结构有两种表示方式,一种是按照行政区划,一种是业务分组+虚拟组织的方式.\n行政区划结构固定,比如: 北京/市辖区/昌平区, 通道可以挂载道何"
  },
  {
    "path": "doc/_content/ability/cloud_record.md",
    "chars": 425,
    "preview": "<!-- 云端录像 -->\n\n# 云端录像\n\n![云端录像](_media/img_26.png)\n云端录像是对录制在zlm服务下的录像文件的管理,录像的文件路径默认在ZLM/www/record下。\n\n- 国标设备是否录像: 可以再WVP"
  },
  {
    "path": "doc/_content/ability/continuous_broadcast.md",
    "chars": 2448,
    "preview": "# 语音对讲\n\n## 流程和原理\n\n语音对讲在国标28181-2016中分为broadcast(广播)和talk(对讲)两种模式,broadcast模式是从服务端把音频传送到设备端,是单向的,\n需要结合点播视频来实现双向对讲,talk模式支"
  },
  {
    "path": "doc/_content/ability/continuous_recording.md",
    "chars": 420,
    "preview": "<!-- 7*24不间断录像 -->\n\n# 7*24不间断录像\n\n目前如果要实现不间断录像如果只是关闭无人观看停止推流是不够的,设备可能经历断网,重启,都会导致录像的中断,目前给大家提供一种可用的临时方案。\n\n**原理:** wvp支持使用"
  },
  {
    "path": "doc/_content/ability/device.md",
    "chars": 1390,
    "preview": "<!-- 接入设备 -->\n\n# 接入设备\n\n## 国标28181设备\n\n设备接入主要是需要在设备上配置28181上级也就是WVP-PRO的信息,只有信息一致的情况才可以注册成功。设备注册成功后打开WVP->\n国标设备,可以看到新增加的设备"
  },
  {
    "path": "doc/_content/ability/device_use.md",
    "chars": 1344,
    "preview": "<!-- 设备使用 -->\n\n# 国标设备\n\n### 更新设备通道\n\n点击列表末尾的“刷新”按钮,可以看到一个圆形进度条,等进度结束提示成功后即可更新完成,如果通道数量有变化你可以看点击左上角的![刷新](_media/img_14.png"
  },
  {
    "path": "doc/_content/ability/gis.md",
    "chars": 832,
    "preview": "<!-- 电子地图 -->\n\n# 电子地图\n\nWVP提供了简单的电子地图用于设备的定位以及移动设备的轨迹信息,电子地图基于开源的地图引擎openlayers开发。\n\n### 查看设备定位\n\n1. 可以在设备列表点击“定位”按钮,自动跳转到电"
  },
  {
    "path": "doc/_content/ability/node_manager.md",
    "chars": 484,
    "preview": "<!-- 节点管理 -->\n\n# 节点管理\n\n![节点管理](_media/img_26.png)\n\nWVP支持单个WVP多个ZLM的方案来扩展WVP的视频并发能力,并发点播是因为带宽和性能的原因,单个ZLM节点能支持的路数有限,所以WVP"
  },
  {
    "path": "doc/_content/ability/online_doc.md",
    "chars": 22,
    "preview": "<!-- 在线文档 -->\n\n# 在线文档\n"
  },
  {
    "path": "doc/_content/ability/proxy.md",
    "chars": 637,
    "preview": "<!-- 拉流代理 -->\n\n# 拉流代理\n\n不是所有的摄像机都支持国标或者推流的,但是这些设备可以得到一个视频播放地址,通常为rtsp协议,\n以大华为例:\n\n```text\nrtsp://{user}:{passwd}@{ipc_ip}:"
  },
  {
    "path": "doc/_content/ability/push.md",
    "chars": 1331,
    "preview": "<!-- 推流列表 -->\n\n# 推流列表\n\n## 功能说明\n\nWVP支持三种图像输入方式,直播,[拉流代理](_content/ability/proxy.md),[国标](_content/ability/device.md),直播设备"
  },
  {
    "path": "doc/_content/ability/user.md",
    "chars": 22,
    "preview": "<!-- 用户管理 -->\n\n# 用户管理\n"
  },
  {
    "path": "doc/_content/about_doc.md",
    "chars": 212,
    "preview": "<!-- 关于本文档 -->\n\n# 关于本文档\n\n本文档开源在gitee上,[https://gitee.com/pan648540858/wvp-pro-doc.git](https://gitee.com/pan648540858/wv"
  },
  {
    "path": "doc/_content/broadcast.md",
    "chars": 613,
    "preview": "# 原理图\n\n## 使用ffmpeg测试语音对讲原理\n\n```plantuml\n@startuml\n\"FFMPEG\" -> \"ZLMediaKit\": 推流到zlm\n\"WVP-PRO\" <- \"ZLMediaKit\": 通知收到语音对讲推流"
  },
  {
    "path": "doc/_content/disclaimers.md",
    "chars": 180,
    "preview": "# 免责声明\n\nWVP-PRO自有代码使用宽松的MIT协议,在保留版权信息的情况下可以自由应用于各自商用、非商业的项目。\n但是本项目也零碎的使用了一些其他的开源代码,在商用的情况下请自行替代或剔除; 由于使用本项目而产生的商业纠纷或侵权行为"
  },
  {
    "path": "doc/_content/introduction/compile.md",
    "chars": 2479,
    "preview": "<!-- 编译 -->\n\n# 编译\n\nWVP-PRO不只是实现了国标28181的协议,本身也是一个完整的视频平台。所以对于新手来说,你可能需要一些耐心来完成。遇到问题不要焦躁,你可以\n\n1. 百度\n2. 加入星球体提问;[知识星球](htt"
  },
  {
    "path": "doc/_content/introduction/config.md",
    "chars": 3814,
    "preview": "<!-- 配置 -->\n\n# 配置\n\n对于首次测试或者新手同学,我建议在局域网测试,并且关闭服务器与客户机的防火墙测试。建议部署在linux进行测试。\n\n```plantuml\n@startuml\n\"WVP-PRO\" -> \"ZLMedia"
  },
  {
    "path": "doc/_content/introduction/deployment.md",
    "chars": 1250,
    "preview": "<!-- 部署 -->\n\n# 部署\n\n**请仔细阅读以下内容**\n\n1. WVP-PRO与ZLM支持分开部署;\n2. 需要开放的端口\n   | 服务 | 端口 | 类型 | 必选 |\n   |-----|:-----------------"
  },
  {
    "path": "doc/_content/qa/bug.md",
    "chars": 429,
    "preview": "<!-- 反馈bug -->\n\n# 反馈bug\n\n代码是在不断的完善的,不断修改会修复旧的问题也有可能引入新的问题,所以遇到BUG是很正常的一件事。所以遇到问题不要烦燥,咱们就事论事就好了。\n\n## 如何反馈\n\n1. 在知识星球提问。\n2."
  },
  {
    "path": "doc/_content/qa/development.md",
    "chars": 385,
    "preview": "<!-- 参与开发 -->\n\n# 参与到开发中来\n\n非常欢迎有兴趣的小伙伴一起来维护这个项目\n\n## 与开发有关的信息\n\n- 开发语言:后端java + 前端vue;\n- jdk版本: 1.8;\n- 作者自用开发ide: jetbrains"
  },
  {
    "path": "doc/_content/qa/play_error.md",
    "chars": 1831,
    "preview": "<!-- 点播错误 -->\n\n# 点播错误\n\n排查点播错误你首先要清楚[点播的基本流程](_content/theory/play.md),一般的流程如下:\n\n```plantuml\n@startuml\n\"WEB用户\"  -> \"WVP-P"
  },
  {
    "path": "doc/_content/qa/regiser_error.md",
    "chars": 136,
    "preview": "<!-- 设备注册不上来的解决办法 -->\n\n# 设备注册不上来的解决办法\n\n一般的原因有两个\n\n1. 信息填写错误,比如密码错误;\n2. 网络不通导致注册消息无法发送到WVP;\n\n遇到问题首先仔细校验填写信息,例如海康可能需要勾选鉴权才可"
  },
  {
    "path": "doc/_content/qa/start_error.md",
    "chars": 652,
    "preview": "<!-- 启动时报错 -->\n\n# 启动时报错\n\n启动时的报错大部分时候是因为你的配置有问题,比如mysql没连接上,redis没连接上,18080/15060端口占用了,这些都会导致启动是报错,修改配置配置之后都可以解决;\n下面我整理的一"
  },
  {
    "path": "doc/_content/skill/tcpdump.md",
    "chars": 1769,
    "preview": "<!-- 抓包 -->\n\n# 抓包\n\n如果说对于网络编程,有什么工具是必会的,我觉得抓包肯定是其中之一了。作为GB/T\n28181调试过程中最重要的手段,我觉得如果你真对他有兴趣,或者系统遇到问题可以最快的得到解决,那么抓包你就一定要学会了"
  },
  {
    "path": "doc/_content/theory/broadcast_cascade.md",
    "chars": 1075,
    "preview": "<!-- 点播流程 -->\n\n# 点播流程\n\n> 以下为WVP-PRO级联语音喊话流程。\n\n```plantuml\n@startuml\n\"上级平台\"  -> \"下级平台\": 1. 发起语音喊话请求\n\"上级平台\" <--  \"下级平台\": 2"
  },
  {
    "path": "doc/_content/theory/code.md",
    "chars": 780,
    "preview": "<!-- 统一编码规则 -->\n\n# 统一编码规则\n\n## D.1 编码规则 A\n\n> &emsp;&emsp;编码规则 A 由中心编码(8位)、行业编码(2位)、类型编码(3位)和序号(7位)四个码段共20位十\n> 进制数字字符构成,即系"
  },
  {
    "path": "doc/_content/theory/play.md",
    "chars": 889,
    "preview": "<!-- 点播流程 -->\n\n# 点播流程\n\n> 以下为WVP-PRO点播流程。点播成功前的任何一个环节出现问题都可能出现点播超时,这也是排查点播超时的依据。\n\n```plantuml\n@startuml\n\"WEB用户\"  -> \"WVP-"
  },
  {
    "path": "doc/_content/theory/register.md",
    "chars": 522,
    "preview": "<!-- 注册流程 -->\n\n# 注册流程\n\nWVP-PRO目前仅支持国标中描述的基本注册流程,也是最常用的,\n> 基本注册即采用IETFRFC3261规定的基于数字摘要的挑战应答式安全技术进行注册.\n\n```plantuml\n@start"
  },
  {
    "path": "doc/_coverpage.md",
    "chars": 376,
    "preview": "<!-- 封面 -->\n![logo](_media/logo-mini.png)\n\n# WVP-PRO <small>2.0</small>\n\n> 开箱即用的28181协议视频平台。\n\n- 基于GB/T28181-2016标准信令实现,兼"
  },
  {
    "path": "doc/_navbar.md",
    "chars": 13,
    "preview": "<!-- 导航栏 -->\n"
  },
  {
    "path": "doc/_sidebar.md",
    "chars": 1121,
    "preview": "<!-- 侧边栏 -->\n\n* **编译与部署**\n    * [编译](_content/introduction/compile.md)\n    * [配置](_content/introduction/config.md)\n    *"
  },
  {
    "path": "doc/index.html",
    "chars": 1902,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <title>WVP-PRO文档</title>\n    <meta http-equiv=\"X-"
  },
  {
    "path": "doc/lib/css/vue.css",
    "chars": 13061,
    "preview": "@import url(\"https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,400,600\");*{-webkit-font-smoothing:"
  },
  {
    "path": "doc/lib/js/docsify@4.js",
    "chars": 160756,
    "preview": "!function(){function c(i){var o=Object.create(null);return function(e){var n=f(e)?e:JSON.stringify(e);return o[n]||(o[n]"
  },
  {
    "path": "docker/README.md",
    "chars": 228,
    "preview": "可以在当前目录下:\n使用`docker compose up -d`直接运行。\n使用`docker compose up -d --build --force-recreate`强制重新构建所有服务的镜像并删除旧容器重新运行\n\n`.env`"
  },
  {
    "path": "docker/build.sh",
    "chars": 1891,
    "preview": "#!/bin/bash\n\n# 获取当前日期作为标签(格式:YYYYMMDD)\ndate_tag=$(date +%Y%m%d)\n\n# 切换到脚本所在目录的上一级目录作为工作目录\ncd \"$(dirname \"$0\")/..\" || {\n  "
  },
  {
    "path": "docker/docker-compose.yml",
    "chars": 4501,
    "preview": "version: '3'\nservices:\n  polaris-redis:\n    image: redis:latest  # 使用官方Redis镜像\n    restart: unless-stopped\n    healthche"
  },
  {
    "path": "docker/docker-upgrade.sh",
    "chars": 76,
    "preview": "#/bin/bash\nset -e\n\ndocker compose down\ndocker compose up -d --remove-orphans"
  },
  {
    "path": "docker/media/Dockerfile",
    "chars": 2968,
    "preview": "FROM ubuntu:20.04 AS build\n\n#shell,rtmp,rtsp,rtsps,http,rtp\nEXPOSE 10935/tcp\nEXPOSE 5540/tcp\nEXPOSE 6080/tcp\nEXPOSE 1000"
  },
  {
    "path": "docker/media/build.sh",
    "chars": 286,
    "preview": "#/bin/bash\nset -e\n\nversion=2.7.3\n\ndocker build -t polaris-media:${version} .\ndocker tag polaris-media:${version} polaris"
  },
  {
    "path": "docker/media/config.ini",
    "chars": 3745,
    "preview": "; auto-generated by mINI class {\n\n[api]\napiDebug=1\ndefaultSnap=./www/logo.png\ndownloadRoot=./www;\nsecret=su6TiedN2rVAmBb"
  },
  {
    "path": "docker/mysql/Dockerfile",
    "chars": 62,
    "preview": "FROM mysql:8.0.32\n\nADD ./db/*.sql /docker-entrypoint-initdb.d/"
  },
  {
    "path": "docker/mysql/build.sh",
    "chars": 286,
    "preview": "#/bin/bash\nset -e\n\nversion=2.7.3\n\ndocker build -t polaris-mysql:${version} .\ndocker tag polaris-mysql:${version} polaris"
  },
  {
    "path": "docker/mysql/db/privileges.sql",
    "chars": 73,
    "preview": "use mysql;\ngrant all privileges on wvp.* to 'ylcx'@'%';\nflush privileges;"
  },
  {
    "path": "docker/mysql/db/wvp.sql",
    "chars": 31655,
    "preview": "/*建库*/\nDROP DATABASE IF EXISTS `wvp`;\n\nCREATE DATABASE `wvp` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;\n\n"
  },
  {
    "path": "docker/nginx/Dockerfile",
    "chars": 457,
    "preview": "FROM ubuntu:24.04 AS builder\n\n\nRUN apt-get update && \\\n    apt-get install -y nodejs npm  && \\\n    rm -rf /var/lib/apt/l"
  },
  {
    "path": "docker/nginx/build.sh",
    "chars": 350,
    "preview": "#/bin/bash\nset -e\n\nversion=2.7.3\n\nrm ./dist/static/js/config.js\ncp ./config.js ./dist/static/js/\n\ndocker build -t polari"
  },
  {
    "path": "docker/nginx/config.js",
    "chars": 451,
    "preview": "\nwindow.baseUrl = \"http://10.10.1.124:18978\"\n\n// map组件全局参数, 注释此内容可以关闭地图功能\nwindow.mapParam = {\n  // 开启/关闭地图功能\n  enable: t"
  },
  {
    "path": "docker/nginx/templates/nginx.conf.template",
    "chars": 3586,
    "preview": "server {\n\tlisten 8080;\n\tserver_name localhost;\n\n    location / {\n\t\troot /opt/dist;\n        index  index.html index.htm;\n"
  },
  {
    "path": "docker/push.sh",
    "chars": 809,
    "preview": "#/bin/bash\nset -e\n\nversion=2.7.3\n\ndocker push polaris-tian-docker.pkg.coding.net/qt/polaris/ylcx-media:latest\ndocker pus"
  },
  {
    "path": "docker/redis/Dockerfile",
    "chars": 123,
    "preview": "FROM redis\n\nRUN mkdir -p /opt/polaris/redis\nWORKDIR /opt/polaris/redis\nCOPY ./conf/redis.conf /opt/polaris/redis/redis.c"
  },
  {
    "path": "docker/redis/build.sh",
    "chars": 286,
    "preview": "#/bin/bash\nset -e\n\nversion=2.7.3\n\ndocker build -t polaris-redis:${version} .\ndocker tag polaris-redis:${version} polaris"
  },
  {
    "path": "docker/redis/conf/redis.conf",
    "chars": 30,
    "preview": "#requirepass root\nbind 0.0.0.0"
  },
  {
    "path": "docker/wvp/Dockerfile",
    "chars": 2706,
    "preview": "FROM ringcentral/jdk:11 AS builder\n\nEXPOSE 18978/tcp\nEXPOSE 8116/tcp\nEXPOSE 8116/udp\nEXPOSE 8080/tcp\n\n#RUN apt-get updat"
  },
  {
    "path": "docker/wvp/build.sh",
    "chars": 276,
    "preview": "#/bin/bash\nset -e\n\nversion=2.7.3\n\ndocker build -t polaris-wvp:${version} .\ndocker tag polaris-wvp:${version} polaris-tia"
  },
  {
    "path": "docker/wvp/wvp/application-base.yml",
    "chars": 2412,
    "preview": "spring:\n  # 设置接口超时时间\n  mvc:\n    async:\n      request-timeout: 20000\n  thymeleaf:\n    cache: false\n  # [可选]上传文件大小限制\n  ser"
  },
  {
    "path": "docker/wvp/wvp/application-docker.yml",
    "chars": 4056,
    "preview": "spring:\n    cache:\n        type: redis\n    thymeleaf:\n        cache: false\n    # 设置接口超时时间\n    mvc:\n        async:\n      "
  },
  {
    "path": "docker/wvp/wvp/application.yml",
    "chars": 67,
    "preview": "spring:\n  application:\n    name: wvp\n  profiles:\n    active: docker"
  },
  {
    "path": "install.sh",
    "chars": 1070,
    "preview": "#! /bin/bash\n\nWORD_DIR=$(cd $(dirname $0); pwd)\nSERVICE_NAME=\"wvp\"\n\n# 检查是否为 root 用户\nif [ \"$(id -u)\" -ne 0 ]; then\n  echo"
  },
  {
    "path": "pom.xml",
    "chars": 18862,
    "preview": "<?xml version=\"1.0\"?>\n<project\n        xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd"
  },
  {
    "path": "run.sh",
    "chars": 2621,
    "preview": "#!/bin/bash\n# JDK路径\nexport JAVA_HOME=/usr/local/java/jdk1.8.0_202\nexport JRE_HOME=${JAVA_HOME}/jre\nexport CLASSPATH=.:${"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java",
    "chars": 2445,
    "preview": "package com.genersoft.iot.vmp;\n\nimport com.genersoft.iot.vmp.jt1078.util.ClassUtil;\nimport com.genersoft.iot.vmp.utils.G"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/CivilCodePo.java",
    "chars": 975,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport org.springframework.util.ObjectUtils;\n\npublic class CivilCodePo {\n\n    pri"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/CommonCallback.java",
    "chars": 103,
    "preview": "package com.genersoft.iot.vmp.common;\n\npublic interface CommonCallback<T>{\n    public void run(T t);\n}\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/DeviceStatusCallback.java",
    "chars": 218,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;\n\npublic interface D"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/InviteInfo.java",
    "chars": 1597,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport com.genersoft.iot.vmp.service.bean.SSRCInfo;\nimport lombok.Data;\n\n/**\n * 记"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/InviteSessionStatus.java",
    "chars": 176,
    "preview": "package com.genersoft.iot.vmp.common;\n\n/**\n * 标识invite消息发出后的各个状态,\n * 收到ok钱停止invite发送cancel,\n * 收到200ok后发送BYE停止invite\n */"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/InviteSessionType.java",
    "chars": 135,
    "preview": "package com.genersoft.iot.vmp.common;\n\npublic enum InviteSessionType {\n    PLAY,\n    PLAYBACK,\n    DOWNLOAD,\n    BROADCA"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/RemoteAddressInfo.java",
    "chars": 468,
    "preview": "package com.genersoft.iot.vmp.common;\n\npublic class RemoteAddressInfo {\n    private String ip;\n    private int port;\n\n  "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/ServerInfo.java",
    "chars": 476,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport com.genersoft.iot.vmp.utils.DateUtil;\nimport lombok.Data;\n\n@Data\npublic cl"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/StatisticsInfo.java",
    "chars": 1705,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport lombok.Data;\n\n/**\n * 统计信息\n */\n@Data\npublic class StatisticsInfo {\n\n    pri"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/StreamInfo.java",
    "chars": 12761,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport com.genersoft.iot.vmp.media.bean.MediaInfo;\nimport com.genersoft.iot.vmp.m"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/StreamURL.java",
    "chars": 1722,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\nimport java.io.Serializable;\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/SubscribeCallback.java",
    "chars": 214,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;\n\npublic interface S"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/SystemAllInfo.java",
    "chars": 927,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport java.util.List;\n\npublic class SystemAllInfo {\n\n    private List<Object> cp"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/VersionPo.java",
    "chars": 2994,
    "preview": "package com.genersoft.iot.vmp.common;\n\nimport com.alibaba.fastjson2.annotation.JSONField;\n\npublic class VersionPo {\n    "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java",
    "chars": 5537,
    "preview": "package com.genersoft.iot.vmp.common;\n\n/**\n * @description: 定义常量\n * @author: swwheihei\n * @date:   2019年5月30日 下午3:04:04\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/enums/ChannelDataType.java",
    "chars": 1020,
    "preview": "package com.genersoft.iot.vmp.common.enums;\n\n/**\n * 支持的通道数据类型\n */\n\npublic class ChannelDataType {\n\n    public final stat"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/enums/DeviceControlType.java",
    "chars": 1436,
    "preview": "package com.genersoft.iot.vmp.common.enums;\n\nimport org.dom4j.Element;\nimport org.springframework.util.ObjectUtils;\n\n\n/*"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/common/enums/MediaApp.java",
    "chars": 462,
    "preview": "package com.genersoft.iot.vmp.common.enums;\n\npublic class MediaApp {\n    public final static String GB28181 = \"rtp\";\n   "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java",
    "chars": 2780,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.common.CivilCodePo;\nimport com.genersoft.iot.vmp.utils"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java",
    "chars": 3001,
    "preview": "package com.genersoft.iot.vmp.conf;\n\n\nimport com.genersoft.iot.vmp.conf.exception.ControllerException;\nimport com.geners"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java",
    "chars": 4857,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.commons.lang3.ObjectUtils;\nimpo"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/GlobalExceptionHandler.java",
    "chars": 2810,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.conf.exception.ControllerException;\nimport com.generso"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/GlobalResponseAdvice.java",
    "chars": 2598,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.alibaba.fastjson2.JSON;\nimport com.genersoft.iot.vmp.vmanager.bean.Error"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java",
    "chars": 3862,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.media.bean.MediaServer;\nimport com.genersoft.iot.vmp.u"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/MediaStatusTimerTask.java",
    "chars": 248,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport org.springframework.scheduling.annotation.Scheduled;\n\n/**\n * 定时向zlm同步媒体流状态\n "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/MybatisConfig.java",
    "chars": 2437,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport org.apache.ibatis.logging.stdout.StdOutImpl;\nimport org.apache.ibatis.mappin"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ScheduleConfig.java",
    "chars": 1438,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport org.apache.commons.lang3.concurrent.BasicThreadFactory;\nimport org.springfra"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ServiceInfo.java",
    "chars": 766,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport lombok.Getter;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework."
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/SipConfig.java",
    "chars": 686,
    "preview": "package com.genersoft.iot.vmp.conf;\n\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.Configurati"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java",
    "chars": 3877,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.conf.security.JwtUtils;\nimport io.swagger.v3.oas.model"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/SystemInfoTimerTask.java",
    "chars": 1256,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.storager.IRedisCatchStorage;\nimport com.genersoft.iot."
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ThreadPoolTaskConfig.java",
    "chars": 1928,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.cont"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/UserSetting.java",
    "chars": 5102,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.Configuratio"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/VersionConfig.java",
    "chars": 888,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport org.springframework.core.annotation.Order;\nimport org.springframework.boot.c"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/VersionInfo.java",
    "chars": 840,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.common.VersionPo;\nimport com.genersoft.iot.vmp.utils.G"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/WVPTimerTask.java",
    "chars": 832,
    "preview": "package com.genersoft.iot.vmp.conf;\n\nimport com.genersoft.iot.vmp.common.ServerInfo;\nimport com.genersoft.iot.vmp.storag"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/exception/ControllerException.java",
    "chars": 761,
    "preview": "package com.genersoft.iot.vmp.conf.exception;\n\nimport com.genersoft.iot.vmp.vmanager.bean.ErrorCode;\n\n/**\n * 自定义异常,contr"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/exception/ServiceException.java",
    "chars": 418,
    "preview": "package com.genersoft.iot.vmp.conf.exception;\n\n/**\n * @author lin\n */\npublic class ServiceException extends Exception{\n "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/exception/SsrcTransactionNotFoundException.java",
    "chars": 1155,
    "preview": "package com.genersoft.iot.vmp.conf.exception;\n\n/**\n * @author lin\n */\npublic class SsrcTransactionNotFoundException exte"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FileCallback.java",
    "chars": 147,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport java.io.OutputStream;\n\npublic interface FileCallback {\n\n    Output"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpAuthority.java",
    "chars": 466,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport org.apache.ftpserver.ftplet.Authority;\nimport org.apache.ftpserver"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpFileSystemFactory.java",
    "chars": 1075,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport org.apache.ftpserver.ftplet.FileSystemFactory;\nimport org.apache.f"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpFileSystemView.java",
    "chars": 1601,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport org.apache.ftpserver.ftplet.FileSystemView;\nimport org.apache.ftps"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpServerConfig.java",
    "chars": 2405,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.apache.ftpserver.*;\nimport o"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/FtpSetting.java",
    "chars": 527,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.Co"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/Ftplet.java",
    "chars": 2159,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport com.genersoft.iot.vmp.jt1078.event.FtpUploadEvent;\nimport org.apac"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/UserManager.java",
    "chars": 2830,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport org.apache.commons.lang3.RandomStringUtils;\nimport org.apache.ftps"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/ftpServer/VirtualFtpFile.java",
    "chars": 3282,
    "preview": "package com.genersoft.iot.vmp.conf.ftpServer;\n\nimport lombok.Setter;\nimport org.apache.ftpserver.ftplet.FtpFile;\n\nimport"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/RedisMsgListenConfig.java",
    "chars": 3002,
    "preview": "package com.genersoft.iot.vmp.conf.redis;\n\n\nimport com.genersoft.iot.vmp.common.VideoManagerConstants;\nimport com.geners"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/RedisRpcConfig.java",
    "chars": 10282,
    "preview": "package com.genersoft.iot.vmp.conf.redis;\n\nimport com.alibaba.fastjson2.JSON;\nimport com.genersoft.iot.vmp.common.Common"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/RedisTemplateConfig.java",
    "chars": 2182,
    "preview": "package com.genersoft.iot.vmp.conf.redis;\n\nimport com.alibaba.fastjson2.support.spring.data.redis.GenericFastJsonRedisSe"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcClassHandler.java",
    "chars": 428,
    "preview": "package com.genersoft.iot.vmp.conf.redis.bean;\n\nimport com.genersoft.iot.vmp.service.redisMsg.dto.RpcController;\nimport "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcMessage.java",
    "chars": 499,
    "preview": "package com.genersoft.iot.vmp.conf.redis.bean;\n\npublic class RedisRpcMessage {\n\n    private RedisRpcRequest request;\n\n  "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcRequest.java",
    "chars": 1595,
    "preview": "package com.genersoft.iot.vmp.conf.redis.bean;\n\n/**\n * 通过redis发送请求\n */\npublic class RedisRpcRequest {\n\n    /**\n     * 来自"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/redis/bean/RedisRpcResponse.java",
    "chars": 1590,
    "preview": "package com.genersoft.iot.vmp.conf.redis.bean;\n\n/**\n * 通过redis发送回复\n */\npublic class RedisRpcResponse {\n\n    /**\n     * 来"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/AnonymousAuthenticationEntryPoint.java",
    "chars": 2091,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport com.alibaba.fastjson2.JSONObject;\nimport com.genersoft.iot.vmp.conf"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/DefaultUserDetailsServiceImpl.java",
    "chars": 1530,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport com.alibaba.excel.util.StringUtils;\nimport com.genersoft.iot.vmp.co"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/JwtAuthenticationFilter.java",
    "chars": 4349,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport com.genersoft.iot.vmp.conf.UserSetting;\nimport com.genersoft.iot.vm"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java",
    "chars": 12701,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport com.genersoft.iot.vmp.conf.UserSetting;\nimport com.genersoft.iot.vm"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/LogoutHandler.java",
    "chars": 836,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.security.core"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/SecurityUtils.java",
    "chars": 2785,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport com.genersoft.iot.vmp.conf.security.dto.LoginUser;\nimport com.gener"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/WebSecurityConfig.java",
    "chars": 6618,
    "preview": "package com.genersoft.iot.vmp.conf.security;\n\nimport com.genersoft.iot.vmp.conf.UserSetting;\nimport lombok.extern.slf4j."
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/dto/JwtUser.java",
    "chars": 1221,
    "preview": "package com.genersoft.iot.vmp.conf.security.dto;\n\npublic class JwtUser {\n\n    public enum TokenStatus{\n        /**\n     "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/security/dto/LoginUser.java",
    "chars": 2211,
    "preview": "package com.genersoft.iot.vmp.conf.security.dto;\n\nimport com.genersoft.iot.vmp.storager.dao.dto.Role;\nimport com.generso"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/webLog/LogChannel.java",
    "chars": 2006,
    "preview": "package com.genersoft.iot.vmp.conf.webLog;\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport jakarta.websocket.*;\nimport jakart"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/webLog/WebSocketAppender.java",
    "chars": 821,
    "preview": "package com.genersoft.iot.vmp.conf.webLog;\n\nimport ch.qos.logback.classic.encoder.PatternLayoutEncoder;\nimport ch.qos.lo"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/conf/websocket/WebSocketConfig.java",
    "chars": 604,
    "preview": "package com.genersoft.iot.vmp.conf.websocket;\n\nimport com.genersoft.iot.vmp.conf.webLog.LogChannel;\nimport org.springfra"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/SipLayer.java",
    "chars": 6013,
    "preview": "package com.genersoft.iot.vmp.gb28181;\n\nimport com.genersoft.iot.vmp.conf.SipConfig;\nimport com.genersoft.iot.vmp.conf.U"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/auth/DigestServerAuthenticationHelper.java",
    "chars": 8096,
    "preview": "/*\n * Conditions Of Use\n *\n * This software was developed by employees of the National Institute of\n * Standards and Tec"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/AlarmChannelMessage.java",
    "chars": 366,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Data;\n\n/**\n * 通过redis分发报警消息\n */\n@Data\npublic class AlarmChan"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/AudioBroadcastCatch.java",
    "chars": 1716,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport com.genersoft.iot.vmp.gb28181.controller.bean.AudioBroadcastEvent;\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/AudioBroadcastCatchStatus.java",
    "chars": 223,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n/**\n * 语音广播状态\n * @author lin\n */\npublic enum AudioBroadcastCatchStatus {\n\n "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/BaiduPoint.java",
    "chars": 383,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic class BaiduPoint {\n\n    String bdLng;\n\n    String bdLat;\n\n    public"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/BasicParam.java",
    "chars": 1356,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\n/**"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogChannelEvent.java",
    "chars": 1404,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/CatalogData.java",
    "chars": 707,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Data;\n\nimport java.time.Instant;\nimport java.util.HashSet;\nim"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/CmdType.java",
    "chars": 238,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic class CmdType {\n\n    public static final String CATALOG = \"Catalog\";"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java",
    "chars": 18186,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.gb28181.event.subscribe.catalog.CatalogEvent;\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonRecordInfo.java",
    "chars": 240,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Data;\n\n@Data\npublic class CommonRecordInfo {\n\n    // 开始时间\n   "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/Device.java",
    "chars": 3537,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\n/*"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarm.java",
    "chars": 5634,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\nimp"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceAlarmMethod.java",
    "chars": 863,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n/**\n * 报警方式\n * @author lin\n * 1为电话报警, 2为设备报警, 3为短信报警, 4为 GPS报警, 5为视频报警, 6为设"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java",
    "chars": 7531,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.common.enums.ChannelDataType;\nimport com.gener"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannelInPlatform.java",
    "chars": 441,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic class DeviceChannelInPlatform extends DeviceChannel{\n\n\tprivate Strin"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceNotFoundEvent.java",
    "chars": 278,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Data;\n\nimport javax.sip.Dialog;\nimport java.util.EventObject;"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceType.java",
    "chars": 1219,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport org.jetbrains.annotations.NotNull;\n\npublic class DeviceType implemen"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceTypeEnum.java",
    "chars": 3440,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n/**\n * 收录行业编码\n */\npublic enum DeviceTypeEnum {\n    DVR(\"111\", \"DVR编码\", \"前端主"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomParam.java",
    "chars": 890,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.gb28181.utils.MessageElement;\nimport io.swagge"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DragZoomRequest.java",
    "chars": 546,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.gb28181.utils.MessageElement;\nimport lombok.Da"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/DrawThinProcess.java",
    "chars": 312,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\n@Getter\n@Setter\npublic class D"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndCode.java",
    "chars": 6919,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport jakarta.validation.constraints.NotNull;\nimport lombok.Data;\n\n\n/**\n *"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForAuxiliary.java",
    "chars": 586,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForFI.java",
    "chars": 733,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForPTZ.java",
    "chars": 933,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForPreset.java",
    "chars": 676,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForScan.java",
    "chars": 700,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForTour.java",
    "chars": 865,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlCodeForWiper.java",
    "chars": 494,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\nimport lombok.Getter;\nimport lombok.Setter;\n\npublic class FrontEndControlC"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/FrontEndControlType.java",
    "chars": 120,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic enum FrontEndControlType {\n\n    PTZ,FI,PRESET,TOUR,SCAN,AUXILIARY\n}\n"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GBStringMsgParser.java",
    "chars": 16157,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport gov.nist.core.Host;\nimport gov.nist.core.HostNameParser;\nimport gov."
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/Gb28181Sdp.java",
    "chars": 1070,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport javax.sdp.SessionDescription;\n\n/**\n * 28181 的SDP解析器\n */\npublic class"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbCode.java",
    "chars": 1198,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\n/**"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbSipDate.java",
    "chars": 4016,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport gov.nist.core.InternalErrorHandler;\nimport gov.nist.javax.sip.header"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbSteamIdentification.java",
    "chars": 916,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n/**\n * 码流索引标识\n */\npublic enum GbSteamIdentification {\n    /**\n     * 主码流 st"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStream.java",
    "chars": 2599,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\n\n/**\n * 直播流关联国标上级平台\n * @"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GbStringMsgParserFactory.java",
    "chars": 772,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport gov.nist.javax.sip.parser.MessageParser;\nimport gov.nist.javax.sip.p"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/Group.java",
    "chars": 2360,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.utils.DateUtil;\nimport io.swagger.v3.oas.annot"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/GroupTree.java",
    "chars": 541,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimpo"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/HandlerCatchData.java",
    "chars": 888,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport org.dom4j.Element;\n\nimport javax.sip.RequestEvent;\n\n/**\n * @author l"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/HomePositionRequest.java",
    "chars": 1889,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.genersoft.iot.vmp.gb28181.utils.MessageElement;\n\n/**\n * 设备信息查询响应"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/Host.java",
    "chars": 454,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\n\npublic class Host {\n\t\n\tprivate String ip;\n\tprivate int port;\n\tprivate Str"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/IFrontEndControlCode.java",
    "chars": 144,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic interface IFrontEndControlCode {\n\n    FrontEndControlType getType();"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/IndustryCodeType.java",
    "chars": 1269,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport org.jetbrains.annotations.NotNull;\n\npublic class IndustryCodeType im"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/IndustryCodeTypeEnum.java",
    "chars": 1563,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Getter;\n\n/**\n * 收录行业编码\n */\npublic enum IndustryCodeTypeEnum {"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteDecodeException.java",
    "chars": 295,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Data;\n\n@Data\npublic class InviteDecodeException extends Runti"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteMessageInfo.java",
    "chars": 507,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Data;\n\n// 从INVITE消息中解析需要的信息\n@Data\npublic class InviteMessageI"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamCallback.java",
    "chars": 137,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic interface InviteStreamCallback {\n    void call(InviteStreamInfo invi"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamInfo.java",
    "chars": 1398,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport com.alibaba.fastjson2.JSONObject;\nimport com.genersoft.iot.vmp.media"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/InviteStreamType.java",
    "chars": 171,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\npublic enum InviteStreamType {\n\n    PLAY,PLAYBACK,DOWNLOAD,PUSH,PROXY,CLOUD"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/MessageResponseTask.java",
    "chars": 889,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Getter;\nimport lombok.Setter;\nimport org.dom4j.Element;\nimpor"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/MobilePosition.java",
    "chars": 1606,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport lombok.Data;\n\n/**\n * @description: 移动位置bean\n * @author: lawrencehj\n "
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/NetworkIdentificationType.java",
    "chars": 1105,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\nimport org.jetbrains.annotations.NotNull;\n\npublic class NetworkIdentificati"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/NetworkIdentificationTypeEnum.java",
    "chars": 1121,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n/**\n * 收录行业编码\n */\npublic enum NetworkIdentificationTypeEnum {\n    PUBLIC_SE"
  },
  {
    "path": "src/main/java/com/genersoft/iot/vmp/gb28181/bean/NotifyCatalogChannel.java",
    "chars": 813,
    "preview": "package com.genersoft.iot.vmp.gb28181.bean;\n\n\npublic class NotifyCatalogChannel {\n\n    private Type type;\n\n    private D"
  }
]

// ... and 942 more files (download for full content)

About this extraction

This page contains the full source code of the 648540858/wvp-GB28181-pro GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1142 files (7.3 MB), approximately 2.0M tokens, and a symbol index with 7879 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!