| @@ -12,7 +12,7 @@ import javax.net.ssl.SSLSocketFactory; | |||||
| * Stormeye | * Stormeye | ||||
| */ | */ | ||||
| @ConfigurationProperties(prefix = "wechat.redis") | @ConfigurationProperties(prefix = "wechat.redis") | ||||
| public class RedisProperies extends JedisPoolConfig { | |||||
| public class WechatRedisProperies extends JedisPoolConfig { | |||||
| private String host = Protocol.DEFAULT_HOST; | private String host = Protocol.DEFAULT_HOST; | ||||
| private int port = Protocol.DEFAULT_PORT; | private int port = Protocol.DEFAULT_PORT; | ||||
| private String password; | private String password; | ||||
| @@ -19,7 +19,7 @@ import redis.clients.util.Pool; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| public class WxOpenInRedisDBConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
| public class FmOpenInRedisDBConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
| private final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:"; | private final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:"; | ||||
| private final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:"; | private final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:"; | ||||
| @@ -47,16 +47,16 @@ public class WxOpenInRedisDBConfigStorage extends WxOpenInMemoryConfigStorage { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||||
| public WxOpenInRedisDBConfigStorage(Pool<Jedis> jedisPool) { | |||||
| public FmOpenInRedisDBConfigStorage(Pool<Jedis> jedisPool) { | |||||
| this.jedisPool = jedisPool; | this.jedisPool = jedisPool; | ||||
| } | } | ||||
| public WxOpenInRedisDBConfigStorage(Pool<Jedis> jedisPool, String keyPrefix) { | |||||
| public FmOpenInRedisDBConfigStorage(Pool<Jedis> jedisPool, String keyPrefix) { | |||||
| this.jedisPool = jedisPool; | this.jedisPool = jedisPool; | ||||
| this.keyPrefix = keyPrefix; | this.keyPrefix = keyPrefix; | ||||
| } | } | ||||
| public WxOpenInRedisDBConfigStorage(JedisPool jedisPool, WxComponentVerifyTicketMapper componentVerifyTicketMapper, WxAuthorizerInfoMapper authorizerInfoMapper) { | |||||
| public FmOpenInRedisDBConfigStorage(JedisPool jedisPool, WxComponentVerifyTicketMapper componentVerifyTicketMapper, WxAuthorizerInfoMapper authorizerInfoMapper) { | |||||
| this.jedisPool = jedisPool; | this.jedisPool = jedisPool; | ||||
| this.wxComponentVerifyTicketMapper = componentVerifyTicketMapper; | this.wxComponentVerifyTicketMapper = componentVerifyTicketMapper; | ||||
| this.wxAuthorizerInfoMapper = authorizerInfoMapper; | this.wxAuthorizerInfoMapper = authorizerInfoMapper; | ||||
| @@ -1,6 +1,6 @@ | |||||
| package com.iformall.service.wechat; | package com.iformall.service.wechat; | ||||
| import com.iformall.config.RedisProperies; | |||||
| import com.iformall.config.WechatRedisProperies; | |||||
| import com.iformall.config.WechatOpenProperties; | import com.iformall.config.WechatOpenProperties; | ||||
| import com.iformall.mapper.WxAuthorizerInfoMapper; | import com.iformall.mapper.WxAuthorizerInfoMapper; | ||||
| import com.iformall.mapper.WxComponentVerifyTicketMapper; | import com.iformall.mapper.WxComponentVerifyTicketMapper; | ||||
| @@ -19,13 +19,13 @@ import javax.annotation.PostConstruct; | |||||
| * Stormeye WU | * Stormeye WU | ||||
| */ | */ | ||||
| @Service | @Service | ||||
| @EnableConfigurationProperties({WechatOpenProperties.class, RedisProperies.class}) | |||||
| public class WxOpenService extends WxOpenServiceImpl { | |||||
| @EnableConfigurationProperties({WechatOpenProperties.class, WechatRedisProperies.class}) | |||||
| public class FmOpenService extends WxOpenServiceImpl { | |||||
| private Logger logger = LoggerFactory.getLogger(getClass()); | private Logger logger = LoggerFactory.getLogger(getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WechatOpenProperties wechatProperties; | private WechatOpenProperties wechatProperties; | ||||
| @Autowired | @Autowired | ||||
| private RedisProperies redisProperies; | |||||
| private WechatRedisProperies redisProperies; | |||||
| @Autowired | @Autowired | ||||
| private WxComponentVerifyTicketMapper componentVerifyTicketMapper; | private WxComponentVerifyTicketMapper componentVerifyTicketMapper; | ||||
| @@ -38,7 +38,7 @@ public class WxOpenService extends WxOpenServiceImpl { | |||||
| @PostConstruct | @PostConstruct | ||||
| public void init() { | public void init() { | ||||
| WxOpenInRedisDBConfigStorage configStorage = new WxOpenInRedisDBConfigStorage(getJedisPool(), componentVerifyTicketMapper, authorizerInfoMapper); | |||||
| FmOpenInRedisDBConfigStorage configStorage = new FmOpenInRedisDBConfigStorage(getJedisPool(), componentVerifyTicketMapper, authorizerInfoMapper); | |||||
| configStorage.setComponentAppId(wechatProperties.getComponentAppId()); | configStorage.setComponentAppId(wechatProperties.getComponentAppId()); | ||||
| configStorage.setComponentAppSecret(wechatProperties.getComponentSecret()); | configStorage.setComponentAppSecret(wechatProperties.getComponentSecret()); | ||||
| configStorage.setComponentToken(wechatProperties.getComponentToken()); | configStorage.setComponentToken(wechatProperties.getComponentToken()); | ||||
| @@ -57,7 +57,7 @@ public class WxOpenService extends WxOpenServiceImpl { | |||||
| private JedisPool getJedisPool() { | private JedisPool getJedisPool() { | ||||
| if (pool == null) { | if (pool == null) { | ||||
| synchronized (WxOpenService.class) { | |||||
| synchronized (FmOpenService.class) { | |||||
| if (pool == null) { | if (pool == null) { | ||||
| pool = new JedisPool(redisProperies, redisProperies.getHost(), | pool = new JedisPool(redisProperies, redisProperies.getHost(), | ||||
| redisProperies.getPort(), redisProperies.getConnectionTimeout(), | redisProperies.getPort(), redisProperies.getConnectionTimeout(), | ||||
| @@ -13,8 +13,6 @@ | |||||
| <artifactId>mlWechatOpen</artifactId> | <artifactId>mlWechatOpen</artifactId> | ||||
| <properties> | <properties> | ||||
| <weixin-java-mp.version>3.3.0.A</weixin-java-mp.version> | |||||
| <weixin-java-open.version>3.3.0.A</weixin-java-open.version> | |||||
| </properties> | </properties> | ||||
| <dependencies> | <dependencies> | ||||
| @@ -23,16 +21,6 @@ | |||||
| <artifactId>mallinkService</artifactId> | <artifactId>mallinkService</artifactId> | ||||
| <version>1.0</version> | <version>1.0</version> | ||||
| </dependency> | </dependency> | ||||
| <dependency> | |||||
| <groupId>com.github.binarywang</groupId> | |||||
| <artifactId>weixin-java-open</artifactId> | |||||
| <version>${weixin-java-open.version}</version> | |||||
| </dependency> | |||||
| <dependency> | |||||
| <groupId>com.github.binarywang</groupId> | |||||
| <artifactId>weixin-java-mp</artifactId> | |||||
| <version>${weixin-java-mp.version}</version> | |||||
| </dependency> | |||||
| <dependency> | <dependency> | ||||
| <groupId>com.google.zxing</groupId> | <groupId>com.google.zxing</groupId> | ||||
| <artifactId>core</artifactId> | <artifactId>core</artifactId> | ||||
| @@ -3,7 +3,7 @@ package com.iformall.controller; | |||||
| import com.iformall.domain.po.WxAuthorizerInfo; | import com.iformall.domain.po.WxAuthorizerInfo; | ||||
| import com.iformall.enums.EnumWxAuthorizationStatus; | import com.iformall.enums.EnumWxAuthorizationStatus; | ||||
| import com.iformall.service.WxAuthorizerInfoService; | import com.iformall.service.WxAuthorizerInfoService; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| @@ -29,7 +29,7 @@ import java.util.Date; | |||||
| public class WechatAuthController { | public class WechatAuthController { | ||||
| private final Logger logger = LoggerFactory.getLogger(getClass()); | private final Logger logger = LoggerFactory.getLogger(getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxAuthorizerInfoService authorizerInfoService; | private WxAuthorizerInfoService authorizerInfoService; | ||||
| @@ -8,7 +8,7 @@ import com.iformall.domain.po.*; | |||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| import com.iformall.mp.manager.WxMpManager; | import com.iformall.mp.manager.WxMpManager; | ||||
| import com.iformall.service.*; | import com.iformall.service.*; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| @@ -45,7 +45,7 @@ public class WechatCalllbackController extends BaseController { | |||||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | private final Logger logger = LoggerFactory.getLogger(this.getClass()); | ||||
| @Autowired | @Autowired | ||||
| protected WxOpenService openService; | |||||
| protected FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxComponentVerifyTicketService componentVerifyTicketService; | private WxComponentVerifyTicketService componentVerifyTicketService; | ||||
| @@ -1,6 +1,5 @@ | |||||
| package com.iformall.controller; | package com.iformall.controller; | ||||
| import com.alibaba.fastjson.JSON; | |||||
| import com.google.gson.Gson; | import com.google.gson.Gson; | ||||
| import com.google.gson.GsonBuilder; | import com.google.gson.GsonBuilder; | ||||
| import com.google.gson.reflect.TypeToken; | import com.google.gson.reflect.TypeToken; | ||||
| @@ -11,7 +10,7 @@ import com.iformall.domain.po.*; | |||||
| import com.iformall.domain.vo.WxWeappCodeStatusVo; | import com.iformall.domain.vo.WxWeappCodeStatusVo; | ||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| import com.iformall.service.*; | import com.iformall.service.*; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiImplicitParam; | import io.swagger.annotations.ApiImplicitParam; | ||||
| import io.swagger.annotations.ApiImplicitParams; | import io.swagger.annotations.ApiImplicitParams; | ||||
| @@ -48,7 +47,7 @@ import java.util.Map; | |||||
| public class WechatWeappCodeController { | public class WechatWeappCodeController { | ||||
| private final Logger logger = LoggerFactory.getLogger(getClass()); | private final Logger logger = LoggerFactory.getLogger(getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxWeappCodeStatusService weappCodeStatusService; | private WxWeappCodeStatusService weappCodeStatusService; | ||||
| @@ -2,7 +2,7 @@ package com.iformall.controller; | |||||
| import com.iformall.common.Result; | import com.iformall.common.Result; | ||||
| import com.iformall.common.ResultData; | import com.iformall.common.ResultData; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; | import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; | ||||
| @@ -22,7 +22,7 @@ import java.util.List; | |||||
| public class WechatWeappDraftTemplateController { | public class WechatWeappDraftTemplateController { | ||||
| private final Logger logger = LoggerFactory.getLogger(getClass()); | private final Logger logger = LoggerFactory.getLogger(getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @GetMapping("/tempDraftList") | @GetMapping("/tempDraftList") | ||||
| @@ -11,7 +11,7 @@ import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.WxAuthorizerInfo; | import com.iformall.domain.po.WxAuthorizerInfo; | ||||
| import com.iformall.enums.EnumWxAuthorizationStatus; | import com.iformall.enums.EnumWxAuthorizationStatus; | ||||
| import com.iformall.service.WxAuthorizerInfoService; | import com.iformall.service.WxAuthorizerInfoService; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiImplicitParam; | import io.swagger.annotations.ApiImplicitParam; | ||||
| import io.swagger.annotations.ApiImplicitParams; | import io.swagger.annotations.ApiImplicitParams; | ||||
| @@ -34,7 +34,7 @@ import java.util.List; | |||||
| public class WechatWeappMsgTemplateController { | public class WechatWeappMsgTemplateController { | ||||
| private final Logger logger = LoggerFactory.getLogger(getClass()); | private final Logger logger = LoggerFactory.getLogger(getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxAuthorizerInfoService authorizerInfoService; | private WxAuthorizerInfoService authorizerInfoService; | ||||
| @@ -8,7 +8,7 @@ import com.iformall.common.ResultData; | |||||
| import com.iformall.domain.po.WxAuthorizerInfo; | import com.iformall.domain.po.WxAuthorizerInfo; | ||||
| import com.iformall.enums.EnumWxAuthorizationStatus; | import com.iformall.enums.EnumWxAuthorizationStatus; | ||||
| import com.iformall.service.WxAuthorizerInfoService; | import com.iformall.service.WxAuthorizerInfoService; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| @@ -33,7 +33,7 @@ import java.util.Map; | |||||
| public class WechatWeappSetController { | public class WechatWeappSetController { | ||||
| private final Logger logger = LoggerFactory.getLogger(getClass()); | private final Logger logger = LoggerFactory.getLogger(getClass()); | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxAuthorizerInfoService authorizerInfoService; | private WxAuthorizerInfoService authorizerInfoService; | ||||
| @@ -19,12 +19,11 @@ import com.iformall.domain.vo.WxWeappInfo; | |||||
| import com.iformall.domain.vo.WxWeappReleaseStatusVo; | import com.iformall.domain.vo.WxWeappReleaseStatusVo; | ||||
| import com.iformall.enums.*; | import com.iformall.enums.*; | ||||
| import com.iformall.service.*; | import com.iformall.service.*; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
| import io.swagger.annotations.ApiImplicitParam; | import io.swagger.annotations.ApiImplicitParam; | ||||
| import io.swagger.annotations.ApiImplicitParams; | import io.swagger.annotations.ApiImplicitParams; | ||||
| import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
| import io.swagger.models.auth.In; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.open.api.WxOpenMaService; | import me.chanjar.weixin.open.api.WxOpenMaService; | ||||
| import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo; | import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo; | ||||
| @@ -73,7 +72,7 @@ public class WxWeappInfoController extends BaseController { | |||||
| private WxWeappReleaseStatusService weappReleaseStatusService; | private WxWeappReleaseStatusService weappReleaseStatusService; | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxAppinfoService appinfoService; | private WxAppinfoService appinfoService; | ||||
| @@ -2,7 +2,7 @@ package com.iformall.mp.manager; | |||||
| import com.iformall.mp.handler.*; | import com.iformall.mp.handler.*; | ||||
| import com.iformall.service.WxAppinfoService; | import com.iformall.service.WxAppinfoService; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import me.chanjar.weixin.mp.api.WxMpMessageRouter; | import me.chanjar.weixin.mp.api.WxMpMessageRouter; | ||||
| import me.chanjar.weixin.mp.api.WxMpService; | import me.chanjar.weixin.mp.api.WxMpService; | ||||
| import me.chanjar.weixin.mp.constant.WxMpEventConstants; | import me.chanjar.weixin.mp.constant.WxMpEventConstants; | ||||
| @@ -21,7 +21,7 @@ public class WxMpManager { | |||||
| @Autowired | @Autowired | ||||
| protected WxOpenService openService; | |||||
| protected FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxAppinfoService appinfoService; | private WxAppinfoService appinfoService; | ||||
| @@ -2,7 +2,7 @@ package com.iformall.schedule; | |||||
| import com.iformall.domain.vo.WxWeappInfo; | import com.iformall.domain.vo.WxWeappInfo; | ||||
| import com.iformall.mapper.WxAuthorizerInfoMapper; | import com.iformall.mapper.WxAuthorizerInfoMapper; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||||
| @@ -20,7 +20,7 @@ public class AppAccessTokenSchedule { | |||||
| private WxAuthorizerInfoMapper authorizerInfoMapper; | private WxAuthorizerInfoMapper authorizerInfoMapper; | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Scheduled(cron = "0 10 * * * *?") // 每小时更新一次 | @Scheduled(cron = "0 10 * * * *?") // 每小时更新一次 | ||||
| //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 | //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 | ||||
| @@ -11,7 +11,7 @@ import com.iformall.exception.MallinkException; | |||||
| import com.iformall.mapper.WxPayAccountMapper; | import com.iformall.mapper.WxPayAccountMapper; | ||||
| import com.iformall.mapper.WxPayOrderMapper; | import com.iformall.mapper.WxPayOrderMapper; | ||||
| import com.iformall.service.WxAppinfoService; | import com.iformall.service.WxAppinfoService; | ||||
| import com.iformall.service.wechat.WxOpenService; | |||||
| import com.iformall.service.wechat.FmOpenService; | |||||
| import me.chanjar.weixin.common.error.WxErrorException; | import me.chanjar.weixin.common.error.WxErrorException; | ||||
| import me.chanjar.weixin.open.api.WxOpenMaService; | import me.chanjar.weixin.open.api.WxOpenMaService; | ||||
| import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
| @@ -37,7 +37,7 @@ public class UserUnionIdSchedule { | |||||
| WxPayOrderMapper payOrderMapper; | WxPayOrderMapper payOrderMapper; | ||||
| @Autowired | @Autowired | ||||
| private WxOpenService openService; | |||||
| private FmOpenService openService; | |||||
| @Autowired | @Autowired | ||||
| private WxPayAccountMapper payAccountMapper; | private WxPayAccountMapper payAccountMapper; | ||||
| @@ -27,6 +27,7 @@ | |||||
| <weixin-java-mp.version>3.3.0.A</weixin-java-mp.version> | <weixin-java-mp.version>3.3.0.A</weixin-java-mp.version> | ||||
| <weixin-java-miniapp.version>3.3.0.A</weixin-java-miniapp.version> | <weixin-java-miniapp.version>3.3.0.A</weixin-java-miniapp.version> | ||||
| <weixin-java-pay.version>3.3.0.A</weixin-java-pay.version> | <weixin-java-pay.version>3.3.0.A</weixin-java-pay.version> | ||||
| <weixin-java-open.version>3.3.0.A</weixin-java-open.version> | |||||
| <quartz.version>2.3.0</quartz.version> | <quartz.version>2.3.0</quartz.version> | ||||
| </properties> | </properties> | ||||
| @@ -322,6 +323,12 @@ | |||||
| <version>${weixin-java-pay.version}</version> | <version>${weixin-java-pay.version}</version> | ||||
| </dependency> | </dependency> | ||||
| <dependency> | |||||
| <groupId>com.github.binarywang</groupId> | |||||
| <artifactId>weixin-java-open</artifactId> | |||||
| <version>${weixin-java-open.version}</version> | |||||
| </dependency> | |||||
| <dependency> | <dependency> | ||||
| <groupId>com.github.ulisesbocchio</groupId> | <groupId>com.github.ulisesbocchio</groupId> | ||||
| <artifactId>jasypt-spring-boot</artifactId> | <artifactId>jasypt-spring-boot</artifactId> | ||||