From ec411f9f54ed6cda6630e127e2b18492886d2fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=B9=E8=80=80=E5=BE=B7?= Date: Tue, 19 Mar 2024 21:06:15 +0800 Subject: [PATCH] add asset sample MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 尹耀德 --- OAT.xml | 11 + README_zh.md | 1 + code/BasicFeature/Security/Asset/.gitignore | 11 + .../Security/Asset/AppScope/app.json5 | 25 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 2041 bytes .../AppScope/resources/base/media/back.png | Bin 0 -> 529 bytes .../AppScope/resources/base/media/forward.png | Bin 0 -> 502 bytes code/BasicFeature/Security/Asset/README_zh.md | 110 +++ .../Security/Asset/build-profile.json5 | 56 ++ .../Security/Asset/entry/.gitignore | 6 + .../Security/Asset/entry/build-profile.json5 | 27 + .../Security/Asset/entry/hvigorfile.ts | 6 + .../Security/Asset/entry/oh-package.json5 | 11 + .../src/main/ets/entryability/EntryAbility.ts | 58 ++ .../entry/src/main/ets/model/AssetModel.ets | 329 +++++++++ .../Asset/entry/src/main/ets/pages/Index.ets | 693 ++++++++++++++++++ .../src/main/ets/pages/QueryResultPage.ets | 182 +++++ .../entry/src/main/ets/pages/UpdatePage.ets | 218 ++++++ .../Asset/entry/src/main/module.json5 | 60 ++ .../main/resources/base/element/color.json | 32 + .../main/resources/base/element/float.json | 188 +++++ .../main/resources/base/element/images.json | 8 + .../main/resources/base/element/string.json | 72 ++ .../resources/base/element/stringarray.json | 35 + .../resources/base/profile/main_pages.json | 7 + .../main/resources/en_US/element/string.json | 72 ++ .../main/resources/zh_CN/element/string.json | 72 ++ .../src/ohosTest/ets/test/Ability.test.ets | 126 ++++ .../entry/src/ohosTest/ets/test/List.test.ets | 5 + .../ohosTest/ets/testability/TestAbility.ets | 47 ++ .../ohosTest/ets/testability/pages/Index.ets | 17 + .../ets/testrunner/OpenHarmonyTestRunner.ets | 90 +++ .../Asset/entry/src/ohosTest/module.json5 | 36 + .../resources/base/element/color.json | 8 + .../resources/base/element/string.json | 16 + .../ohosTest/resources/base/media/icon.png | Bin 0 -> 2041 bytes .../resources/base/profile/test_pages.json | 5 + .../Security/Asset/hvigor/hvigor-config.json5 | 18 + .../Security/Asset/hvigor/hvigor-wrapper.js | 1 + .../BasicFeature/Security/Asset/hvigorfile.ts | 6 + code/BasicFeature/Security/Asset/hvigorw | 63 ++ code/BasicFeature/Security/Asset/hvigorw.bat | 77 ++ .../Security/Asset/oh-package-lock.json5 | 15 + .../Security/Asset/oh-package.json5 | 28 + .../Asset/screenshots/batch_query_result.jpeg | Bin 0 -> 46259 bytes .../Security/Asset/screenshots/delete.jpeg | Bin 0 -> 36497 bytes .../Security/Asset/screenshots/query.jpeg | Bin 0 -> 36436 bytes .../Security/Asset/screenshots/save.jpeg | Bin 0 -> 40375 bytes .../screenshots/single_query_result.jpeg | Bin 0 -> 28906 bytes .../Asset/screenshots/update_edit.jpeg | Bin 0 -> 38124 bytes .../Asset/screenshots/update_list.jpeg | Bin 0 -> 32707 bytes 52 files changed, 2856 insertions(+) create mode 100755 code/BasicFeature/Security/Asset/.gitignore create mode 100755 code/BasicFeature/Security/Asset/AppScope/app.json5 create mode 100755 code/BasicFeature/Security/Asset/AppScope/resources/base/element/string.json create mode 100755 code/BasicFeature/Security/Asset/AppScope/resources/base/media/app_icon.png create mode 100755 code/BasicFeature/Security/Asset/AppScope/resources/base/media/back.png create mode 100755 code/BasicFeature/Security/Asset/AppScope/resources/base/media/forward.png create mode 100755 code/BasicFeature/Security/Asset/README_zh.md create mode 100755 code/BasicFeature/Security/Asset/build-profile.json5 create mode 100755 code/BasicFeature/Security/Asset/entry/.gitignore create mode 100755 code/BasicFeature/Security/Asset/entry/build-profile.json5 create mode 100755 code/BasicFeature/Security/Asset/entry/hvigorfile.ts create mode 100755 code/BasicFeature/Security/Asset/entry/oh-package.json5 create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/ets/entryability/EntryAbility.ts create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/ets/model/AssetModel.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/ets/pages/Index.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/ets/pages/QueryResultPage.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/ets/pages/UpdatePage.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/module.json5 create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/color.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/float.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/images.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/string.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/stringarray.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/base/profile/main_pages.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/en_US/element/string.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/main/resources/zh_CN/element/string.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/Ability.test.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/List.test.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/TestAbility.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/pages/Index.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/module.json5 create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/color.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/string.json create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/media/icon.png create mode 100755 code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/profile/test_pages.json create mode 100755 code/BasicFeature/Security/Asset/hvigor/hvigor-config.json5 create mode 100755 code/BasicFeature/Security/Asset/hvigor/hvigor-wrapper.js create mode 100755 code/BasicFeature/Security/Asset/hvigorfile.ts create mode 100755 code/BasicFeature/Security/Asset/hvigorw create mode 100755 code/BasicFeature/Security/Asset/hvigorw.bat create mode 100755 code/BasicFeature/Security/Asset/oh-package-lock.json5 create mode 100755 code/BasicFeature/Security/Asset/oh-package.json5 create mode 100755 code/BasicFeature/Security/Asset/screenshots/batch_query_result.jpeg create mode 100755 code/BasicFeature/Security/Asset/screenshots/delete.jpeg create mode 100755 code/BasicFeature/Security/Asset/screenshots/query.jpeg create mode 100755 code/BasicFeature/Security/Asset/screenshots/save.jpeg create mode 100755 code/BasicFeature/Security/Asset/screenshots/single_query_result.jpeg create mode 100755 code/BasicFeature/Security/Asset/screenshots/update_edit.jpeg create mode 100755 code/BasicFeature/Security/Asset/screenshots/update_list.jpeg diff --git a/OAT.xml b/OAT.xml index 2b9bd52f1..fec79e76f 100644 --- a/OAT.xml +++ b/OAT.xml @@ -103,6 +103,17 @@ Note:If the text contains special characters, please escape them according to th + + + + + + + + + + + diff --git a/README_zh.md b/README_zh.md index 548ff368a..77bf44367 100644 --- a/README_zh.md +++ b/README_zh.md @@ -118,6 +118,7 @@ 通用密钥库系统(huks)(API 10) 支付 证书管理 + 关键资产存储 diff --git a/code/BasicFeature/Security/Asset/.gitignore b/code/BasicFeature/Security/Asset/.gitignore new file mode 100755 index 000000000..f11a3ee29 --- /dev/null +++ b/code/BasicFeature/Security/Asset/.gitignore @@ -0,0 +1,11 @@ +/node_modules +/oh_modules +/local.properties +/.idea +**/build +/.hvigor +.cxx +/.clangd +/.clang-format +/.clang-tidy +**/.test diff --git a/code/BasicFeature/Security/Asset/AppScope/app.json5 b/code/BasicFeature/Security/Asset/AppScope/app.json5 new file mode 100755 index 000000000..bd5d03e2e --- /dev/null +++ b/code/BasicFeature/Security/Asset/AppScope/app.json5 @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "bundleName": "com.example.asset_sample", + "vendor": "example", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name" + } +} diff --git a/code/BasicFeature/Security/Asset/AppScope/resources/base/element/string.json b/code/BasicFeature/Security/Asset/AppScope/resources/base/element/string.json new file mode 100755 index 000000000..8c7764091 --- /dev/null +++ b/code/BasicFeature/Security/Asset/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "asset_sample" + } + ] +} diff --git a/code/BasicFeature/Security/Asset/AppScope/resources/base/media/app_icon.png b/code/BasicFeature/Security/Asset/AppScope/resources/base/media/app_icon.png new file mode 100755 index 0000000000000000000000000000000000000000..cd45accb1dfd2fd0da16c732c72faa6e46b26521 GIT binary patch literal 2041 zcmaJ?c~nzZ9u6@;0AXaYAVN(;Kr(@>EJ+}skOWf=BA~*l4us@ELY9{%0m5QX6pnb} z(jZF|S&pLAS}3BZAfeQSvJ_h>F2Q1PYqi?o5`;m_yjZdG$1v}l_wK#F^L^iMz2}uD z#K$>1dON~kFlWvhW+Jp=tuN9J`ZlM-rl4h+ij|^D0y9;4JOuz-EdVnB6i3R-0ulk9 zApi4zAQA>!N9@-o026$1@L`d124`3G5<@_m`0f)Ug_Ie~;HT2q<_a=HH> zDwTdfD^-cW-|_xWVP$f@93UhDN-#&khZ>jZXLTi~$0`7x3REP6pk%&^2|`c>DutjN zMJD4Zs6Z}{FOpd;*mo2zm(GzXRXiCV;4m3zNCYnu3Fy=i5;2An&Lp!#LP;bRD~1&s z%VH6UY+}r6YDgG+p34OJIZ{BTn&%4s=CT&#TBkuOhdeU@g(w#guoa*b^)73=XyI65 z7Swys6)YS}?1EeZ6b!-I+yCnIya^g0>-NLsLWd8t56GZ_S3r|ZGbR+mV2ErEb9J)X zIF!njY-D-7{qtF2(?nlQ$0}!pzt=}hc*m%%)0Jb#N_K4@IC-`Pi5DahPZN7N9rH;ol;Gc*>-Go@gXKTM{eP)iJj6CYTIi}B#zLKZYD@_;m zrXmXXsFq@~ou-z!9bHoM8*(hwl>X(zm)TDcdkF4lZm$1jP*HbnD`o1$g}_R#+bu2D zr%7Y8KdsaC-V*aem5#@*M%r^GPgu%P2e-BnBClhP2yoGFe40>);=}>{NONtkXQ01p z)OX^t2Ojhddot9eg0WTIVSTNBa}7V-^_pO595w|Hx9q?k4dMp@$G7PK*TD=y;ck6J zdGRB!_RAI2nR3%tO1IkdWp*bw*?<=pM_LZb30?!oK)s;En( z!#nnd9=cXJ<}+e{XLdx(q3&ikJISe?eSHHohk+pz+$6Cv{ytvc{QXmMn2XQ9U8rvt zrJdAn(0gpSD@N=yTrI_2^P#*zQg7MTp1)k(lv(*(KtUR6@M|2WB>2wRwC-h=wk6XF zPtSes*_JwI+^d>xW489MJw5R6=t5?{R zc|E8i?RL@p9)A3ZJAQOg`}+F;<_vnWA!KxR#g%jZ@y_1Qu#Uw)kFPw_xmZ?a^e*1{ zM|ImtqA|(CaDQ@Fyvcof`MN66&VI6m6gAyAXx`%cDx6BI{Bj#}V*Rn1(b~;Am)D2u zX7(027IO?Z2VYK^1vXXpoZ@AtH~N?0rYWwtyA15`6vEf6fk&;o-L;7zFt`5nk*iOy z`<918zB+k;EytI$FAXug)jk*e@e};4e9g__w4A5ev!!)H$yC@{?vsRqJ##X1R%xPG z&_R3oDi$MtTkVqfPj)HEUDx_7wd!y{8#1%$U*Dd0sK@=#6+!XlsE-s^1f5E`R9Wo71^b~mbVdU;Fw0LG~mUQg;xsX4QYRo3B@rH_=ry>DE8ef!c2ta8UcI#26# zF|`*4wtMHe@%#eGZw`#Yj|QWuB`eRD)b~)r9mM95p_JVG%-IdcbIX5qG#GpGD+IrS zEqxb1Rg&Dadk5#7t4j68I1f!@A$efp1?I%&d*56)yl!tkz!14<$0Od_&6cGw$WW0r zjSlQA7l*6;vgfhv!cR|RmAD$+w6j`rVf=-?-D@q>kOseUVSb*~jbAS^*1h?ZL)n(9 zDa}`4etXO6`}9;{k5E^N{rcfnV_(LPwsDg``wtyS*V<19c3!PGJ3Kqy9ksvkwbJ%Z z*N(fT0{e*Wji-Ck5!3YE0j|PZ@&z`v=kitWL$bqSt!e4bH!+(|Q)CZ30^nVPfkx{s zX{6of`p=BiPb@u@IyL!tRk>?qgBqCmo-Zlt!636g?z`s~zdfwuB7DXZHvV`Usp+%Z zo*&;Biu@MHE&2j+?j^o`Cr12u<>vOe=a&8a2hlcmFjJiDR>XnD4c4DAhZWCkiAgW{ E51q9-lK=n! literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/AppScope/resources/base/media/back.png b/code/BasicFeature/Security/Asset/AppScope/resources/base/media/back.png new file mode 100755 index 0000000000000000000000000000000000000000..d08edf854236cfd7d3dce517505fbc8a38472077 GIT binary patch literal 529 zcmV+s0`C2ZP)Px$%Sl8*RA@u(nY}IsK@^6cFWdkw#1*&#m4t*wg94!y5egd7`45FCL?80WBX9_;1AD+u+kn0; zbONmYiv9q`QUW*wmJPxCz-9^n62%K($q;)Eth6m&#&2pN>3nlW1(T-KDY8$z(N;E zN;5~5g+%-lFlh`V;unE0&EQ?MDFaACe3^xk5nl$d1{@jTe+Nz@u+1AFMdF{Q$U-l` zL>K;bm}3sOtNV=Z0^1IQchO}Ac&r1E_i`j0?Lv{o9IwE$#zGcjhHqMx2gY*=OwPFG z<_@pE=0sLh^Cy$Y%wjKpWQ+Gm%|}x{cG6651pc9KyvydAOhuJ^%zL7=$kXfsjLwc_V!QY-qjc+Ri6{XfS_p zd;%k`!nFN-1IWBmD@_AiKYwVBwL)CmwE^I&#i?Hp;IwQWJM|IpxR_2uB_DxrPIpi- T_|x7n00000NkvXXu0mjfCNS0( literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/AppScope/resources/base/media/forward.png b/code/BasicFeature/Security/Asset/AppScope/resources/base/media/forward.png new file mode 100755 index 0000000000000000000000000000000000000000..612ef73601089baba84c98ee3827d044f3fdcfb0 GIT binary patch literal 502 zcmVPx$ut`KgRA@u(m^(`aF%X5n3!;dK*!n_zwIbsG@3m1;5DN{SOVUFUvp?j zF5u1E0V(@G??^=`k;W4PY-&@(o;+fbarX1r7(HECS&LAnj|wK?LF)cs1q8 zl*yg|GlB315X5jl=s%@X7AJB5NbnZ0QzD&m0Z99H_X|1X#3k_TwI^}{NTW)tQYsuj zU5Ryp$PFOjyTE3y5?ca5+ErdvX2YQq`?TBO$r)7&KmzxH^?}km;67PB6u;D~Us?_X zKLJ-Y0i1LlYp?kcxTysomO{6{Lk$42a{3OOS?>-dHgT+s>MT%eVZJlu22eYpwxY^| zEY?c6p2CVsE(c=GoV)m30ROequ1#E@lim&#y$g6dQ1z8^1vtvpaZWqvyi!Q*vg&<5 zihPmqOd);PQlB#ie08@j^C2~+#qe@K?-Il!@X>vp8}okiGoAouF)0f)fRw0t&S?&K sMl)rt=0Hl+Jm)kAJfoSiR`m}20qmVlF(z(vpa1{>07*qoM6N<$f)$d`C;$Ke literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/README_zh.md b/code/BasicFeature/Security/Asset/README_zh.md new file mode 100755 index 000000000..2aeacbd96 --- /dev/null +++ b/code/BasicFeature/Security/Asset/README_zh.md @@ -0,0 +1,110 @@ +# 关键资产存储服务 +## 介绍 +本示例使用@kit.AssetStoreKit相关接口实现了对敏感数据的保存、更新、查询、删除操作。 + +实现场景如下: + +1)用户使用本应用保存密码或信用卡号。 + +2)用户更新本应用管理的密码或信用卡号。 + +3)用户查询本应用管理的密码或信用卡号。 + +4)用户删除本应用管理的密码或信用卡号。 + +## 效果预览 +| **保存页面** | **删除页面** | **更新列表页面** | **更新编辑页面** | +|---------|----------|------------|----------| +|![](screenshots/save.jpeg)|![](screenshots/delete.jpeg)|![](screenshots/update_list.jpeg)|![](screenshots/update_edit.jpeg)| +| **查询页面** | **批量查询结果页面** | **单个查询结果页面** | +![](screenshots/query.jpeg)|![](screenshots/batch_query_result.jpeg)|![](screenshots/single_query_result.jpeg)| + +使用说明: +* 保存敏感数据: + * 输入账号、密码、标签,其中标签可以填写多个,但不超过4个 + * 点击“保存”按钮 + +* 删除敏感数据,可使用以下任意一种方式删除: + * 批量删除:不输入任何信息,或输入单个或多个标签),点击“删除”按钮 + * 单个删除:输入账号、标签(可选),点击“删除”按钮 +* 更新敏感数据: + * 点击标题栏的“更新”,进入更新页面 + * 在显示的账号列表中,点击待更新的账号 + * 输入锁屏密码,进入编辑界面 + * 输入更新后的密码和标签,点击“更新” +* 查询敏感数据,可使用以下任意一种方式删除: + * 批量查询:不输入任何信息,或输入单个或多个标签),点击“查询”按钮,显示保存的信息列表,不含“密码/信用卡号” + * 单个查询:输入账号、标签(可选),点击“查询”按钮,输入锁屏密码,显示该账号详细信息,含“密码/信用卡号” + +## 工程目录 +``` +entry/src/main/ets/ +|---entryAbility +| |---EntryAbility.ts +|---model +| |---AssetModel.ets // 关键资产存储模型文件 +|---pages +| |---Index.ets // 主页面 +| |---QueryResultPage.ets // 查询结果界面 +| |---UpdatePage.ets // 更新页面 +``` +## 具体实现 +本应用分为四个主页面:保存、删除、更新、查询,通过TabBuilder组件实现页面直接的切换。 +* **保存页面**:解析用户输入的账号、密码、标签信息,传入@kit.AssetStoreKit提供的add接口,从而实现将短敏感数据存储到关键资产存储服务中。 + +* **删除页面**:解析用户输入的账号、标签信息,传入@kit.AssetStoreKit提供的remove接口,删除满足条件的短敏感数据。 + +* **更新页面**: + + 1)调用@kit.AssetStoreKit提供的query接口,查询关键资产中存储的全量账号。 + + 2)调用@kit.AssetStoreKit提供的preQuery接口,将返回的challenge传给@kit.UserAuthenticationKit提供的on接口。 + + 3)待用户输入锁屏密码后,将onResult接口返回的AuthToken传给@kit.AssetStoreKit提供的query接口,用以查询旧的敏感数据明文。 + + 4)解析用户输入的账号、标签信息,传入@kit.AssetStoreKit提供的update接口,更新关键资产存储服务中存储的敏感数据。 + + 5)退出更新界面时,调用@kit.AssetStoreKit提供的postQuery接口清理资源 + +* **查询页面**: + + 用户未输入账号: + + 解析用户输入的标签信息,传入@kit.AssetStoreKit提供的query接口,查询关键资产存储服务中存储的账号、标签。 + + 用户输入了账号: + + 1)调用@kit.AssetStoreKit提供的preQuery接口,将返回的challenge传给@kit.UserAuthenticationKit提供的on接口。 + + 2)待用户输入锁屏密码后,将onResult接口返回的AuthToken、用户输入的账号、标签信息传给@kit.AssetStoreKit提供的query接口,用以查询敏感数据明文。 + + 3)调用@kit.AssetStoreKit提供的postQuery接口清理资源。 + +## 相关权限 +ohos.permission.ACCESS_BIOMETRIC + +ohos.permission.STORE_PERSISTENT_DATA + +## 依赖 +不涉及 + +## 约束与限制 +1.本示例仅支持标准系统上运行。 + +2.本示例支持API11版本SDK,SDK版本号(API Version 11 Release), 镜像版本号(4.1Release)。 + +3.本示例需要使用DevEco Studio版本号(4.1Release)及以上版本才可编译运行。 + +4.本示例需要在设备设置锁屏密码后使用。其中,更新、查询结果页面输入锁屏密码方可进入。 + +## 下载 +如需单独下载本工程,执行如下命令: + +``` +git init +git config core.sparsecheckout true +echo code/BasicFeature/Security/Asset/ > .git/info/sparse-checkout +git remote add origin https://gitee.com/openharmony/applications_app_samples.git +git pull origin master + +``` \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/build-profile.json5 b/code/BasicFeature/Security/Asset/build-profile.json5 new file mode 100755 index 000000000..254528826 --- /dev/null +++ b/code/BasicFeature/Security/Asset/build-profile.json5 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "app": { + "products": [ + { + "name": "default", + "signingConfig": "default", + "compileSdkVersion": 11, + "compatibleSdkVersion": 11, + "runtimeOS": "OpenHarmony" + } + ], + "signingConfigs": [ + { + "name": "default", + "material": { + "certpath": "C:/Users/zengbenchong/.ohos/config/openharmony/default_Asset_WMjW1k3aXdGTv9zVP9gZHS6Q095UiwPg2bW9aR_b0Gw=.cer", + "storePassword": "0000001B53993973AD492CF6E3976586BBED74A3A3E4D725B2C0CDC71D63D0522A290CC9E86C861E213C97", + "keyAlias": "debugKey", + "keyPassword": "0000001B5B410B8FCF1DFC802D233B1A0AC012B8294A5BFB3BF3713733C3B5E2B68C890DC235987A625118", + "profile": "C:/Users/zengbenchong/.ohos/config/openharmony/default_Asset_WMjW1k3aXdGTv9zVP9gZHS6Q095UiwPg2bW9aR_b0Gw=.p7b", + "signAlg": "SHA256withECDSA", + "storeFile": "C:/Users/zengbenchong/.ohos/config/openharmony/default_Asset_WMjW1k3aXdGTv9zVP9gZHS6Q095UiwPg2bW9aR_b0Gw=.p12" + } + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + } + ] +} diff --git a/code/BasicFeature/Security/Asset/entry/.gitignore b/code/BasicFeature/Security/Asset/entry/.gitignore new file mode 100755 index 000000000..32abf8fd5 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/.gitignore @@ -0,0 +1,6 @@ +/node_modules +/oh_modules +/.preview +/build +/.cxx +/.test \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/build-profile.json5 b/code/BasicFeature/Security/Asset/entry/build-profile.json5 new file mode 100755 index 000000000..8830cfe9f --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/build-profile.json5 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "apiType": 'stageMode', + "targets": [ + { + "name": "default", + "runtimeOS": "OpenHarmony" + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/hvigorfile.ts b/code/BasicFeature/Security/Asset/entry/hvigorfile.ts new file mode 100755 index 000000000..ba9480d0a --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/hvigorfile.ts @@ -0,0 +1,6 @@ +import { hapTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: hapTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/code/BasicFeature/Security/Asset/entry/oh-package.json5 b/code/BasicFeature/Security/Asset/entry/oh-package.json5 new file mode 100755 index 000000000..7dca654ad --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/oh-package.json5 @@ -0,0 +1,11 @@ +{ + "license": "", + "devDependencies": {}, + "author": "", + "name": "entry", + "description": "Please describe the basic information.", + "main": "", + "version": "1.0.0", + "dynamicDependencies": {}, + "dependencies": {} +} diff --git a/code/BasicFeature/Security/Asset/entry/src/main/ets/entryability/EntryAbility.ts b/code/BasicFeature/Security/Asset/entry/src/main/ets/entryability/EntryAbility.ts new file mode 100755 index 000000000..ebb6ff604 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/ets/entryability/EntryAbility.ts @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AbilityConstant } from '@kit.AbilityKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { UIAbility } from '@kit.AbilityKit'; +import { Want } from '@kit.AbilityKit'; +import { window } from '@kit.ArkUI'; + +export default class EntryAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + } + + onDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage) { + // Main window is created, set main page for this ability + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); + + windowStage.loadContent('pages/Index', (err, data) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); + }); + } + + onWindowStageDestroy() { + // Main window is destroyed, release UI related resources + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + } + + onForeground() { + // Ability has brought to foreground + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + } + + onBackground() { + // Ability has back to background + hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + } +} diff --git a/code/BasicFeature/Security/Asset/entry/src/main/ets/model/AssetModel.ets b/code/BasicFeature/Security/Asset/entry/src/main/ets/model/AssetModel.ets new file mode 100755 index 000000000..01e65f8f3 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/ets/model/AssetModel.ets @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { asset } from '@kit.AssetStoreKit'; +import { promptAction } from '@kit.ArkUI'; +import { util } from '@kit.ArkTS'; + +function removeDuplicateAndSort(arr: string[]): string[] { + let newArr = new Array(); + for (let i = 0; i < arr.length; i++) { + if (newArr.indexOf(arr[i]) === -1 && arr[i] != '') { + newArr.push(arr[i]); + } + } + return newArr.sort(); +} + +export function log(str: string) { + promptAction.showToast({ message: str }) + console.log(str); +} + +export function stringToArray(str: string): Uint8Array { + let textEncoder = new util.TextEncoder(); + return textEncoder.encodeInto(str); +} + +function newNullArray(): Uint8Array { + return new Uint8Array([0]); +} + +function arrayToString(arr: Uint8Array): string { + let textDecoder = util.TextDecoder.create("utf-8", { + ignoreBOM: true + }); + let str = textDecoder.decodeWithStream(arr, { + stream: false + }) + return str; +} + +export async function addAssetPromise(account: string, password: string, label: string) { + let labelList: Array = label.split(';'); + labelList = removeDuplicateAndSort(labelList); + if (labelList.length > 4) { + log("保存失败,标签数量超过4个") + return; + } + let attr: asset.AssetMap = new Map(); + attr.set(asset.Tag.ALIAS, stringToArray(account)) + attr.set(asset.Tag.SECRET, stringToArray(password)) + if (labelList[0]) { + attr.set(asset.Tag.DATA_LABEL_NORMAL_1, stringToArray(labelList[0])) + } + if (labelList[1]) { + attr.set(asset.Tag.DATA_LABEL_NORMAL_2, stringToArray(labelList[1])) + } + if (labelList[2]) { + attr.set(asset.Tag.DATA_LABEL_NORMAL_3, stringToArray(labelList[2])) + } + if (labelList[3]) { + attr.set(asset.Tag.DATA_LABEL_NORMAL_4, stringToArray(labelList[3])) + } + attr.set(asset.Tag.AUTH_TYPE, asset.AuthType.ANY) + attr.set(asset.Tag.IS_PERSISTENT, true) + try { + await asset.add(attr); + log("保存成功") + } catch (error) { + if (error.code === 24000003) { + log('保存失败,账号已存在'); + } else { + log('保存失败') + } + } +} + +export async function removeAssetPromise(deleteAccount: string, deleteLabel: string) { + let attr: asset.AssetMap = new Map(); + if (deleteAccount.length > 0) { + attr.set(asset.Tag.ALIAS, stringToArray(deleteAccount)) + } + if (deleteLabel.length == 0) { + try { + await asset.remove(attr); + log("删除成功") + } catch (error) { + if (error.code === 24000002) { + log('删除失败,账号不存在'); + } else { + log('删除失败') + } + } + } else { + let labelList = deleteLabel.split(';'); + labelList = removeDuplicateAndSort(labelList); + let assetList: asset.AssetMap[] = await getArrangedMap(deleteAccount, labelList) + if (assetList.length == 0) { + log('删除失败,账号不存在'); + return; + } + let map: Map = new Map(); + for (let i = 0; i < assetList.length; i++) { + map.set(asset.Tag.ALIAS, assetList[i].get(asset.Tag.ALIAS) as Uint8Array); + try { + await asset.remove(map) + } catch (error) { + log('删除失败') + return; + } + } + log("删除成功") + } +} + +function compareArray(array1: Uint8Array, array2: Uint8Array): boolean { + return JSON.stringify(array1) == JSON.stringify(array2); +} + +function addLabelInfo(label: string, tag: asset.Tag, account: asset.AssetMap, emptyArray: Uint8Array): string { + if (account.has(tag) && !compareArray(account.get(tag) as Uint8Array, emptyArray)) { + label += arrayToString(account.get(tag) as Uint8Array) + ';' + } + return label; +} + +function addElement(attr: asset.AssetMap, label: string, key: asset.Tag) { + if (label){ + attr.set(key, stringToArray(label)) + } else { + attr.set(key, newNullArray()) + } +} + +let normalLabelList: Array = new Array(asset.Tag.DATA_LABEL_NORMAL_1, + asset.Tag.DATA_LABEL_NORMAL_2, asset.Tag.DATA_LABEL_NORMAL_3, asset.Tag.DATA_LABEL_NORMAL_4); + +// asset获取的map转换为显示map +function convertAssetList(assetList: asset.AssetMap[], accountList: Map[]): Array> { + for (let account of assetList) { + let map: Map = new Map(); + let alias = arrayToString(account.get(asset.Tag.ALIAS) as Uint8Array); + if (account.has(asset.Tag.SECRET)) { + let secret = arrayToString(account.get(asset.Tag.SECRET) as Uint8Array); + map.set('secret', secret); + } + let label = '' + let emptyArray = newNullArray(); + for (let currentLabel of normalLabelList) { + label = addLabelInfo(label, currentLabel, account, emptyArray); + } + label = label.slice(0, label.length - 1) + map.set('alias', alias); + map.set('label', label) + accountList.push(map); + } + return accountList; +} + +export async function updateAssetPromise(reserveAccount: string, reservePassword: string, reserveLabel: string) { + let labelList = reserveLabel.split(';'); + labelList = removeDuplicateAndSort(labelList); + if (labelList.length > 4) { + log("更新失败,标签数量超过4个") + return; + } + + let attr: asset.AssetMap = new Map(); + attr.set(asset.Tag.SECRET, stringToArray(reservePassword)) + normalLabelList.forEach((element: asset.Tag, index: number) => { + addElement(attr, labelList[index], element); + }); + + let attr2: asset.AssetMap = new Map(); + attr2.set(asset.Tag.ALIAS, stringToArray(reserveAccount)) + + try { + await asset.update(attr2, attr) + log("更新成功") + } catch (error) { + log('更新失败'); + } +} + +async function getFirstQuery(alias: string, label: string): Promise +{ + let res: Array = new Array(); + let options: asset.Tag[] = [ asset.Tag.DATA_LABEL_NORMAL_1, asset.Tag.DATA_LABEL_NORMAL_2, + asset.Tag.DATA_LABEL_NORMAL_3, asset.Tag.DATA_LABEL_NORMAL_4 ]; + for (let i = 0; i < options.length; i++) { + let map: asset.AssetMap = new Map(); + if (alias.length > 0) { + map.set(asset.Tag.ALIAS, stringToArray(alias)); + map.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL) + } + map.set(options[i], stringToArray(label)); + try { + let temp: Array = await asset.query(map) + res = res.concat(temp); + } catch(e) { + // skip the error: not found + } + } + return res; +} + +function getLabelList(input: asset.AssetMap): Array +{ + let tmp = new Array(); + if (input.has(asset.Tag.DATA_LABEL_NORMAL_1)) { + tmp.push(arrayToString(input.get(asset.Tag.DATA_LABEL_NORMAL_1) as Uint8Array)); + } + if (input.has(asset.Tag.DATA_LABEL_NORMAL_2)) { + tmp.push(arrayToString(input.get(asset.Tag.DATA_LABEL_NORMAL_2) as Uint8Array)); + } + if (input.has(asset.Tag.DATA_LABEL_NORMAL_3)) { + tmp.push(arrayToString(input.get(asset.Tag.DATA_LABEL_NORMAL_3) as Uint8Array)); + } + if (input.has(asset.Tag.DATA_LABEL_NORMAL_4)) { + tmp.push(arrayToString(input.get(asset.Tag.DATA_LABEL_NORMAL_4) as Uint8Array)); + } + return tmp; +} + +async function getArrangedMap(alias: string, labels: string[]): Promise +{ + let first_query: asset.AssetMap[] = await getFirstQuery(alias, labels[0]); + let res: asset.AssetMap[] = first_query.filter((map: asset.AssetMap) => { + let list: Array = getLabelList(map); + for (let i = 1; i < labels.length; i++) { + if (list.indexOf(labels[i]) < 0) { + return false; + } + } + return true; + }); + return res; +} + +export async function queryAssetPromise(checkAccount: string, checkLabel: string): Promise>> { + let accountList: Map[] = new Array>(); + let assetMap: asset.AssetMap = new Map(); + if (checkAccount.length > 0) { + assetMap.set(asset.Tag.ALIAS, stringToArray(checkAccount)) + assetMap.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL) + } + if (checkLabel.length == 0) { // query condition do not contain label. + try { + let assetList: Array = await asset.query(assetMap); + return convertAssetList(assetList, accountList); + } catch (error) { + if (error.code === 24000002) { + log('未查询到结果'); + } else { + log('查询失败'); + } + return new Array>(); + } + } else { + let labelList: Array = checkLabel.split(';'); + labelList = removeDuplicateAndSort(labelList); + let assetList: asset.AssetMap[] = await getArrangedMap(checkAccount, labelList) + if (assetList.length == 0) { + log('未查询到结果'); + return new Array>(); + } + return convertAssetList(assetList, accountList); + } +} + +export async function preQueryAssetPromise(checkAccount: string): Promise { + let assetMap: asset.AssetMap = new Map(); + assetMap.set(asset.Tag.AUTH_VALIDITY_PERIOD, 10 * 60) + assetMap.set(asset.Tag.AUTH_TYPE, asset.AuthType.ANY) + if (checkAccount.length > 0) { + assetMap.set(asset.Tag.ALIAS, stringToArray(checkAccount)) + } + try { + return await asset.preQuery(assetMap) + } catch (error) { + return new Uint8Array(0) + } +} + +export async function queryAuthAssetPromise(checkAccount: string, challenge: Uint8Array, + authToken: Uint8Array): Promise> { + let attr: asset.AssetMap = new Map(); + let account: Map = new Map(); + if (checkAccount.length > 0) { + attr.set(asset.Tag.ALIAS, stringToArray(checkAccount)); + attr.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL); + attr.set(asset.Tag.AUTH_CHALLENGE, challenge); + attr.set(asset.Tag.AUTH_TOKEN, authToken) + } + try { + let data: Array = await asset.query(attr); + let accountList: Map[] = new Array>(); + accountList = convertAssetList(data, accountList); + return accountList[0] + } catch (error) { + if (error.code === 24000002) { + log('未查询到结果'); + } else { + log('查询失败'); + } + return account; + } +} + +export async function postQueryAssetPromise(challenge: Uint8Array) { + let attr: asset.AssetMap = new Map(); + attr.set(asset.Tag.AUTH_CHALLENGE, challenge); + try { + await asset.postQuery(attr); + } catch (error) { + } +} diff --git a/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/Index.ets b/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/Index.ets new file mode 100755 index 000000000..753055a70 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/Index.ets @@ -0,0 +1,693 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import { promptAction } from '@kit.ArkUI'; +import { userAuth } from '@kit.UserAuthenticationKit'; +import { addAssetPromise, removeAssetPromise, queryAssetPromise, queryAuthAssetPromise, preQueryAssetPromise, log, + postQueryAssetPromise } from '../model/AssetModel'; + +interface AssetItem { + alias: string; + secret: string; + dataLabel: string; +} + +function isReserveClickable(reserveAccount: string, reservePassword: string, reserveLabel: string): boolean { + return reserveAccount !== '' && reservePassword !== '' && reserveLabel != ''; +} + +async function getAuthTokenCallback(challenge: Uint8Array, + callback: (isSuccess: boolean, challenge: Uint8Array) => void) { + const authParam: userAuth.AuthParam = { + challenge: challenge, + authType: [userAuth.UserAuthType.PIN,userAuth.UserAuthType.FACE,userAuth.UserAuthType.FINGERPRINT], + authTrustLevel: userAuth.AuthTrustLevel.ATL1, + }; + const widgetParam: userAuth.WidgetParam = { + title: '请输入锁屏密码', + }; + try { + let userAuthInstance = userAuth.getUserAuthInstance(authParam, widgetParam); + userAuthInstance.on('result', { + onResult(result) { + console.log('userAuthInstance callback result = ' + JSON.stringify(result)); + if (result.result == 12500000) { + console.log('userAuthInstance callback result success'); + callback(true, result.token) + } else if (result.result == 12500010) { + promptAction.showToast({ message: $r('app.string.please_set_pwd') }) + callback(false, new Uint8Array(0)) + } + } + }); + userAuthInstance.start(); + } catch (error) { + console.log('auth catch error: ' + JSON.stringify(error)); + promptAction.showToast({ message: $r('app.string.auth_failed') }) + callback(false, new Uint8Array(0)) + } +} + +function convertMapArrayToMapItem(array: Array>): Array +{ + let res = new Array(); + for (let dataElement of array) { + let tmp: AssetItem = { + alias: dataElement.get('alias') as string, + secret: dataElement.get('secret') as string, + dataLabel: dataElement.get('label') as string, + }; + res.push(tmp) + } + return res; +} + +@Entry +@Component +struct Page { + private challenge: Uint8Array = new Uint8Array; + private authToken: Uint8Array = new Uint8Array; + @State reserveAccount: string = ''; + @State reservePassword: string = ''; + @State reserveLabel: string = ''; + @State deleteAccount: string = ''; + @State deleteLabel: string = ''; + @State checkAccount: string = ''; + @State checkLabel: string = ''; + @State eventType: string = '' + @State index: number = 0 + @State assetArr: string[] = new Array(); + private tabsController: TabsController = new TabsController(); + @State view: Visibility[] = [Visibility.Hidden, Visibility.Visible, Visibility.None]; + @State indexView: number = 0 + + @Builder TabBuilder(index: number, name: string) { + Column() { + Row().height(this.index === index ? 8 : 17) + Text(name) + .fontColor(0x182413) + .fontSize(this.index === index ? 30 : 20) + .fontWeight(this.index === index ? 700 : 500) + .lineHeight(this.index === index ? 41 : 28) + .opacity(this.index === index ? 1 : 0.7) + .fontFamily(this.index === index ? 'HarmonyHeiTi-Bold' : 'HarmonyHeiTi-Medium') + .margin(this.index == 0 ? {left: 24} : {left: 0}) + Row().height(this.index === index ? 7 : 11) + } + .width('100%') + } + + build() { + Tabs({ + index: 0, + controller: this.tabsController }) { + /* 保存页面 */ + TabContent() { + Column() { + Column() { + /* 账号 */ + Row() { + Text("*").fontColor(0xFFE84026) + Text($r('app.string.account')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .margin({ top: "2.3%", bottom: "1.1%" }) + } + .width('86.7%').height('7.14%') + .margin({ top: 4 }) + + /* 账号输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_account') }) + .fontColor(0x182431) + .defaultFocus(false) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0.00px' }) + .backgroundColor(Color.Transparent) + .borderRadius(0) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.reserveAccount = value; + }) + .onEditChange((isEditing: boolean) => { + if (isEditing === true) { + this.eventType = 'Down1'; + } + }) + } + .width('86.7%').height('7.14%') + + if (this.eventType === 'Down1') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: 12, + right: 12 + }) + .backgroundColor(0x182431) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + } + + /* 密码 */ + Row() { + Text("*").fontColor(0xFFE84026) + Text($r('app.string.secret_or_card_num')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .fontWeight(500) + .margin({ top: "2.3%", bottom: "1.1%" }) + } + .width('86.7%').height('7.14%') + + /* 密码输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_secret_or_card_num') }) + .type(InputType.Password) + .defaultFocus(false) + .fontColor(0x182431) + .padding({ top: '1.70%', right: '0', bottom: '1.70%', left: '0.00px' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.reservePassword = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down2'; + } + }) + .margin({ top: '0.00vp', right: '-12vp', bottom: '4.00vp', left: '0.00vp' }) + } + .width('86.7%').height('7.14%') + if (this.eventType === 'Down2') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + } + + /* 标签 */ + Row() { + Text("*").fontColor(0xFFE84026) + Text($r('app.string.label')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .fontWeight(500) + .margin({ top: "2.3%", bottom: "1.1%" }) + } + .width('86.7%').height('7.14%') + + /* 标签输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_label') }) + .fontColor(0x182431) + .defaultFocus(false) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0.00px' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.reserveLabel = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down3'; + } + }) + } + .width('86.7%').height('7.14%') + if (this.eventType === 'Down3') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431).margin({ bottom: 4}) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431').margin({ bottom: 4}) + } + } + .backgroundColor(0xFFFFFF).borderRadius(16) + + Blank() + + Row() { + /* 底部按钮 */ + Button($r('app.string.save'), { type: ButtonType.Capsule, stateEffect: false }) + .backgroundColor(0x007DFF).fontColor('white') + .borderRadius(20) + .width('86.7%') + .height(40) + .enabled(isReserveClickable(this.reserveAccount, this.reservePassword, this.reserveLabel)) + .onClick(() => { + addAssetPromise(this.reserveAccount, this.reservePassword, this.reserveLabel) + }) + } + .margin({ bottom: '8.1%' }) + } + .height('100%') + } + .tabBar(this.TabBuilder(0, "保存")) + + /* 删除页面 */ + TabContent() { + Column() { + Column() { + /* 账号 */ + Row() { + Text($r('app.string.account')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('7.14%') + .margin({ top: 4 }) + + /* 用户名输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_account') }) + .fontColor(0x182431) + .defaultFocus(false) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.deleteAccount = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down4'; + } + }) + } + .width('86.7%').height('7.14%') + + if (this.eventType === 'Down4') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + } + + /* 标签 */ + Row() { + Text($r('app.string.label')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .fontWeight(500) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('7.14%') + + /* 标签输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_label') }) + .fontColor(0x182431) + .defaultFocus(false) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.deleteLabel = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down5'; + } + }) + } + .width('86.7%').height('7.14%') + + if (this.eventType === 'Down5') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431).margin({ bottom: 4}) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431').margin({ bottom: 4}) + } + } + .backgroundColor(0xFFFFFF).borderRadius(16) + + Blank() + Row() { + /* 底部按钮 */ + Button($r('app.string.delete'), { type: ButtonType.Capsule, stateEffect: false }) + .backgroundColor(0x007DFF).fontColor('white') + .borderRadius(20) + .width('86.7%') + .height(40) + .onClick(() => { + removeAssetPromise(this.deleteAccount, this.deleteLabel) + }) + } + .margin({ bottom: '8.1%' }) + } + .height('100%') + } + .tabBar(this.TabBuilder(1, "删除")) + + /* 更新页面 */ + TabContent() { + Column() { + Column() { + List({ space: 0, initialIndex: 0 }) { // 查询列表 + ForEach(this.assetArr, (item: string) => { + ListItem() { + Column() { + /* 账号 */ + Row() { + Row() { + Text(item) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .textAlign(TextAlign.Start) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + + Blank() + Row() { + Image($r('app.media.forward')) + .height(18) + .width(9) + .fillColor('#182431') + } + } + .width('100%').height('7.14%') + .onClick(async () => { + let account = await queryAuthAssetPromise(item, this.challenge, this.authToken); + router.pushUrl({ + url: 'pages/UpdatePage', + params: { name: item, pwd: account.get('secret'), label: account.get("label") } + }, router.RouterMode.Standard, (err) => { + if (err) { + console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + }); + }); + } + .margin({ right: 12, left: 12 }) + } + }, (item: string) => item) + } + .listDirection(Axis.Vertical) // 排列方向 + .divider({ strokeWidth: 1, color: '#0D182431', startMargin: 12, endMargin: 12 }) // 每行之间的分界线 + .edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果 + } + .margin({ right: 12, left: 12 }) + .backgroundColor(0xFFFFFF).borderRadius(16) + } + .height('100%') + } + .tabBar(this.TabBuilder(2, "更新")) + + /* 查询页面 */ + TabContent() { + Column() { + Column() { + /* 账号 */ + Row() { + Text($r('app.string.account')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .textAlign(TextAlign.Start) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('7.14%') + .margin({ top: 4 }) + + /* 用户名输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_account') }) + .fontColor(0x182431) + .defaultFocus(false) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.checkAccount = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down6'; + } + }) + } + .width('86.7%').height('7.14%') + + if (this.eventType === 'Down6') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + } + + /* 标签 */ + Row() { + Text($r('app.string.label')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .textAlign(TextAlign.Start) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('7.14%') + + /* 标签输入 */ + Row() { + TextInput({ placeholder: $r('app.string.please_input_label') }) + .fontColor(0x182431) + .defaultFocus(false) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.checkLabel = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down7'; + } + }) + } + .width('86.7%').height('7.14%') + + if (this.eventType === 'Down7') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431).margin({bottom: 4}) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431').margin({bottom: 4}) + } + } + .backgroundColor(0xFFFFFF).borderRadius(16) + + Blank() + Row() { + /* 底部按钮 */ + Button($r('app.string.search'), { type: ButtonType.Capsule, stateEffect: false }) + .backgroundColor(0x007DFF) + .borderRadius(20) + .width('86.7%') + .height(40) + .onClick(async () => { + // 需要执行的操作 + // 如果查询的时候输入了账号 则表示精确查询 进行二次访问控制 + if (this.checkAccount.length > 0) { + let challenge = await preQueryAssetPromise(this.checkAccount); + if (challenge.length == 0) { + log("查询失败") + return + } + this.challenge = challenge + getAuthTokenCallback(this.challenge, async (isSuccess: boolean, authToken: Uint8Array) => { + if (isSuccess) { + console.log('get auth token success!') + this.authToken = authToken + + let account = await queryAuthAssetPromise(this.checkAccount, this.challenge, this.authToken); + postQueryAssetPromise(this.challenge) + this.challenge = new Uint8Array; + this.authToken = new Uint8Array; + router.pushUrl({ + url: 'pages/QueryResultPage', + params: { + data_array_map: convertMapArrayToMapItem(new Array>(account)) + } + }, router.RouterMode.Standard, (err) => { + if (err) { + console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + }); + } + }); + } + else { + let accountList = queryAssetPromise(this.checkAccount, this.checkLabel); + accountList.then(data => { + router.pushUrl({ + url: 'pages/QueryResultPage', // 目标url + params: { + data_array_map: convertMapArrayToMapItem(data) + } + }, router.RouterMode.Standard, (err) => { + if (err) { + console.error(`Invoke pushUrl failed, code is ${err.code}, message is ${err.message}`); + return; + } + console.info('Invoke pushUrl succeeded.'); + }); + }) + } + }) + } + .margin({ bottom: '8.1%' }) + } + .height('100%') + + } + .tabBar(this.TabBuilder(3, "查询")) + } + .scrollable(true) + .backgroundColor(0xf1f3f5) + .barMode(BarMode.Fixed) + .barHeight(56) + .onChange(async (index: number) => { + if (index == 2 && this.index != 2) { + let challenge = await preQueryAssetPromise(""); + console.log('get challenge success!') + this.challenge = challenge + // get auth token + getAuthTokenCallback(this.challenge, async (isSuccess: boolean, authToken: Uint8Array) => { + if (isSuccess) { + console.log('get auth token success!') + this.authToken = authToken + let resultList = await queryAssetPromise('', ''); + for (let accountListElement of resultList) { + let str = accountListElement.get('alias'); + if (str !== undefined) { + this.assetArr.push(str) + } + } + } + }); + } else if (this.challenge.length > 0) { + postQueryAssetPromise(this.challenge) + this.challenge = new Uint8Array; + this.authToken = new Uint8Array; + this.assetArr = new Array(); + } + this.index = index; + }) + } +} diff --git a/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/QueryResultPage.ets b/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/QueryResultPage.ets new file mode 100755 index 000000000..1dddce07a --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/QueryResultPage.ets @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; + +interface AssetItem { + alias: string; + secret: string; + dataLabel: string; +} + +@Entry +@Component +struct QueryResultPage { + @State param: Record> = router.getParams() as Record>; + @State data: Array = this.param.data_array_map as Array; + + build() { + Column() { + Row() { + Image($r('app.media.back')) + .height(18) + .width(20) + .onClick(() => { + // 返回到上一页面,相当于pop操作 + router.back(); + }) + + Text($r('app.string.search_result')) + .fontFamily("HarmonyHeiTi") + .fontSize(20) + .fontColor(0x182431) + .lineHeight(28) + .fontWeight(700) + .margin({ left: '5%' }) + .textAlign(TextAlign.Center) + } + .width('86.7%').height(56) + + Column() { + List({ space: 0, initialIndex: 0 }) { + ForEach(this.data, (item: AssetItem) => { + ListItem() { + Column() { + Row() { + Row() { + Text($r('app.string.account')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + Blank() + Row() { + Text(item.alias.toString()) + .opacity(0.6) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(19) + .fontWeight(400) + .baselineOffset(0) + .margin({ top: '2.3%', bottom: '1.1%' }) + } + } + .width('86.7%').height('7.14%') + + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + + /* 密码/信用卡号 */ + if (item.secret) { + Row() { + Row() { + Text($r('app.string.secret_or_card_num')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .textAlign(TextAlign.Start) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + + Blank() + Row() { + Text(item.secret.toString()) + .opacity(0.6) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(19) + .fontWeight(400) + .textAlign(TextAlign.End) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + }.width('86.7%').height('6.7%') + } + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + /* 标签 */ + Row() { + Row() { + Text($r('app.string.label2')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .baselineOffset(0) + .textAlign(TextAlign.Start) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + + Blank() + Row() { + Text(item.dataLabel.toString()) + .opacity(0.6) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(19) + .fontWeight(400) + .baselineOffset(0) + .textAlign(TextAlign.End) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + }.width('86.7%').height('7.14%') + } + .margin({ left: 12, right: -12, bottom: 12 }) + .backgroundColor(0xFFFFFF).borderRadius(16) + } + }, (item: AssetItem) => JSON.stringify(item)) + } + .listDirection(Axis.Vertical) // 排列方向 + .edgeEffect(EdgeEffect.Spring) // 滑动到边缘无效果 + } + } + .width("100%").height("100%").backgroundColor(0xf1f3f5) + } + + pageTransition() { + // 定义页面进入时的效果,从右侧滑入,时长为1000ms,页面栈发生push操作时该效果才生效 + PageTransitionEnter({ type: RouteType.Push, duration: 300 }) + .slide(SlideEffect.Right) + // 定义页面进入时的效果,从左侧滑入,时长为1000ms,页面栈发生pop操作时该效果才生效 + PageTransitionEnter({ type: RouteType.Pop, duration: 300 }) + .slide(SlideEffect.Left) + // 定义页面退出时的效果,向左侧滑出,时长为1000ms,页面栈发生push操作时该效果才生效 + PageTransitionExit({ type: RouteType.Push, duration: 300 }) + .slide(SlideEffect.Left) + // 定义页面退出时的效果,向右侧滑出,时长为1000ms,页面栈发生pop操作时该效果才生效 + PageTransitionExit({ type: RouteType.Pop, duration: 300 }) + .slide(SlideEffect.Right) + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/UpdatePage.ets b/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/UpdatePage.ets new file mode 100755 index 000000000..e22d55da6 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/ets/pages/UpdatePage.ets @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { router } from '@kit.ArkUI'; +import { updateAssetPromise } from '../model/AssetModel'; + +function isUpdateClickable(reservePassword: string): boolean { + return reservePassword !== ''; +} + +@Entry +@Component +struct UpdatePage { + @State params: Record = router.getParams() as Record; + @State user: string = this.params.name as string; + @State pwd: string = this.params.pwd as string; + @State label: string = this.params.label as string; + @State reservePassword: string = this.pwd; + @State reserveLabel: string = this.label; + @State eventType: string = '' + + build() { + Column() { + Row() { + Image($r('app.media.back')) + .height(18) + .width(20) + .onClick(() => { + // 返回到上一页面,相当于pop操作 + router.back(); + }) + Text($r('app.string.update')) + .fontFamily("HarmonyHeiTi") + .fontSize(20) + .fontColor(0x182431) + .lineHeight(28) + .fontWeight(700) + .margin({ left: '5%' }) + .textAlign(TextAlign.Center) + }.width('86.7%').height(56) + + Column() { + /* 账号 */ + Row() { + Text($r('app.string.account')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .textAlign(TextAlign.Start) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('6.7%') + + /* 用户名输入 */ + Row() { + Text(this.user) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .opacity(0.6) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(400) + .textAlign(TextAlign.Start) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('6.7%') + + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + + /* 密码 */ + Row() { + Text("*").fontColor(0xFFE84026) + Text($r('app.string.secret_or_card_num')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('6.7%') + + /* 密码输入 */ + Row() { + TextInput({ text: this.pwd }) + .type(InputType.Password) + .defaultFocus(false) + .fontColor(0x182431) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.reservePassword = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down9'; + } + }) + .margin({ right: -12 }) + } + .width('86.7%').height('6.7%') + + if (this.eventType === 'Down9') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431') + } + + /* 标签 */ + Row() { + Text($r('app.string.label')) + .fontFamily("HarmonyHeiTi") + .fontSize(16) + .fontColor(0x182431) + .lineHeight(22) + .fontWeight(500) + .baselineOffset(0) + .textAlign(TextAlign.Start) + .padding({ top: '2.3%', bottom: '1.1%' }) + } + .width('86.7%').height('6.7%') + + /* 标签输入 */ + Row() { + TextInput({ text: this.label }) + .defaultFocus(false) + .fontColor(0x182431) + .padding({ top: '1.70%', right: '48.00px', bottom: '1.70%', left: '0' }) + .backgroundColor(Color.Transparent) + .placeholderFont({ size: 16, weight: 400, family: 'HarmonyHeiTi', style: FontStyle.Normal }) + .onChange((value: string) => { + this.reserveLabel = value; + }) + .onTouch((event: TouchEvent) => { + if (event.type === TouchType.Down) { + this.eventType = 'Down10'; + } + }) + } + .width('86.7%').height('6.7%') + + if (this.eventType === 'Down10') { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor(0x182431).margin({ bottom: 4 }) + } else { + Line() + .width('86.7%') + .height('0.5vp') + .margin({ + left: '12vp', + right: '12vp' + }) + .backgroundColor('#0D182431').margin({ bottom: 4 }) + } + } + .backgroundColor(0xFFFFFF).borderRadius(16) + + Blank() + Row() { + /* 底部按钮 */ + Button($r('app.string.update'), { type: ButtonType.Capsule, stateEffect: false }) + .backgroundColor(0x007DFF).fontColor('white') + .borderRadius(20) + .width('86.7%') + .height(40) + .enabled(isUpdateClickable(this.reservePassword)) + .onClick(() => { + updateAssetPromise(this.user, this.reservePassword, this.reserveLabel) + }) + } + .margin({ bottom: '8.1%' }) + } + // .margin({ right: 12, left: 12 }) + .width("100%").height('100%').backgroundColor(0xf1f3f5) + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/module.json5 b/code/BasicFeature/Security/Asset/entry/src/main/module.json5 new file mode 100755 index 000000000..1b25b5ea0 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/module.json5 @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "module": { + "name": "entry", + "type": "entry", + "description": "$string:module_desc", + "mainElement": "EntryAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "EntryAbility", + "srcEntry": "./ets/entryability/EntryAbility.ts", + "description": "$string:EntryAbility_desc", + "icon": "$media:app_icon", + "label": "$string:EntryAbility_label", + "startWindowIcon": "$media:app_icon", + "startWindowBackground": "$color:start_window_background", + "exported": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ], + "requestPermissions": [ + { + "name": "ohos.permission.ACCESS_BIOMETRIC" + }, + { + "name": "ohos.permission.STORE_PERSISTENT_DATA" + } + ] + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/color.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/color.json new file mode 100755 index 000000000..9cd507c23 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/color.json @@ -0,0 +1,32 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + }, + { + "name": "column_background_color", + "value": "#F5F5F5" + }, + { + "name": "custom_color", + "value": "#182431" + }, + { + "name": "custom_button_color", + "value": "#007DFF" + }, + { + "name": "custom_blank_color", + "value": "#F2F2F2" + }, + { + "name": "place_color", + "value": "#99000000" + }, + { + "name": "divider_color", + "value": "#0D182431" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/float.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/float.json new file mode 100755 index 000000000..bab9e1ffc --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/float.json @@ -0,0 +1,188 @@ +{ + "float": [ + { + "name": "image_back_size", + "value": "26vp" + }, + { + "name": "avatar_size", + "value": "56vp" + }, + { + "name": "personal_font_size", + "value": "16fp" + }, + { + "name": "title_hobbies_size", + "value": "20fp" + }, + { + "name": "title_line_height", + "value": "28vp" + }, + { + "name": "label_size", + "value": "16fp" + }, + { + "name": "options_height", + "value": "22vp" + }, + { + "name": "toggle_size", + "value": "20vp" + }, + { + "name": "options_top_distance", + "value": "13vp" + }, + { + "name": "options_bottom_distance", + "value": "13vp" + }, + { + "name": "divider_height", + "value": "0.5vp" + }, + { + "name": "list_top_distance", + "value": "14vp" + }, + { + "name": "list_bottom_distance", + "value": "8vp" + }, + { + "name": "options_list_height", + "value": "242vp" + }, + { + "name": "blank_width", + "value": "1vp" + }, + { + "name": "blank_opacity", + "value": "1vp" + }, + { + "name": "blank_height", + "value": "25vp" + }, + { + "name": "dialog_radius", + "value": "32vp" + }, + { + "name": "title_left_distance", + "value": "24vp" + }, + { + "name": "label_left_distance", + "value": "24vp" + }, + { + "name": "dialog_left_distance", + "value": "24vp" + }, + { + "name": "dialog_top_distance", + "value": "14vp" + }, + { + "name": "toggle_right_distance", + "value": "24vp" + }, + { + "name": "dialog_bottom_distance", + "value": "16vp" + }, + { + "name": "button_text_size", + "value": "16fp" + }, + { + "name": "button_height", + "value": "40vp" + }, + { + "name": "text_image_size", + "value": "24vp" + }, + { + "name": "image_left_distance", + "value": "12vp" + }, + { + "name": "text_size", + "value": "16vp" + }, + { + "name": "content_left_distance", + "value": "16vp" + }, + { + "name": "content_right_distance", + "value": "7vp" + }, + { + "name": "arrow_image_width", + "value": "12vp" + }, + { + "name": "arrow_image_height", + "value": "24vp" + }, + { + "name": "arrow_right_distance", + "value": "14vp" + }, + { + "name": "row_top_distance", + "value": "24vp" + }, + { + "name": "row_radius", + "value": "24vp" + }, + { + "name": "row_height", + "value": "64vp" + }, + { + "name": "input_image_size", + "value": "24vp" + }, + { + "name": "input_image_left", + "value": "12vp" + }, + { + "name": "input_text_size", + "value": "16fp" + }, + { + "name": "input_left_inside", + "value": "12vp" + }, + { + "name": "input_right_inside", + "value": "32vp" + }, + { + "name": "text_input_height", + "value": "48vp" + }, + { + "name": "input_row_top", + "value": "24vp" + }, + { + "name": "input_row_radius", + "value": "24vp" + }, + { + "name": "input_row_height", + "value": "64vp" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/images.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/images.json new file mode 100755 index 000000000..882cd74e4 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/images.json @@ -0,0 +1,8 @@ +{ + "boolean": [ + { + "name": "boolean_1", + "value": true + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/string.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/string.json new file mode 100755 index 000000000..30e25f63f --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/string.json @@ -0,0 +1,72 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "Main program entry" + }, + { + "name": "EntryAbility_label", + "value": "MultipleWindow" + }, + { + "name": "please_set_pwd", + "value": "please set screen password" + }, + { + "name": "auth_failed", + "value": "auth failed" + }, + { + "name": "account", + "value": "account" + }, + { + "name": "please_input_account", + "value": "please input account" + }, + { + "name": "secret_or_card_num", + "value": "secret or card number" + }, + { + "name": "please_input_secret_or_card_num", + "value": "please input secret or card number" + }, + { + "name": "label", + "value": "label(max 4, split by ;)" + }, + { + "name": "label2", + "value": "label" + }, + { + "name": "please_input_label", + "value": "please input label" + }, + { + "name": "save", + "value": "save" + }, + { + "name": "delete", + "value": "delete" + }, + { + "name": "search", + "value": "search" + }, + { + "name": "search_result", + "value": "search result" + }, + { + "name": "update", + "value": "update" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/stringarray.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/stringarray.json new file mode 100755 index 000000000..1e5f24381 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/element/stringarray.json @@ -0,0 +1,35 @@ +{ + "strarray": [ + { + "name": "sex_array", + "value": [ + { + "value": "male" + }, + { + "value": "female" + } + ] + }, + { + "name": "hobbies_data", + "value": [ + { + "value": "Soccer" + }, + { + "value": "Badminton" + }, + { + "value": "Travelling" + }, + { + "value": "Playing games" + }, + { + "value": "Reading books" + } + ] + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/base/profile/main_pages.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/profile/main_pages.json new file mode 100755 index 000000000..3b2fc05da --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/base/profile/main_pages.json @@ -0,0 +1,7 @@ +{ + "src": [ + "pages/Index", + "pages/QueryResultPage", + "pages/UpdatePage" + ] +} diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/en_US/element/string.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/en_US/element/string.json new file mode 100755 index 000000000..48f68a23e --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/en_US/element/string.json @@ -0,0 +1,72 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "module description" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + }, + { + "name": "please_set_pwd", + "value": "please set screen password" + }, + { + "name": "auth_failed", + "value": "auth failed" + }, + { + "name": "account", + "value": "account" + }, + { + "name": "please_input_account", + "value": "please input account" + }, + { + "name": "secret_or_card_num", + "value": "secret or card number" + }, + { + "name": "please_input_secret_or_card_num", + "value": "please input secret or card number" + }, + { + "name": "label", + "value": "label(max 4, split by ;)" + }, + { + "name": "label2", + "value": "label" + }, + { + "name": "please_input_label", + "value": "please input label" + }, + { + "name": "save", + "value": "save" + }, + { + "name": "delete", + "value": "delete" + }, + { + "name": "search", + "value": "search" + }, + { + "name": "search_result", + "value": "search result" + }, + { + "name": "update", + "value": "update" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/main/resources/zh_CN/element/string.json b/code/BasicFeature/Security/Asset/entry/src/main/resources/zh_CN/element/string.json new file mode 100755 index 000000000..e141961b0 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/main/resources/zh_CN/element/string.json @@ -0,0 +1,72 @@ +{ + "string": [ + { + "name": "module_desc", + "value": "模块描述" + }, + { + "name": "EntryAbility_desc", + "value": "description" + }, + { + "name": "EntryAbility_label", + "value": "label" + }, + { + "name": "please_set_pwd", + "value": "请设置锁屏密码" + }, + { + "name": "auth_failed", + "value": "认证失败" + }, + { + "name": "account", + "value": "账号" + }, + { + "name": "please_input_account", + "value": "请输入账号" + }, + { + "name": "secret_or_card_num", + "value": "密码/信用卡号" + }, + { + "name": "please_input_secret_or_card_num", + "value": "请输入密码/信用卡号" + }, + { + "name": "label", + "value": "标签(最多4个,以;分隔)" + }, + { + "name": "label2", + "value": "标签" + }, + { + "name": "please_input_label", + "value": "请输入标签名称" + }, + { + "name": "save", + "value": "保存" + }, + { + "name": "delete", + "value": "删除" + }, + { + "name": "search", + "value": "查询" + }, + { + "name": "search_result", + "value": "查询结果" + }, + { + "name": "update", + "value": "更新" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/Ability.test.ets b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/Ability.test.ets new file mode 100755 index 000000000..6641837fd --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/Ability.test.ets @@ -0,0 +1,126 @@ +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'; +import { addAssetPromise, + postQueryAssetPromise, + preQueryAssetPromise, + queryAssetPromise, + removeAssetPromise, + updateAssetPromise } from '../../../main/ets/model/AssetModel'; + +export default function abilityTest() { + describe('ActsAbilityTest', () => { + // Defines a test suite. Two parameters are supported: test suite name and test suite function. + beforeAll(() => { + // Presets an action, which is performed only once before all test cases of the test suite start. + // This API supports only one parameter: preset action function. + }) + beforeEach(() => { + // Presets an action, which is performed before each unit test case starts. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: preset action function. + }) + afterEach(() => { + // Presets a clear action, which is performed after each unit test case ends. + // The number of execution times is the same as the number of test cases defined by **it**. + // This API supports only one parameter: clear action function. + }) + afterAll(() => { + // Presets a clear action, which is performed after all test cases of the test suite end. + // This API supports only one parameter: clear action function. + }) + it('assertContain', 0, () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let a = 'abc'; + let b = 'b'; + // Defines a variety of assertion methods, which are used to declare expected boolean conditions. + expect(a).assertContain(b); + expect(a).assertEqual(a); + }) + it('assertAdd', 0, async () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let account = 'asset_account'; + let pwd = 'pwd'; + let label ='label1;label2'; + try { + await addAssetPromise(account, pwd, label); + let delete_label = 'label1'; + await removeAssetPromise(account, delete_label); + expect(0).assertEqual(0); + } catch (error) { + expect(0).assertEqual(false); + } + }) + + it('assertQuery', 0, async () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let account = 'asset_account'; + let pwd = 'pwd'; + let label ='label1;label2'; + try { + await addAssetPromise(account, pwd, label); + let query_label = 'label1'; + await queryAssetPromise(account, query_label); + let delete_label = 'label1'; + await removeAssetPromise(account, delete_label); + expect(0).assertEqual(0); + } catch (error) { + expect(0).assertEqual(false); + } + }) + + it('assertUpdate', 0, async () => { + // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function. + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let account = 'asset_account'; + let pwd = 'pwd'; + let label ='label1;label2'; + try { + await addAssetPromise(account, pwd, label); + let reserve_label = 'label1'; + let reserve_password = '123'; + await updateAssetPromise(account, reserve_password, reserve_label); + let delete_label = 'label1'; + await removeAssetPromise(account, delete_label); + expect(0).assertEqual(0); + } catch (error) { + expect(0).assertEqual(false); + } + }) + + it('assertDelete', 0, async () => { + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let account = 'asset_account'; + let pwd = 'pwd'; + let label ='label1;label2'; + try { + await addAssetPromise(account, pwd, label); + let delete_label = 'label1'; + await removeAssetPromise(account, delete_label); + expect(0).assertEqual(0); + } catch (error) { + expect(0).assertEqual(false); + } + }) + + it('assertPreQuery', 0, async () => { + hilog.info(0x0000, 'testTag', '%{public}s', 'it begin'); + let account = 'asset_account'; + let pwd = 'pwd'; + let label ='label1;label2'; + try { + await addAssetPromise(account, pwd, label); + let challenge = await preQueryAssetPromise(account); + await postQueryAssetPromise(challenge); + let delete_label = 'label1'; + await removeAssetPromise(account, delete_label); + expect(0).assertEqual(0); + } catch (error) { + expect(0).assertEqual(false); + } + }) + + }) +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/List.test.ets b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/List.test.ets new file mode 100755 index 000000000..794c7dc4e --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/test/List.test.ets @@ -0,0 +1,5 @@ +import abilityTest from './Ability.test'; + +export default function testsuite() { + abilityTest(); +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/TestAbility.ets b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/TestAbility.ets new file mode 100755 index 000000000..3e0434979 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/TestAbility.ets @@ -0,0 +1,47 @@ +import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit'; +import { abilityDelegatorRegistry } from '@kit.TestKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { window } from '@kit.ArkUI'; +import { Hypium } from '@ohos/hypium'; +import testsuite from '../test/List.test'; + +export default class TestAbility extends UIAbility { + onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onCreate'); + hilog.info(0x0000, 'testTag', '%{public}s', 'want param:' + JSON.stringify(want) ?? ''); + hilog.info(0x0000, 'testTag', '%{public}s', 'launchParam:' + JSON.stringify(launchParam) ?? ''); + let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator; + abilityDelegator = abilityDelegatorRegistry.getAbilityDelegator(); + let abilityDelegatorArguments: abilityDelegatorRegistry.AbilityDelegatorArgs; + abilityDelegatorArguments = abilityDelegatorRegistry.getArguments(); + hilog.info(0x0000, 'testTag', '%{public}s', 'start run testcase!!!'); + Hypium.hypiumTest(abilityDelegator, abilityDelegatorArguments, testsuite); + } + + onDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onDestroy'); + } + + onWindowStageCreate(windowStage: window.WindowStage) { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageCreate'); + windowStage.loadContent('testability/pages/Index', (err) => { + if (err.code) { + hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); + return; + } + hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.'); + }); + } + + onWindowStageDestroy() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onWindowStageDestroy'); + } + + onForeground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onForeground'); + } + + onBackground() { + hilog.info(0x0000, 'testTag', '%{public}s', 'TestAbility onBackground'); + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/pages/Index.ets b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/pages/Index.ets new file mode 100755 index 000000000..423b4276e --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testability/pages/Index.ets @@ -0,0 +1,17 @@ +@Entry +@Component +struct Index { + @State message: string = 'Hello World'; + + build() { + Row() { + Column() { + Text(this.message) + .fontSize(50) + .fontWeight(FontWeight.Bold) + } + .width('100%') + } + .height('100%') + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets new file mode 100755 index 000000000..0eb230c72 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/ets/testrunner/OpenHarmonyTestRunner.ets @@ -0,0 +1,90 @@ +import { abilityDelegatorRegistry, TestRunner } from '@kit.TestKit'; +import { UIAbility, Want } from '@kit.AbilityKit'; +import { BusinessError } from '@kit.BasicServicesKit'; +import { hilog } from '@kit.PerformanceAnalysisKit'; +import { resourceManager } from '@kit.LocalizationKit'; +import { util } from '@kit.ArkTS'; + +let abilityDelegator: abilityDelegatorRegistry.AbilityDelegator; +let abilityDelegatorArguments: abilityDelegatorRegistry.AbilityDelegatorArgs; +let jsonPath: string = 'mock/mock-config.json'; +let tag: string = 'testTag'; + +async function onAbilityCreateCallback(data: UIAbility) { + hilog.info(0x0000, 'testTag', 'onAbilityCreateCallback, data: ${}', JSON.stringify(data)); +} + +async function addAbilityMonitorCallback(err: BusinessError) { + hilog.info(0x0000, 'testTag', 'addAbilityMonitorCallback : %{public}s', JSON.stringify(err) ?? ''); +} + +export default class OpenHarmonyTestRunner implements TestRunner { + constructor() { + } + + onPrepare() { + hilog.info(0x0000, 'testTag', '%{public}s', 'OpenHarmonyTestRunner OnPrepare'); + } + + async onRun() { + let tag = 'testTag'; + hilog.info(0x0000, tag, '%{public}s', 'OpenHarmonyTestRunner onRun run'); + abilityDelegatorArguments = abilityDelegatorRegistry.getArguments() + abilityDelegator = abilityDelegatorRegistry.getAbilityDelegator() + let moduleName = abilityDelegatorArguments.parameters['-m']; + let context = abilityDelegator.getAppContext().getApplicationContext().createModuleContext(moduleName); + let mResourceManager = context.resourceManager; + await checkMock(abilityDelegator, mResourceManager); + const bundleName = abilityDelegatorArguments.bundleName; + const testAbilityName: string = 'TestAbility'; + let lMonitor: abilityDelegatorRegistry.AbilityMonitor = { + abilityName: testAbilityName, + onAbilityCreate: onAbilityCreateCallback, + moduleName: moduleName + }; + abilityDelegator.addAbilityMonitor(lMonitor, addAbilityMonitorCallback) + const want: Want = { + bundleName: bundleName, + abilityName: testAbilityName, + moduleName: moduleName + }; + abilityDelegator.startAbility(want, (err: BusinessError, data: void) => { + hilog.info(0x0000, tag, 'startAbility : err : %{public}s', JSON.stringify(err) ?? ''); + hilog.info(0x0000, tag, 'startAbility : data : %{public}s', JSON.stringify(data) ?? ''); + }) + hilog.info(0x0000, tag, '%{public}s', 'OpenHarmonyTestRunner onRun end'); + } +} + +async function checkMock(abilityDelegator: abilityDelegatorRegistry.AbilityDelegator, resourceManager: resourceManager.ResourceManager) { + let rawFile: Uint8Array; + try { + rawFile = resourceManager.getRawFileContentSync(jsonPath); + hilog.info(0x0000, tag, 'MockList file exists'); + let mockStr: string = util.TextDecoder.create("utf-8", { ignoreBOM: true }).decodeWithStream(rawFile); + let mockMap: Record = getMockList(mockStr); + try { + abilityDelegator.setMockList(mockMap) + } catch (error) { + let code = (error as BusinessError).code; + let message = (error as BusinessError).message; + hilog.error(0x0000, tag, `abilityDelegator.setMockList failed, error code: ${code}, message: ${message}.`); + } + } catch (error) { + let code = (error as BusinessError).code; + let message = (error as BusinessError).message; + hilog.error(0x0000, tag, `ResourceManager:callback getRawFileContent failed, error code: ${code}, message: ${message}.`); + } +} + +function getMockList(jsonStr: string) { + let jsonObj: Record = JSON.parse(jsonStr); + let map: Map = new Map(Object.entries(jsonObj)); + let mockList: Record = {}; + map.forEach((value: object, key: string) => { + let realValue: string = value['source'].toString(); + mockList[key] = realValue; + }); + hilog.info(0x0000, tag, '%{public}s', 'mock-json value:' + JSON.stringify(mockList) ?? ''); + return mockList; +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/module.json5 b/code/BasicFeature/Security/Asset/entry/src/ohosTest/module.json5 new file mode 100755 index 000000000..751c66094 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/module.json5 @@ -0,0 +1,36 @@ +{ + "module": { + "name": "entry_test", + "type": "feature", + "description": "$string:module_test_desc", + "mainElement": "TestAbility", + "deviceTypes": [ + "default" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:test_pages", + "abilities": [ + { + "name": "TestAbility", + "srcEntry": "./ets/testability/TestAbility.ets", + "description": "$string:TestAbility_desc", + "icon": "$media:icon", + "label": "$string:TestAbility_label", + "exported": true, + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:start_window_background", + "skills": [ + { + "actions": [ + "action.system.home" + ], + "entities": [ + "entity.system.home" + ] + } + ] + } + ] + } +} diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/color.json b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/color.json new file mode 100755 index 000000000..3c712962d --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "start_window_background", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/string.json b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/string.json new file mode 100755 index 000000000..65d8fa5a7 --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "module_test_desc", + "value": "test ability description" + }, + { + "name": "TestAbility_desc", + "value": "the test ability" + }, + { + "name": "TestAbility_label", + "value": "test label" + } + ] +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/media/icon.png b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/media/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..cd45accb1dfd2fd0da16c732c72faa6e46b26521 GIT binary patch literal 2041 zcmaJ?c~nzZ9u6@;0AXaYAVN(;Kr(@>EJ+}skOWf=BA~*l4us@ELY9{%0m5QX6pnb} z(jZF|S&pLAS}3BZAfeQSvJ_h>F2Q1PYqi?o5`;m_yjZdG$1v}l_wK#F^L^iMz2}uD z#K$>1dON~kFlWvhW+Jp=tuN9J`ZlM-rl4h+ij|^D0y9;4JOuz-EdVnB6i3R-0ulk9 zApi4zAQA>!N9@-o026$1@L`d124`3G5<@_m`0f)Ug_Ie~;HT2q<_a=HH> zDwTdfD^-cW-|_xWVP$f@93UhDN-#&khZ>jZXLTi~$0`7x3REP6pk%&^2|`c>DutjN zMJD4Zs6Z}{FOpd;*mo2zm(GzXRXiCV;4m3zNCYnu3Fy=i5;2An&Lp!#LP;bRD~1&s z%VH6UY+}r6YDgG+p34OJIZ{BTn&%4s=CT&#TBkuOhdeU@g(w#guoa*b^)73=XyI65 z7Swys6)YS}?1EeZ6b!-I+yCnIya^g0>-NLsLWd8t56GZ_S3r|ZGbR+mV2ErEb9J)X zIF!njY-D-7{qtF2(?nlQ$0}!pzt=}hc*m%%)0Jb#N_K4@IC-`Pi5DahPZN7N9rH;ol;Gc*>-Go@gXKTM{eP)iJj6CYTIi}B#zLKZYD@_;m zrXmXXsFq@~ou-z!9bHoM8*(hwl>X(zm)TDcdkF4lZm$1jP*HbnD`o1$g}_R#+bu2D zr%7Y8KdsaC-V*aem5#@*M%r^GPgu%P2e-BnBClhP2yoGFe40>);=}>{NONtkXQ01p z)OX^t2Ojhddot9eg0WTIVSTNBa}7V-^_pO595w|Hx9q?k4dMp@$G7PK*TD=y;ck6J zdGRB!_RAI2nR3%tO1IkdWp*bw*?<=pM_LZb30?!oK)s;En( z!#nnd9=cXJ<}+e{XLdx(q3&ikJISe?eSHHohk+pz+$6Cv{ytvc{QXmMn2XQ9U8rvt zrJdAn(0gpSD@N=yTrI_2^P#*zQg7MTp1)k(lv(*(KtUR6@M|2WB>2wRwC-h=wk6XF zPtSes*_JwI+^d>xW489MJw5R6=t5?{R zc|E8i?RL@p9)A3ZJAQOg`}+F;<_vnWA!KxR#g%jZ@y_1Qu#Uw)kFPw_xmZ?a^e*1{ zM|ImtqA|(CaDQ@Fyvcof`MN66&VI6m6gAyAXx`%cDx6BI{Bj#}V*Rn1(b~;Am)D2u zX7(027IO?Z2VYK^1vXXpoZ@AtH~N?0rYWwtyA15`6vEf6fk&;o-L;7zFt`5nk*iOy z`<918zB+k;EytI$FAXug)jk*e@e};4e9g__w4A5ev!!)H$yC@{?vsRqJ##X1R%xPG z&_R3oDi$MtTkVqfPj)HEUDx_7wd!y{8#1%$U*Dd0sK@=#6+!XlsE-s^1f5E`R9Wo71^b~mbVdU;Fw0LG~mUQg;xsX4QYRo3B@rH_=ry>DE8ef!c2ta8UcI#26# zF|`*4wtMHe@%#eGZw`#Yj|QWuB`eRD)b~)r9mM95p_JVG%-IdcbIX5qG#GpGD+IrS zEqxb1Rg&Dadk5#7t4j68I1f!@A$efp1?I%&d*56)yl!tkz!14<$0Od_&6cGw$WW0r zjSlQA7l*6;vgfhv!cR|RmAD$+w6j`rVf=-?-D@q>kOseUVSb*~jbAS^*1h?ZL)n(9 zDa}`4etXO6`}9;{k5E^N{rcfnV_(LPwsDg``wtyS*V<19c3!PGJ3Kqy9ksvkwbJ%Z z*N(fT0{e*Wji-Ck5!3YE0j|PZ@&z`v=kitWL$bqSt!e4bH!+(|Q)CZ30^nVPfkx{s zX{6of`p=BiPb@u@IyL!tRk>?qgBqCmo-Zlt!636g?z`s~zdfwuB7DXZHvV`Usp+%Z zo*&;Biu@MHE&2j+?j^o`Cr12u<>vOe=a&8a2hlcmFjJiDR>XnD4c4DAhZWCkiAgW{ E51q9-lK=n! literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/profile/test_pages.json b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/profile/test_pages.json new file mode 100755 index 000000000..b7e7343ca --- /dev/null +++ b/code/BasicFeature/Security/Asset/entry/src/ohosTest/resources/base/profile/test_pages.json @@ -0,0 +1,5 @@ +{ + "src": [ + "testability/pages/Index" + ] +} diff --git a/code/BasicFeature/Security/Asset/hvigor/hvigor-config.json5 b/code/BasicFeature/Security/Asset/hvigor/hvigor-config.json5 new file mode 100755 index 000000000..2e2412443 --- /dev/null +++ b/code/BasicFeature/Security/Asset/hvigor/hvigor-config.json5 @@ -0,0 +1,18 @@ +{ + "hvigorVersion": "4.0.1", + "dependencies": { + "@ohos/hvigor-ohos-plugin": "4.0.1" + }, + "execution": { + // "daemon": true, /* Enable daemon compilation. Default: true */ + // "incremental": true, /* Enable incremental compilation. Default: true */ + // "parallel": true, /* Enable parallel compilation. Default: true */ + // "typeCheck": false, /* Enable typeCheck. Default: false */ + }, + "logging": { + // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ + }, + "debugging": { + // "stacktrace": false /* Disable stacktrace compilation. Default: false */ + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/hvigor/hvigor-wrapper.js b/code/BasicFeature/Security/Asset/hvigor/hvigor-wrapper.js new file mode 100755 index 000000000..26073b8c2 --- /dev/null +++ b/code/BasicFeature/Security/Asset/hvigor/hvigor-wrapper.js @@ -0,0 +1 @@ +"use strict";var u=require("path"),D=require("os"),e=require("fs"),t=require("crypto"),r=require("child_process"),n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},i={},C={},E=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(C,"__esModule",{value:!0}),C.maxPathLength=C.isMac=C.isLinux=C.isWindows=void 0;const F=E(D),A="Windows_NT",o="Darwin";function a(){return F.default.type()===A}function c(){return F.default.type()===o}C.isWindows=a,C.isLinux=function(){return"Linux"===F.default.type()},C.isMac=c,C.maxPathLength=function(){return c()?1016:a()?259:4095},function(e){var t=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),r=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),i=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&t(D,u,e);return r(D,u),D};Object.defineProperty(e,"__esModule",{value:!0}),e.ENABLE_SIGN_TASK_KEY=e.HVIGOR_CACHE_DIR_KEY=e.WORK_SPACE=e.HVIGOR_PROJECT_WRAPPER_HOME=e.HVIGOR_PROJECT_ROOT_DIR=e.HVIGOR_PROJECT_CACHES_HOME=e.HVIGOR_PNPM_STORE_PATH=e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=e.PROJECT_CACHES=e.HVIGOR_WRAPPER_TOOLS_HOME=e.HVIGOR_USER_HOME=e.DEFAULT_PACKAGE_JSON=e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME=e.PNPM=e.HVIGOR=e.NPM_TOOL=e.PNPM_TOOL=e.HVIGOR_ENGINE_PACKAGE_NAME=void 0;const E=i(D),F=i(u),A=C;e.HVIGOR_ENGINE_PACKAGE_NAME="@ohos/hvigor",e.PNPM_TOOL=(0,A.isWindows)()?"pnpm.cmd":"pnpm",e.NPM_TOOL=(0,A.isWindows)()?"npm.cmd":"npm",e.HVIGOR="hvigor",e.PNPM="pnpm",e.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME="hvigor-config.json5",e.DEFAULT_PACKAGE_JSON="package.json",e.HVIGOR_USER_HOME=F.resolve(E.homedir(),".hvigor"),e.HVIGOR_WRAPPER_TOOLS_HOME=F.resolve(e.HVIGOR_USER_HOME,"wrapper","tools"),e.PROJECT_CACHES="project_caches",e.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH=F.resolve(e.HVIGOR_WRAPPER_TOOLS_HOME,"node_modules",".bin",e.PNPM_TOOL),e.HVIGOR_PNPM_STORE_PATH=F.resolve(e.HVIGOR_USER_HOME,"caches"),e.HVIGOR_PROJECT_CACHES_HOME=F.resolve(e.HVIGOR_USER_HOME,e.PROJECT_CACHES),e.HVIGOR_PROJECT_ROOT_DIR=process.cwd(),e.HVIGOR_PROJECT_WRAPPER_HOME=F.resolve(e.HVIGOR_PROJECT_ROOT_DIR,e.HVIGOR),e.WORK_SPACE="workspace",e.HVIGOR_CACHE_DIR_KEY="hvigor.cacheDir",e.ENABLE_SIGN_TASK_KEY="enableSignTask"}(i);var s={},l={};Object.defineProperty(l,"__esModule",{value:!0}),l.logInfoPrintConsole=l.logErrorAndExit=void 0,l.logErrorAndExit=function(u){u instanceof Error?console.error(u.message):console.error(u),process.exit(-1)},l.logInfoPrintConsole=function(u){console.log(u)};var B=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),d=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),f=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&B(D,u,e);return d(D,u),D};Object.defineProperty(s,"__esModule",{value:!0});var _=s.executeBuild=void 0;const O=f(e),p=f(u),h=l;_=s.executeBuild=function(u){const D=p.resolve(u,"node_modules","@ohos","hvigor","bin","hvigor.js");try{const u=O.realpathSync(D);require(u)}catch(e){(0,h.logErrorAndExit)(`Error: ENOENT: no such file ${D},delete ${u} and retry.`)}};var P={},v={};!function(u){var D=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(u,"__esModule",{value:!0}),u.hashFile=u.hash=u.createHash=void 0;const r=D(t),i=D(e);u.createHash=(u="MD5")=>r.default.createHash(u);u.hash=(D,e)=>(0,u.createHash)(e).update(D).digest("hex");u.hashFile=(D,e)=>{if(i.default.existsSync(D))return(0,u.hash)(i.default.readFileSync(D,"utf-8"),e)}}(v);var g={},m={},R={};Object.defineProperty(R,"__esModule",{value:!0}),R.Unicode=void 0;class I{}R.Unicode=I,I.SPACE_SEPARATOR=/[\u1680\u2000-\u200A\u202F\u205F\u3000]/,I.ID_START=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]/,I.ID_CONTINUE=/[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u09FC\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9-\u0AFF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D00-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF9\u1D00-\u1DF9\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312E\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEA\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF2D-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDE00-\uDE3E\uDE47\uDE50-\uDE83\uDE86-\uDE99\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD36\uDD3A\uDD3C\uDD3D\uDD3F-\uDD47\uDD50-\uDD59]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/,Object.defineProperty(m,"__esModule",{value:!0}),m.JudgeUtil=void 0;const y=R;m.JudgeUtil=class{static isIgnoreChar(u){return"string"==typeof u&&("\t"===u||"\v"===u||"\f"===u||" "===u||" "===u||"\ufeff"===u||"\n"===u||"\r"===u||"\u2028"===u||"\u2029"===u)}static isSpaceSeparator(u){return"string"==typeof u&&y.Unicode.SPACE_SEPARATOR.test(u)}static isIdStartChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||"$"===u||"_"===u||y.Unicode.ID_START.test(u))}static isIdContinueChar(u){return"string"==typeof u&&(u>="a"&&u<="z"||u>="A"&&u<="Z"||u>="0"&&u<="9"||"$"===u||"_"===u||"‌"===u||"‍"===u||y.Unicode.ID_CONTINUE.test(u))}static isDigitWithoutZero(u){return/[1-9]/.test(u)}static isDigit(u){return"string"==typeof u&&/[0-9]/.test(u)}static isHexDigit(u){return"string"==typeof u&&/[0-9A-Fa-f]/.test(u)}};var N=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(g,"__esModule",{value:!0}),g.parseJsonText=g.parseJsonFile=void 0;const S=N(e),b=N(D),w=N(u),H=m;var x;!function(u){u[u.Char=0]="Char",u[u.EOF=1]="EOF",u[u.Identifier=2]="Identifier"}(x||(x={}));let M,T,G,V,j,J,U="start",L=[],W=0,$=1,K=0,k=!1,z="default",q="'",Z=1;function Y(u,D=!1){T=String(u),U="start",L=[],W=0,$=1,K=0,V=void 0,k=D;do{M=X(),nu[U]()}while("eof"!==M.type);return V}function X(){for(z="default",j="",q="'",Z=1;;){J=Q();const u=Du[z]();if(u)return u}}function Q(){if(T[W])return String.fromCodePoint(T.codePointAt(W))}function uu(){const u=Q();return"\n"===u?($++,K=0):u?K+=u.length:K++,u&&(W+=u.length),u}g.parseJsonFile=function(u,D=!1,e="utf-8"){const t=S.default.readFileSync(w.default.resolve(u),{encoding:e});try{return Y(t,D)}catch(D){if(D instanceof SyntaxError){const e=D.message.split("at");if(2===e.length)throw new Error(`${e[0].trim()}${b.default.EOL}\t at ${u}:${e[1].trim()}`)}throw new Error(`${u} is not in valid JSON/JSON5 format.`)}},g.parseJsonText=Y;const Du={default(){switch(J){case"/":return uu(),void(z="comment");case void 0:return uu(),eu("eof")}if(!H.JudgeUtil.isIgnoreChar(J)&&!H.JudgeUtil.isSpaceSeparator(J))return Du[U]();uu()},start(){z="value"},beforePropertyName(){switch(J){case"$":case"_":return j=uu(),void(z="identifierName");case"\\":return uu(),void(z="identifierNameStartEscape");case"}":return eu("punctuator",uu());case'"':case"'":return q=J,uu(),void(z="string")}if(H.JudgeUtil.isIdStartChar(J))return j+=uu(),void(z="identifierName");throw Fu(x.Char,uu())},afterPropertyName(){if(":"===J)return eu("punctuator",uu());throw Fu(x.Char,uu())},beforePropertyValue(){z="value"},afterPropertyValue(){switch(J){case",":case"}":return eu("punctuator",uu())}throw Fu(x.Char,uu())},beforeArrayValue(){if("]"===J)return eu("punctuator",uu());z="value"},afterArrayValue(){switch(J){case",":case"]":return eu("punctuator",uu())}throw Fu(x.Char,uu())},end(){throw Fu(x.Char,uu())},comment(){switch(J){case"*":return uu(),void(z="multiLineComment");case"/":return uu(),void(z="singleLineComment")}throw Fu(x.Char,uu())},multiLineComment(){switch(J){case"*":return uu(),void(z="multiLineCommentAsterisk");case void 0:throw Fu(x.Char,uu())}uu()},multiLineCommentAsterisk(){switch(J){case"*":return void uu();case"/":return uu(),void(z="default");case void 0:throw Fu(x.Char,uu())}uu(),z="multiLineComment"},singleLineComment(){switch(J){case"\n":case"\r":case"\u2028":case"\u2029":return uu(),void(z="default");case void 0:return uu(),eu("eof")}uu()},value(){switch(J){case"{":case"[":return eu("punctuator",uu());case"n":return uu(),tu("ull"),eu("null",null);case"t":return uu(),tu("rue"),eu("boolean",!0);case"f":return uu(),tu("alse"),eu("boolean",!1);case"-":case"+":return"-"===uu()&&(Z=-1),void(z="numerical");case".":case"0":case"I":case"N":return void(z="numerical");case'"':case"'":return q=J,uu(),j="",void(z="string")}if(void 0===J||!H.JudgeUtil.isDigitWithoutZero(J))throw Fu(x.Char,uu());z="numerical"},numerical(){switch(J){case".":return j=uu(),void(z="decimalPointLeading");case"0":return j=uu(),void(z="zero");case"I":return uu(),tu("nfinity"),eu("numeric",Z*(1/0));case"N":return uu(),tu("aN"),eu("numeric",NaN)}if(void 0!==J&&H.JudgeUtil.isDigitWithoutZero(J))return j=uu(),void(z="decimalInteger");throw Fu(x.Char,uu())},zero(){switch(J){case".":case"e":case"E":return void(z="decimal");case"x":case"X":return j+=uu(),void(z="hexadecimal")}return eu("numeric",0)},decimalInteger(){switch(J){case".":case"e":case"E":return void(z="decimal")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimal(){switch(J){case".":j+=uu(),z="decimalFraction";break;case"e":case"E":j+=uu(),z="decimalExponent"}},decimalPointLeading(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalFraction");throw Fu(x.Char,uu())},decimalFraction(){switch(J){case"e":case"E":return j+=uu(),void(z="decimalExponent")}if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},decimalExponent(){switch(J){case"+":case"-":return j+=uu(),void(z="decimalExponentSign")}if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Fu(x.Char,uu())},decimalExponentSign(){if(H.JudgeUtil.isDigit(J))return j+=uu(),void(z="decimalExponentInteger");throw Fu(x.Char,uu())},decimalExponentInteger(){if(!H.JudgeUtil.isDigit(J))return eu("numeric",Z*Number(j));j+=uu()},hexadecimal(){if(H.JudgeUtil.isHexDigit(J))return j+=uu(),void(z="hexadecimalInteger");throw Fu(x.Char,uu())},hexadecimalInteger(){if(!H.JudgeUtil.isHexDigit(J))return eu("numeric",Z*Number(j));j+=uu()},identifierNameStartEscape(){if("u"!==J)throw Fu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":break;default:if(!H.JudgeUtil.isIdStartChar(u))throw Fu(x.Identifier)}j+=u,z="identifierName"},identifierName(){switch(J){case"$":case"_":case"‌":case"‍":return void(j+=uu());case"\\":return uu(),void(z="identifierNameEscape")}if(!H.JudgeUtil.isIdContinueChar(J))return eu("identifier",j);j+=uu()},identifierNameEscape(){if("u"!==J)throw Fu(x.Char,uu());uu();const u=ru();switch(u){case"$":case"_":case"‌":case"‍":break;default:if(!H.JudgeUtil.isIdContinueChar(u))throw Fu(x.Identifier)}j+=u,z="identifierName"},string(){switch(J){case"\\":return uu(),void(j+=function(){const u=Q(),D=function(){switch(Q()){case"b":return uu(),"\b";case"f":return uu(),"\f";case"n":return uu(),"\n";case"r":return uu(),"\r";case"t":return uu(),"\t";case"v":return uu(),"\v"}return}();if(D)return D;switch(u){case"0":if(uu(),H.JudgeUtil.isDigit(Q()))throw Fu(x.Char,uu());return"\0";case"x":return uu(),function(){let u="",D=Q();if(!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());if(u+=uu(),D=Q(),!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());return u+=uu(),String.fromCodePoint(parseInt(u,16))}();case"u":return uu(),ru();case"\n":case"\u2028":case"\u2029":return uu(),"";case"\r":return uu(),"\n"===Q()&&uu(),""}if(void 0===u||H.JudgeUtil.isDigitWithoutZero(u))throw Fu(x.Char,uu());return uu()}());case'"':case"'":if(J===q){const u=eu("string",j);return uu(),u}return void(j+=uu());case"\n":case"\r":case void 0:throw Fu(x.Char,uu());case"\u2028":case"\u2029":!function(u){console.warn(`JSON5: '${Eu(u)}' in strings is not valid ECMAScript; consider escaping.`)}(J)}j+=uu()}};function eu(u,D){return{type:u,value:D,line:$,column:K}}function tu(u){for(const D of u){if(Q()!==D)throw Fu(x.Char,uu());uu()}}function ru(){let u="",D=4;for(;D-- >0;){const D=Q();if(!H.JudgeUtil.isHexDigit(D))throw Fu(x.Char,uu());u+=uu()}return String.fromCodePoint(parseInt(u,16))}const nu={start(){if("eof"===M.type)throw Fu(x.EOF);iu()},beforePropertyName(){switch(M.type){case"identifier":case"string":return G=M.value,void(U="afterPropertyName");case"punctuator":return void Cu();case"eof":throw Fu(x.EOF)}},afterPropertyName(){if("eof"===M.type)throw Fu(x.EOF);U="beforePropertyValue"},beforePropertyValue(){if("eof"===M.type)throw Fu(x.EOF);iu()},afterPropertyValue(){if("eof"===M.type)throw Fu(x.EOF);switch(M.value){case",":return void(U="beforePropertyName");case"}":Cu()}},beforeArrayValue(){if("eof"===M.type)throw Fu(x.EOF);"punctuator"!==M.type||"]"!==M.value?iu():Cu()},afterArrayValue(){if("eof"===M.type)throw Fu(x.EOF);switch(M.value){case",":return void(U="beforeArrayValue");case"]":Cu()}},end(){}};function iu(){const u=function(){let u;switch(M.type){case"punctuator":switch(M.value){case"{":u={};break;case"[":u=[]}break;case"null":case"boolean":case"numeric":case"string":u=M.value}return u}();if(k&&"object"==typeof u&&(u._line=$,u._column=K),void 0===V)V=u;else{const D=L[L.length-1];Array.isArray(D)?k&&"object"!=typeof u?D.push({value:u,_line:$,_column:K}):D.push(u):D[G]=k&&"object"!=typeof u?{value:u,_line:$,_column:K}:u}!function(u){if(u&&"object"==typeof u)L.push(u),U=Array.isArray(u)?"beforeArrayValue":"beforePropertyName";else{const u=L[L.length-1];U=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}}(u)}function Cu(){L.pop();const u=L[L.length-1];U=u?Array.isArray(u)?"afterArrayValue":"afterPropertyValue":"end"}function Eu(u){const D={"'":"\\'",'"':'\\"',"\\":"\\\\","\b":"\\b","\f":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","\v":"\\v","\0":"\\0","\u2028":"\\u2028","\u2029":"\\u2029"};if(D[u])return D[u];if(u<" "){const D=u.charCodeAt(0).toString(16);return`\\x${`00${D}`.substring(D.length)}`}return u}function Fu(u,D){let e="";switch(u){case x.Char:e=void 0===D?`JSON5: invalid end of input at ${$}:${K}`:`JSON5: invalid character '${Eu(D)}' at ${$}:${K}`;break;case x.EOF:e=`JSON5: invalid end of input at ${$}:${K}`;break;case x.Identifier:K-=5,e=`JSON5: invalid identifier character at ${$}:${K}`}const t=new Au(e);return t.lineNumber=$,t.columnNumber=K,t}class Au extends SyntaxError{}var ou={},au=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),cu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),su=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&au(D,u,e);return cu(D,u),D},lu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(ou,"__esModule",{value:!0}),ou.isFileExists=ou.offlinePluginConversion=ou.executeCommand=ou.getNpmPath=ou.hasNpmPackInPaths=void 0;const Bu=r,du=lu(e),fu=su(u),_u=i,Ou=l;ou.hasNpmPackInPaths=function(u,D){try{return require.resolve(u,{paths:[...D]}),!0}catch(u){return!1}},ou.getNpmPath=function(){const u=process.execPath;return fu.join(fu.dirname(u),_u.NPM_TOOL)},ou.executeCommand=function(u,D,e){0!==(0,Bu.spawnSync)(u,D,e).status&&(0,Ou.logErrorAndExit)(`Error: ${u} ${D} execute failed.See above for details.`)},ou.offlinePluginConversion=function(u,D){return D.startsWith("file:")||D.endsWith(".tgz")?fu.resolve(u,_u.HVIGOR,D.replace("file:","")):D},ou.isFileExists=function(u){return du.default.existsSync(u)&&du.default.statSync(u).isFile()};var pu=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),hu=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),Pu=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&pu(D,u,e);return hu(D,u),D},vu=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(P,"__esModule",{value:!0});var gu=P.initProjectWorkSpace=void 0;const mu=Pu(e),Ru=vu(D),Iu=Pu(u),yu=i,Nu=v,Su=g,bu=l,wu=ou;let Hu,xu,Mu;function Tu(u,D,e){return void 0!==e.dependencies&&(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,D.dependencies[u])===Iu.normalize(e.dependencies[u])}gu=P.initProjectWorkSpace=function(){if(Hu=function(){const u=Iu.resolve(yu.HVIGOR_PROJECT_WRAPPER_HOME,yu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);mu.existsSync(u)||(0,bu.logErrorAndExit)(`Error: Hvigor config file ${u} does not exist.`);return(0,Su.parseJsonFile)(u)}(),Mu=function(u){let D;D=function(u){const D=u.hvigorVersion;if(D.startsWith("file:")||D.endsWith(".tgz"))return!1;const e=u.dependencies,t=Object.getOwnPropertyNames(e);for(const u of t){const D=e[u];if(D.startsWith("file:")||D.endsWith(".tgz"))return!1}if(1===t.length&&"@ohos/hvigor-ohos-plugin"===t[0])return D>"2.5.0";return!1}(u)?function(u){let D=`${yu.HVIGOR_ENGINE_PACKAGE_NAME}@${u.hvigorVersion}`;const e=u.dependencies;if(e){Object.getOwnPropertyNames(e).sort().forEach((u=>{D+=`,${u}@${e[u]}`}))}return(0,Nu.hash)(D)}(u):(0,Nu.hash)(process.cwd());return Iu.resolve(Ru.default.homedir(),".hvigor","project_caches",D)}(Hu),xu=function(){const u=Iu.resolve(Mu,yu.WORK_SPACE,yu.DEFAULT_PACKAGE_JSON);return mu.existsSync(u)?(0,Su.parseJsonFile)(u):{dependencies:{}}}(),function(){const u=Iu.resolve(yu.HVIGOR_USER_HOME,yu.DEFAULT_HVIGOR_CONFIG_JSON_FILE_NAME);if(mu.existsSync(u))(0,Su.parseJsonFile)(u)}(),!(0,wu.hasNpmPackInPaths)(yu.HVIGOR_ENGINE_PACKAGE_NAME,[Iu.join(Mu,yu.WORK_SPACE)])||(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion)!==xu.dependencies[yu.HVIGOR_ENGINE_PACKAGE_NAME]||!function(){function u(u){const D=null==u?void 0:u.dependencies;return void 0===D?0:Object.getOwnPropertyNames(D).length}const D=u(Hu),e=u(xu);if(D+1!==e)return!1;for(const u in null==Hu?void 0:Hu.dependencies)if(!(0,wu.hasNpmPackInPaths)(u,[Iu.join(Mu,yu.WORK_SPACE)])||!Tu(u,Hu,xu))return!1;return!0}())try{!function(){(0,bu.logInfoPrintConsole)("Hvigor installing...");for(const u in Hu.dependencies)Hu.dependencies[u]&&(Hu.dependencies[u]=(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.dependencies[u]));const u={dependencies:{...Hu.dependencies}};u.dependencies[yu.HVIGOR_ENGINE_PACKAGE_NAME]=(0,wu.offlinePluginConversion)(yu.HVIGOR_PROJECT_ROOT_DIR,Hu.hvigorVersion);const D=Iu.join(Mu,yu.WORK_SPACE);try{mu.mkdirSync(D,{recursive:!0});const e=Iu.resolve(D,yu.DEFAULT_PACKAGE_JSON);mu.writeFileSync(e,JSON.stringify(u))}catch(u){(0,bu.logErrorAndExit)(u)}(function(){const u=["config","set","store-dir",yu.HVIGOR_PNPM_STORE_PATH],D={cwd:Iu.join(Mu,yu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(yu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)})(),function(){const u=["install"],D={cwd:Iu.join(Mu,yu.WORK_SPACE),stdio:["inherit","inherit","inherit"]};(0,wu.executeCommand)(yu.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH,u,D)}(),(0,bu.logInfoPrintConsole)("Hvigor install success.")}()}catch(u){!function(){const u=Iu.join(Mu,yu.WORK_SPACE);if((0,bu.logInfoPrintConsole)("Hvigor cleaning..."),!mu.existsSync(u))return;const D=mu.readdirSync(u);if(!D||0===D.length)return;const e=Iu.resolve(Mu,"node_modules","@ohos","hvigor","bin","hvigor.js");mu.existsSync(e)&&(0,wu.executeCommand)(process.argv[0],[e,"--stop-daemon"],{});try{D.forEach((D=>{mu.rmSync(Iu.resolve(u,D),{recursive:!0})}))}catch(D){(0,bu.logErrorAndExit)(`The hvigor build tool cannot be installed. Please manually clear the workspace directory and synchronize the project again.\n\n Workspace Path: ${u}.`)}}()}return Mu};var Gu={};!function(t){var C=n&&n.__createBinding||(Object.create?function(u,D,e,t){void 0===t&&(t=e);var r=Object.getOwnPropertyDescriptor(D,e);r&&!("get"in r?!D.__esModule:r.writable||r.configurable)||(r={enumerable:!0,get:function(){return D[e]}}),Object.defineProperty(u,t,r)}:function(u,D,e,t){void 0===t&&(t=e),u[t]=D[e]}),E=n&&n.__setModuleDefault||(Object.create?function(u,D){Object.defineProperty(u,"default",{enumerable:!0,value:D})}:function(u,D){u.default=D}),F=n&&n.__importStar||function(u){if(u&&u.__esModule)return u;var D={};if(null!=u)for(var e in u)"default"!==e&&Object.prototype.hasOwnProperty.call(u,e)&&C(D,u,e);return E(D,u),D},A=n&&n.__importDefault||function(u){return u&&u.__esModule?u:{default:u}};Object.defineProperty(t,"__esModule",{value:!0}),t.executeInstallPnpm=t.isPnpmInstalled=t.environmentHandler=t.checkNpmConifg=t.PNPM_VERSION=void 0;const o=r,a=F(e),c=A(D),s=F(u),B=i,d=l,f=ou;t.PNPM_VERSION="7.30.0",t.checkNpmConifg=function(){const u=s.resolve(B.HVIGOR_PROJECT_ROOT_DIR,".npmrc"),D=s.resolve(c.default.homedir(),".npmrc");if((0,f.isFileExists)(u)||(0,f.isFileExists)(D))return;const e=(0,f.getNpmPath)(),t=(0,o.spawnSync)(e,["config","get","prefix"],{cwd:B.HVIGOR_PROJECT_ROOT_DIR});if(0!==t.status||!t.stdout)return void(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.");const r=s.resolve(`${t.stdout}`.replace(/[\r\n]/gi,""),".npmrc");(0,f.isFileExists)(r)||(0,d.logErrorAndExit)("Error: The hvigor depends on the npmrc file. Configure the npmrc file first.")},t.environmentHandler=function(){process.env["npm_config_update-notifier"]="false"},t.isPnpmInstalled=function(){return!!a.existsSync(B.HVIGOR_WRAPPER_PNPM_SCRIPT_PATH)&&(0,f.hasNpmPackInPaths)("pnpm",[B.HVIGOR_WRAPPER_TOOLS_HOME])},t.executeInstallPnpm=function(){(0,d.logInfoPrintConsole)(`Installing pnpm@${t.PNPM_VERSION}...`);const u=(0,f.getNpmPath)();!function(){const u=s.resolve(B.HVIGOR_WRAPPER_TOOLS_HOME,B.DEFAULT_PACKAGE_JSON);try{a.existsSync(B.HVIGOR_WRAPPER_TOOLS_HOME)||a.mkdirSync(B.HVIGOR_WRAPPER_TOOLS_HOME,{recursive:!0});const D={dependencies:{}};D.dependencies[B.PNPM]=t.PNPM_VERSION,a.writeFileSync(u,JSON.stringify(D))}catch(D){(0,d.logErrorAndExit)(`Error: EPERM: operation not permitted,create ${u} failed.`)}}(),(0,f.executeCommand)(u,["install","pnpm"],{cwd:B.HVIGOR_WRAPPER_TOOLS_HOME,stdio:["inherit","inherit","inherit"],env:process.env}),(0,d.logInfoPrintConsole)("Pnpm install success.")}}(Gu),function(){Gu.checkNpmConifg(),Gu.environmentHandler(),Gu.isPnpmInstalled()||Gu.executeInstallPnpm();const D=gu();_(u.join(D,i.WORK_SPACE))}(); \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/hvigorfile.ts b/code/BasicFeature/Security/Asset/hvigorfile.ts new file mode 100755 index 000000000..159890e9e --- /dev/null +++ b/code/BasicFeature/Security/Asset/hvigorfile.ts @@ -0,0 +1,6 @@ +import { appTasks } from '@ohos/hvigor-ohos-plugin'; + +export default { + system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */ + plugins:[] /* Custom plugin to extend the functionality of Hvigor. */ +} diff --git a/code/BasicFeature/Security/Asset/hvigorw b/code/BasicFeature/Security/Asset/hvigorw new file mode 100755 index 000000000..b99d5d5f3 --- /dev/null +++ b/code/BasicFeature/Security/Asset/hvigorw @@ -0,0 +1,63 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- +# Copyright (c) 2024 Huawei Device Co., Ltd. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Hvigor startup script, version 1.0.0 +# +# Required ENV vars: +# ------------------ +# NODE_HOME - location of a Node home dir +# or +# Add /usr/local/nodejs/bin to the PATH environment variable +# ---------------------------------------------------------------------------- + +HVIGOR_APP_HOME="`pwd -P`" +HVIGOR_WRAPPER_SCRIPT=${HVIGOR_APP_HOME}/hvigor/hvigor-wrapper.js +warn() { + echo "" + echo -e "\033[1;33m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" +} + +error() { + echo "" + echo -e "\033[1;31m`date '+[%Y-%m-%d %H:%M:%S]'`$@\033[0m" +} + +fail() { + error "$@" + exit 1 +} + +# Determine node to start hvigor wrapper script +if [ -n "${NODE_HOME}" ];then + EXECUTABLE_NODE="${NODE_HOME}/bin/node" + if [ ! -x "$EXECUTABLE_NODE" ];then + fail "ERROR: NODE_HOME is set to an invalid directory,check $NODE_HOME\n\nPlease set NODE_HOME in your environment to the location where your nodejs installed" + fi +else + EXECUTABLE_NODE="node" + which ${EXECUTABLE_NODE} > /dev/null 2>&1 || fail "ERROR: NODE_HOME is not set and not 'node' command found in your path" +fi + +# Check hvigor wrapper script +if [ ! -r "$HVIGOR_WRAPPER_SCRIPT" ];then + fail "ERROR: Couldn't find hvigor/hvigor-wrapper.js in ${HVIGOR_APP_HOME}" +fi + +# start hvigor-wrapper script +exec "${EXECUTABLE_NODE}" \ + "${HVIGOR_WRAPPER_SCRIPT}" "$@" diff --git a/code/BasicFeature/Security/Asset/hvigorw.bat b/code/BasicFeature/Security/Asset/hvigorw.bat new file mode 100755 index 000000000..afaca7358 --- /dev/null +++ b/code/BasicFeature/Security/Asset/hvigorw.bat @@ -0,0 +1,77 @@ +:: Copyright (c) 2024 Huawei Device Co., Ltd. +:: Licensed under the Apache License, Version 2.0 (the "License"); +:: you may not use this file except in compliance with the License. +:: You may obtain a copy of the License at +:: +:: http://www.apache.org/licenses/LICENSE-2.0 +:: +:: Unless required by applicable law or agreed to in writing, software +:: distributed under the License is distributed on an "AS IS" BASIS, +:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +:: See the License for the specific language governing permissions and +:: limitations under the License. + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Hvigor startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +set WRAPPER_MODULE_PATH=%APP_HOME%\hvigor\hvigor-wrapper.js +set NODE_EXE=node.exe + +goto start + +:start +@rem Find node.exe +if defined NODE_HOME goto findNodeFromNodeHome + +%NODE_EXE% --version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. +echo. +echo Please set the NODE_HOME variable in your environment to match the +echo location of your NodeJs installation. + +goto fail + +:findNodeFromNodeHome +set NODE_HOME=%NODE_HOME:"=% +set NODE_EXE_PATH=%NODE_HOME%/%NODE_EXE% + +if exist "%NODE_EXE_PATH%" goto execute +echo. +echo ERROR: NODE_HOME is not set and no 'node' command could be found in your PATH. +echo. +echo Please set the NODE_HOME variable in your environment to match the +echo location of your NodeJs installation. + +goto fail + +:execute +@rem Execute hvigor +"%NODE_EXE%" "%WRAPPER_MODULE_PATH%" %* + +if "%ERRORLEVEL%" == "0" goto hvigorwEnd + +:fail +exit /b 1 + +:hvigorwEnd +if "%OS%" == "Windows_NT" endlocal + +:end diff --git a/code/BasicFeature/Security/Asset/oh-package-lock.json5 b/code/BasicFeature/Security/Asset/oh-package-lock.json5 new file mode 100755 index 000000000..1777e049d --- /dev/null +++ b/code/BasicFeature/Security/Asset/oh-package-lock.json5 @@ -0,0 +1,15 @@ +{ + "lockfileVersion": 3, + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "specifiers": { + "@ohos/hypium@1.0.6": "@ohos/hypium@1.0.6" + }, + "packages": { + "@ohos/hypium@1.0.6": { + "integrity": "sha512-bb3DWeWhYrFqj9mPFV3yZQpkm36kbcK+YYaeY9g292QKSjOdmhEIQR2ULPvyMsgSR4usOBf5nnYrDmaCCXirgQ==", + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.6.tgz", + "shasum": "3f5fed65372633233264b3447705b0831dfe7ea1", + "registryType": "ohpm" + } + } +} \ No newline at end of file diff --git a/code/BasicFeature/Security/Asset/oh-package.json5 b/code/BasicFeature/Security/Asset/oh-package.json5 new file mode 100755 index 000000000..bb904bde4 --- /dev/null +++ b/code/BasicFeature/Security/Asset/oh-package.json5 @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +{ + "license": "", + "devDependencies": { + "@ohos/hypium": "1.0.6" + }, + "author": "", + "name": "asset_sample", + "description": "Please describe the basic information.", + "main": "", + "version": "1.0.0", + "dynamicDependencies": {}, + "dependencies": {} +} diff --git a/code/BasicFeature/Security/Asset/screenshots/batch_query_result.jpeg b/code/BasicFeature/Security/Asset/screenshots/batch_query_result.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..67afda3ccbdb18ac710fa5206cee0a9ede3e064a GIT binary patch literal 46259 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 Uwt&3cL1x=)+KOEH1mCCs7Xl!}oB#j- literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/screenshots/delete.jpeg b/code/BasicFeature/Security/Asset/screenshots/delete.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..bcbea86ee6d0743195c6ad6d95f33277e23765af GIT binary patch literal 36497 zcmeFa1yo$kwl3Ou@Cfd%0fM_FY24jOAi>?e0|XKp3r_Ih))0cbdvIyo-Q8(k=ihSQ z+vh)L?03&O_wI3Tno(|<2_*$N2^kp`9Xlfx&2w5ZGA4fJ=Px*U zcz7ro1w{q8MA*4`xPBFafR2uig^5LkjZMTwO-9Z2|NHmQ0(kNW1%Nn=gg^s8e1d@V z1mU3rKnbT41>uh$;IBUfL?mPsRJ2Fv7?|)3m5%|42uMhX$VezC$jI>AzVPP&Uk zsW~N4pQ*k@qjALJ@{juVi1uY!E56#u5goUQQvf;!0U;4F2|WWN6Eh1BFCV{vpwO$= zKq+Y%SvhqLO)YI5T|Lux@6F6DEUlbfT;1F~JiP)x1_gim90HDxiH(a-Nc@_VnU$TB zo0nfu_@lg{vZ}hKwyv$cqqD2Kr?+o(YonWdUk$sd3AmB zi!THK(qGtuAOFJGKk)Sg&KDvwG7>V{FTM~E-Qfx82{H;bC+bs4RkXK`&uF;(AK|@> z`c~G8PRp%!gm2di?u&E`{x)7_@CnJ?~MHqzGeVeNC@!8LwW)b2b>-- zt;AHa+4!_nr~(lQz!J>!`Hy2&fiLh>!6Bg%tDQ0J2b_BAi zp!+f-ZyIEKPRW+C=cdTco}@27nl^9BS5Ai|2o#>3k9>YOq4|@aUKRT1GA;0 z6cc_263?DVm?{{c$Be?^g^V}KJRXZkq?H7el?7we5@$S9W>ui^pL4KLZx2*eGfUK4 zyHmqQ&B6l8khy0h^YB3Ua+k(*xg{8+utj)Z6yT||Kiiz)Is4kC-i4 zE}}^JvPdCOjXKR9NB)~JpKg8?8@}^X6XKw@=o#Xj%6PG zFp25lku5Q|f4#fl78*J8T!>_+(K-pMx8(5Kaa%k4!xF{DxaP(8#3sJY%7c*pZ(9jT zzCUl2a+u@i-7DM$h$-eU+)45nN}SHLCI+MIaf6Q(>5VmTCzae*lcxO2 z!mw`m6LmuXNwoK@C@DVDHHWAZ8c(9Iuj!zKuzMz2Sb{EWFi1;oDLhuD_6kXnCT|`) zs-8>}ar{$SW-RzoYj+O$P7EN6hti4@T+za8$qdvp!BPV=6)LTi=$+9~T>$N>Cac|E`uA1uHXsV!wTgcC0 zpb}e>{IWIS^HERhn7I^;`TC=CNN$L$^Tm+Z4&t{-8a`$^ESJsFN*q~a%Rbr4;SG#2 z8OSX;SBItej8JTOu`)*-i3F@#9fOrfw&Jy=#hGj%2MFW_n?8TK#)>~9 zNz_Bjm?rH!`3*bC^2=B#?Y5Ma8nGio9|~<9G<2B=(HEDY^krR5r}yG z66a9CYgBg&%I_7UD{w-NV5yMal2v=xN!ABtobJ1;;`T4Vn@rsZ#nbaP)-|S|<811E z5rh#l7T~2B&fm_x(88Fs%r-LIU?sKTAiOHdEZ7Cbeam;P##s)e%E2Q-foo)d9#du_ zStlDmPi8~l6hQ({Y~%La%ZUMg)rK+lNpEK2ciSJhNT(vsl`4G%=|7UpJ=@{33Fb)g z$zJ~?+1)H2B>d5j9um-H&_u2{aisnL|-^0;?k?h_RfBXm)lkobR)xnL9>DH`&4Ms}(uhH}uOZYA3J! z*k9E2mFx)pDYXq<50zFF~AR=7Lv2(2fBCG;4$=C7*kGA7>9_BnNrUOEyvz!o*$z| z@u4lU z6Vfn6_xS@rpycJMW`I4$jOAPUXYHI(iT)LV^?8CY>Y4NvY$I&_J!5lO?VeBl_Ad}( z_5&iZCbzWnp+4FlBY{m=I+vT3xMo)wJ_7oZ@zs&|3q^!w{{E#LJA?{~EO3g@153*wn zu~+)a7CtPWKhKw?z}4gZ*n4%Mtm**}&hxVnC~xv;J~NI^iCpIeoq5!Gk@igLK{nxj z%vYZuGIUsB=Xav@8v5Q~O=>!WVoT@jB{BZY*?Gu_RbV0VZMUTb+nCb805pokY2;VVy*I zD`6^x#9&V4St%yW@J=3Z4Bkf-LTZ{Ad}cj~iqKlhWjSnNTNDe-&x#C|jg)wd$4LyGC9^oMQx{J;{)QO{DxPbF2&6aX;BtTIkJW#~ zG@D;PwVatBOvP*`X@CBFwxKr00egovI|*~UIBnJoWUPnkhg!L-(7Id@wWz>$1 z&6OyxQI-xYo=5|5YR`3&#?P@_c>%o~-FedR#ps(XviXMUETyD6)2>Ts4y)8C=tvyW zbdsBst(^NgNeV2JLmZ)_?^M02RoObQcn^}jn@KLTiccWWsv_X*i=Vs}Obq|oy{(vZ zGI_*pfEi?Ndr%g~qH|6wa=NXm_B5S!@4$H?Ouxcd;{kv~iWiryt?&TIYrb4U(x>+9Aq|iRfR#jjwW%HVEZKR1%f628jH0=tRf1M@Y8RhLHh(^C zj@in&5Vaa>{9)F;BDS7p{cy!?xF8n6$WN2USn;|-o1)t{sE(>D7VwmYBKBM#LTD#_!^U9Af$&pr)#;uU8quc}YMUPfs5zpabf zYVXYKi*1V4Mu{nXJ_tH> zxU5CQ;Y1dI-p^OSw3F-j6zi+b4~K_WX8hhUcX0b1QPZPu^FaG@KseEiDr&Mjg$e+pOz^4769smpBsEUOJRHk8NqP9dtPsBi!$5_3{Aovq+UN(F z3<(yX&A3Y=Q%w>hYHCuDUN-U*h2C#x6@9LV@MY9t%h2*QeL=s(Q z67zU3f)d`0LpFne+89tMiUzDFDK8O}31)iI4^}-i)>k#+JO@oLF5HPPrPGZf7lK~KQY8V&%rYgF9$VVfm+2BP*a4UlRT;putC`6@&f?*`ZX4Y z1OEAYyb`?@{e3^mBjvacog&)f<0{(Y&5c)-Z2rocD^1@rql`69#omyqf7k@yxPj5m zmAN-0lMJ-SG*l=xPsPkSiCPDIxq&ZkO23|pA)pBkS-s50g~0D1oEvj*sGxdo@5}V* zi}-1t&Ep-&x8{vs2ij5_1V#<`N&>}9#4?(bkHidEcNL}&&?cL5GYd2xSxG8J7cNP(t}7k_cgx*EAI#kvD#E|&fRdJh5}JpclHO2G!&<7b+_<~`y+ znwx)dtBV-Gx?{z31O3wc1N6roZPrCH6(KT=n@liB?}YL~`|<$*ucRNalJcmuz#?nc z=q0Qd_5k=pG!D*6rTG?l=grihcYm#;5p3k8J&vb(-b@AS`CC2^o=HyvfygWb2`^ftT0K6qmU(n($8_SPKPu_*VI{)@=W_(k8W;#?P=sxtX z*<^T@x|(7$6DIEhZ=e0OxFg97@XbrGSoNCn1?9cSFA?yW#NeOh;Q8A3fTq&VPXCa= z#Aq0Fv;s~X^#j1ch4k0A&w=Kjin8CQN&59A3jgpf`!m($32!qp|jKbzi|Hr${W#ZeLf3#a& zeAAa-@(a5E^Z-y6hqv#*S>>7UFIkCye*pX?7gHv9RrCnnp#cB+6wXc^*C)+m*PgG1 z3;owmp}At^@$_T#C^K^efP#MxzJMUqV4FrmTYwjLd@_ztEv7mvL5jV`S;$=n|9sP zCb-o^yFJ}{?5K_Snpte*(8USdJxeJy=C&K4Z5`UH`JdeFQNJ>BX2%9=* zFYp$R8h)OR(^z-o?54UzY}i=rqI_)Qx=*sGHEu@(zR~%rxf*#HRgRE`_R285JN+8( z?C=Igd4mMyU5&gZzC(Hd7{xc=5aoME_ln4`q>~LCKhqcy5%(4ToP9shU`dIA_pBe+ zYx3&-s-n|*1CYJhlWoSbYQa8U69L8D4hi6VvXU_jT3c~7zI^up7$*4PgYW?0#e_BF zJ^*H7U6FE*r6Zsn%^2rw`qH=W10~(bNUQgJ)@57O$FL2R+h&VG7e5JUcFuQHKWk2{ zlQpR4qj%s^76p`2jyA6aS~p+dM_x-CRUSpcWFw*;0JhC%&ST1|kfG;I$D5G{KAHuV zNx=J`8>C<31>RPMPtnv;&N2Ff8<%m(JSI0+P}8%l`A>r^!OHgZ4Hk*;I+z73ZWsn@uScVGkH_~7upHaHFrp}m zj)l7&J=CSFg>|`$48Q3Fq?xF)_loT>RDtK+KupE0Y zEgpq$#3oVwd3mBi)7IUu+}}Yp`E82%`dVad>-LnRA*}Y;S@IY)gdxUz`D=JN6MB^^ zDwh!cwFgb;9KUF2`vTSXW4=h7oV-2?MoO;qMpAbz^3M>xYxQ;^=w}gfSNkH%FF$P# z$-2tw4k9+uNR`Axw}+OE)pYxLE>z?l(W1D!ijVE)%Ra9=FXGG2S;| zNt&fI$2Mlx$RP(G?q~W_vu{^wo2xulVLoTZxBCx(t3nCa3T-s&6>&l%tAr#UEidVG z%j%!K4uac(^-06}&13|C>8+_D0rw$T5U^#JsW=>Dq=-1dPWPj(CM>3=6{ z_%y!evbu(J)iGY#=jKt0-@F}ixbH;$_an{>a9?KDdLI(@+q30VHideM&i|zFYHgFQAO|^fTbp2>1X@@Ix4|VJu z_&U-ToQFZ_a^v}V)xkS2Vmf|My>}pb_l_*^8Vpzx!L)UD&+rI_ciLYWRqU1D*; zrDw3?#arK*t6vlHJ}QJCM+x2F4C(GxS(5yx5M_wn9WZxCuW~Tycsia+LWk@{x9g3z za^X&V9bY=z{_K7@8d5z)i#IfF3q~}obzNa=H@`Ce1-9Q&T;S07)pK{>Fs*bsSSLNa zQ#r6c>5s)akXNG@Fk3SH>w#{| z1!m-Zq83L7(N81JBOddB_>2B)8CJeZ`V`x=(3R^3XXiY<`8kfykNJ~dG_Y&}%(=|d zI2VdNSh{t6<@KY9a~|vK&OHDu5crTbm;rO#r+0Ig=OwFc*#@v-p*^q@t*-wa2E@!q z2rRpCeD`?7P7)W_nGGqB+KK5>iMyW~#I*@DO8x(+aQy(0_ExvYR_O$lx0rEkC_Rl} z2^@4S6I|Y$BdEGPhDT(F5&pPFzdgwS(@TVfk-&Pu1Hcm%grF<-c*2%PIaFvP%Wt2& z7}w>U>&s5b7~+=AM)oLA^A%78m$5$LjmsgY+Z*jmBYD}CU_Ze4=Cj2s zE$gqEFVT`l38|$eqvu(NM0iU)KnlmMliv!r#cjsuo?dG;$%zdN#9iwwy>T>b4zj&_ zvJy#TWHAYQvS<;ML|Su@a~s;ViE^8kcuwYC;@;{-5Cu9$(<&S1xu`3vj94F?C$9Dh zZy}?^rE89g$9MePvDt76yR~Nr#Vg2Tvt8HcNs0Ao zW!i^2yBtgE_+j3kVY))*@mPJ*zsKPu(|0opW7NMRMwh4cW0*3F&t8H5ZH&pCx=hl+U0z` z)xgF$RxvHfBJ~#So?ng!50e{hEVL%I7R1Z+*;r1MUfEMy9JJ1LqeVq~WVPLp-E_hr zzBrWyK(rK^h-JF=p|F$gW}@!NI*53i{QKh0f`P(CBju-D95ZBm2$c6;vX2rvhOPOl zoOCU#E}~lrJe~=M^(#AeF?gD@`fs}%0Qa>&7VUF zx2Y2)@wA*j{|sAm?Gfx^4U3Wgq&(sC`p~sVmi+U_80;QhvKMP*-2&hI%L@#xzg%@I zeC4@f=N11h;PKQjAN6AGsV}DSQ9;uN;%Q?2qxk=J&HDM6y>x~2 zt-}HB7*Eam32cn$^u2=@KAGv+4b_NzqxY@tdkEdB zP%qnB6&r1jbSX{tq$?|?XR_v4g4QSp4pPtLM<6qN$Rpe3yWPL?sLlTYfS$9pns;IT z05H|1pr1gw`0`fyiJ=waPxUp?$at~ZPHKw4oOzF!z3QTZDSgt6~ zq2$(F-8vJzwsxB`O=Bx#_VK+7!XF)JyQ8xr=1;G*-wA0y;k_?OKIS^uIC&RLotr<` zUF+JC%N6;FjdzzdRat(tgy)Ej!I)3~^Hf7|yI{|aX7j%Hy>govL!|19uMn)N>mV6* z{{YX+;;+e46wjfcN>}fGq|MTJw(R#fe5WZ$`%3HZksSjbV+($Bdt5wT?C~G$Ui|kQiE|@FheA@SB0G2w#i0_(=8(+r5eD zaZICd$Z^Xc0DqGwr4sd0N|tBpNSJMUY=eOr^g-iMJcWC+nRF4#HTa1zQfMW)wsN}G z`2PEM@vg;PaY)_XCag$wxk7v(p&Q1%v}>C_?sDccxZp{cK6B z?0|gFEDg4IeE@tW;8J{pe^$^Truf~Ao%Tz-!0s@GXwkM7m_LfnVj`8h>~pWd zk%PAyTLU_C+}ki2uNu{utMM9e_mC0#WXYL;i2Q27bAt7|^$%HsO7DG#2611NpF->d zF1hcEI)$pI`~9ExR(fDfyUk#G8^jYhwLj<5lQ@=}&6WzocUz6->|OHH(9_YKl3dfB zk+ek@JXsE-fk~JIJuX{|P-+U`(yf?(SpW^A~K<{;$;%!#zb`$}D;ET~t zDtr&dzR=g4`FgW@JDC`91 zv*AaFJJ>Gcs&51ju{~VRtW#g^Y{+ES)W)ozBv@se9^{iZrM2abRCtFA>rC1+cq9pL z$E`k+r2=@ZdEZXXpE8*45+JS6c0#rflQ{BH6OYz)`=& z?My%8ErlV_Q%?Cke*k=gfR4~vi!$Rr42%??3k%R0DytEmaK9&eO*_LmhFH#c3RL$v-f-oU@2s3f>YsWSF$EXOCE zg@!C&5U_+W+@<#R7 zK?RvdV?p}XIEUib0r2YgqyPJ)p+3WBlohF}@DHXeW(~VHq85lUSwlY;KNM_jF=fB_ z&)d)bD{OFoUPeBBBqbM&CNC>L1H(n_`%H(In)>6vO`+9S9soMbu~*HL7=Ushp4y)q z4E{d9{u5)u|Jr8=ddBC$UzHQ?-{$`NOb~C>E##E+uFR_~P~r{b=t?@9TOzA&A1i-l zkPM4o!(KG1G*&vMD56gfw5!CH^VHLyU90yPvrmb-&UpX$%@WfpK0$-@9fMFb=-KX# zfa-1#+BKpzM!(WTNkVIGzkxM1+xg8)lpnHdHPI$RLkm6E4j$xIdy?A}l#`W1PjNpmfZ&QRgyei9lrM;kWMq`Bq{NWj?lmjJ1ZGq_(n8S{ zv5$J8u;Gpoo2Or=CmUq`(-e)0+*82Z3n{6|JFD~#Md^+vLYZ@-J53C|d81-ZeX(TX z6U`s8?6P!B6e*)sSzGE4fRAZoFz_m9sg46iQw<}th9*r+HsZ~UOzhh-hO?C@uu`nE z$SzA9-W9>ex*v-{Bie9la4QDfsqNy2AEP~4LU7REJ$Vxs*U-mK6DloJ9Z~OYPD@*p zdx7kQji;)j@;Bi8i=6*CJhWOZ5RHpimJae-EGmsYCkhp3kYGsj@hM+(!Mvk|LR2PP z4oPUQbmP0As^c!Vp#hhej0w-!=RY5A$p})J=XkxxJ76W#4EA5aX6%@}DOR@R+F>dx zZYx&fjgo%agNgaO=NdPyDAO{eOh|_&lyoa9y|EyZZUV|n{ z-gExFA~BBhfUnA-_ir*VdEf-6n15VTzETpg##!FLEOKXEM12x?Lz0vAh@*+>PBJKW z_F236vz|OskkiuX{ynR+&XHDXu~n7^p1hE^I;zDD&rG0R z$A;)jqUAJVeXs8-?ToZ^Ri`!4&YCW)WU&y?QYq%_%x;odD#XJK+HYJb*%6hyTsgyl z%unZ(8{<~*cx-PFqg*|@8NV<(rw6wj%5DE(Fer<(s@CpdjF@Oj$Ki23`4)YsnXVi( zu{xI9XjZL;BQfJi<@FS3xtoSRc0Rpa7k2=$e}iIDU!K^>Qm|A1Np;T|I9zOEk%ZH1 zyUHf7Kb{~{9emIMmCuU&jz8ewqwhWiYF z+g5#MjHR<>wjuMbuBNW8C2i-x^mz%Y13$%wcSiz6B&Z>_%L6!2nQ~8~g=x7g1xeFr zWjcWHjhc-m8MJMM=4gFCluX&Yz@U>QE#r{!`iXS=kQf-J>! z(M|P-vqp9GWEFXcT$}d?l-}=k7QhxV>?PNgY90uCKX8m{tm29QQ-{!s=He!8?R)?` z0NBTr`K9fDi<|S$-K!X*4}fBxKA+}YY_7zBzY&&Bc+;wo*9rTsf|B$vMljr#@(+V+ zri_1*3B}O+k!#g5P@OmnK#!S^<5GHEsuQ+#myckPJ=Hu<8AnQZn{|?bk{M(20C4fs zurWS}?E63f{{7znC2|2XAy)kA2Imx0$Dm?71T*lz_|y$f^FPA_ zmmoVeSZ5{LVpP_NR_YDrY6+TGbVFoU^#Yx8h!|=0>yf+8B=@oQUaGkqKG@}$XxaEg z5ThOI-N})&Mi#ai zpY0cFm&oRWCb)e?V`aN?t`s_t)=IvT_xk`MdW1Q zY1V;9EyI60KB9lu_d!fnX>150Z2i_)KK1gV>FWbPl2rK?*1W1dJ3ni9aLe1lZF{?* zAKVSaUs*I872kT|4i6qkWxTV_yn2tN=T^Fc=Bh7aPgi~W-03rodE0jZnTV0zeW+N) z9-$~-5w=usCBazy0g_i)h~AuxNJ}ce?Jl_WSpKTc&6*Mi_}(TQ-E7?M{b1MTx<>0} z9wTki$t|lPn$iLX$DJhHhoJd0O=B|2E|)%fz5AFz2{Emi?-5=!>X3V8jWXa$-(a+a zombIbquD(b1DL1i0mVd&#?g($x^qQBVw{BBy@HlhG(Ke$mNUICFOp+>-j>1@bD18I zEV(-s1+4sTu*X!Wrx^ne%YdX*s~a>tLGcb*V?TK;Xre5Vv{Jc9VB`^Tql|UM*^z*@ z-Y|joVusO&as{LSx(P)Y+!#_V8}~UZGt!^C<|0}@d52rpttqhOTR7m!Wr4j^O|s~} zNs>(vxL4O1AV;3de3@vP9VikxmM<2#JoIeahE3~syruxG+j(f2~sM?$DCB?pu`=)eXI8nb^ zq;rBhc#FRqoS}^un{dLr&qG{dAFU(8oOey=)beF+X0Ci+i;9z# zK@jg6=)8D>`;w(G?VEW%UAVa`-Y#A+GnO5xX+)vpaHJeOayqEW%XFy7NZ<12o%5{X zh0Z}SZ4`k{Ul9d);yFyy?znlGn6s6o-hyJN?`#uaxTY0$-bpFGwsZjgK4Az;DU6UbIVcQK+rbqyurM5rq^8QtNSla2{h6pRD)r;mysB z%brpM)I`cXNj8f)WTn~HT5V#b?C`^b@?M*T!k)6~oIzb(%9G_}1MpiZIUUoayxcnp z$JxI5W2aTYXlssQ)7Wc2c3YIcF3o|5K6QCeO9|m5ik%GsuDqc8{M;5Z8^vWhi#+N- zGU*{3g4CwONaS1qi2e}DRqm~`;wq`VK-+N07%=?ZYrAhcV%kSVM)*e&wabZn#oZxq z(&ej=Nnei_!WI^ixBX#GN1krcVl-|4o$u<#yT}bT*vR%3)Yf#lzmc{pp)U0! z+@fY?WkGQ=KNT$7EvlX$I_qpXRpWdhB z&wrUR=5`9>7a+gYiU?gI_F>MKfKg1WgIlK+_jCF}UUy&-YAqE}_9eeHiHu<5Nto0U zP9}HPZK@3;s_6Gz(>FmQHhH8;(EuZZGG}@i>{g$O-gn>8YA3x;bJ{+dVhTX%ouzi` z>zVUi-R|@nK|67+UZ`YU(0iSh97fy3u@K1%37E z8>o1viR2jNCm)6_&qU>S_KbI*V&Fbp0ot-s{eT5hou`-{(M+bKY69ad`DXx^0;ZZh zPsX-;N8UJSh5o#-dOYjw?pLgs&fCOQmaIOrp}u)PW3RITO5j)pwvaG3*QBtu%T~T1 z<9J&3ZBo(lA-3+773$9_7*<%~a{Dzny*@pU{d#jf6HX#Rf5+X$L+8H`>UxaQ_~4?q}FQxYgC{Lnx}|POJ3>6cckB~>?gdfS%qco=qjrMm>GRfc`WdH7K)|S&x`Q; zJme)~d6(pX!^BwLu;!a`O9+nx*|InxTfhz2=H#Eja{Rk9n z)4=^~dfTD1u;*CUa+mZ6)>keG2?r%iC&^u-N`v_HrD`z-Uy$K=x<*4tqAs;Wl-@TH zTjN91f(O9)m{OZpN;kNP$U|8A$fy8>6RWkeFt8vfHpblH?;*ezQL|FljOyXnHY7QG zIMate4pj&yOyL-+D2zrw>?z(iZ>ig8fbvztxN2=FJTZBrb)~|~-ClZr*hKOlOWI!v zp$ei2vwf{nC<<6ox0jGPHWa&AnBaM4>l9kVUX)KALVB5Q?##X-ZCL-sd57hZ$SdsB z@UWTEP}kHkOORFE+woYTfe)>G_=7}G0?;o@6^=H8(q)Ga*h->D4vplaV={U*qNYF0 zNr-p$+>EPUJ#P*?GbHd%jJFk&_oR3i>JZcS#<3R-jcCZq{bf0)4-&}PafO*iXkaqS zmLU$i`_K*^q^l57g8!Wh!N6tDsyi&C?kapKlqj|$gy)i7`Y1DhchAAv960RC3c|A@ znatshH>;MnFsYD2P}NOltFN7(38!pNP`xTrJEnlpaTzIOE{qDuz7Loq^N&WDQ)Y-e zN6Li{#O3}mRPMjxnpGb5eT@0!54(rS-wX6H-bLa1W%rOEu*d|z`uqJqiP!sAc=nr# ze}z`~MZ-VU5&}b*UqnEw0ZM?RF}eo;6hTe)m=>roST&QKgvYBiQABNwH+Q zP+)Oss(ftU!8%4N!#2=RPgrDIJ&3lhn@~-%P;@l9t5*Z9*kvUxLZ`bWbEA$@jfEXL z+Qe^?3tbeJF;qu#?6YzB(1S!fEG?1}633pM1f8U8@_u{2y3cZ`8qjBLsMK1b|GuJn z(iY1(tySkz>=S;Ml{>)~58>sUuB7}gEc4cssB{fOEx8xAJd9vJ`Bl-Y+=d%j@TBGb$DRYa{>*^>;4a+J zN*fo}&f|$3SiwrDeE+SrES?_FjM^>a^BU|Z1u0@&7iY~6QNQa5zi<2SsS#;?8Kwd{ z&|dJn3^~wj+e>sX>e#A(zYa2(<1QA%6QjtFLHbkmqhuQgIji+@`W=|<0bmR@z7Z@) z0G;UaEZ!o)=Qded5ygf$5f1>}K;`j@UE;U3o*eVh{9u}%AStEOJMqoY+Ib|HTx1w% zH#`#d;e1MDM4HaAA-|NG8b1+nYS(|ECY8m}`k1uq5=H(q#AeazTp)Z9g^o`@eT6R^ zJzBGBeDixqpL~A1*^u2wGRpKCv>Ieh@z2oscB!ND!*t4NP*w5zX|+#1m(t#iY0}`W zQ7z<7tOoiHdbZEkw=pRzHb5TT6ZH*k{rNz@AGtS4-^7}~*kcbC`PRC5`{xQ7Ve0@v z$~c}N=Ze4;f=IT#7mBt8Gp`($sT%6bJu>1VB}#m~&G8{6SE0&BXD=F8B{*t^VcQ`JBsSj#mKEN4#^g+!_`LAH@JFqY^KoEQz%4ParLVvVpfzsEY5u29%A_N zCfGaFk?U)_84&Pe8N8Zu(Z%$Ge6SmMY?lr(md`8Jj@SDrLuW0&g{5XQ$Pe(K6>a4m zyi!_Jtviycw$GlIw)SPn@hDSTrACiEJ@0Zn)S?>Z7>cMU+Sl%MOVF-z_^CF?N{!i1 zik&CkzzEnEWriWt1`M?eK?Z&n;61TQh@^{fz<>RTE(y?j?EZ1jhkV(R_nzhAM$~R1 z>#aN6cr< z_3pcB$L;%(t9$Pqg)UZ1q-}Mighu8F?o~$c&=bzBQ6vHE$+ob4f7VLvT&XN7fm$cT zR6{J??j>0<2GJYP!{$ev0+)YEAbGN6-J9IykA+r#f?FTTAQt@{@GDZ26we2NsrpRn>3l2!CC~O`_nJXQ47)% zcdJ5)iz-x53Cc6V^$kYsNr)uI;HyK|BNMqe%OqBjm!d)SV=3X7z6@PZjfU}Wfwt>A znRBv@5l0__mQt_~y%4nFVPh^H&)Rmqpw?OXA-bVUc2lIct=tuq4&2(HWztblxy!xq z-kTZA6S}IA1k?2&zGEqCtD>iR6{-$pL(?9l?IdpbysU}@ldRv}SwG0U+9_1Ry9Yo- zwWY@@>uJpkrrTZZl-%TMThA#z&1uds)ezlq1XU>G@Wv-<#5g{?gbjrh}|95xbe-P{X-<9Xj4HAMlP}F1~z#ua#|u))oV=|Rm~??;-Cgg9UX{&HFVhRRCPc{U$69G!G@&pHSd`ZfR%iBcg!ZORySe)uD&6*mo>cwS3(%${Kp(*Wl`h|e5cI);-?nrT*MEM z|CANznf->Dq0o%5$E`@9_XFU=y)~*b@l~+Y+)Q@H1K~#5r}~d!g%5_B5?g>Ok%e56z%=^b1rEfDB0Y27JfEkM$jt zXZSUDohBpFe-!q`*QENixiQ)JD8VBT7En!@m<4-!_!u;-wR(yl3Z&Hhb{Bdec@AD2 zgkAi5bm94GeLCT&Mf*+GZ)yF;*6*J9Zxq*mqk<^A8tUMzTA!e2yw4~WSJj^}@0h*P z)mE*FSP?rUntA{%f#jB%ig%V?OyK9BT#)|bb2vrx7~z7z&uEaF;!@d%WYulb;h*8kk|HhlZ+tTgWDkLr&; zN0S^!Vv!s_wHW8(qm4s~fOy)`UT^rb{i0_m=?AfH^LNsxt4AeT zIdzG1^8>l$o zTD>nEzjjjOL{yUTSX?LbU9OLsMa{J(?uw!lxBW46@l z(@Z#ZLp?wisj0Uh=j2oBH~EFIfubUJ*nKnY=P@4+v2T!tDbkN%Oa@0s7b#W5Xztk( zmXhXg1{NeCRf*S8-*K^aUi>IHU>zxD_%TteE^UiuP+nc@Fse}Y_MK_3xnIrD*^Q>6 z(@GZ%bWeUgvXx1p`k(&psStF3pt;iV%lDkr=+^Xp2loR`aZ3`u_E-oOKv z_5a;}Wbw~NGgH8Kf|pNpImF2OvaY?)&s9VD+^T1p%iG+cQ|MsOT2WjrJPX9W*gi5# zjFDR3Vj|`1AlcpM+3yjmYny(|U1u2eoc3LipX4x^>yFnLd*!^=c^>x;Ar|{1t_-Kb zH2{}}g9lQz)v=Mjo~Gbjd{grPXd_C|M<65x|8sO|M{GD|IzgL$(1OnObo_Wr}pr4QRRXfnL z73n*`@6$}pEC>E>lF#XYeSQyp3R7IFX1^^Fr3b}ClD%D6!c*T&6)5p3xQxO~Ny!nK zl%)G^m6u^+qFK06*u|JZQ=yG3lBKEouHpf}e+geJfxnj~^PkT9IKm`;jMFM3MkST%iE}_TJw)+3Vb!{ZYzR?-4N& z_teTI>ZC%^`2K=r!QcP7bYwfX+E58?&o>iRd|7tLBSy00bmA?SsV_DdI_JU-2cmyB zndsa<4RG~`f3_zl@TVL z3rx9n8@VbaO8u;A8mOxoOKvE_K2*1#7v8BGXYPXQ^Q$q_z}S2ErF+AkYTMzbt!g!d zoxN<^$O^w9?9Xqz@{85Tm#46uS1P8aKyKBYLH)_$Td+ovFs09U)#PO05f0gWGNpfm z`+ozQrSdj{6-yVrvHb-0Q)EBU0A9DBXz+;!f1^P;Hc2^L`dM#L%C?^-wenir+D5yk0JWYj+KsHk4aQL@|g&= z$)0q6h56B`6<;4xRBCI#AYde>->;0iJ9KaM4wsV42FA`ZTIk@|7a`?=tDj{55PQQX z|C)khp|7>X>Fx`^f(f{c+7;aOzZO%U?EbT=+W$pdkV8SjG86cZcE{hr4abghn*&=W zxxd+Nmjx~lJ0lyh9f0)?y;WpYMara3kGu2RVrs1|ZB`AF+lcZa0-V)%rlKHS!!ew36-iPt!xp zhrAQAscSRBob$Qiuq+~c6v{b@k4!L~<8lSu@H^1+SQrFFcW!d8W#(~3sQ&iw*G&eI0Q|YVCW;O2ENz&Xa+~(4^Q#m#`3!g&PBnC0M>@ppIZVm zyq=vo$Nv`OkOQcO*;0v>V(*Sm1C<_kh2@(;>5ThvAE_UWkNtr>7pOjy8EghoTi7C* z;Ju$y)me1I)Azm4jJ>Itb}B~OkYpgLU6TM&WCA@GyDSV3NP^IAln_O#0PTjW5n(RX z7{BhEplvj$S%>LnXN0>EDk8k^qw2nGKn6$EZrmW@KkCw#$FU86ArtYydK!KyrrT>- za3VFw@~g0f)XB51t4Z0HzY4174dXE6Hy7DWl3RKSw0fd|LH!qgLG8v(F%o}ByGoHr z#IK&u)(0hNm%L=u?86dm1?0iw&1bP9SB7g*!5C47mrOun;nrK3*rzg1+98BIx&J&s zUeET-37S!0)?>3#B5k?VPC3mE@3IyGqCuV%$dJLfKz}(+3vN{#Z-fU8aiElrJ0TW{ z;a0Ax{_;Y2|89=ggSE!-u4X(df3!X;)B-|f2b*9niG>L`e?|Hhc3d}!BE!vROC@Ou z3Fk3%N-$xu0;0$*&553v*Y%cCo|Fb0^d%}%-eNj2fP>J^p2JU(eYC^3quP z)Q!=A(sXXGb!%5^QR0gIvkzb;dtDhw>AIQH#WuZx+8idE4aTF&(^zz2REXDrH!}-o7hir7Gfpa%alw-H20ht+d69RRESm4*-kjortM7Tl+FiE+* zEl0!%Zw8x3LKq)J$JM8h3<~2E{EG_^aDF%Hu4JPmI>kf*MNYF=LS1`CMg_L^IZ`=H z8hPuv5XvI{9#zqntQDP&0F|ECVuWo}+Yb$Pa!wxTDXvS2!7eCo5a1~Dwa2t`ckK>ejx+5zGy1}JHfTow<1=e=zdU81^FmQ}tv6-C#KqzAs-}^q&PTVf z$$tB`A=hur!#jknr?F9b*Uuf7%dJR2Gz!y9CqnmB{{DsxAMbFn@IsRI89AL)=?*7T zzA&flVaU&e%ddcgx#uw5i!Hx#t@G~N#%*&vuZ~l$Qv-R9iMaiXyDH;6@4~I3h6AE4 zd|CW-`m<)P+2eL2@gD~LrRXWooD#>g!&Q7{-`+^%FXdOwo_Q5@cx}en;p$d!-8*{@ zawklCxxJ1DrU7B5==by6tRl0c%rRjCbi|VyF_-{_SQBv=DZt}N(%|;OZg_3binX6a z_tAyV_DuaD5=!fS+8Mbl2tL(_*L46Hmi}@&#Q>(9fVBCf9VT0h5db^oVQEmPHXF^B zB6LB2hUIOM7}Kl=Ht&2EZh1+V2I*~z@?mQUQ_T!S3v9uoC;1daZu;oP+8&sGqJC zv!0%(t}1LKWj{}`Nft**Z|8LIUmE5020kxwd>*ZT=g13(rJo;gY&i`E(~bkWbRi_o z%{~3C@}$c;Ook%Pnn)xI=7DWg7!_F%i4xhd5iVd{q>BTXT zwNH_^b;G{?2U=T>36354cF)s3KOeubf~?M=MN-z2#Nt?4iKh!~uYDhZE$Q z8J1^7=p|wpZ1#nqTF{(`Ga@Xz{M|7|ct%LtY6`4XznTK?^I``V9n(P~iH)+norQTV z695QIbass7suZz6EHR7*?0Rrw$qduvVGzI~p%F_xiFgMcW4WA;tAxCLYcWuegM*91 znv-C6P&PELS|lFu!Mj@U80-ce3x2vU_{h+mPQ)1^T-NgAwPs`r(QI88Z3~FR@`69m zK(Bm6085`JkqgO} literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/screenshots/query.jpeg b/code/BasicFeature/Security/Asset/screenshots/query.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..833aadb342dc91a31eff9ee8fa10512ed8e28ca4 GIT binary patch literal 36436 zcmeFa1yo$mmN(kCL!@y{a1ZVlg1b8;xCD2%07>JX;O>p38@He#1b26LcX*xuy?5sO zuFSjdeKTwBdy{6>VVyd4s%r20)vjGtyY_jUdRziLk(HE@1i--o0C2EBz~d}H9Ds_9 zjDn1Wih_cIhK7oc3BaZN<>0JLB&E#@sf#>goKWVp6L}ECnqO4 zEuRoCyC4e(C;P8V;Ly;}FflL*u&@Z&Uy!_D|9|{@Yy&(+MFPMNA;7%^z(0jUcnbH} z2_T2n6AA8*AK=eFICum^BxDp+G;|DD0_YO}JRAZ7JR$-T5+WijwJ+>B0P!i(vlnb) z$j?>Yp}ceivIoXyqf)-E`i84Id_=`z>=cBCj)zY`NJLFTOGnSZ$;HjX%f~PNMnY0b zT1Hk)T|-k#TSwQ#)Xdz%(#qP|#nsK-!_zDHLr7@Y$4{WR_=Loy@OioSDEU&Dtt#52@ZSNePoSvOuTwYz@{GtmE zfbb`>VAnqp_E&U0h0z6%h=_oQ@{2Awcz0Mpc#4Shf(`kZmw`JyKYDiW`NDj+0aC+w=P3~vn51!N%rjY0GQ#>qg{p%-!Ci{Oi#3!r+wfd|nb|xi<;MF=X`4(y^9ZgoWscH1t-El61J8 z2%LMy5h@^nE)+ z$hnvj(j@L#shpf(?t-OJ9S%_%Ni0FGSH(azhDoY6&XKx2W>2X~evslA1eM;3;Ubop zJC_(7+pOK{aTIu&;97uYFjXkw=4JOK*LvYas2roGZr=}!I*{n=&iPQk<`P>LW*ps& zn;9%3-Wh`FTt^P>2ZvX@7dacCa9>4Y&gNa&g?0=Dsqd4jJ2OJ5RRqLeXNv?~%lqW3 zht4AT&b3=+hUZulLe(*^gvLcL4!0$`&=n2dd(PvI`;&Pzx(hwe^PNK@`~ra3+kYmXDcbgtnke=2WcMr8}I+hWUHCf&JcURED< zX|%c3jFX<0N~5CKrzM~SIL@BrEbpz`q_u5CC4#doE5JKeb{I?yJhH1-T6YQ@`jz1d z6XmuqEi6|lke$#(=mb}HCAxZ94DCWK$(rdX);7}AZ=4NyLdweQT;|^{BBI6?(6Aj? zhV{n@JgDnaqR^To z;3x71FM?3-S!qgAv}-;=*JKir{Jw^RBHZqoP)RwOfc^j_sg=NJm8v*`!pp*Wtk^~p z4fwIJjGP1z>bIVJ(w%rfE+@G)8wk=yZ$&SmYmBK1qAQUXFJ|kf+eiiumGc1AswC+{ zx<^J8zhEz!xzK%!-L3CuV4l!U$CR|-^B=0?)_)ZIS)9FkCE zPLW%-!Dkxrw27ZfL!WOvItLega&^8K6yAZ)o_NVkPlf5SSpmhCLA3fI10C8xAC(5* zlCpPNiOldPd@WOAO(YUUcAiUn1Y|I19u3~9i@ep5sX?W-^1_W?T!fNrL1k@e=QgV3 zG+FWH?bh+~f5KIU3{rVzAnBzlKp}_*`U9kjlP6i2CG(TiJ(SxDy^Kc1+#K#tm2fnD zz^o7ctRhFa{#WZ{n#qpt!P^wvA4^lzgN+qhC!db~@w&m8}b&>p-q@Dh8SHlrl44g>c2nXtV8|fHP&#|@iz6wE) z9}V(SKiYcop%%X(!R_lDV7T3c$-&EX6QsY>w$?VSYB_?MJXL-?Fuu#un@;|)Ku5trO7@KLwEV23BgY-Z4mk}3Tavbguth2n{d zFsjO6y&zvng_y3>=!CS&E#Aw`qe6%1PH5HCbYG)E)2OQ@-h$rN_&7yE2@gqdl#}OO zl}x^lmAG=f_E~A)b8DPbzIs=T{g}DUijgW+U%ZEZ^bS{V0#p z(W?%{3Cg4%<=VPhsPjo5@XNc0qr;mK{;}MN1*1vvmm{_UDw79xu6p$fd3qTyUN9Mm zU2D;1q?cBVoqL$nRDN-FAEnHId-;a>!xuzMH{LGKi&9$)D<9*k##?n_ag^Bz3#iLX z@+TI^KC4u?VncZ9n^RHrb#1tBX9X5$C&je)el!c8O7a&9Vp%^Lo+Z-ua%UKN?51g@ z&Sjnz`!9+NH14D5*CoDe8gp%Yil(_}_c|}&1m$WnQ?^~kpsmfECWYo}lh*moS9`HZ z#bjHd=B~n-_p}t!g;hNjLoOF!);%F&{jV9m&vdfuLfp9^P0@pofO6~5@Cv;dtCQ`N zL|AfDfyyTKOzV~wiV@CPfe*v)?I<%`r%bXx+s9u5Vqbu&k%RM3v)V&d%|KJI38*Q>0Ts?M|%p zTd8mO-ZsPalWW@z0K0Fc0;P1Xgw-@D_LL6?b5yML?SWl+Y(ac$a?@Ks%A1=>zLly+ z0ItO0ZQmmx3zTo+@@|~DeAB`aShVMyMDfJ?7Clw3Ia+msh4qD&_8LXN62cJnqO2HA zKJhav-NcZ{#va$aE|2wE6!&ikr2Is?J_7D$CA!vZx?4x0@N|}U1Jnb1@Qyu7e$dVP z(ySqt7q!E#kT{RkIB9jsvL!qb9wpuPE~(8KU8T3PLfrNYyY0%|^PiG~&jcK7;?q7^ zBuTG6rQ|acb%s12Jpy+gGjESlS2duy5*LhFh3eoKdw|A7yqYC_N2Uv^NE&Y4~0XtUeeIdob zng43rZy3T2LFY#!!I>z%&y#|nRwAahUF7Qx3FboXqI$@U9svd_^m!`pPRYSEY$F+x z+7ZU_1mLIm#L>F)YR595JbdCPp{+s_&P1!ImCNrd$<5TPBgLpVx+)ScR!UY#XQIaF z_Y~Z^ zL6#OVNM8MOF0jiHcDYjl!LPDO(%)LbqH;=otRJ7@#6%TETQjN0<)~-gig)7a4soQaqm~ z1`vxPl6hX_Q|F+&sk-ky0$wTz=+%#AdzfgOg`~PCv)jQnOSr^~`Ete2+AHl7ubr0X zIYZxlbTP7rvDAr3p)0>U7kF7r6)Sa$D2lD^G9bMI0SihJJ=_?)=83}?qo;_t`ypVm z#b8Ei7weL5IivJ|a$dWjJ_h-8HvC+ASO%EO)`wxId1pOQ$Jh7>sMr=sRdZEP9a;G? z(caCcIvZ<_Y$EIkG&93||I@*J|s&=>uL>;cnqOnM)?d zaS+gU=Go;VAZiqK6y@&0e-%3H6nDyfM~9$PhzyA4->kTIj;eoaJ>LJ*7O1Spn8$|q zR;T)Be?)xrTV$b#?QN0)Wl1l^5RfT5 zU{>83QLF3zsUCWc=u$RkSonrP!fF1@zc{;8w$=+T)3NYH&RTK&yt5m_D@ zQvdx7ij@+()`Idd%q%tY#IGs`(wgiQMW5JFqKvOU(7*%ftkk zJ8N(9?gtOQI~Kaw)Z4!9aWeqB>rh2DO1<9vAT@4O@XGzdSW2UFf+ttB}FZ zdDYunIkk*KyJ1QPoVUm*TMSvn2kSK{z85u%7SVwBrx>TZ@ftfLL+hzcsdlTyuPzHVI0*6! zad{Chw`BqkH9rSe=<2H)r>h580ny#)Q48?l`soP@M#DG{DDq)59}V;+Bo;d04w|tt zy_G1HG6n9-8f$*T1bv0)!HWH_!K(161*Stcx@P==*g2`9oah}e%@D3oS$a}he^cCk5EU`4_6t7NyGJ^mGg>!HQV& z`B@6jR1|~3Vgha|zMRq_ z2%cT!nK5UGFx=RI+^LsFcYMCp#FUGD-)PCo$z&r}HtN43XTd!$cz=noYow;4UcxEf zr*>-;cK3YU$1!68qBRcGxV5Jg*{e8wfRUVd+;ftPdoBT-p!_aU-P(HP|4mq{i-mE= zi=pM~8u_%*;xA&E0>yC8xq!Yl-;Jh4{)k~rJdC0v#YXZ~kq`lU;@mRcJ_3G~5#XqZ zs5J&rIj?x(Z~6%E|ARAie1%$LoN70VF|E}ie-vTZ#VW+OgH8vF@;CMWQ>s=Fn~}1L z)WluLeeC@spyL7U6i^87r8Nr6t(D@T=iw3XM>~9e3Ua8(-^$(fd-Dh|{!1Cdaz=70 zO1l}aAG-dMFptQ=#7I^}Zr4xj{?ngx^q?4$@O>dcu6IIvi}R52tJPE4WI#8nAmQ3I zkv*jw&tDv{-j=l4*8NqxM?lq|YHU3(7YoY_R=wcc=YJx0qX`B(SgCTmhGO^Oj{qeR zSfl@3ca-n)<$-bK8q0L?4_>j27`LS7M1vmzF8))GfIs41#Y!@6@4!m9l)8`pbKT&! zrO|NDk$?~N_e1|q?niEZ^^)mbBY736Ns-2@PivF6{xD8&WMFZEec2?)^&hs9|>TaXW?XX7kejslUmeIXy(*-jet$nfo#R1uJZbfz`V|D5)jx zk5`SRGS5!`Xt#MeBk5o4d;QSy2q?__RqBoIjqop4kx%*mDG^Xb!ZG7YMFI%;*9zi7 z^U#__;T5`Cms1iJe||s;$XYrs%VXYvz?3~LSTPG8CcxoA^rbKP-jOCUs*zU(2tHo=iod2?wNTA=Ks6r*m{=xFwr7`@c6yIXIdw z5&y2)O9)%o-PddqDK;=#uwk3yHG?)=8pDaUM=hM`WBp(ZitkR@oQ7gdai(fjSAWU& z)O}A9Bw!)bv#HmR`AIT)xzT&~V?ay&Cwa}jUiMccUQ5p<+P3J*S;Zz@4MfxpXgd!C zck`d=DFonCIfVf*gKzF7+!EU8azKE87)mDhJ!&|(g5F$;`t6$yjQAewFU|@&J_3Zj zSnn?$0e2b{{4RVMZa!LCEZeX&uSgxA}fc=EW!s!27fJ7HI;TkAT-X zORfo;lC2dqf!4{-bPV(*W#-<>e{4Hg2&$J;A~u?uH&iOxPRUE+_+Bv7T&McwfvoMK z$BP9eTSdS5GJL%@X=G+mqABBG14rmBucTPqt9i$ff{}_Q1@9us%LW5zWGME!mAkaZ zD#2>SNO<5d432-7JjS4_uvJ^5b}jCw+bOz+;C2B%Q)fsJ+od0LVeno zA>LP9?*w}aKH*qzQOHHd9=@!)8WX6N81j3y>t!BqmZ!6gmkd9H`w5%mD-x*#mW_Y= z`mx15#w(aKEcWmI;&_yE-^7)-n*x_Is2erIlQG^K84=*5o`!3$>~Z7n7j~SiIZVrM zAMP@38b=Au*ErcQx{O&OuK?PN;piVt6grk&*>$Kieh?Gt)LWoNMB>{XfDd+R7-3@pZSq3(m$%^l7;drozU$HHj9!Ghc z^*iap^lo9otBe6g11)6^DPWHJBS7-=6RG!mTT;lyd)%&S9;32Kh_xV9g$X|y7qt$K zGqm&hE}!LGkCsh^<4?z=Kb;I@Pnt&Fd?o0p8en(uKs>v^o$@gsb46;c98sONb)j3< zVd^x&pzoobCF~Y(JyhKiX1}t^v#goWA|tA6&fvV?@4R>-Al(z^q@QMywa1{>_?-0- z(EbQWeF*vf2snaq?-|Qfunfoc#kwNX> zjK1fR_EA92?<(1elkV{wdZk1)`J&wNf?ZdC$BV16t3a>rlUeL19&AN4{WFBSTO~2l zpZw&X?CvBAc66ZwDaX@E6r$QBuXw3JGAk{Y-(nfGV+BT*0<$=bXpGqxTGhBU7s zws!L?V=)i=on^%i&0jos_YE>CmQxjs9|m^z=a-?9@N=25gT_*u=PN0M{a40|$`g{g zD+!j^xqNK8RCx)X#0UqMdp38qSSx%?3TB}F>l1;PjN@tFMc{Uq~r699#WLQi+mq-@w;7iQgXdqA8^OywMY!7c|C=4l$c&=IP3a{A68@vk75|mqA+^wgbWhYKL*RU)-;YnwBI=m z;x&}5S`lFW)H*A#Z8ti3dQ5)*A@f=jIo*n@J30s2ghQKHPDn*pKa)Khzs2bP?@5#c z)=aJ;7)tywb=dh^mm@4QqCx@aC@5sgGLQ#`qU@Ed*+$yJdu`h^AH|5RlFHw)E>2aOL#^b z1MlvM5H2*AV>7Hi$vx1UqQ0?0f_*gV`P^dH%Yk^O)+S;;3iWkvyPwL%Cx9yF z*FH$ohc_Nv9aNky;@nyld17l^lOeMV9T7b>wf*VNEk-*Qit7%OgeM$VxeqNS4+^5B z2LGrT%BA$L9J8*%J7afs6P&*9KIlBa6UM=g?gS+M+j{cegeyeq>TTWjwe|zMZ~QZ z?NYk;@)%zMQo`0Ci)$Y(L=M* zF>Tna=F#SbMs&O#0!^DFuBZ?%ZmR?%+?TQ~Zle8?4sSwgY?D}QQk*I76KEl6BNS*=@k1D{Ws*KFmqIX@5&nT;&9=zYUznyl7;(|c;Gi9jla0s@I( zFIsVP_?sAZ&wM!jVo}#*u<&*huv)--ZNX&%MF?+ zOKl{SKAy)jy$JSA8h0!3t9!_dbaPRyB#Awen(DR1(QX<2`UqeO_Ke-UAC-1lB%X~B zFV~)X1WbBxKLV)B8$e9R!i71|yNTLx2Z{AGySK1TtFiGk;3xl)byUdm>~|KZUbD5H z-WS&=rBsge(-3%pn_vSjpfd53xiZm8bp zONdPxE0sxRz9&w1I=SAMpk84wR&bv!lbr4QVXUr2su*7!k(j}9p_!Nf#~5sWHR~-m z!O3s15dw10(=mxRvt?5ney#+06IY#s^dcxI&oqet5un(Rc~sQ&^bsKH2CGwX>s87A zR?c@OpHt5Y5AQZVu6oemx893>VRLPZhmqtMNjL^4J~a(N#K{Gwt9rc3p+`WUdt+MB zwFv<);ms2I4f3JbaK$?Nf)zJDJC9b%G)ZPB=&Oy1l?i#Wg$+`Z|9t4H;1giIgs~T0 zP7!Ql@voK9^T^b!)v+N2y5gqji&j~|Ul%|qC>5q3+nnY8am_-t{QdAZ6JU7w8zy*5 z_Ki92&?o%W+7(0OPZTgf2IzU6dW0)PiUjV{FL`k5;bP7$O@tQ{>Y zYy5BX0Ux7XB=$`Fn{T3cmN_8te~bSIbB6!!=Zta>m80}0kAO1HAODaD!AZR_=(M0- ziC)Lb7f2}`%lmx_kdQF_Db;tjxVgZ_-HFoe1(Ev?d`H8O(9&*XKk zZ>Pywa1g)-AB8A8ZYJtigtT{_PTvQ2ltff9|1kD05F)`@GLk6s|cH({OJ?@Xd3UZaQX_o7%V4bRlSNUnDwJEVuEFC++suOx=MCZP8*mAO`gR?)Lxd^8YD3@G|Rl5QRl@U3Y_tw`U}R zpIWSaM;slDPV$Kg^#9;>UP4r!zWT-=gMDgdhd(OQ(ZO)p^kl_swu$~me~Qz8-8}zl_y2>4U`Q`0HS_iKwzB2E-b**BQ^Wal-x} ztb4>au=Hl|qf0bSd)!X#u^v+xDls+8Qm#6e>H$6+sh^)wL}t>Z*{#3)tZ%D4TO2yW z@gws!fAF4-@ND-3aZ`O&P3<^kocB78JyG}VXOgAZ=;Z9%shlRL9$$)DJ#{dO&vl=cax zPWME9Ujj<15IlvB&!rPvENkfj*gUYrdTg8Tu$RQr$Xe zSEaI$BOWagMdH2dgDXw^Qa`z5s6&TMg8MT?>+%qj zxWtM(++}ZX184bBXa(lXwarBlZye_wcjKG3(6uP_5xYq{VdmX9tBV``li3-)aHD-R z1MW9{No@O?JJ*QEGqt13-BB&->;^kuw~rc{yj&*BCU(TW6Dv{Syp{$FIkz|XH45^m zHjjh%0A*Tk&II`yLRtB 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 O$`_Jy@c!7DmVX0KOMsaG literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/screenshots/save.jpeg b/code/BasicFeature/Security/Asset/screenshots/save.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..8398d0e3076fb4e5d8e6ac30d1e704f239a68e41 GIT binary patch literal 40375 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 literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/screenshots/single_query_result.jpeg b/code/BasicFeature/Security/Asset/screenshots/single_query_result.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..26c12829b46a6066eb5d71d6ef9d8f3efa054676 GIT binary patch literal 28906 zcmeIb1yodD+c$jZPKWMh2n7j|4u|e;6ciW`5D+P80UeMI=^Q#l=~f!02BaIMyPI#+ z|NnmO=ULzTt^0k~`@Q$`uI0?y=gjQ0&)HY}c3eBIb2EN34-hNME6D>WC;)(h`~o*q zfE<90iHU`YfsKWQg@c2Qiw`2e$HT*?BE3ZfqN8S@r=zB&Wn{h0!N|F)pZ=cW}P!Nvek2hmWN0aOwc zG!m4Xc7Op%CkD!|5AfFq1r-e)0}~4y2Nw^Spo$nkML|PDMMuNHKu1TW_Ca0;&`B^z znfPTeZ)rWkVs-}I4T#RdW|6JFQjzDr8Z&dG)6 zF zpM0SJXusJ)9)C0TU-%+H@`Z|yj)so)lP?rhcVs{#LC0X?$0U`}!g}O zwu<-Z%hpOQ2r4;D8az`#9H#~018Ko9K<&t*sV1r=%oxZ-16jhr{+5X#?Lns69MHP* zBj=wdepPpB2)Y%_m_QpD0nZ8dM$F@fudM05>s(BLaSao{gLi={ElX~*gPkF~nm7S4 zP0lS9HEb~QFCXZ6c1*&%P&5_Qd{oX`v;-pb(Ckzq24ftnJ$Z2EV*35e5Xv0TruJfh zX&5L|rx#%vFs-cVtODa#l?^${4@wS$i_mJSJczT5q6fPwM%#8!<>R8WgQ3pyoMi22 zf}57%S}?#EjB&>c9fSan#Gz8^CqtB!V7PTunYT2!Rha{(pFP!S3)0fIerNpsQkx7j z2OpwH>z*MuQcrOZ5AF0F!L%EKlX@qlV zN~4<$TRe6HPU771aLmT@AuqfflXC24nL<>!J&nKg+SJ0NW!q;$e4C0KZu1fur=L#} zP>W1bPUJWX2wy+r6FJUahK2d4(+D_2Z@m-QnjA z_80mwiW3T{tc+V6lq`Vr)PDBD<`4VS*5!!!(oEa((sigK9uL<&<)u@DOEm%0_hD+I zWe&_Xwo8ndE;v%0;!7Klj-K1*jv==6O`MG1ms54mUCr(Vmy|d@pLsZkjvbxH&cAIN z+7}~st!v7H#bK3@U60o!)mCBLJ9^%Z=%?Te!9? zbtE)BI}V2ZsS8fG9t-3MGT8CMDqF!&FvQprUmM0*q$*d)-^aO}2pTNA2hypK2M2c| z5R2hDC=d}H2ngFpoH|l)6Tz0PcRxQsGf0Q2yF=hUld}@c7tAk1aSMbje3tJ_9Vdl{ zD^y@u&M8pncy0%ZGuTxgJf11*bPOj1<1Qvc7(cM}dm~^W{_XCWrnzU?IYb-Egtla% z2x`amd$<^nY;%N$q4bo2tI}g*0n`ib5c~&DEL1(+i+S2w(}=YDx-Z^*9fYX!CaWyi zQ}7@>?PI4?ac3HKk4p32xVat=NUo!1jWP>^S@EB*lvfcdp+kF>ss@*FhZRdN=d zr6xt=K9*?QiKmvvbe&GU0n)kjcLy$Yr5+k7Rb#V3y~rZx=Bj8{tCSr$rk5*J^zV?* zIQ}4qe?@s8JizLej$x9bR#k~^X4+4uKDM8UUo*28U4C@kPkqCuqpvh>ci z-yNx4GQZOw^!kZ6fK+0}DQ?T9OWLR5>oS>7pwH>?mdogYB6%TJJfz>b$tGneyIDBW z6u!(l9I@^;z+TJarx>PrFnZe$-`-Vqmld}45qzl%qabsy{NxP-s}L#aOE zFw5IXV&sI|9*T*k{H1~Q7;r0GF-chM6D+aW%C6iw%=pmZBvIAcP+cn$@j#YvN7V~q zv^sXrE7nM4pAH48n$en5ciBPPJH|25ds!_IPzV}LTMh#mds`S;uubzf_wWVd#tsL1 z>F%xyFF1@I=tj&gF37Q(8#xlGrtYbv8PZYJIPLQvK-9dUY{8q=AC_L)phtvcfha47 zKjL!cfUu1@v)|En@ZJ;5ZVVbHPZW%6TAP;r)^|^`JnTnNOumR;BUMlV=T$+>$TsNoO05)YY zCt9%41C5FXl#(3>bQiQi`mUoJK%`7|NiWa|cM|%D?N%Fq^t*t{poaYW*G!Wciv;Eb zCYu&EN(SAbU!3?*Vz&aJ)bh&Q>fNg^+7^+A_lo za3*LDE6t7VqK%Qw7P0{<&g#8}t#W5Jk9jR-C)PfC8km!Y2yd!3GGt8!nWlbM5&xh- z`G)EX7g}0odPcA##~Ua0B;L1!Dg`sbIjVQNy@|b-W-F?1fVYBQiy$hN*fZJjtm<@z ze5^LnN5uw{Y1_FJTd_$mKPa-|haX)^H0YXm!}OR~@!OtZv3h+o?TUxnzYU!3UN!XH zN^!J11XpEh4Jyw2R#|K@OJqX)S!c1TxMl->(B*%BA##2LoUgx8V-6#FcLn8-h}*y0 zZUuVRVf(sv+6!Ts0aMjutetk=frwG%7OT2bG%J9b*1*2;iqc*P7?_C6fOvc4MV5x8 zv$AsxMC`S)sg}y*I~ymNbyho2 zYp1m>b2}*WxWhXr^B2Q4DX3ul8dLI|cyBudVX>fBniNdTv1DLl>B_J=h6QB;F$WA= zyw_^%P-i7+Onbjin;LH%_FeZ|EKbxO>L&yh$ieOQ%=*iQG9StU8Z30(g~^RZrR?z! z=3GkKgPqt|?vv7z9FUkqDRgqCKMk*qx{Zftsm-d)=2=SUHp^O53^F>L z8_&bw-0}#&U8&OM{XBTCM&9dWd6*)cD#FmjrDjRL>Qmp`m7mh(WJ-};LL#|-H93E8 z!syxkcW=LTt*IsNkM0VX;sx6{Y*)l{86L5SAFOFtGHy#df@K=HW- zsy9G>%jJuA^6#Wp4sHOtvaqC^=sIaxztN;&o=n?~W_7 z+yGAxB*%^|GQM8S5FK_{+fje2s|g%MOg!DnbXb4=BVtE;wu&y{qnmwU)nVv>C#WP_ zV@YTHS~kMq%cJ_}m8Kiui#@e5xm1N)-<*4o#Xzc_5B+xM=O59f zl-x@px6?<3^}$g5$YyEUI!jR(1?4oM3r}q{KX{j$I2YNI1KjU~NtDYW>Gh5Zf;uqm zsV{2XjS8S4`$SB41Dm!GEq@tW=W~6-V$tBk`uNR69V^#kI$#q+uL$;GWTjv@#s1Mq z<)pE-%Y>%89&;ENiXssna3n{qRWw3`LP^ z-CeNa%4k?*TqykrN$XN_EQoCWmiqTvV$jZ-8snX(-@@@-?r%cFo4?t~ljg})I*-l1 za~(V`tVTSf-JZVz1oV@_-VodwjSGLV80gW7HCm|}P`ey-K<}@8+=&9$>*YMt(sD|JWtjr-4%9Rm z9%T$(PIMSLYOa2tf(jz+P4+YBM1fwBv<&ELG6T|v(qtOZvBeB9d;xZr7F@@nfyr{I z>Zmc+e$|4xgC?zRfk;%4{YIC&m54le2L_bjE-9EmS^pj6ZY&i{`2}Ye2;Z6zDN9h= zfpnXjV!39z8fPXoPY7lpN`XLxtA-IcYH3`%c1=}??;#ZKD$Owsi_?zpV8bxggnlZF ztHjAx24|&f0 zbZb6}g}#>Zj}naLv4tA|{mc+wr^81Lg5jfbF&D5u4mvXDUZ)0=9cc(GqjZQ6dX(qe zX8P$KNIs^5clZcFP>w7FmY-^c(~b=b>JSy3WeCg@yQUuJa!H>fV>B7`4kVudHtFdj z;qZ@LKP=RS)W0`U`)IrqMv!&iryUys=`6FXAt-WphDxa=RzivBAj=Ky=E{dy1q;17a}x zGU$T);s!u6{3D8!xj8R8veXmrg5$3!m!`cAw5-{A>o{LbXdID7@}BLiVD*(chJ{GDn~o_iga^L#F< z<%3kqsoy8bhoE^49qqZ?p&0LlJ=HJIN*SxaH`GW6=r z4WJ=~FkGp1)Uq9U!SGiUDQAa|1Tu%~)f=GV2KddY1Q><6IWs$B zOsf7Lyz*mqDaV^g*ssAj&sR?TNW_zG0H6AkIHQb*fv>5k0JouICoQj3Q5K>w}7ev3($ig_w1mRQfUzF0f zZfQ2pI&7WsEa-lu7sW^GXKh0e;8iCNbAPB-ReU8Fvcgc z4l7ukwx0LveSiv%^2~ zx1x;<7p0fFS=qo%2MU!djCdZaZlz*~zgTGk^lpGx`E7HD^oSc^_pa1liN>jsG0`QP z-?*P`m}B1!;CQgKFS+g9AmMEgYcYOm)9xOsxO*pfIo-9*LPI=@nPC>!Bw%|sjezk~ z!|w*baXMzQk7U`Lx&bQD3BI2-2-Ljb58oS;>Mf7I^}@USl1-BS2FN@{nymrR$gZqP z@kX+5XiiVjoGF(vb5N77!^A2Do$F*HdvDk0Yq|zAjxKZZH40uQ#tbvueX z3Wq;>&?VH#iE((-rm^l>lnjj$3wTrl!lV5`Kv|tW$6uyp&kPyK~ESZ{5o; z<=7KPYdH^ry)JQ`1IsD*7*O9mu7a<*KQj|QkA1yh8?Ri*L$Uk?^*&3cQ0t`KF+JyC z*>i&1M~4!4io|iFRL71>j-%*hc>EmY3w_UK*%7=vmohmr6mR8=X%WCl`ZK2wFW2wc zcy^U*A(A7q>kj)Ko(6S#Q3U4&@>=drHLe@;F}ruu`K}6edWf~@4|*ibu8%EJjT%o2 zG$ns!aEUTt#UTRTZ><^4QCOv0P@n3H+48QWy?eb_NA+gPYhL7fZAXb$!H2N?ntUa& zWtHa!IK{hj1Kd)$598#F?~k=){%y|H+aKBIJEO+T{8)|_rQTVTOLWMtKM!k!yh^M*j;RGvlv-D zC5dNYoZlBICJUa=I3sz^aK0OQ14xrKXliOfK)}B_ptN4f@9KrrP;c0@z27i6uE6eV zm{G&)A!e)2lJDF}sxR#K@xPzWaO$+%(mwgXI3Xo_=S{Q0+j0&fy!l%+0UW(;EG*~5 z_9ONwk)Qb{JnG!GxVARQ9d3Y0VXaKQSyDpU2-w1V_kh^$Z5NccHvp~$vNFB`r1o9> zu5Z_C5PIl5*p1H}t*1+zc$9S6L(%8{#fs_+sTc0VUsZ0o&l9IYLyafylrgg&UtO3) zdZUB%xo8^VKYmDG`#YYrG@eSOk}&4LD^|!Te5gFN%EwbBv#1h zevJ<~WiLyZIwelYeozy=7Ux*la(44}5a@6<;{x>!B+Li$56GR5Rcui3y3K#tc*pxA zI`6%^qVAKP$0C$R%W>t-rIELHS1wbQ%a2mdN-gKiJxZHzmE7|1>J!vpX1voLw(Kz5 zpnlILHek5P?9^#N!q05?YSZ9exlQ(f6I-L=T7#%AJ*W{z>yS=99Fq~8#&Z{(6(D9dBJ>TOug>QXK(Bqnb+Pjv8z@*(>Y`^ zt%B{uE`Hg5Yw(~`!qwE(&e;96_@j93l5K4Y0Q5}#G5TFo*~D>4GPLHptRV%qB=F7y=N#DyiP*Nq+eBmIQaoTyFB)t#wo zqq=i&Wmd82&T-qQ6WfG=@?fDDBIo-zz~V;Um{X%`fro%aV!N?JRY=mYG!u*u&FR3Z zi{{N*Lm3wl?&(SUxlQol1-BHs#q3lY`S`Y#5^nchPfA%SV@qL4ioW@arWgAfM7Af@ z_nu8{MQ^k7;3m+b)E-1}3oJ_3EJ*0IvwtzF7&G>f;>Y^9|5^B%Us$Zhsg|c?)*e;| zMWTK=RJ^q@VViJuyr(zS-{V|Ay=HNT!v6fnN~ri9xI|J-RGYJ()UJ2XkPDxJw#;Ip z)}gq!g%d7~$Cz}GLBzb&j^y-E{8Yr0XTP)YsxNJA?}P`u=|v-ZO*8Z9?Sapd_`}ED zj#V^aGh+rZK5K-XBJ@F0S6&-#<(T%qR3jGc^cYd#*yXxmA}~jNx!mD=L|2tqmf_kZ zO6l79K!~N<-PwIS6S`{H?aw<*de1zTvdBipc<24dO;0~+)F$jGC2FLPYOq6G+a&Kw zW1(Ax2W`yOCx_PAa%RJ%f3@0wx8DDa&dddRxS4<`0FM1c@Rb*TkF`RijTJ_vF+v>! z1K>6}Yss!3$JeS~l+74pli^$jn`Og*kafi5`NUS))?#g-Oejp3uyiiUL$G>u&}a(Y zR6_Cz-3o_RkxbVM5Fz6Qp=i&k3~$|DZm51=6|(G_lovr}5Sx1W6;ng9$`%mt$Mh7e z)WlG^x})*U(y)pK&!l^(hRam;1K=b5(6iVF*&ihSnaT?>^jFvC-zGd|6b``JpA;4+ z-BpO1*nI=oA7*0P7B)s6wGN-mkvTrLftin=kjI4ID!AJA@2hgrQkXzY7SVR5utlfj#7kc`OgL$PseqM z&RVozG3Z9SC! z&;mi=oEzs7x?npKeF=ec7c#}oWHO$+WxcdtuyK2^M<4gK3&5-G;W)^*rnqPO->Mqc zRPwY3ZJ;Oe<(49ZqcEj{0S)AoIvU#zpl?@Ylz3%SG=f~D@E>)aQP`DX{xCE0GWamW zC4*GYqE!_39z#VMnLhUYb@rBtBi1Rs!Yb~C!>Idhj8SkHE)|vWbPb$6)w*5ru z)_bs~Tg|quJLtISrhz{NO*H2pe%{10ZCdpm@7Wt?J^_Bb+KhN?i4fnqa_wQKOR;=g z@~uZc`E9u!7X`UWW4-7v2vTp2HG7T4PC-SVWCT`55;rG7?;ZP=J{z-rsDIal%8Z7E zL3mIGt(tqx3L(h7MbG_s`1x67SNl*qqa4WqQ{WQa`4FQ*!W!{Fj)~gS*i+0S>P01e z`{L5=kxu5Yd#AgYOutR-J)*R)IqiuP6veVr%p*alXUCsE9mBYQ2ievG z|E|C-r96VP%tv?6Bn>9Ya%(Q8Y8<*GFa^@%vrNn06iloc7=MFbeHBJrH7kuMFSxTj z3=|j*ptdjn{N65hfGUDlQiq1vouU;>q>IiO=1~37>x7th^sTcK{t6DKTP*EkN3{5o zw|AHOeWcnAD5APYUCb(;bGn1LYDG4Nu_l9?s2!G5=wnNKn(^Kwu-I;YxSO^9DU=c4 zJ^x|dNB7e1njNeB@g5&%VoZm!f{K+)9`6k0r@o9zg2fj(4y^9NT%Gn%Yy`FSj^3}tgVT&|hBxIM*m3WiyKZy%LFQR=I z3>=+ge{$6xGf&^gtdCT4t01lnT=vO*dJ;dhf-QJ0Z{CJQ-#qx4*Ua(wOp%9OYDv6GL0X z?B}Z0?0FY@np3wNkLNvL@34&|k|n5P#xv{{o-E&0tQOkQ?cgjU4|i2+pU`C9_=#_i zqnf8vx2RUJ9vSQE)EZ`$tf`c&#TZu2{K#}6O0&5a&o#divSs=$vCTn}KpSy=VKgRW z^D#=ri9W}3IoDB?kCJu_3ZWnigmM0R8>#}fk5%cA7<=2t(UKdYs0OQQ8W2D}3PPjU zLkf=Cb}7PK3V(b)%=DqMCOS7{lrpXPfc25md9==uG>L}2)AN+ujIbvRZOoVqr3}_V zo6B=Ok=XEO)_f%&&L~r zU~jhfrxufsw{)rd#F`oqZXJfv4}&d;i!G(OwknHU0`25Nc1GAFV5?%UN z;fo(*+l6C1iZqB6Ks#<^@9PpET0gR5{c~5uB2BH}Ovxh#6vZC>OB#D|lP}42X2vIs zc*er)Q4*Z^r_uF*^Os$dAB7lRPx^lo92>s8U!Fq3g17nuk$PWSQae;aW@|R>U742z zS^sMKolw&j;po-LZ&}zDUz4}AKhNgSJwHgI28U_J=GYgW*F&G|xj8l4!QEIj zP2{zvhcIp_$mpiHOkQ4AUN2%wj0}J118q=H8(^RDP28vivN&-_z#tQHt>_T*<9p1Z zoPT@x!@}$5hVEjx+>s9Mo$K((ppsoojZ3w$8{l=R6qd*9)AG-wUPD#nc}srVK|51b z6JGN++beK#vc5^q?5NK$&P>$*t${1oIQ;Hw0KM=Q1QH|fU1;QbI&fX(gOQELpyHEYWG9~0*bWi zNxpH@B@R~iOaeQu^bB7&?3up!nX=)xHJqRf=Rl9VIlCxBQ)83*9@Z1>rx7Bp9Mh@M ztvk{b1x3lhd+&oEle-(3q&R+gjNcZK&+2TXeOe~w%8-$3_r4^C#||Nz=_r9Un@Jc5 z>uuV@fWI9{SmsWeWh3GbWL{+SA{P>xEr&w$c+ad8sD#ffnG&LEW^lz~lYtfpb7}!A zvEr(?_Tax*Sv~UT)eZZcc(G9NuF}JBXGWXcF~`}Fk3SVT(c$-56)18C z&0h3JL`t5m0l6@@J$uMl^;uo8?>f}rlxiuUb2UNCh<^cS8^dESMu%H zr&VTs>Y8Ext$4w0q{>G}zA9wEVCZ|r?%4GM~=6&YHI>LS*oO()Ye$I z^1S%aQC6kl9V?dyr&%|EA5-xOk3oA2h)M}xuoj!8;093eT0W%l!|Th0?$4gucZ}WB za11e;kNDoj^6*Jq=qL1Z9oEAZ^s|ot=WKLe})tryfz}J$I%Sgg5 zjnCa-De{mJY1@uUm$T4^D?A>hQo)F+4u&_X{4-NVZGIQEpnpf}Y=+gQ+fWtOQEZlETF7xM{d4SOaUjud6oomaegPRjF%&4Ge~N z%AS|nnoe`gn$+NlhMo0>m4-YjQ?_z z*m^oob*S#C=L@%#TB5iL`+$4$NgQn0nphHEWBI2(ZncN+lP?ou=D0tcB^1flqwQB< zWl5~3*UgurwclGSuuE`JbEP%ct~dQcPr*tYO`}_Wo|dz^adCb8u8oBy8$*g zKJFSECuE>|33$k=QK$ycWxp8FURvf&t3|J2d-wg^AlTtlu5hH&^RgP$31dj?4yMz)pq;*Z?-N$!ARt}P|LzVDS4| zSQ}zggXYAND@#juo{9@59ES+_R&0OG`2i*3%_wB|=WjGB%&Lr4uonyS_M~F*o?wzx zzAe+uQl9TAxs```$PlS+=lNv4qkJ){P?y;RAVjL7sFYd+#RTxXh}% z>X!$RaFfI~5>vUn(B?*%J@x~wMna1B==((Cn&`<^a=E6Hwj`ZjKaclY56p_apEzM% zE}WJrB_cC7Gc=xx6W(k8FkPp|!WzYgBc5C|OJ8e2_6a#zNno@Rzb&{iR? z3Djv<{rRqoM4R?u#SVF5?na=eujv(adf2NDo9-^JtC^plvphYIA}L`Fw33F)h-|y+ zZ3+>nC=4?XGdyTWUq;_wiXp~V$C5P>*TjNY`C!7W$bNj>4$(^)?V5*5hlVU7(Z7k|RVo~;!WabV<8u#1STjSsGu(#6pSyd$=)3 zRWYeP4o75|j`r6HEgE`~lQfu_^1Y$cjVAZ1lkjIKePRIx=d0w#Rm7ZVR4OREq435M zY1_JH89T@%Orm3x-m9wa<{GtID>x-xmR|9ew|2}J127lH=2w}c|CYyIkC*42gh zk6YIJ^o#G_0L4Pa?~sP(Ke}3Y{6EJPA6u++rM8t?)+9>eu^I}C28{l=;C3wI$1p!Xo_M$2c_TjxX}`DNo3 z@qzFGux++KSDJA97dP;S>bqtIDvA4v0-Tg6{gRIY<%#UlDJ`o5m;za0oFiP!oO+s~ z0G5nKwm(w{VscW+9M2=$Gv#H;Yfyt%wP=Q`wm;}0fRzdVYhpDJ(L4H?h`AqGm%EsJ z3E>NiaZ$%|vGe*p%G=uS+y~M^_UHaR0srSv<2UP{cB~HZKh2S&SpPI$Rez2;A}IeU z{@*>1{{NbP&rbtf|H-ehQ~rOJB)R3U0n_fE);Lq}ze&XZOwj+=?|)4dMw7D@^r87z zA5_Gq;Ip^Be0pw2 zdRWAbT$}dFyDQ^Rq7Au{&jYzIqiD408{2NiE8`R62GQWY`bW7i5~{SGGhN2{TTxQR zJQSk1+})d17O%Z{KHM&J&PC1>T3^oC$y!Gcw4)LJct~6(kJW;Xm_7~b4D)ebR1?}{ z9lE_8(+i4EcMC?DWS^q3!tY9be7KmwX?j%8EhSIg`u+xZvt(Gcywn#{8|maoxgwOM z{eN)Qqc2f2UR=Q`A47v(#XYV9>xB&9zSajowIJ3T=dbGZgWY^kb5uwJvp#WoqNS2- zNK@--gL{M4!M4b0nXm6htm{XGOcZoUCdKWkG+o?pt0Q~rqTER-?I#)qhVarL-nSjS zt&SY%PW`@%M_qJk&qn|)qZ;a06&``TpY-r`+E^+Ww=tZ|peWOy7bkmkXgr~7`HYS_E$pFa|g}7Q-eeg{4>FOE(;>vNG#g?Wt?bDISztZ6%6+#v@yjY?w$8>Ag76jwneuqe+- zBf|JNXh%2wRaIfnjEBL4n!V@I1gHyJ!)+Op3ThWm0~+T9kYaSfqFmcDkAxe;Lj!qp zcX@*=qh~+#zwv(dgW?&LrMeOeV6~xF$t%!)Z;p6nkG?9mE$?%^)3`QUz0uduuS5-u z_=HXNI_g8)FR2!$QXH5k)eNrKe$;$CAZ6gC`&eOA`}upi*MZ!_=+>FM+A#t9S*Duz zdlqXagSPKm-)C0g7A(BQ!N`w=WoJ=ceKiO>QbY>z(dXTjT;Yzny*{9pZ;=rjfH+ zfUo~y{l(^fFDBW{$3W0?$~=}~L9koW^UIBd(f8)u@f{_>Lu285-Q5G?`f1vTvT`TE z)s+#!<>76^w9&r1y#`ol%jSd%Qg6-v&rLpX<1Sq*gxxvcLoW1_HJ&M%cz$Nl{^I=g z<9(|d4_J)*<0u8kR835}?_Q7}TT@@_({q^XFy;-oQ5ZfqJi9A(OV7G7`D7t@BoTj$ zIf#A@>#J-xFtY<2uSQh)2&y?eaDuL={wOr>?g9zjNac7&d2r3n@i>z38FR#9oSML~JD9 zdr|M&qF z*(h0?iT|o0W@F*H?1Ok2@Am`{G+?fhhK?!6tdPBCRFn_ zfVX9W6rowyLZ5;9J(3=wX@p`7KO^1vkM|hQ z3r{*%lM`cf4fv$-q_V@04_u>&B{4&M7qOt(gh>L=?QHw02Ejmqn1rF!FI_G(SO|aa zwTyj{jh3T+oKg+34>-1rk=EE%ogf9^Q~x`nqz92H6-5Wob#bP#5o4`E8=EPAeq z(aV(vLUDoRLjcq4!Xasj|NA1Jekj-GqDU0KgEpF-{hw@;|0%)#lTGvIzW+sV{*mE7 z?BYKd`h%fA82E#MKN$Fffj=1dgMmL7_=ABz82E#MKN$Fffj=1dgMmL7_=ABz82E#M zKN$Fffj=1dgMmL7_=ABz82E#MKN$Fffj=1dgMt6E7&zn8G7lZ`YeIVE6mQwOvwbbK zOH{I29xEVkdmeexLUhV>1;3i>x<)xlBilF1TaGO7^Zw~FQfiCgSK88o@)%cS+R)!= zbAG3-BHNeA%~@yo>0&kVLhhm^@)B(W#{Jz+7J4Q3)6**P_2Bi+(hY!geGNOK5KQ{7 zY3sSaE6dtm4_u%8bYdx0Db;X#1GGvuW;e^NgY#ih$PH3INhT`40o?a)0Dm7J$jg9a z)xCdQVHj)qeM@UL(r55qsK4nYwk-~3DVMHL^Zu$g6Ub-iv{7v~r%gm)l1!s9AM3E4}p!J(@4LYZf zzX)&6ZkEXtV$l2@twQ%pOveOddp|e@uYVJ8-EcM6et`=+y%5(9`Uf9G<$k{z41m1! zRfpm%QG)zzZh&7p_y;GLu+z;!0;$a#;HT4Cg`>IcYmV_agRUfa&V|@dag+GCU$neA zCL`NBM)G#-{!3X$JHIsezMwqPRpq}%+LlM!{&h3)`Ob;otxYcOrO9VG7gE2}cYbo> z$8d@@4l?LQjY9mbCyRd)?RCuG0+;%mg&@dFKgb>AmcL)r-}yTl$(f&e&bri3u!JJ_ z{QlM(Qex7Aam_iumE-qIIh(lLOXuJ#h5t%|p!Q!_MS8LS#Z!4fc@*>?T99n{jmj;u zeLCUDU-|zh-~|0jInQA67bMSNXSm@*M+`f@s7UARzZe~>H0busjx0oi|37Z^guDz* z<~&b4X#xI`F3zC)c_!jN$2~Xbu0xgvi`h%Gzstf;eE+`l9|d6>c18;GLjq@>VUl6y z(r=!@Y{-Hc*H{uMg4TbOfcora2>fqh9f$rT4!tf%5MkTr#S#BV0km%8^}-gDDKFVM zFBt`c4IN>fBm-f$?L#Av8cJ3Mko)D5^7vg9)j&y^mI!Lq#Sll=%L2Mriz&%&f`fuo zIdfG^OCXyXJKXnm%W0{@DvuA*)}#f4A0l5f<4?=U97XNMMDqSq-bgr?fQ+KA0wpC} zr=N=t+UuD~&9OsI+dej4Mp^=_XhrbnsE{FLC>RxhLMt;z-jgGjm!Sz( z#%ZHK32s91(ouLK|nh1Lz7hzLo$qDSG63$RyQ_w+e~!9NgX8_8Kq>-JieUp z0|+}5A1606*%2CUtZd8)+~;6DP=re7+F`PRlHi$Ein%-Lg2NqXvd3`Hr0HO*aSMEP ztiHXhI{FC<4LoU_)%i{_|2(c4@tVaXa*u_BPtNB3v&+b)^oir6E|E18NzUtU7d$3v zEysjAhfbTDS1FQLC+9n7^`kDaP0`9+V^4O7j85Hz+=j`ewoKkIruMkZm+;5G8TYjR zR;P7vZ(eMSY_gsR^#l8FC-g3hjcUk4w9%sA6Fv6-*b1e36F^%0zA-JCqZTkUd4-HqW2yI5w}jxPYyw zyMi6>i@?=*j#h%}Ccs{RbYPOP=||$}anSs^_Gn_ItAQcZ;wd8b!(c)22PL5kABk{k zvfxIoI}FhJ0QPhX*IF`*><9@BW0tY4BUHvQ9^M~sYA@7EaPWt`-)3?z4TVbPl)5e^ zBz}DD`eC^=UoyTxqPV`dmIzdM@BH~jFslr~w%#ZtSmJxJH2J~YVYNI&*d=DqO4htiBQo!Am*C8A** zyeeu1s}53co;U|14qu&^fUYw~CS$ui7gV^9tEyr1a~e3dOosbe%#6gDHVIN`u19rJ zm#<$)9p9=&E% z&Y6pf++TtXhOmKvB_(;N?fakmlLBL4;BX|s^U&jx;C*b&vQf!8h-5Y3HdFxVmp(u+ zu5uDH5C#T^n2M+NV`Rxp1ynGTAEolE~#ZD;JiUKcDq;p2WsLv9~B||St$8vs_+3p z!p}lnRroI8c)99VuMQxLf^M0z%i#zuRW!j&gqAd6alJa6J+^=i(fJ_{R|W5C!s=0o z+@=h30b=mmw|BfkqBw$hKGI2tVjG^8j=p_vqH==fU7on7M>+$UYbx|XPWjQ2b$(7D zm4S&;8>PI&@uzG$>s^s@h`LGBk^L|B!K24_)+b}v>w{**?Mb6ZMPj$xVSEJ={-^~* z5MzD)2Q@yj2`R~%uF{0Lx$r(z+-G@1(uD9n;W%yL%8&$@v~WTUOpZK!C>e}Bu?zny z?8}2Fb7VElidYwRxAM=CP?He9C$RD&KbPZTZ0O+ZmSJE*R=#&uUa7U?4e*(t;|k-@ z>5|YmRzHNB2zSDeW=bq9z(=s%M3og6&a4$9>XKKtE~miVT=KGak_oAJvd0m9yzI8Q zOvri<7jVwahFPMhD9PKt|M?OEa^iJST+U1x6(to#RDYx|Msg%H{I!vS4DMh9AT69yXPfn--63dF@Ng7eZBOxLpA|oTApy8mSp`xM@V!y=1AtfRwBPAjsp`d1^qj<$kMM6T)$H2_a!OhK0 zPA4G3&ne8x#m)H}2n;eZG8!rx0XjMXCnX6b=l|o+b2k7B2_67D350nCfW?9VV!=H3 z0mz|v!o&RW0sQ>~0}F(MM?geEMnQ#kXnX;Hg#iL#;ehb)aB$Gx{?Ok6a9HrzlpNv+ zFI7ztUpeD&1}A(%qLQfV!Bv|&rRFkq2|-4|!zUmlqM@auXJF*!;pO8O5Pb7iQc7Az zR!&_*Q%hS%SI^Ac!qUpx#@5x%-NVz%+b8rxSa`(8NKj%@a!P7idPZh`L19sGNoiSm z{pW_prskH`FJF86`UeJwhDWAnX6GRD3*Q&lH#UE6ZSU;v?Vp`rTwYz@-2S@zO&1IR z_&2hk*S`_=pXkDZ(gh0#2ZTfXO&1KTC$s>u;NU4a5U|Bn5lx(5zTylTDZ76E8L80h2yu>higi(~qYq(+wa ze%%eKlCXFnF@}}W7s;xU>^Q0*c$_}y)j$Q-6r=~p1LBy17=ldGaMUI#TMBUYujT0rVK)*?iz|rWt0FVF|P{C1qtnD6NEfFO``TUIi~Zy;tuIRaLW0*ZcXPhKo>u zCMiSWnU}@QUBz3xHlxcWMk|Fb%)?%Wqs}-_-OWASQizb7J*m_yG!tClV8d>WJ}h2T z+EW6QNsS1WmqF)OqlpAD%$f!RiVE|CQ6+Iy5V_ zRS6wBU0$cbH_7hB$c76gk{&(|83nehl;QGB-g=`WRxKbgiN2NafR1u|Ru)V>@ZBOh z5&t5=_X1}w-X|w^{_Fg0P?WzCF?Yv--0D|UMd_h=wf#krtU3bX&r7Ak?$x6T^^=z| z0#`bni&M*N$>ADkw<2?5*C%_D{U}O?@4Z)W=K?Kn&F=3e9`DH?6ixPRN@ymD%*Idc z3AuvXJOy?UNg0+S#ruu6h?soECrxJU9UM=p6+2S8epnEi`gbXhSB-w!P0RHEcBfRt zkhvdiw?j!mh`v#zPyw{bvaX5^FGyw!eC%7Nr;7Jdo@kW;JpMww>EO2V?gt!FLNP7Jv30~) zqR^9u0Tm*hS!(_l)DF?!I=vCdUElOLK7BX>Oq@x!7CiTGvVkYD_@0_Hc?Kixmf<&q zZGNE0@MT42YMgr!LH~Rzk;0LtlM>9qrAT=-vXH?z6{(HTOr6>rpyI2N74(EQ5>43I z2ylKf2&reVh;%;*P{2)Y%K>WWX0Tz9)H6j>1JRc&yeZ=tqu)-$nXKl+QLmF?2pgE5 z-iTI*k>ppG#6j{GCW_-eoTkaw6etN+300>Y>gN)mbe07LFmQ{WuQiL+o@^9kcG1uk!_sZMwyYRx+mrA zvk_esO#WP{%$7nVhTyuK{R{vzYMo9zXo$Ykm2E=KNCf@CuOU~rJB;uuCy6k;*MMI$0jUjexuFDF~}@KeUA8TL4<39yh>~O z@{_Nl$m|W1oecs|ZnTa18sJ{Gqo2Av#$9Q3l;3c2nOooQDAL&7*3`lu`&I(uM8RiT zcXyu8CrOw8oD{}JA-B7r^`W0+WS;K($U_rXa2XCHXFCc<&(~Pjm}Z%ybC^90C21za zN8@z&#fN76FUcOCmjP2>&6u5h%y&Qr``x=^Z90QvxFSc{srdDaV=-sh*n(thv#_Cf znI0yRIHtdM8FgTKQSo-NcDyg_^mbxehtNm8*5ZA>OpC<{3o7Ouc7!*+SgU1_nh5IJ zQ2h{pDaH8yi@4yK{3C$>n?`p|LLB4|TFd zx;AfAT6HcfMqk=uW(l;qqaMXC@6=4!srlpGZ5TRgc4duw%gW1$qviQeB^ zDnY1H2UVI|nj2luM{zPto=#8hrUhpUAgjjnZ(dE?3#rZ@JGkq&Di-R4DJhu^#eZqj zfpaQqX0N==nrbuLJ!h!EFt6USe8_-9^Wg9IzOJyhvhg#mYrEGVeuKCaZPn+OXY%9ajH&tnQaRS>%qstV!VP3G2*Fm;+)^hG; zS>O-R@wOvGgO-$6?X&J}SjbvG93%>Z&Jl0tbLGCu8g_SE(q__rZr8rL`|Kz_uassl z($QbC_@0hJrlfALX437titSK@*x)nRA6xfROPD85LwnrBGoacwJgP>2(dK+FGX>h+ zT&T94GuO7WlVX~CN$A7Wdj~48`+|AK=LTOFYZB&-WN>aI>FzTi%Dp&nekSnnYT9U@ zLvPjQn(rM?&QV^hm=AE_scQ#!$iTK%aa~`LnL6Lgl9THNZ@j15j%c5d`h$2yPlbQf z;U43!7r*Sc0i6D|ic~Vgk~ZH-F&6x|SYi`w?~fg-6N;0%(%RnzP~F|l3vARq18^lz z?nj>id7vUIHK!X*oYF(rREihA_b6HV9dT+9RyIm)ou3pzYrsj2A9CWfMa0-P zdMRNsZG-NG{a#zmh@L$_QbD2vKOs+xay?rPz1>qWSbFP+ahmZ%Sm#0IfX1E2io8iy z%H}EehD5K;L>UdK$~8PuK4rc4Zdo1R{)+o05ne~egRd$BE0JlTmqJcb@Ym6Bp0ggzI9OV*2?)cz>J~XQarKy%#5LP%Dh=tw4Z_ zK7ZY4d#~Ox8}eB1%9bh%7n}g@ifFcta&(p}qz+DZ0Q`*8t4Kd@sB*5=&mcv`T={H2 zW)#NTfFg)Yf(fa3ER=3Qs)ftyzAndU;Rp2F$UtYgiV z_^O|UR7AuR%J&w!de(JXa$MYZXT5y;m8 z0ky>+bX-`i>5mMbjr3L#?1G&tk2)ZnMe<~YR$zZdMhW#T|D183x+ssR{oFM()5HeQ zUhd`1Gaz;bX$JA(DR8rK$|doF_kkX$T!H|I6WpnJbd7C&XFE6c%^pWZpQ(@o@11V_ zx3TD?xOWI5n^_#+AZ#qFf!S^MEnoxNqQ91?QmpJ!#BUb4u5d48F&q{eZ6-xREud0#!)1@|Z`l!c)89clp%`((GoC;qjUy49ino4w4{MY zV5`Na(TiWXzMr1bE63jG@bRANE$Xx6G@y5=lGLs2>q83aAr4jUyq)pCPF|%X%Rbop zk`Jkl{Cdx)CVbQN%ic_0V(^-^we9#9)2|Cqgw)K~Ve$E~M5GG8Cs+-j4QZsci9+5HyQDG6TCrTTqxj%?NwA#s z>jneALjLQ#SVWT9^t>8CrYB8zP)VSi4UDg4k2jY6i(8D*v`vda73eG zQxagu6Y*DO!#4vNn}CKwvu2!^1MIIG^Ucu*xyjQnVbhw}(HX0iI1yXR65Lu>R5)J$_Uf^2Y5JQ$FQ@nOao2#RMSxQ{7{pqh^+${IW?J$`lXrR+g25R1Sz_EMy->*zrbI<%Sq)3gG}8ut zz%*LDrFe!QJrAU3pdyrzQk=rWO3x%?6Q3YstJd(9Avyh<8dMVH&og6p&SY39Jjp~L zE|>KAaBd?Bm@;SQet|BY?V9N`tPnx=HDyrFq%0Ju$dn25`lm*Iay0`z<3^|wxZr zphu7S=eOOOD*6(qr}3wo^=AOwFILdqG>Db_d)MlN=vpo

Iy;fQY^&&??aP^cfK1 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 literal 0 HcmV?d00001 diff --git a/code/BasicFeature/Security/Asset/screenshots/update_list.jpeg b/code/BasicFeature/Security/Asset/screenshots/update_list.jpeg new file mode 100755 index 0000000000000000000000000000000000000000..629f1d79a2553a3d93f4ec02d1fcd454da78d2de GIT binary patch literal 32707 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 literal 0 HcmV?d00001