From d5b84caca827bd11925064f2af4e29c7ade3acf0 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Thu, 19 Jun 2025 21:00:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E5=95=86=E5=9F=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supermarket/vo/ShopCategoryTreeVo.java | 16 +++++ .../supermarket/vo/app/ShopSkuAppVo.java | 11 ++++ .../vo/app/ShopSpuDetailAppVo.java | 16 +++++ .../supermarket/vo/app/ShopSpuListAppVo.java | 15 +++++ .../controller/AppShopCategoryController.java | 44 +++++++++++++ .../controller/AppShopSpuController.java | 60 ++++++++++++++++++ .../controller/ShopCategoryController.java | 10 +-- .../controller/ShopSpuController.java | 4 +- .../entity/ShopCategoryEntity.java | 4 +- .../service/ShopCategoryService.java | 19 ++++++ .../supermarket/service/ShopSpuService.java | 9 +++ .../service/impl/ShopCategoryServiceImpl.java | 16 +++++ .../service/impl/ShopSpuServiceImpl.java | 8 +++ .../青少年宫.111xls.xls | Bin 0 -> 33280 bytes 14 files changed, 225 insertions(+), 7 deletions(-) create mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java create mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java create mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java create mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java create mode 100644 pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java create mode 100644 pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java create mode 100644 pjcloud-supermarket/pjcloud-supermarket-biz/青少年宫.111xls.xls diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java new file mode 100644 index 000000000..297b90e7d --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/ShopCategoryTreeVo.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.supermarket.vo; + +import lombok.Data; +import java.util.List; + +@Data +public class ShopCategoryTreeVo { + private Long id; + private String name; + private Long parentId; + private Integer level; + private Integer sort; + private Integer status; + private String picUrl; + private List children; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java new file mode 100644 index 000000000..f2a5b2c89 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSkuAppVo.java @@ -0,0 +1,11 @@ +package com.bsd.pjcloud.supermarket.vo.app; + +import lombok.Data; + +@Data +public class ShopSkuAppVo { + private Long id; + private String skuName; + private Integer price; + private Integer stock; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java new file mode 100644 index 000000000..5a9b9771c --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuDetailAppVo.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.supermarket.vo.app; + +import lombok.Data; +import java.util.List; + +@Data +public class ShopSpuDetailAppVo { + private Long id; + private String productName; + private String picUrl; + private String subTitle; + private String detail; + private Integer categoryId; + private Integer status; + private List skuList; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java new file mode 100644 index 000000000..e0e7ba92d --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/app/ShopSpuListAppVo.java @@ -0,0 +1,15 @@ +package com.bsd.pjcloud.supermarket.vo.app; + +import lombok.Data; + +@Data +public class ShopSpuListAppVo { + private Long id; + private String productName; + private String picUrl; + private String subTitle; + private Integer categoryId; + private Integer status; + private Integer sales; + private Integer price; +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java new file mode 100644 index 000000000..7b87f02d5 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopCategoryController.java @@ -0,0 +1,44 @@ +package com.bsd.pjcloud.supermarket.controller; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; +import com.bsd.pjcloud.supermarket.service.ShopCategoryService; +import com.bsd.pjcloud.supermarket.vo.ShopCategoryTreeVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import java.util.List; +import java.util.Objects; + +@RestController +@RequestMapping("/app/shopCategory") +@Tag(name = "App分类", description = "移动端分类接口") +@RequiredArgsConstructor +public class AppShopCategoryController { + private final ShopCategoryService shopCategoryService; + + @GetMapping("/list") + @Operation(summary = "APP分类列表", description = "移动端分类树") + public R> appCategoryList() { + List all = shopCategoryService.list(Wrappers.lambdaQuery() + .eq(ShopCategoryEntity::getStatus, 0)); // 只查启用 + List tree = buildCategoryTree(all, 0L); + return R.ok(tree); + } + + private List buildCategoryTree(List all, Long parentId) { + List result = new java.util.ArrayList<>(); + for (ShopCategoryEntity cat : all) { + if (Objects.equals(cat.getParentId(), parentId)) { + ShopCategoryTreeVo vo = com.bsd.pjcloud.common.core.util.BeanUtils.toBean(cat, ShopCategoryTreeVo.class); + vo.setChildren(buildCategoryTree(all, cat.getId())); + result.add(vo); + } + } + return result; + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java new file mode 100644 index 000000000..c9efd012a --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/AppShopSpuController.java @@ -0,0 +1,60 @@ +package com.bsd.pjcloud.supermarket.controller; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; +import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; +import com.bsd.pjcloud.supermarket.service.ShopSpuService; +import com.bsd.pjcloud.supermarket.service.ShopSkuService; +import com.bsd.pjcloud.supermarket.vo.app.ShopSpuListAppVo; +import com.bsd.pjcloud.supermarket.vo.app.ShopSpuDetailAppVo; +import com.bsd.pjcloud.supermarket.vo.app.ShopSkuAppVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/app/shopSpu") +@Tag(name = "App商品", description = "移动端商品接口") +@RequiredArgsConstructor +public class AppShopSpuController { + private final ShopSpuService shopSpuService; + private final ShopSkuService shopSkuService; + + @GetMapping("/page") + @Operation(summary = "APP商品分页", description = "移动端商品分页") + public R> page( + @ParameterObject Page page, + @RequestParam(required = false) Integer categoryId, + @RequestParam(required = false) String keyword + ) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(categoryId != null, ShopSpuEntity::getCategoryId, categoryId); + wrapper.like(StrUtil.isNotBlank(keyword), ShopSpuEntity::getProductName, keyword); + wrapper.eq(ShopSpuEntity::getStatus, 0); // 只查上架 + IPage spuPage = shopSpuService.page(page, wrapper); + IPage voPage = spuPage.convert(spu -> BeanUtils.toBean(spu, ShopSpuListAppVo.class)); + return R.ok(voPage); + } + + @GetMapping("/detail/{id}") + @Operation(summary = "APP商品详情", description = "移动端商品详情") + public R detail(@PathVariable("id") Long id) { + ShopSpuEntity spu = shopSpuService.getByIdDeep(id); + if (spu == null) return R.failed("商品不存在"); + ShopSpuDetailAppVo vo = BeanUtils.toBean(spu, ShopSpuDetailAppVo.class); + // 查询sku列表 + List skuList = shopSkuService.list(Wrappers.lambdaQuery().eq(ShopSkuEntity::getSpuId, id)); + vo.setSkuList(skuList.stream().map(sku -> BeanUtils.toBean(sku, ShopSkuAppVo.class)).collect(Collectors.toList())); + return R.ok(vo); + } +} \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java index 91daf79f4..451758518 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopCategoryController.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; import com.bsd.pjcloud.supermarket.entity.SmErpSupplierEntity; import com.bsd.pjcloud.supermarket.service.ShopCategoryService; @@ -54,7 +55,7 @@ public class ShopCategoryController { public R getShopCategoryPage(@ParameterObject Page page, @ParameterObject ShopCategoryEntity shopCategory) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(StrUtil.isNotBlank(shopCategory.getName()),ShopCategoryEntity::getName,shopCategory.getName()); - return R.ok(shopCategoryService.page(page, wrapper)); + return R.ok(shopCategoryService.pageScope(page, wrapper)); } @@ -80,6 +81,7 @@ public class ShopCategoryController { @PostMapping @PreAuthorize("@pms.hasPermission('supermarket_shopCategory_add')" ) public R save(@RequestBody ShopCategoryEntity shopCategory) { + shopCategory.setDeptId(SecurityUtils.getUser().getDeptId()); return R.ok(shopCategoryService.save(shopCategory)); } @@ -129,12 +131,12 @@ public class ShopCategoryController { @GetMapping("/tree") @Operation(summary = "分类树", description = "获取所有分类的树结构") public R> tree() { - List all = shopCategoryService.list(); - List tree = buildCategoryTree(all, 0); + List all = shopCategoryService.listScope(); + List tree = buildCategoryTree(all, 0L); return R.ok(tree); } - private List buildCategoryTree(List all, Integer parentId) { + private List buildCategoryTree(List all, Long parentId) { List result = new java.util.ArrayList<>(); for (ShopCategoryEntity cat : all) { if (Objects.equals(cat.getParentId(), parentId)) { diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java index c063c98ce..21c825b48 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/ShopSpuController.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; import com.bsd.pjcloud.supermarket.service.ShopSpuService; @@ -50,7 +51,7 @@ public class ShopSpuController { public R getShopSpuPage(@ParameterObject Page page, @ParameterObject ShopSpuEntity shopSpu) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.like(StrUtil.isNotBlank(shopSpu.getProductName()),ShopSpuEntity::getProductName,shopSpu.getProductName()); - return R.ok(shopSpuService.page(page, wrapper)); + return R.ok(shopSpuService.pageScope(page, wrapper)); } /** @@ -75,6 +76,7 @@ public class ShopSpuController { @PostMapping @PreAuthorize("@pms.hasPermission('supermarket_shopSpu_add')" ) public R save(@RequestBody ShopSpuEntity shopSpu) { + shopSpu.setDeptId(SecurityUtils.getUser().getDeptId()); return R.ok(shopSpuService.saveDeep(shopSpu)); } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java index d1bd01694..6d06287ac 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/entity/ShopCategoryEntity.java @@ -27,13 +27,13 @@ public class ShopCategoryEntity extends Model { */ @TableId(type = IdType.ASSIGN_ID) @Schema(description="id") - private Integer id; + private Long id; /** * 父级分类ID,0为顶级 */ @Schema(description="父级分类ID,0为顶级") - private Integer parentId; + private Long parentId; /** * 分类名称 diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java index fc67a34bd..0a83bda43 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopCategoryService.java @@ -1,8 +1,27 @@ package com.bsd.pjcloud.supermarket.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; +import java.util.List; + public interface ShopCategoryService extends IService { + + /** + * 列表,条件当前权限 + * @return + */ + List listScope(); + + + /** + * 分页,条件当前权限 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java index 42c6b4645..328973233 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/ShopSpuService.java @@ -1,5 +1,7 @@ package com.bsd.pjcloud.supermarket.service; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.extension.mapping.base.MPJDeepService; import com.bsd.pjcloud.supermarket.entity.ShopSkuEntity; import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; @@ -13,4 +15,11 @@ public interface ShopSpuService extends MPJDeepService { Boolean removeChild(Long[] ids); + /** + * 分页查询 + * @param page + * @param wrapper + * @return + */ + Object pageScope(Page page, LambdaQueryWrapper wrapper); } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java index a6f0f1972..a165580a1 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopCategoryServiceImpl.java @@ -1,10 +1,16 @@ package com.bsd.pjcloud.supermarket.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.supermarket.entity.ShopCategoryEntity; import com.bsd.pjcloud.supermarket.mapper.ShopCategoryMapper; import com.bsd.pjcloud.supermarket.service.ShopCategoryService; import org.springframework.stereotype.Service; + +import java.util.List; + /** * 在线商品分类 * @@ -13,4 +19,14 @@ import org.springframework.stereotype.Service; */ @Service public class ShopCategoryServiceImpl extends ServiceImpl implements ShopCategoryService { + @Override + public List listScope() { + + return baseMapper.selectListByScope(null, DataScope.of()); + } + + @Override + public Object pageScope(Page page, LambdaQueryWrapper wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java index ad2c8325a..ee636739a 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ShopSpuServiceImpl.java @@ -1,6 +1,9 @@ package com.bsd.pjcloud.supermarket.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.supermarket.entity.ShopSpuEntity; import com.bsd.pjcloud.supermarket.mapper.ShopSpuMapper; import com.bsd.pjcloud.supermarket.service.ShopSpuService; @@ -64,4 +67,9 @@ public class ShopSpuServiceImpl extends ServiceImpl wrapper) { + return baseMapper.selectPageByScope(page, wrapper, DataScope.of()); + } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/青少年宫.111xls.xls b/pjcloud-supermarket/pjcloud-supermarket-biz/青少年宫.111xls.xls new file mode 100644 index 0000000000000000000000000000000000000000..7d0384b093ed0a714274ba269f70a17c9c1e6ead GIT binary patch literal 33280 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 Cp>qBJ literal 0 HcmV?d00001