[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBK2AF5DSXVGFC1V2YZ0R2":3,"skill-same:01M6CBK2AF5DSXVGFC1V2YZ0R2":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":34,"commitSha":35,"skillDirectory":36,"forksCount":14,"repositoryHtmlUrl":37,"repositoryHomepageUrl":6,"ownerHtmlUrl":38,"ownerBlogUrl":6,"ownerDescription":39,"updatedAt":40,"install":41,"resources":54},"01M6CBK2AF5DSXVGFC1V2YZ0R2","11-shop-product",null,"ShopTable row를 table-centric `ShopProductBase` 계층(`Daily\u002FEvent\u002FGold\u002FChest\u002FPurchase`)으로 변환하고 가격, 할인, 구매 제한 runtime 모델을 정리할 때 사용한다.","devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F28-shop-system\u002F11-shop-product\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[24,25,26,27,28],"product","shop","11 shop product","table","daily","2026-11-10 10:12:30",false,"---\nname: 11-shop-product\ndescription: ShopTable row를 table-centric `ShopProductBase` 계층(`Daily\u002FEvent\u002FGold\u002FChest\u002FPurchase`)으로 변환하고 가격, 할인, 구매 제한 runtime 모델을 정리할 때 사용한다.\n---\n\n# 11-shop-product\n\nStatus: ACTIVE\nAppliesTo: v10\n\nShopProduct 모델은 `SHOP_ITEM_*` row를 1:1 concrete product class로 감싼다.\nrow 원본은 `Table` 프로퍼티를 통해 노출하고, runtime 상태만 product에 둔다.\n\n---\n\n## 1. Source Tables\n\n- table file: `input\u002FDomains\u002FGame\u002FShopTable.xlsx`\n- `SHOP_ITEM_DAILY`\n- `SHOP_ITEM_EVENT`\n- `SHOP_ITEM_CHEST`\n- `SHOP_ITEM_PURCHASE`\n- `SHOP_ITEM_GOLD`\n\n기존 `SHOP_PRODUCT`\u002F`productId` 개념은 제거하고 `shop_item_id`를 사용한다.\n\n---\n\n## 2. Class Contract\n\n```csharp\npublic interface IShopTableProduct\n{\n    public object TableObject { get; }\n}\n\npublic interface IShopTableProduct\u003Cout TRow> : IShopTableProduct\n{\n    public TRow Table { get; }\n}\n\npublic abstract class ShopProductBase\n{\n    public string shop_id { get; }\n    public string name_id { get; }\n    public SHOP_CATALOG_TYPE catalog_type { get; }\n    public SHOP_PRODUCT_TYPE ProductType { get; }\n    public SHOP_DISCOUNT_TYPE DiscountType { get; }\n    public virtual int PriceWithoutDiscount { get; }\n    public int Price { get; } \u002F\u002F PriceWithoutDiscount에 DiscountType 반영\n}\n\npublic abstract class ShopProductBase\u003CTRow> : ShopProductBase, IShopTableProduct\u003CTRow>\n{\n    public TRow Table { get; }\n}\n\npublic abstract class ShopLimitedProductBase : ShopProductBase\n{\n    public int max_count { get; }\n    public int RemainCount { get; }\n    public bool HasPurchaseLimit { get; }\n}\n\npublic abstract class ShopRewardProductBase : ShopLimitedProductBase\n{\n    public CURRENCY_TYPE currency_type { get; }\n    public string reward_group_id { get; }\n    public int amount { get; }\n}\n\npublic sealed class ShopProductDaily : ShopRewardProductBase\u003CSHOP_ITEM_DAILY> {}\npublic sealed class ShopProductEvent : ShopRewardProductBase\u003CSHOP_ITEM_EVENT> {}\npublic sealed class ShopProductGold : ShopRewardProductBase\u003CSHOP_ITEM_GOLD> {}\npublic sealed class ShopProductChest : ShopLimitedProductBase\u003CSHOP_ITEM_CHEST> {}\npublic sealed class ShopProductPurchase : ShopProductBase\u003CSHOP_ITEM_PURCHASE> {}\n```\n\n- concrete class는 source table 기준으로만 나눈다.\n- `FREE\u002FADS\u002FCURRENCY`는 더 이상 구현 클래스 분기가 아니라 `ProductType`\u002F`currency_type` 해석 결과다.\n- `SHOP_ITEM_GOLD`와 `SHOP_ITEM_EVENT`는 `amount` column이 없으므로 `amount=1` 고정이다.\n- `SHOP_ITEM_CHEST.amount`는 reward 반복 지급 횟수다.\n\n---\n\n## 3. Hard Rules\n\n- `shop_item_id`가 유일 키다.\n- `Table`이 row 원본 SSOT다. `name_id`, `price`, `reward_group_id`, `internal_product_id` 같은 table 값은 product에 중복 저장하지 않는다.\n- runtime 상태(`DiscountType`, `RemainCount`)만 product에 둔다.\n- `PURCHASE` 타입은 `Internal_product_id`가 필수다.\n- `DiscountType`은 `SHOP_ITEM_DAILY` 초기화\u002Frefresh 시에만 랜덤 배정되며, 나머지 카탈로그는 `SHOP_DISCOUNT_TYPE.NONE`을 사용한다.\n- `ShopManager.GetProducts(...)` API는 사용하지 않고, `GetCatalog(catalog_type).GetProducts()`\u002F`GetCatalog(catalog_type).GetProduct(shop_item_id)`를 사용한다.\n- 제한 상품은 `ShopLimitedProductBase`만 표현한다. `max_count=-1`은 무제한이다.\n- `ShopLimitedProductBase` 생성 시 기본 `RemainCount = max_count`로 초기화한다.\n- `ShopProductBase.Price`는 `SHOP_DISCOUNT_TYPE`을 적용한 최종 가격이다.\n- `ShopProductBase.PriceWithoutDiscount`는 \"할인 전 실제 결제 기준 가격\"이다.\n- `SHOP_ITEM_DAILY` row는 정적 `amount`를 가지지 않고 `amount_min\u002Famount_max`를 가진다.\n- `ShopRewardProductBase`의 기본 `amount`는 `1`이다. `ShopProductDaily`만 daily snapshot에서 선택된 runtime `amount`를 주입한다.\n- `SHOP_ITEM_DAILY.unit_price`는 단가다. 따라서 `ShopProductDaily.PriceWithoutDiscount = Table.unit_price * amount`이며, 할인은 그 결과에 적용한다.\n- `SHOP_ITEM_EVENT.price`, `SHOP_ITEM_GOLD.price`, `SHOP_ITEM_CHEST.price`는 이미 최종 row 가격으로 해석한다. 특히 chest는 `amount`가 reward 배수일 뿐 가격에는 곱해지지 않는다.\n- daily runtime `amount`는 reward 반복 횟수이면서 가격 배수에도 반영된다.\n- `SHOP_ITEM_CHEST.amount`는 reward 반복 지급 횟수일 뿐 가격에는 곱하지 않는다.\n- `SHOP_ITEM_CHEST`는 `reward_group_id`를 직접 가지지 않는다. chest 구매 reward는 현재 `ShopCatalogChest.Level`의 `SHOP_CATALOG_CHEST.reward_ads\u002Freward_paid01\u002Freward_paid10`에서 동적으로 결정한다.\n- `ShopProductChest.ProductType`은 `Chest_type=ADS`면 `SHOP_PRODUCT_TYPE.ADS`, `Chest_type=ONE\u002FTEN`이면 `SHOP_PRODUCT_TYPE.CURRENCY`로 해석한다.\n- `ShopProductDaily\u002FEvent\u002FGold`의 `ProductType`은 각 row의 `currency_type`에서 계산한다.\n- 카탈로그 클래스(`ShopCatalogBase`, `ShopCatalogDaily\u002FChest\u002FPurchase\u002FGold`)는 `ShopCatalog.cs`에 분리되어 관리한다.\n- row -> `ShopProductBase` 변환은 `ShopProductFactory`(15)에서 처리한다.\n\n---\n\n## 4. Implementation Location (3-path mirror)\n\n클래스별 파일 분리 — `Product\u002F` 폴더 (8개 파일):\n- `ShopProductBase.cs`\n- `ShopLimitedProductBase.cs`\n- `ShopRewardProductBase.cs`\n- `ShopProductDaily.cs`\n- `ShopProductEvent.cs`\n- `ShopProductGold.cs`\n- `ShopProductChest.cs`\n- `ShopProductPurchase.cs`\n\n- UPM (정본): `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FShop\u002FProduct\u002F`\n- Packages (sync): `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FShop\u002FProduct\u002F`\n- Assets\u002FSamples (import): `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Foundation\u002F0.1.0\u002FMobilePackage\u002FRuntime\u002FShop\u002FProduct\u002F`\n\n---\n\n## 5. Related\n\n- [10-shop-manager](..\u002F10-shop-manager\u002FSKILL.md)\n- [13-shop-catalog](..\u002F13-shop-catalog\u002FSKILL.md)\n- [15-shop-product-factory](..\u002F15-shop-product-factory\u002FSKILL.md)\n","# 11-shop-product\n\nStatus: ACTIVE\nAppliesTo: v10\n\nShopProduct 모델은 `SHOP_ITEM_*` row를 1:1 concrete product class로 감싼다.\nrow 원본은 `Table` 프로퍼티를 통해 노출하고, runtime 상태만 product에 둔다.\n\n---\n\n## 1. Source Tables\n\n- table file: `input\u002FDomains\u002FGame\u002FShopTable.xlsx`\n- `SHOP_ITEM_DAILY`\n- `SHOP_ITEM_EVENT`\n- `SHOP_ITEM_CHEST`\n- `SHOP_ITEM_PURCHASE`\n- `SHOP_ITEM_GOLD`\n\n기존 `SHOP_PRODUCT`\u002F`productId` 개념은 제거하고 `shop_item_id`를 사용한다.\n\n---\n\n## 2. Class Contract\n\n```csharp\npublic interface IShopTableProduct\n{\n    public object TableObject { get; }\n}\n\npublic interface IShopTableProduct\u003Cout TRow> : IShopTableProduct\n{\n    public TRow Table { get; }\n}\n\npublic abstract class ShopProductBase\n{\n    public string shop_id { get; }\n    public string name_id { get; }\n    public SHOP_CATALOG_TYPE catalog_type { get; }\n    public SHOP_PRODUCT_TYPE ProductType { get; }\n    public SHOP_DISCOUNT_TYPE DiscountType { get; }\n    public virtual int PriceWithoutDiscount { get; }\n    public int Price { get; } \u002F\u002F PriceWithoutDiscount에 DiscountType 반영\n}\n\npublic abstract class ShopProductBase\u003CTRow> : ShopProductBase, IShopTableProduct\u003CTRow>\n{\n    public TRow Table { get; }\n}\n\npublic abstract class ShopLimitedProductBase : ShopProductBase\n{\n    public int max_count { get; }\n    public int RemainCount { get; }\n    public bool HasPurchaseLimit { get; }\n}\n\npublic abstract class ShopRewardProductBase : ShopLimitedProductBase\n{\n    public CURRENCY_TYPE currency_type { get; }\n    public string reward_group_id { get; }\n    public int amount { get; }\n}\n\npublic sealed class ShopProductDaily : ShopRewardProductBase\u003CSHOP_ITEM_DAILY> {}\npublic sealed class ShopProductEvent : ShopRewardProductBase\u003CSHOP_ITEM_EVENT> {}\npublic sealed class ShopProductGold : ShopRewardProductBase\u003CSHOP_ITEM_GOLD> {}\npublic sealed class ShopProductChest : ShopLimitedProductBase\u003CSHOP_ITEM_CHEST> {}\npublic sealed class ShopProductPurchase : ShopProductBase\u003CSHOP_ITEM_PURCHASE> {}\n```\n\n- concrete class는 source table 기준으로만 나눈다.\n- `FREE\u002FADS\u002FCURRENCY`는 더 이상 구현 클래스 분기가 아니라 `ProductType`\u002F`currency_type` 해석 결과다.\n- `SHOP_ITEM_GOLD`와 `SHOP_ITEM_EVENT`는 `amount` column이 없으므로 `amount=1` 고정이다.\n- `SHOP_ITEM_CHEST.amount`는 reward 반복 지급 횟수다.\n\n---\n\n## 3. Hard Rules\n\n- `shop_item_id`가 유일 키다.\n- `Table`이 row 원본 SSOT다. `name_id`, `price`, `reward_group_id`, `internal_product_id` 같은 table 값은 product에 중복 저장하지 않는다.\n- runtime 상태(`DiscountType`, `RemainCount`)만 product에 둔다.\n- `PURCHASE` 타입은 `Internal_product_id`가 필수다.\n- `DiscountType`은 `SHOP_ITEM_DAILY` 초기화\u002Frefresh 시에만 랜덤 배정되며, 나머지 카탈로그는 `SHOP_DISCOUNT_TYPE.NONE`을 사용한다.\n- `ShopManager.GetProducts(...)` API는 사용하지 않고, `GetCatalog(catalog_type).GetProducts()`\u002F`GetCatalog(catalog_type).GetProduct(shop_item_id)`를 사용한다.\n- 제한 상품은 `ShopLimitedProductBase`만 표현한다. `max_count=-1`은 무제한이다.\n- `ShopLimitedProductBase` 생성 시 기본 `RemainCount = max_count`로 초기화한다.\n- `ShopProductBase.Price`는 `SHOP_DISCOUNT_TYPE`을 적용한 최종 가격이다.\n- `ShopProductBase.PriceWithoutDiscount`는 \"할인 전 실제 결제 기준 가격\"이다.\n- `SHOP_ITEM_DAILY` row는 정적 `amount`를 가지지 않고 `amount_min\u002Famount_max`를 가진다.\n- `ShopRewardProductBase`의 기본 `amount`는 `1`이다. `ShopProductDaily`만 daily snapshot에서 선택된 runtime `amount`를 주입한다.\n- `SHOP_ITEM_DAILY.unit_price`는 단가다. 따라서 `ShopProductDaily.PriceWithoutDiscount = Table.unit_price * amount`이며, 할인은 그 결과에 적용한다.\n- `SHOP_ITEM_EVENT.price`, `SHOP_ITEM_GOLD.price`, `SHOP_ITEM_CHEST.price`는 이미 최종 row 가격으로 해석한다. 특히 chest는 `amount`가 reward 배수일 뿐 가격에는 곱해지지 않는다.\n- daily runtime `amount`는 reward 반복 횟수이면서 가격 배수에도 반영된다.\n- `SHOP_ITEM_CHEST.amount`는 reward 반복 지급 횟수일 뿐 가격에는 곱하지 않는다.\n- `SHOP_ITEM_CHEST`는 `reward_group_id`를 직접 가지지 않는다. chest 구매 reward는 현재 `ShopCatalogChest.Level`의 `SHOP_CATALOG_CHEST.reward_ads\u002Freward_paid01\u002Freward_paid10`에서 동적으로 결정한다.\n- `ShopProductChest.ProductType`은 `Chest_type=ADS`면 `SHOP_PRODUCT_TYPE.ADS`, `Chest_type=ONE\u002FTEN`이면 `SHOP_PRODUCT_TYPE.CURRENCY`로 해석한다.\n- `ShopProductDaily\u002FEvent\u002FGold`의 `ProductType`은 각 row의 `currency_type`에서 계산한다.\n- 카탈로그 클래스(`ShopCatalogBase`, `ShopCatalogDaily\u002FChest\u002FPurchase\u002FGold`)는 `ShopCatalog.cs`에 분리되어 관리한다.\n- row -> `ShopProductBase` 변환은 `ShopProductFactory`(15)에서 처리한다.\n\n---\n\n## 4. Implementation Location (3-path mirror)\n\n클래스별 파일 분리 — `Product\u002F` 폴더 (8개 파일):\n- `ShopProductBase.cs`\n- `ShopLimitedProductBase.cs`\n- `ShopRewardProductBase.cs`\n- `ShopProductDaily.cs`\n- `ShopProductEvent.cs`\n- `ShopProductGold.cs`\n- `ShopProductChest.cs`\n- `ShopProductPurchase.cs`\n\n- UPM (정본): `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FShop\u002FProduct\u002F`\n- Packages (sync): `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FShop\u002FProduct\u002F`\n- Assets\u002FSamples (import): `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Foundation\u002F0.1.0\u002FMobilePackage\u002FRuntime\u002FShop\u002FProduct\u002F`\n\n---\n\n## 5. Related\n\n- [10-shop-manager](..\u002F10-shop-manager\u002FSKILL.md)\n- [13-shop-catalog](..\u002F13-shop-catalog\u002FSKILL.md)\n- [15-shop-product-factory](..\u002F15-shop-product-factory\u002FSKILL.md)\n",{"name":5,"description":7},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F50-mobile-package\u002F28-shop-system\u002F11-shop-product","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":8,"skillName":5,"commands":42,"prompt":52,"zipAvailable":53},[43,46,49],{"tool":44,"command":45},"npx","npx skills add devwinsoft\u002Fdevian --skill 11-shop-product",{"tool":47,"command":48},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 11-shop-product",{"tool":50,"command":51},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 11-shop-product","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F28-shop-system\u002F11-shop-product\u002FSKILL.md",true,[55,61,65],{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"_meta.json","REFERENCE","参考文档",398,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fsendai-official-solana-skills\u002F_meta.json",{"path":62,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":63,"sourceHtmlUrl":64},"SOURCE.md",342,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fsendai-official-solana-skills\u002FSOURCE.md",{"path":66,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":67,"sourceHtmlUrl":68},"TRUST.auto.yaml",2108,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fsendai-official-solana-skills\u002FTRUST.auto.yaml",[70,76,84,92,101,108],{"skillNo":71,"name":72,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":29},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[72],{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":29},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[82,83],"archive","90 project archive",{"skillNo":85,"name":86,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":29},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[90,91],"management","30 env management",{"skillNo":93,"name":94,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":29},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[98,99,100],"push","page","19 page push send",{"skillNo":102,"name":103,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":106,"publishedAt":29},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[99,107],"18 page savedata",{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":29},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[99,114],"17 page deobfuscate"]